Index: pkg/front_end/lib/src/incremental/file_state.dart |
diff --git a/pkg/front_end/lib/src/incremental/file_state.dart b/pkg/front_end/lib/src/incremental/file_state.dart |
index 61400d6f12b0f816c885a60b7004f6b9377682fa..15faab032129124f784903f216e57c35fca3edf8 100644 |
--- a/pkg/front_end/lib/src/incremental/file_state.dart |
+++ b/pkg/front_end/lib/src/incremental/file_state.dart |
@@ -44,6 +44,7 @@ class FileState { |
bool _exists; |
List<int> _content; |
List<int> _contentHash; |
+ bool _hasMixin; |
List<int> _apiSignature; |
List<NamespaceExport> _exports; |
@@ -85,6 +86,14 @@ class FileState { |
@override |
int get hashCode => uri.hashCode; |
+ /// Whether the file has a mixin application. |
+ bool get hasMixin => _hasMixin; |
ahe
2017/06/12 19:22:03
Rename to hasMixinApplication? I think it's import
scheglov
2017/06/12 19:43:18
Yeah, I actually named it initially this way.
But
|
+ |
+ /// Whether a unit of the library has a mixin application. |
+ bool get hasMixinLibrary { |
ahe
2017/06/12 19:22:03
hasMixinApplicationLibrary?
But how about this: r
|
+ return _hasMixin || _partFiles.any((part) => part._hasMixin); |
+ } |
+ |
/// The list of the libraries imported by this library. |
List<FileState> get importedLibraries => _importedLibraries; |
@@ -138,8 +147,8 @@ class FileState { |
// Scan the content. |
ScannerResult scanResult = _scan(); |
- // Compute the API signature. |
- _apiSignature = _computeApiSignature(scanResult.tokens); |
+ // Compute syntactic properties. |
+ _computeSyntacticProperties(scanResult.tokens); |
// Parse directives. |
var listener = new _DirectiveListenerWithNative(); |
@@ -210,14 +219,16 @@ class FileState { |
} |
} |
- /// Compute and return the API signature of the file. |
+ /// Compute syntactic properties of the file: [_apiSignature] and [_hasMixin]. |
/// |
/// The signature is based on non-comment tokens of the file outside |
/// of function bodies. |
- List<int> _computeApiSignature(Token token) { |
+ void _computeSyntacticProperties(Token token) { |
var parser = new _BodySkippingParser(); |
parser.parseUnit(token); |
+ _hasMixin = parser.hasMixin; |
+ |
ApiSignature apiSignature = new ApiSignature(); |
apiSignature.addBytes(_fsState._salt); |
@@ -239,7 +250,8 @@ class FileState { |
apiSignature.addString(token.lexeme); |
} |
- return apiSignature.toByteList(); |
+ // Store the API signature. |
+ _apiSignature = apiSignature.toByteList(); |
} |
/// Exclude all `native 'xyz';` token sequences. |
@@ -439,6 +451,7 @@ class _BodyRange { |
/// The [Parser] that skips function bodies and remembers their token ranges. |
class _BodySkippingParser extends Parser { |
+ bool hasMixin = false; |
final List<_BodyRange> bodyRanges = []; |
_BodySkippingParser() : super(new Listener()); |
@@ -452,6 +465,11 @@ class _BodySkippingParser extends Parser { |
} |
return super.parseFunctionBody(token, isExpression, allowAbstract); |
} |
+ |
+ Token parseMixinApplication(Token token) { |
+ hasMixin = true; |
+ return super.parseMixinApplication(token); |
+ } |
} |
/// [DirectiveListener] that skips native clauses. |