Index: pkg/compiler/lib/src/common/resolution.dart |
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart |
index b9c8f0bc5d0bbfd484ce995e8d706110abc07903..38b8d5c295be363c1bd1ae3757f297f922b4f6f5 100644 |
--- a/pkg/compiler/lib/src/common/resolution.dart |
+++ b/pkg/compiler/lib/src/common/resolution.dart |
@@ -10,8 +10,7 @@ import '../compiler.dart' show |
import '../core_types.dart' show |
CoreTypes; |
import '../dart_types.dart' show |
- DartType, |
- InterfaceType; |
+ DartType; |
import '../diagnostics/diagnostic_listener.dart' show |
DiagnosticReporter; |
import '../elements/elements.dart' show |
@@ -21,9 +20,7 @@ import '../elements/elements.dart' show |
ErroneousElement, |
FunctionElement, |
FunctionSignature, |
- LocalFunctionElement, |
MetadataAnnotation, |
- MethodElement, |
TypedefElement, |
TypeVariableElement; |
import '../enqueue.dart' show |
@@ -33,10 +30,6 @@ import '../tree/tree.dart' show |
AsyncForIn, |
Send, |
TypeAnnotation; |
-import '../universe/universe.dart' show |
- UniverseSelector; |
-import '../util/util.dart' show |
- Setlet; |
import 'registry.dart' show |
Registry; |
import 'work.dart' show |
@@ -53,7 +46,6 @@ class ResolutionWorkItem extends WorkItem { |
WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { |
WorldImpact impact = compiler.analyze(this, world); |
- impact = compiler.backend.resolutionCallbacks.transformImpact(impact); |
_isAnalyzed = true; |
return impact; |
} |
@@ -61,13 +53,8 @@ class ResolutionWorkItem extends WorkItem { |
bool get isAnalyzed => _isAnalyzed; |
} |
-// TODO(johnniwinther): Rename this to something like `BackendResolutionApi` |
-// and clean up the interface. |
/// Backend callbacks function specific to the resolution phase. |
class ResolutionCallbacks { |
- /// |
- WorldImpact transformImpact(ResolutionWorldImpact worldImpact) => worldImpact; |
- |
/// Register that an assert has been seen. |
void onAssert(bool hasMessage, Registry registry) {} |
@@ -146,256 +133,6 @@ class ResolutionCallbacks { |
void onIncDecOperation(Registry registry) {} |
} |
-class ResolutionWorldImpact extends WorldImpact { |
- const ResolutionWorldImpact(); |
- |
- // TODO(johnniwinther): Remove this. |
- void registerDependency(Element element) {} |
- |
- Iterable<Feature> get features => const <Feature>[]; |
- Iterable<DartType> get requiredTypes => const <DartType>[]; |
- Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; |
- Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; |
- Iterable<DartType> get typeLiterals => const <DartType>[]; |
- Iterable<String> get constSymbolNames => const <String>[]; |
-} |
- |
-/// A language feature seen during resolution. |
-// TODO(johnniwinther): Should mirror usage be part of this? |
-enum Feature { |
- /// Invocation of a generative construction on an abstract class. |
- ABSTRACT_CLASS_INSTANTIATION, |
- /// An assert statement with no message. |
- ASSERT, |
- /// An assert statement with a message. |
- ASSERT_WITH_MESSAGE, |
- /// A method with an `async` body modifier. |
- ASYNC, |
- /// An asynchronous for in statement like `await for (var e in i) {}`. |
- ASYNC_FOR_IN, |
- /// A method with an `async*` body modifier. |
- ASYNC_STAR, |
- /// A catch statement. |
- CATCH_STATEMENT, |
- /// A compile time error. |
- COMPILE_TIME_ERROR, |
- /// A fall through in a switch case. |
- FALL_THROUGH_ERROR, |
- /// A ++/-- operation. |
- INC_DEC_OPERATION, |
- /// A field whose initialization is not a constant. |
- LAZY_FIELD, |
- /// A call to `new Symbol`. |
- NEW_SYMBOL, |
- /// A catch clause with a variable for the stack trace. |
- STACK_TRACE_IN_CATCH, |
- /// String interpolation. |
- STRING_INTERPOLATION, |
- /// An implicit call to `super.noSuchMethod`, like calling an unresolved |
- /// super method. |
- SUPER_NO_SUCH_METHOD, |
- /// A redirection to the `Symbol` constructor. |
- SYMBOL_CONSTRUCTOR, |
- /// An synchronous for in statement, like `for (var e in i) {}`. |
- SYNC_FOR_IN, |
- /// A method with a `sync*` body modifier. |
- SYNC_STAR, |
- /// A throw expression. |
- THROW_EXPRESSION, |
- /// An implicit throw of a `NoSuchMethodError`, like calling an unresolved |
- /// static method. |
- THROW_NO_SUCH_METHOD, |
- /// An implicit throw of a runtime error, like |
- THROW_RUNTIME_ERROR, |
- /// The need for a type variable bound check, like instantiation of a generic |
- /// type whose type variable have non-trivial bounds. |
- TYPE_VARIABLE_BOUNDS_CHECK, |
-} |
- |
-/// A use of a map literal seen during resolution. |
-class MapLiteralUse { |
- final InterfaceType type; |
- final bool isConstant; |
- final bool isEmpty; |
- |
- MapLiteralUse(this.type, {this.isConstant: false, this.isEmpty: false}); |
- |
- int get hashCode { |
- return |
- type.hashCode * 13 + |
- isConstant.hashCode * 17 + |
- isEmpty.hashCode * 19; |
- } |
- |
- bool operator ==(other) { |
- if (identical(this, other)) return true; |
- if (other is! MapLiteralUse) return false; |
- return |
- type == other.type && |
- isConstant == other.isConstant && |
- isEmpty == other.isEmpty; |
- } |
-} |
- |
-/// A use of a list literal seen during resolution. |
-class ListLiteralUse { |
- final InterfaceType type; |
- final bool isConstant; |
- final bool isEmpty; |
- |
- ListLiteralUse(this.type, {this.isConstant: false, this.isEmpty: false}); |
- |
- int get hashCode { |
- return |
- type.hashCode * 13 + |
- isConstant.hashCode * 17 + |
- isEmpty.hashCode * 19; |
- } |
- |
- bool operator ==(other) { |
- if (identical(this, other)) return true; |
- if (other is! ListLiteralUse) return false; |
- return |
- type == other.type && |
- isConstant == other.isConstant && |
- isEmpty == other.isEmpty; |
- } |
-} |
- |
-/// Mutable implementation of [WorldImpact] used to transform |
-/// [ResolutionWorldImpact] to [WorldImpact]. |
-// TODO(johnniwinther): Remove [Registry] when dependency is tracked directly |
-// on [WorldImpact]. |
-class TransformedWorldImpact implements WorldImpact, Registry { |
- final ResolutionWorldImpact worldImpact; |
- |
- Setlet<Element> _staticUses; |
- Setlet<InterfaceType> _instantiatedTypes; |
- Setlet<UniverseSelector> _dynamicGetters; |
- Setlet<UniverseSelector> _dynamicInvocations; |
- Setlet<UniverseSelector> _dynamicSetters; |
- |
- TransformedWorldImpact(this.worldImpact); |
- |
- @override |
- Iterable<DartType> get asCasts => worldImpact.asCasts; |
- |
- @override |
- Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks; |
- |
- @override |
- Iterable<MethodElement> get closurizedFunctions { |
- return worldImpact.closurizedFunctions; |
- } |
- |
- @override |
- Iterable<UniverseSelector> get dynamicGetters { |
- return _dynamicGetters != null |
- ? _dynamicGetters : worldImpact.dynamicGetters; |
- } |
- |
- @override |
- Iterable<UniverseSelector> get dynamicInvocations { |
- return _dynamicInvocations != null |
- ? _dynamicInvocations : worldImpact.dynamicInvocations; |
- } |
- |
- @override |
- Iterable<UniverseSelector> get dynamicSetters { |
- return _dynamicSetters != null |
- ? _dynamicSetters : worldImpact.dynamicSetters; |
- } |
- |
- @override |
- Iterable<DartType> get isChecks => worldImpact.isChecks; |
- |
- @override |
- Iterable<Element> get staticUses { |
- if (_staticUses == null) { |
- return worldImpact.staticUses; |
- } |
- return _staticUses; |
- } |
- |
- @override |
- bool get isForResolution => true; |
- |
- _unsupported(String message) => throw new UnsupportedError(message); |
- |
- @override |
- Iterable<Element> get otherDependencies => _unsupported('otherDependencies'); |
- |
- // TODO(johnniwinther): Remove this. |
- @override |
- void registerAssert(bool hasMessage) => _unsupported('registerAssert'); |
- |
- @override |
- void registerDependency(Element element) { |
- worldImpact.registerDependency(element); |
- } |
- |
- @override |
- void registerDynamicGetter(UniverseSelector selector) { |
- if (_dynamicGetters == null) { |
- _dynamicGetters = new Setlet<UniverseSelector>(); |
- _dynamicGetters.addAll(worldImpact.dynamicGetters); |
- } |
- _dynamicGetters.add(selector); |
- } |
- |
- @override |
- void registerDynamicInvocation(UniverseSelector selector) { |
- if (_dynamicInvocations == null) { |
- _dynamicInvocations = new Setlet<UniverseSelector>(); |
- _dynamicInvocations.addAll(worldImpact.dynamicInvocations); |
- } |
- _dynamicInvocations.add(selector); |
- } |
- |
- @override |
- void registerDynamicSetter(UniverseSelector selector) { |
- if (_dynamicSetters == null) { |
- _dynamicSetters = new Setlet<UniverseSelector>(); |
- _dynamicSetters.addAll(worldImpact.dynamicSetters); |
- } |
- _dynamicSetters.add(selector); |
- } |
- |
- @override |
- void registerGetOfStaticFunction(FunctionElement element) { |
- _unsupported('registerGetOfStaticFunction($element)'); |
- } |
- |
- @override |
- void registerInstantiation(InterfaceType type) { |
- // TODO(johnniwinther): Remove this when dependency tracking is done on |
- // the world impact itself. |
- registerDependency(type.element); |
- if (_instantiatedTypes == null) { |
- _instantiatedTypes = new Setlet<InterfaceType>(); |
- } |
- _instantiatedTypes.add(type); |
- } |
- |
- @override |
- Iterable<InterfaceType> get instantiatedTypes { |
- return _instantiatedTypes != null |
- ? _instantiatedTypes : const <InterfaceType>[]; |
- } |
- |
- @override |
- void registerStaticInvocation(Element element) { |
- if (_staticUses == null) { |
- _staticUses = new Setlet<Element>(); |
- _staticUses.addAll(worldImpact.staticUses); |
- } |
- _staticUses.add(element); |
- } |
- |
- @override |
- Iterable<LocalFunctionElement> get closures => worldImpact.closures; |
-} |
- |
// TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`. |
abstract class Resolution { |
Parsing get parsing; |
@@ -408,9 +145,6 @@ abstract class Resolution { |
void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation); |
FunctionSignature resolveSignature(FunctionElement function); |
DartType resolveTypeAnnotation(Element element, TypeAnnotation node); |
- |
- bool hasBeenResolved(Element element); |
- ResolutionWorldImpact analyzeElement(Element element); |
} |
// TODO(johnniwinther): Rename to `Parser` or `ParsingContext`. |