Chromium Code Reviews| 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 d89474404cc791185bef9ad3c99fcc2363bef8db..db6f1dd5af0b4f0dcc694bd1fb16e6d6b68ce016 100644 |
| --- a/pkg/compiler/lib/src/resolution/members.dart |
| +++ b/pkg/compiler/lib/src/resolution/members.dart |
| @@ -42,7 +42,6 @@ import '../util/util.dart' show |
| import '../universe/universe.dart' show |
| CallStructure, |
| Selector, |
| - SelectorKind, |
| UniverseSelector; |
| import 'access_semantics.dart'; |
| @@ -666,7 +665,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| if (op == null) { |
| // Unsupported operator. An error has been reported during parsing. |
| return new Selector.call( |
| - new Name(source, library), node.argumentsNode.slowLength(), []); |
| + new Name(source, library), |
| + new CallStructure.unnamed(node.argumentsNode.slowLength())); |
| } |
| return node.arguments.isEmpty |
| ? new Selector.unaryOperator(op) |
| @@ -705,7 +705,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| // If we're invoking a closure, we do not have an identifier. |
| return (identifier == null) |
| ? new Selector.callClosure(arity, named) |
| - : new Selector.call(new Name(identifier.source, library), arity, named); |
| + : new Selector.call(new Name(identifier.source, library), |
| + new CallStructure(arity, named)); |
| } |
| Selector resolveSelector(Send node, Element element) { |
| @@ -1209,7 +1210,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| } |
| } else { |
| ResolutionResult expressionResult = visitExpression(expression); |
| - semantics = const DynamicAccess.dynamicProperty(); |
| + semantics = const DynamicAccess.expression(); |
| registry.registerDynamicInvocation(new UniverseSelector(selector, null)); |
| if (expressionResult.isConstant) { |
| @@ -1254,8 +1255,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| Node expression = node.receiver; |
| ResolutionResult result = visitExpression(expression); |
| - registry.registerSendStructure(node, |
| - new NotStructure(const DynamicAccess.dynamicProperty())); |
| + registry.registerSendStructure(node, const NotStructure()); |
| if (result.isConstant) { |
| ConstantExpression expressionConstant = result.constant; |
| @@ -1385,7 +1385,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| ResolutionResult leftResult = visitExpression(left); |
| ResolutionResult rightResult = visitExpression(right); |
| registry.registerDynamicInvocation(new UniverseSelector(selector, null)); |
| - semantics = const DynamicAccess.dynamicProperty(); |
| + semantics = const DynamicAccess.expression(); |
| if (leftResult.isConstant && rightResult.isConstant) { |
| bool isValidConstant; |
| @@ -1554,7 +1554,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| /// Handle access of a property of [name] on `this`, like `this.name` and |
| /// `this.name()`, or `name` and `name()` in instance context. |
| ResolutionResult handleThisPropertyAccess(Send node, Name name) { |
| - AccessSemantics semantics = const DynamicAccess.thisProperty(); |
| + AccessSemantics semantics = new DynamicAccess.thisProperty(name); |
| return handleDynamicAccessSemantics(node, name, semantics); |
| } |
| @@ -1562,7 +1562,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| /// `this.name++`, or `name = b` and `name++` in instance context. |
| ResolutionResult handleThisPropertyUpdate( |
| SendSet node, Name name, Element element) { |
| - AccessSemantics semantics = const DynamicAccess.thisProperty(); |
| + AccessSemantics semantics = new DynamicAccess.thisProperty(name); |
| return handleDynamicUpdateSemantics(node, name, element, semantics); |
| } |
| @@ -1598,13 +1598,12 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| ResolutionResult handleSuperPropertyAccess(Send node, Name name) { |
| Element target; |
| Selector selector; |
| - CallStructure callStructure = CallStructure.NO_ARGS; |
| + CallStructure callStructure; |
| if (node.isCall) { |
| - callStructure = |
| - resolveArguments(node.argumentsNode).callStructure; |
| - selector = new Selector(SelectorKind.CALL, name, callStructure); |
| + callStructure = resolveArguments(node.argumentsNode).callStructure; |
| + selector = new Selector.call(name, callStructure); |
| } else { |
| - selector = new Selector(SelectorKind.GETTER, name, callStructure); |
| + selector = new Selector.getter(name); |
| } |
| AccessSemantics semantics = checkSuperAccess(node); |
| if (semantics == null) { |
| @@ -1674,8 +1673,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| internalError(node, "Unexpected super property access $semantics."); |
| break; |
| } |
| - registry.registerSendStructure(node, |
| - new GetStructure(semantics, selector)); |
| + registry.registerSendStructure(node, new GetStructure(semantics)); |
| } |
| target = semantics.element; |
| @@ -1969,9 +1967,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| new InvokeStructure(semantics, selector)); |
| } else { |
| // TODO(johnniwinther): Avoid the need for a [Selector] here. |
|
floitsch
2015/08/24 14:15:13
remove todo.
|
| - registry.registerSendStructure(node, |
| - new GetStructure(semantics, |
| - new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS))); |
| + registry.registerSendStructure(node, new GetStructure(semantics)); |
| } |
| return const NoneResult(); |
| } |
| @@ -2050,9 +2046,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| analyzeConstantDeferred(node, enforceConst: false); |
| // TODO(johnniwinther): Avoid the need for a [Selector] here. |
|
floitsch
2015/08/24 14:15:13
ditto.
|
| - registry.registerSendStructure(node, |
| - new GetStructure(semantics, |
| - new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS))); |
| + registry.registerSendStructure(node, new GetStructure(semantics)); |
| return new ConstantResult(node, semantics.constant); |
| } |
| } |
| @@ -2342,17 +2336,16 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| if (node.isCall) { |
| CallStructure callStructure = |
| resolveArguments(node.argumentsNode).callStructure; |
| - selector = new Selector(SelectorKind.CALL, name, callStructure); |
| + selector = new Selector.call(name, callStructure); |
| registry.registerDynamicInvocation( |
| new UniverseSelector(selector, null)); |
| sendStructure = new InvokeStructure(semantics, selector); |
| } else { |
| assert(invariant(node, node.isPropertyAccess)); |
| - selector = new Selector( |
| - SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| + selector = new Selector.getter(name); |
| registry.registerDynamicGetter( |
| new UniverseSelector(selector, null)); |
| - sendStructure = new GetStructure(semantics, selector); |
| + sendStructure = new GetStructure(semantics); |
| } |
| registry.registerSendStructure(node, sendStructure); |
| // TODO(23998): Remove this when all information goes through |
| @@ -2364,10 +2357,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| /// Handle dynamic update of [semantics]. |
| ResolutionResult handleDynamicUpdateSemantics( |
| SendSet node, Name name, Element element, AccessSemantics semantics) { |
| - Selector getterSelector = |
| - new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| - Selector setterSelector = |
| - new Selector(SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG); |
| + Selector getterSelector = new Selector.getter(name); |
| + Selector setterSelector = new Selector.setter(name.setter); |
| registry.registerDynamicSetter( |
| new UniverseSelector(setterSelector, null)); |
| if (node.isComplex) { |
| @@ -2430,13 +2421,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| return handlePrefixSend(node, name, result); |
| } else if (node.isConditional) { |
| return handleDynamicAccessSemantics( |
| - node, name, const DynamicAccess.ifNotNullProperty()); |
| + node, name, new DynamicAccess.ifNotNullProperty(name)); |
| } else { |
| // Handle dynamic property access, like `a.b` or `a.b()` where `a` is not |
| // a prefix or class. |
| // TODO(johnniwinther): Use the `element` of [result]. |
| return handleDynamicAccessSemantics( |
| - node, name, const DynamicAccess.dynamicProperty()); |
| + node, name, new DynamicAccess.dynamicProperty(name)); |
| } |
| } |
| @@ -2463,13 +2454,13 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| return handlePrefixSendSet(node, name, result); |
| } else if (node.isConditional) { |
| return handleDynamicUpdateSemantics( |
| - node, name, null, const DynamicAccess.ifNotNullProperty()); |
| + node, name, null, new DynamicAccess.ifNotNullProperty(name)); |
| } else { |
| // Handle dynamic property access, like `a.b = c`, `a.b++` or `a.b += c` |
| // where `a` is not a prefix or class. |
| // TODO(johnniwinther): Use the `element` of [result]. |
| return handleDynamicUpdateSemantics( |
| - node, name, null, const DynamicAccess.dynamicProperty()); |
| + node, name, null, new DynamicAccess.dynamicProperty(name)); |
| } |
| } |
| @@ -2490,17 +2481,14 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| if (node.isCall) { |
| CallStructure callStructure = |
| resolveArguments(node.argumentsNode).callStructure; |
| - selector = new Selector(SelectorKind.CALL, name, callStructure); |
| - registry.registerDynamicInvocation( |
| - new UniverseSelector(selector, null)); |
| + selector = new Selector.call(name, callStructure); |
| + registry.registerDynamicInvocation(new UniverseSelector(selector, null)); |
| sendStructure = new InvokeStructure(semantics, selector); |
| } else { |
| assert(invariant(node, node.isPropertyAccess)); |
| - selector = new Selector( |
| - SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| - registry.registerDynamicGetter( |
| - new UniverseSelector(selector, null)); |
| - sendStructure = new GetStructure(semantics, selector); |
| + selector = new Selector.getter(name); |
| + registry.registerDynamicGetter(new UniverseSelector(selector, null)); |
| + sendStructure = new GetStructure(semantics); |
| } |
| // TODO(23998): Remove this when all information goes through |
| // the [SendStructure]. |
| @@ -2567,7 +2555,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| if (node.isCall) { |
| CallStructure callStructure = |
| resolveArguments(node.argumentsNode).callStructure; |
| - selector = new Selector(SelectorKind.CALL, name, callStructure); |
| + selector = new Selector.call(name, callStructure); |
| bool isIncompatibleInvoke = false; |
| switch (semantics.kind) { |
| case AccessKind.LOCAL_FUNCTION: |
| @@ -2639,9 +2627,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| "Unexpected local access $semantics."); |
| break; |
| } |
| - selector = new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| - registry.registerSendStructure(node, |
| - new GetStructure(semantics, selector)); |
| + selector = new Selector.getter(name); |
| + registry.registerSendStructure(node, new GetStructure(semantics)); |
| } |
| // TODO(23998): Remove these when all information goes through |
| @@ -2739,7 +2726,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| ArgumentsResult argumentsResult = |
| resolveArguments(node.argumentsNode); |
| CallStructure callStructure = argumentsResult.callStructure; |
| - selector = new Selector(SelectorKind.CALL, name, callStructure); |
| + selector = new Selector.call(name, callStructure); |
| bool isIncompatibleInvoke = false; |
| switch (semantics.kind) { |
| @@ -2793,7 +2780,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| ? new IncompatibleInvokeStructure(semantics, selector) |
| : new InvokeStructure(semantics, selector)); |
| } else { |
| - selector = new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| + selector = new Selector.getter(name); |
| switch (semantics.kind) { |
| case AccessKind.STATIC_METHOD: |
| case AccessKind.TOPLEVEL_METHOD: |
| @@ -2823,8 +2810,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| "Unexpected statically resolved access $semantics."); |
| break; |
| } |
| - registry.registerSendStructure(node, |
| - new GetStructure(semantics, selector)); |
| + registry.registerSendStructure(node, new GetStructure(semantics)); |
| if (member.isConst) { |
| FieldElement field = member; |
| result = new ConstantResult( |
| @@ -3148,10 +3134,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| Node index = node.arguments.head; |
| visitExpression(receiver); |
| visitExpression(index); |
| + AccessSemantics semantics = const DynamicAccess.expression(); |
| if (node.isPrefix || node.isPostfix) { |
| // `a[b]++` or `++a[b]`. |
| IncDecOperator operator = IncDecOperator.parse(operatorText); |
| - AccessSemantics semantics = const DynamicAccess.dynamicProperty(); |
| Selector getterSelector = new Selector.index(); |
| Selector setterSelector = new Selector.indexSet(); |
| Selector operatorSelector = |
| @@ -3171,10 +3157,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| new UniverseSelector(operatorSelector, null)); |
| SendStructure sendStructure = node.isPrefix |
| - ? new IndexPrefixStructure( |
| - semantics, operator, getterSelector, setterSelector) |
| - : new IndexPostfixStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + ? new IndexPrefixStructure(semantics, operator) |
| + : new IndexPostfixStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } else { |
| @@ -3184,7 +3168,6 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| AssignmentOperator operator = AssignmentOperator.parse(operatorText); |
| if (operator.kind == AssignmentOperatorKind.ASSIGN) { |
| // `a[b] = c`. |
| - AccessSemantics semantics = const DynamicAccess.dynamicProperty(); |
| Selector setterSelector = new Selector.indexSet(); |
| // TODO(23998): Remove this when selectors are only accessed |
| @@ -3193,13 +3176,11 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.registerDynamicInvocation( |
| new UniverseSelector(setterSelector, null)); |
| - SendStructure sendStructure = |
| - new IndexSetStructure(semantics, setterSelector); |
| + SendStructure sendStructure = new IndexSetStructure(semantics); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } else { |
| // `a[b] += c`. |
| - AccessSemantics semantics = const DynamicAccess.dynamicProperty(); |
| Selector getterSelector = new Selector.index(); |
| Selector setterSelector = new Selector.indexSet(); |
| Selector operatorSelector = |
| @@ -3218,8 +3199,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.registerDynamicInvocation( |
| new UniverseSelector(operatorSelector, null)); |
| - SendStructure sendStructure = new CompoundIndexSetStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + SendStructure sendStructure = |
| + new CompoundIndexSetStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } |
| @@ -3264,10 +3245,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| new UniverseSelector(operatorSelector, null)); |
| SendStructure sendStructure = node.isPrefix |
| - ? new IndexPrefixStructure( |
| - semantics, operator, getterSelector, setterSelector) |
| - : new IndexPostfixStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + ? new IndexPrefixStructure(semantics, operator) |
| + : new IndexPostfixStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } else { |
| @@ -3292,8 +3271,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.setSelector(node, setterSelector); |
| registry.registerStaticInvocation(semantics.setter); |
| - SendStructure sendStructure = |
| - new IndexSetStructure(semantics, setterSelector); |
| + SendStructure sendStructure = new IndexSetStructure(semantics); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } else { |
| @@ -3324,8 +3302,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.registerDynamicInvocation( |
| new UniverseSelector(operatorSelector, null)); |
| - SendStructure sendStructure = new CompoundIndexSetStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + SendStructure sendStructure = |
| + new CompoundIndexSetStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| return const NoneResult(); |
| } |
| @@ -3340,10 +3318,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| String text = selector.source; |
| Name name = new Name(text, enclosingElement.library); |
| String operatorText = node.assignmentOperator.source; |
| - Selector getterSelector = new Selector( |
| - SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| - Selector setterSelector = new Selector( |
| - SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG); |
| + Selector getterSelector = new Selector.getter(name); |
| + Selector setterSelector = new Selector.setter(name); |
| AccessSemantics semantics = checkSuperAccess(node); |
| if (node.isPrefix || node.isPostfix) { |
| // `super.a++` or `++super.a`. |
| @@ -3412,10 +3388,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| AccessSemantics semantics) { |
| SendStructure sendStructure; |
| String operatorText = node.assignmentOperator.source; |
| - Selector getterSelector = |
| - new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS); |
| - Selector setterSelector = |
| - new Selector(SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG); |
| + Selector getterSelector = new Selector.getter(name); |
| + Selector setterSelector = new Selector.setter(name); |
| if (node.isPrefix || node.isPostfix) { |
| // `e++` or `++e`. |
| IncDecOperator operator = IncDecOperator.parse(operatorText); |
| @@ -3437,10 +3411,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| new UniverseSelector(operatorSelector, null)); |
| SendStructure sendStructure = node.isPrefix |
| - ? new PrefixStructure( |
| - semantics, operator, getterSelector, setterSelector) |
| - : new PostfixStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + ? new PrefixStructure(semantics, operator) |
| + : new PostfixStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| } else { |
| Node rhs = node.arguments.head; |
| @@ -3458,8 +3430,7 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| // through the send structure. |
| registry.setSelector(node, setterSelector); |
| - SendStructure sendStructure = |
| - new SetStructure(semantics, setterSelector); |
| + SendStructure sendStructure = new SetStructure(semantics); |
| registry.registerSendStructure(node, sendStructure); |
| } else { |
| // `e1 += e2`. |
| @@ -3480,8 +3451,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
| registry.registerDynamicInvocation( |
| new UniverseSelector(operatorSelector, null)); |
| - SendStructure sendStructure = new CompoundStructure( |
| - semantics, operator, getterSelector, setterSelector); |
| + SendStructure sendStructure = |
| + new CompoundStructure(semantics, operator); |
| registry.registerSendStructure(node, sendStructure); |
| } |
| } |