@@ -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 );
0 commit comments