Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(402)

Unified Diff: pkg/compiler/lib/src/resolution/members.dart

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/resolution/constructors.dart ('k') | pkg/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/resolution/members.dart
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 137edcf8569e2aff168ead149df0e559ad36e41b..91650b135bcf3689311321db8b77aaf1dbe3cf4a 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -39,6 +39,8 @@ import '../universe/selector.dart' show
Selector;
import '../universe/universe.dart' show
UniverseSelector;
+import '../universe/use.dart' show
+ StaticUse;
import 'access_semantics.dart';
import 'class_members.dart' show MembersCreator;
@@ -1033,7 +1035,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
}
// We still need to register the invocation, because we might
// call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
registry.registerSuperNoSuchMethod();
}
return computeSuperAccessSemantics(node, target);
@@ -1100,13 +1102,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
if (getterError) {
// We still need to register the invocation, because we might
// call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(getterSelector, null));
}
if (setterError) {
// We still need to register the invocation, because we might
// call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
}
if (getterError || setterError) {
@@ -1210,7 +1212,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// TODO(johnniwinther): Add information to [AccessSemantics] about
// whether it is erroneous.
if (semantics.kind == AccessKind.SUPER_METHOD) {
- registry.registerStaticUse(semantics.element.declaration);
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.element.declaration,
+ selector.callStructure));
}
// TODO(23998): Remove this when all information goes through
// the [SendStructure].
@@ -1219,7 +1224,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
} else {
ResolutionResult expressionResult = visitExpression(expression);
semantics = const DynamicAccess.expression();
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
if (expressionResult.isConstant) {
bool isValidConstant;
@@ -1382,7 +1387,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// TODO(johnniwinther): Add information to [AccessSemantics] about
// whether it is erroneous.
if (semantics.kind == AccessKind.SUPER_METHOD) {
- registry.registerStaticUse(semantics.element.declaration);
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.element.declaration,
+ selector.callStructure));
}
// TODO(23998): Remove this when all information goes through
// the [SendStructure].
@@ -1392,7 +1400,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
} else {
ResolutionResult leftResult = visitExpression(left);
ResolutionResult rightResult = visitExpression(right);
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
semantics = const DynamicAccess.expression();
if (leftResult.isConstant && rightResult.isConstant) {
@@ -1527,7 +1535,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// TODO(23998): Remove this when all information goes through the
// [SendStructure].
registry.setSelector(node, selector);
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
registry.registerSendStructure(node,
new InvokeStructure(const DynamicAccess.expression(), selector));
return const NoneResult();
@@ -1560,7 +1568,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
AccessSemantics accessSemantics = checkThisAccess(node);
if (accessSemantics == null) {
accessSemantics = const DynamicAccess.thisAccess();
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
}
registry.registerSendStructure(node,
@@ -1602,20 +1610,22 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
if (!callStructure.signatureApplies(
superMethod.functionSignature)) {
registry.registerThrowNoSuchMethod();
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
registry.registerSuperNoSuchMethod();
isIncompatibleInvoke = true;
} else {
- registry.registerStaticInvocation(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(semantics.element, callStructure));
}
break;
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
case AccessKind.SUPER_GETTER:
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.element));
selector = callStructure.callSelector;
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
break;
case AccessKind.SUPER_SETTER:
@@ -1639,12 +1649,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
case AccessKind.SUPER_METHOD:
// TODO(johnniwinther): Method this should be registered as a
// closurization.
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.superTearOff(semantics.element));
break;
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
case AccessKind.SUPER_GETTER:
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.element));
break;
case AccessKind.SUPER_SETTER:
case AccessKind.UNRESOLVED_SUPER:
@@ -2326,13 +2338,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
CallStructure callStructure =
resolveArguments(node.argumentsNode).callStructure;
selector = new Selector.call(name, callStructure);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
sendStructure = new InvokeStructure(semantics, selector);
} else {
assert(invariant(node, node.isPropertyAccess));
selector = new Selector.getter(name);
- registry.registerDynamicGetter(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
sendStructure = new GetStructure(semantics);
}
@@ -2348,10 +2360,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
SendSet node, Name name, Element element, AccessSemantics semantics) {
Selector getterSelector = new Selector.getter(name);
Selector setterSelector = new Selector.setter(name.setter);
- registry.registerDynamicSetter(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
if (node.isComplex) {
- registry.registerDynamicGetter(
+ registry.registerDynamicUse(
new UniverseSelector(getterSelector, null));
}
@@ -2472,12 +2484,12 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
CallStructure callStructure =
resolveArguments(node.argumentsNode).callStructure;
selector = new Selector.call(name, callStructure);
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
sendStructure = new InvokeStructure(semantics, selector);
} else {
assert(invariant(node, node.isPropertyAccess));
selector = new Selector.getter(name);
- registry.registerDynamicGetter(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
sendStructure = new GetStructure(semantics);
}
// TODO(23998): Remove this when all information goes through
@@ -2554,7 +2566,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
function.computeType(resolution);
if (!callStructure.signatureApplies(function.functionSignature)) {
registry.registerThrowNoSuchMethod();
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
isIncompatibleInvoke = true;
}
@@ -2564,7 +2576,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
case AccessKind.LOCAL_VARIABLE:
case AccessKind.FINAL_LOCAL_VARIABLE:
selector = callStructure.callSelector;
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
break;
default:
@@ -2727,11 +2739,12 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
method.computeType(resolution);
if (!callStructure.signatureApplies(method.functionSignature)) {
registry.registerThrowNoSuchMethod();
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
isIncompatibleInvoke = true;
} else {
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.staticInvoke(semantics.element, callStructure));
handleForeignCall(node, semantics.element, callStructure);
if (method == compiler.identicalFunction &&
argumentsResult.isValidAsConstant) {
@@ -2748,9 +2761,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
case AccessKind.TOPLEVEL_GETTER:
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.staticGet(semantics.element));
selector = callStructure.callSelector;
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(selector, null));
break;
case AccessKind.STATIC_SETTER:
@@ -2775,10 +2789,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
switch (semantics.kind) {
case AccessKind.STATIC_METHOD:
case AccessKind.TOPLEVEL_METHOD:
- // TODO(johnniwinther): Method this should be registered as a
- // closurization.
- registry.registerStaticUse(semantics.element);
- registry.registerGetOfStaticFunction(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.staticTearOff(semantics.element));
break;
case AccessKind.STATIC_FIELD:
case AccessKind.FINAL_STATIC_FIELD:
@@ -2786,7 +2798,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
case AccessKind.TOPLEVEL_GETTER:
- registry.registerStaticUse(semantics.element);
+ registry.registerStaticUse(
+ new StaticUse.staticGet(semantics.element));
break;
case AccessKind.STATIC_SETTER:
case AccessKind.TOPLEVEL_SETTER:
@@ -2845,7 +2858,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
? new StaticAccess.topLevelGetter(abstractField.getter)
: new StaticAccess.staticGetter(abstractField.getter);
}
- registry.registerStaticUse(abstractField.getter);
+ registry.registerStaticUse(
+ new StaticUse.staticGet(abstractField.getter));
} else if (node.isComplex) {
if (abstractField.getter == null) {
ErroneousElement error = reportAndCreateErroneousElement(
@@ -2859,7 +2873,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
: CompoundAccessKind.UNRESOLVED_STATIC_GETTER,
error,
abstractField.setter);
- registry.registerStaticUse(abstractField.setter);
+ registry.registerStaticUse(
+ new StaticUse.staticSet(abstractField.setter));
} else {
// `a++` or `a += b` where `a` has both a getter and a setter.
semantics = new CompoundAccessSemantics(
@@ -2868,22 +2883,24 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
: CompoundAccessKind.STATIC_GETTER_SETTER,
abstractField.getter,
abstractField.setter);
- registry.registerStaticUse(abstractField.getter);
- registry.registerStaticUse(abstractField.setter);
+ registry.registerStaticUse(
+ new StaticUse.staticGet(abstractField.getter));
+ registry.registerStaticUse(
+ new StaticUse.staticSet(abstractField.setter));
}
} else {
// `a = b` where `a` has a setter.
semantics = element.isTopLevel
? new StaticAccess.topLevelSetter(abstractField.setter)
: new StaticAccess.staticSetter(abstractField.setter);
- registry.registerStaticUse(abstractField.setter);
+ registry.registerStaticUse(
+ new StaticUse.staticSet(abstractField.setter));
}
} else {
MemberElement member = element;
// TODO(johnniwinther): Needed to provoke a parsing and with it discovery
// of parse errors to make [element] erroneous. Fix this!
member.computeType(resolution);
- registry.registerStaticUse(member);
if (member.isMalformed) {
// [member] has parse errors.
semantics = new StaticAccess.unresolved(member);
@@ -2895,7 +2912,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.registerThrowNoSuchMethod();
if (node.isComplex) {
// `a++` or `a += b` where `a` is a function.
- registry.registerGetOfStaticFunction(element);
+ registry.registerStaticUse(
+ new StaticUse.staticTearOff(element));
}
semantics = member.isTopLevel
? new StaticAccess.topLevelMethod(member)
@@ -2904,6 +2922,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// `a = b`, `a++` or `a += b` where `a` is a field.
assert(invariant(node, member.isField,
message: "Unexpected element: $member."));
+ if (node.isComplex) {
+ // `a++` or `a += b` where `a` is a field.
+ registry.registerStaticUse(new StaticUse.staticGet(member));
+ }
if (member.isFinal || member.isConst) {
ErroneousElement error = reportAndCreateErroneousElement(
node.selector, name.text,
@@ -2913,6 +2935,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
? new StaticAccess.finalTopLevelField(member)
: new StaticAccess.finalStaticField(member);
} else {
+ registry.registerStaticUse(new StaticUse.staticSet(member));
semantics = member.isTopLevel
? new StaticAccess.topLevelField(member)
: new StaticAccess.staticField(member);
@@ -3121,11 +3144,11 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(getterSelector, null));
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
@@ -3145,7 +3168,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// TODO(23998): Remove this when selectors are only accessed
// through the send structure.
registry.setSelector(node, setterSelector);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
SendStructure sendStructure = new IndexSetStructure(semantics);
@@ -3164,11 +3187,11 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(getterSelector, null));
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure =
@@ -3186,6 +3209,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
String operatorText = node.assignmentOperator.source;
Node index = node.arguments.head;
visitExpression(index);
+
AccessSemantics semantics = checkSuperAccess(node);
if (node.isPrefix || node.isPostfix) {
// `super[a]++` or `++super[a]`.
@@ -3205,15 +3229,23 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
semantics = computeSuperAccessSemanticsForSelectors(
node, getterSelector, setterSelector, isIndex: true);
- registry.registerStaticInvocation(semantics.getter);
- registry.registerStaticInvocation(semantics.setter);
+ if (!semantics.getter.isError) {
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.getter, getterSelector.callStructure));
+ }
+ if (!semantics.setter.isError) {
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
+ }
// TODO(23998): Remove these when elements are only accessed
// through the send structure.
registry.useElement(node, semantics.setter);
registry.useElement(node.selector, semantics.getter);
}
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
@@ -3241,7 +3273,11 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// TODO(23998): Remove this when selectors are only accessed
// through the send structure.
registry.setSelector(node, setterSelector);
- registry.registerStaticInvocation(semantics.setter);
+ if (!semantics.setter.isError) {
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
+ }
SendStructure sendStructure = new IndexSetStructure(semantics);
registry.registerSendStructure(node, sendStructure);
@@ -3256,8 +3292,16 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
semantics = computeSuperAccessSemanticsForSelectors(
node, getterSelector, setterSelector, isIndex: true);
- registry.registerStaticInvocation(semantics.getter);
- registry.registerStaticInvocation(semantics.setter);
+ if (!semantics.getter.isError) {
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.getter, getterSelector.callStructure));
+ }
+ if (!semantics.setter.isError) {
+ registry.registerStaticUse(
+ new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
+ }
// TODO(23998): Remove these when elements are only accessed
// through the send structure.
@@ -3271,7 +3315,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure =
@@ -3292,14 +3336,69 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
String operatorText = node.assignmentOperator.source;
Selector getterSelector = new Selector.getter(name);
Selector setterSelector = new Selector.setter(name);
+
+ void registerStaticUses(AccessSemantics semantics) {
+ switch (semantics.kind) {
+ case AccessKind.SUPER_METHOD:
+ registry.registerStaticUse(
+ new StaticUse.superTearOff(semantics.element));
+ break;
+ case AccessKind.SUPER_GETTER:
+ registry.registerStaticUse(new StaticUse.superGet(semantics.getter));
+ break;
+ case AccessKind.SUPER_SETTER:
+ registry.registerStaticUse(new StaticUse.superSet(semantics.setter));
+ break;
+ case AccessKind.SUPER_FIELD:
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.element));
+ registry.registerStaticUse(
+ new StaticUse.superSet(semantics.element));
+ break;
+ case AccessKind.SUPER_FINAL_FIELD:
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.element));
+ break;
+ case AccessKind.COMPOUND:
+ CompoundAccessSemantics compoundSemantics = semantics;
+ switch (compoundSemantics.compoundAccessKind) {
+ case CompoundAccessKind.SUPER_GETTER_SETTER:
+ case CompoundAccessKind.SUPER_GETTER_FIELD:
+ case CompoundAccessKind.SUPER_FIELD_SETTER:
+ case CompoundAccessKind.SUPER_FIELD_FIELD:
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.getter));
+ registry.registerStaticUse(
+ new StaticUse.superSet(semantics.setter));
+ break;
+ case CompoundAccessKind.SUPER_METHOD_SETTER:
+ registry.registerStaticUse(
+ new StaticUse.superSet(semantics.setter));
+ break;
+ case CompoundAccessKind.UNRESOLVED_SUPER_GETTER:
+ registry.registerStaticUse(
+ new StaticUse.superSet(semantics.setter));
+ break;
+ case CompoundAccessKind.UNRESOLVED_SUPER_SETTER:
+ registry.registerStaticUse(
+ new StaticUse.superGet(semantics.getter));
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
AccessSemantics semantics = checkSuperAccess(node);
if (node.isPrefix || node.isPostfix) {
// `super.a++` or `++super.a`.
if (semantics == null) {
semantics = computeSuperAccessSemanticsForSelectors(
node, getterSelector, setterSelector);
- registry.registerStaticInvocation(semantics.getter);
- registry.registerStaticInvocation(semantics.setter);
+ registerStaticUses(semantics);
}
return handleUpdate(node, name, semantics);
} else {
@@ -3310,7 +3409,6 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
semantics =
computeSuperAccessSemanticsForSelector(
node, setterSelector, alternateName: name);
- registry.registerStaticInvocation(semantics.setter);
switch (semantics.kind) {
case AccessKind.SUPER_FINAL_FIELD:
reporter.reportWarningMessage(
@@ -3319,7 +3417,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
{'name': name,
'superclassName': semantics.setter.enclosingClass.name});
// TODO(johnniwinther): This shouldn't be needed.
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
registry.registerSuperNoSuchMethod();
break;
@@ -3329,12 +3427,16 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
{'name': name,
'superclassName': semantics.setter.enclosingClass.name});
// TODO(johnniwinther): This shouldn't be needed.
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(setterSelector, null));
registry.registerSuperNoSuchMethod();
break;
+ case AccessKind.SUPER_FIELD:
+ case AccessKind.SUPER_SETTER:
+ registry.registerStaticUse(
+ new StaticUse.superSet(semantics.setter));
+ break;
default:
- registry.registerStaticInvocation(semantics.setter);
break;
}
}
@@ -3344,8 +3446,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
if (semantics == null) {
semantics = computeSuperAccessSemanticsForSelectors(
node, getterSelector, setterSelector);
- registry.registerStaticInvocation(semantics.getter);
- registry.registerStaticInvocation(semantics.setter);
+ registerStaticUses(semantics);
}
return handleUpdate(node, name, semantics);
}
@@ -3379,7 +3480,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.useElement(node, semantics.setter);
registry.useElement(node.selector, semantics.getter);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
@@ -3421,7 +3522,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(operatorSelector, null));
SendStructure sendStructure;
@@ -3457,29 +3558,6 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
}
}
- void registerSend(Selector selector, Element target) {
- if (target == null || target.isInstanceMember) {
- if (selector.isGetter) {
- registry.registerDynamicGetter(
- new UniverseSelector(selector, null));
- } else if (selector.isSetter) {
- registry.registerDynamicSetter(
- new UniverseSelector(selector, null));
- } else {
- registry.registerDynamicInvocation(
- new UniverseSelector(selector, null));
- }
- } else if (Elements.isStaticOrTopLevel(target)) {
- // Avoid registration of type variables since they are not analyzable but
- // instead resolved through their enclosing type declaration.
- if (!target.isTypeVariable) {
- // [target] might be the implementation element and only declaration
- // elements may be registered.
- registry.registerStaticUse(target.declaration);
- }
- }
- }
-
ConstantResult visitLiteralInt(LiteralInt node) {
registry.registerInstantiatedType(coreTypes.intType);
ConstantExpression constant = new IntConstantExpression(node.value);
@@ -3668,7 +3746,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
compiler.resolver.resolveRedirectionChain(constructor, node);
});
- registry.registerStaticUse(redirectionTarget);
+ registry.registerStaticUse(
+ new StaticUse.constructorRedirect(redirectionTarget));
// TODO(johnniwinther): Register the effective target type instead.
registry.registerInstantiatedType(
redirectionTarget.enclosingClass.thisType
@@ -3812,7 +3891,9 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
// [constructor] might be the implementation element
// and only declaration elements may be registered.
- registry.registerStaticUse(constructor.declaration);
+ registry.registerStaticUse(
+ new StaticUse.constructorInvoke(
+ constructor.declaration, callSelector.callStructure));
ClassElement cls = constructor.enclosingClass;
if (cls.isEnumClass && currentClass != cls) {
reporter.reportErrorMessage(
@@ -4168,16 +4249,16 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
}
registerImplicitInvocation(Selector selector) {
- registry.registerDynamicInvocation(new UniverseSelector(selector, null));
+ registry.registerDynamicUse(new UniverseSelector(selector, null));
}
ResolutionResult visitAsyncForIn(AsyncForIn node) {
registry.registerAsyncForIn(node);
registry.setCurrentSelector(node, Selectors.current);
- registry.registerDynamicGetter(
+ registry.registerDynamicUse(
new UniverseSelector(Selectors.current, null));
registry.setMoveNextSelector(node, Selectors.moveNext);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(Selectors.moveNext, null));
visit(node.expression);
@@ -4191,13 +4272,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
ResolutionResult visitSyncForIn(SyncForIn node) {
registry.registerSyncForIn(node);
registry.setIteratorSelector(node, Selectors.iterator);
- registry.registerDynamicGetter(
+ registry.registerDynamicUse(
new UniverseSelector(Selectors.iterator, null));
registry.setCurrentSelector(node, Selectors.current);
- registry.registerDynamicGetter(
+ registry.registerDynamicUse(
new UniverseSelector(Selectors.current, null));
registry.setMoveNextSelector(node, Selectors.moveNext);
- registry.registerDynamicInvocation(
+ registry.registerDynamicUse(
new UniverseSelector(Selectors.moveNext, null));
visit(node.expression);
@@ -4260,7 +4341,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
}
if (loopVariableSelector != null) {
registry.setSelector(declaration, loopVariableSelector);
- registerSend(loopVariableSelector, loopVariable);
+ if (loopVariable == null || loopVariable.isInstanceMember) {
+ registry.registerDynamicUse(
+ new UniverseSelector(loopVariableSelector, null));
+ } else if (loopVariable.isStatic || loopVariable.isTopLevel) {
+ registry.registerStaticUse(
+ new StaticUse.staticSet(loopVariable.declaration));
+ }
} else {
// The selector may only be null if we reported an error.
assert(invariant(declaration, compiler.compilationFailed));
« no previous file with comments | « pkg/compiler/lib/src/resolution/constructors.dart ('k') | pkg/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698