Skip to content

Commit fa74c54

Browse files
committed
Use default FeatureSet for a file in its unlinked unit key hash.
BUG=#40609 Change-Id: I4f333c802d1ba086354701aa41a75dadca8099a2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/135500 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent e342991 commit fa74c54

3 files changed

Lines changed: 37 additions & 21 deletions

File tree

pkg/analyzer/lib/src/dart/analysis/file_state.dart

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ class FileState {
108108
*/
109109
final bool isInExternalSummaries;
110110

111+
/**
112+
* The default [FeatureSet] for the file path and URI.
113+
*
114+
* The actual language version, and the feature set, of the file might be
115+
* different, if `@dart` is specified in the file header.
116+
*/
117+
final FeatureSet _featureSet;
118+
111119
bool _exists;
112120
String _content;
113121
String _contentHash;
@@ -139,14 +147,15 @@ class FileState {
139147
*/
140148
bool hasErrorOrWarning = false;
141149

142-
FileState._(this._fsState, this.path, this.uri, this.source)
150+
FileState._(this._fsState, this.path, this.uri, this.source, this._featureSet)
143151
: isInExternalSummaries = false;
144152

145153
FileState._external(this._fsState, this.uri)
146154
: isInExternalSummaries = true,
147155
path = null,
148156
source = null,
149-
_exists = true {
157+
_exists = true,
158+
_featureSet = null {
150159
_apiSignature = Uint8List(16);
151160
_libraryCycle = LibraryCycle.external();
152161
}
@@ -368,8 +377,7 @@ class FileState {
368377
return _parse(errorListener);
369378
});
370379
} catch (_) {
371-
AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
372-
return _createEmptyCompilationUnit(analysisOptions.contextFeatures);
380+
return _createEmptyCompilationUnit();
373381
}
374382
}
375383

@@ -405,6 +413,7 @@ class FileState {
405413
{
406414
var signature = ApiSignature();
407415
signature.addUint32List(_fsState._unlinkedSalt);
416+
signature.addFeatureSet(_featureSet);
408417
signature.addString(_contentHash);
409418
signature.addBool(_exists);
410419
contentSignature = signature.toByteList();
@@ -522,10 +531,10 @@ class FileState {
522531
@override
523532
String toString() => path ?? '<unresolved>';
524533

525-
CompilationUnit _createEmptyCompilationUnit(FeatureSet featureSet) {
534+
CompilationUnit _createEmptyCompilationUnit() {
526535
var token = Token.eof(0);
527536
return astFactory.compilationUnit(
528-
beginToken: token, endToken: token, featureSet: featureSet)
537+
beginToken: token, endToken: token, featureSet: _featureSet)
529538
..lineInfo = LineInfo(const <int>[0]);
530539
}
531540

@@ -568,14 +577,13 @@ class FileState {
568577

569578
CompilationUnit _parse(AnalysisErrorListener errorListener) {
570579
AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
571-
var featureSet = _fsState.featureSetProvider.getFeatureSet(path, uri);
572580
if (source == null) {
573-
return _createEmptyCompilationUnit(featureSet);
581+
return _createEmptyCompilationUnit();
574582
}
575583

576584
CharSequenceReader reader = CharSequenceReader(content);
577585
Scanner scanner = Scanner(source, reader, errorListener)
578-
..configureFeatures(featureSet);
586+
..configureFeatures(_featureSet);
579587
Token token = PerformanceStatistics.scan.makeCurrentWhile(() {
580588
return scanner.tokenize(reportScannerErrors: false);
581589
});
@@ -819,7 +827,8 @@ class FileSystemState {
819827
*/
820828
FileState get unresolvedFile {
821829
if (_unresolvedFile == null) {
822-
_unresolvedFile = FileState._(this, null, null, null);
830+
var featureSet = FeatureSet.fromEnableFlags([]);
831+
_unresolvedFile = FileState._(this, null, null, null, featureSet);
823832
_unresolvedFile.refresh();
824833
}
825834
return _unresolvedFile;
@@ -847,7 +856,8 @@ class FileSystemState {
847856
}
848857
// Create a new file.
849858
FileSource uriSource = FileSource(resource, uri);
850-
file = FileState._(this, path, uri, uriSource);
859+
FeatureSet featureSet = featureSetProvider.getFeatureSet(path, uri);
860+
file = FileState._(this, path, uri, uriSource, featureSet);
851861
_uriToFile[uri] = file;
852862
_addFileWithPath(path, file);
853863
_pathToCanonicalFile[path] = file;
@@ -888,7 +898,8 @@ class FileSystemState {
888898
String path = uriSource.fullName;
889899
File resource = _resourceProvider.getFile(path);
890900
FileSource source = FileSource(resource, uri);
891-
file = FileState._(this, path, uri, source);
901+
FeatureSet featureSet = featureSetProvider.getFeatureSet(path, uri);
902+
file = FileState._(this, path, uri, source, featureSet);
892903
_uriToFile[uri] = file;
893904
_addFileWithPath(path, file);
894905
file.refresh(allowCached: true);

pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/analysis/features.dart';
65
import 'package:analyzer/dart/ast/ast.dart';
76
import 'package:analyzer/dart/ast/token.dart';
8-
import 'package:analyzer/src/dart/analysis/experiments.dart';
97
import 'package:analyzer/src/dart/ast/token.dart';
108
import 'package:analyzer/src/summary/api_signature.dart';
119

@@ -61,12 +59,6 @@ class _UnitApiSignatureComputer {
6159
addToken(node.rightBracket);
6260
}
6361

64-
void addFeatureSet(FeatureSet featureSet) {
65-
for (var feature in ExperimentStatus.knownFeatures.values) {
66-
signature.addBool(featureSet.isEnabled(feature));
67-
}
68-
}
69-
7062
void addFunctionBodyModifiers(FunctionBody node) {
7163
signature.addBool(node.isSynchronous);
7264
signature.addBool(node.isGenerator);
@@ -127,7 +119,7 @@ class _UnitApiSignatureComputer {
127119
}
128120

129121
void compute(CompilationUnit unit) {
130-
addFeatureSet(unit.featureSet);
122+
signature.addFeatureSet(unit.featureSet);
131123

132124
signature.addInt(unit.directives.length);
133125
unit.directives.forEach(addNode);

pkg/analyzer/lib/src/summary/api_signature.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import 'dart:convert';
66
import 'dart:typed_data';
77

8+
import 'package:analyzer/dart/analysis/features.dart';
9+
import 'package:analyzer/src/dart/analysis/experiments.dart';
810
import 'package:convert/convert.dart';
911
import 'package:crypto/crypto.dart';
1012

@@ -87,6 +89,17 @@ class ApiSignature {
8789
_offset += 8;
8890
}
8991

92+
/**
93+
* Collect a [FeatureSet].
94+
*/
95+
void addFeatureSet(FeatureSet featureSet) {
96+
var knownFeatures = ExperimentStatus.knownFeatures;
97+
addInt(knownFeatures.length);
98+
for (var feature in knownFeatures.values) {
99+
addBool(featureSet.isEnabled(feature));
100+
}
101+
}
102+
90103
/**
91104
* Collect a 32-bit unsigned integer value.
92105
*/

0 commit comments

Comments
 (0)