Chromium Code Reviews| Index: pkg/compiler/lib/src/resolution/send_structure.dart |
| diff --git a/pkg/compiler/lib/src/resolution/send_structure.dart b/pkg/compiler/lib/src/resolution/send_structure.dart |
| index 05f9c1fa56c051d31a92091addf3e25f4808ef64..415856ca45f28a93a3a3143d523877baaeefb590 100644 |
| --- a/pkg/compiler/lib/src/resolution/send_structure.dart |
| +++ b/pkg/compiler/lib/src/resolution/send_structure.dart |
| @@ -1562,8 +1562,13 @@ class CompoundStructure<R, A> implements SendStructure<R, A> { |
| node.arguments.single, |
| arg); |
| case CompoundAccessKind.SUPER_FIELD_FIELD: |
| - // TODO(johnniwinther): Handle this. |
| - break; |
| + return visitor.visitSuperFieldFieldCompound( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + operator, |
| + node.arguments.single, |
| + arg); |
| case CompoundAccessKind.SUPER_GETTER_SETTER: |
| return visitor.visitSuperGetterSetterCompound( |
| node, |
| @@ -1622,6 +1627,307 @@ class CompoundStructure<R, A> implements SendStructure<R, A> { |
| String toString() => 'compound($operator,$semantics)'; |
| } |
| +/// The structure for a [Send] that is a compound assignment. For instance |
|
Siggi Cherem (dart-lang)
2015/08/26 21:25:01
same comment Karl had in the other file (s/compoun
Johnni Winther
2015/08/28 08:12:12
Done.
|
| +/// `a += b`. |
| +class SetIfNullStructure<R, A> implements SendStructure<R, A> { |
| + /// The target of the compound assignment, i.e. the left-hand side. |
| + final AccessSemantics semantics; |
| + |
| + SetIfNullStructure(this.semantics); |
| + |
| + R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { |
| + switch (semantics.kind) { |
| + case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
| + return visitor.visitIfNotNullDynamicPropertySetIfNull( |
| + node, |
| + node.receiver, |
| + semantics.name, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.DYNAMIC_PROPERTY: |
| + return visitor.visitDynamicPropertySetIfNull( |
| + node, |
| + node.receiver, |
| + semantics.name, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.LOCAL_FUNCTION: |
| + return visitor.visitLocalFunctionSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.LOCAL_VARIABLE: |
| + return visitor.visitLocalVariableSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.FINAL_LOCAL_VARIABLE: |
| + return visitor.visitFinalLocalVariableSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.PARAMETER: |
| + return visitor.visitParameterSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.FINAL_PARAMETER: |
| + return visitor.visitFinalParameterSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.STATIC_FIELD: |
| + return visitor.visitStaticFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.FINAL_STATIC_FIELD: |
| + return visitor.visitFinalStaticFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.STATIC_METHOD: |
| + return visitor.visitStaticMethodSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.STATIC_GETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.STATIC_SETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.TOPLEVEL_FIELD: |
| + return visitor.visitTopLevelFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.FINAL_TOPLEVEL_FIELD: |
| + return visitor.visitFinalTopLevelFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.TOPLEVEL_METHOD: |
| + return visitor.visitTopLevelMethodSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.TOPLEVEL_GETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.TOPLEVEL_SETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.CLASS_TYPE_LITERAL: |
| + return visitor.visitClassTypeLiteralSetIfNull( |
| + node, |
| + semantics.constant, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.TYPEDEF_TYPE_LITERAL: |
| + return visitor.visitTypedefTypeLiteralSetIfNull( |
| + node, |
| + semantics.constant, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.DYNAMIC_TYPE_LITERAL: |
| + return visitor.visitDynamicTypeLiteralSetIfNull( |
| + node, |
| + semantics.constant, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
| + return visitor.visitTypeVariableTypeLiteralSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.EXPRESSION: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.THIS: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.THIS_PROPERTY: |
| + return visitor.visitThisPropertySetIfNull( |
| + node, |
| + semantics.name, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.SUPER_FIELD: |
| + return visitor.visitSuperFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.SUPER_FINAL_FIELD: |
| + return visitor.visitFinalSuperFieldSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.SUPER_METHOD: |
| + return visitor.visitSuperMethodSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.SUPER_GETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.SUPER_SETTER: |
| + // This is not a valid case. |
| + break; |
| + case AccessKind.CONSTANT: |
| + // TODO(johnniwinther): Should this be a valid case? |
| + break; |
| + case AccessKind.UNRESOLVED_SUPER: |
| + return visitor.visitUnresolvedSuperSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.UNRESOLVED: |
| + return visitor.visitUnresolvedSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.INVALID: |
| + return visitor.errorInvalidSetIfNull( |
| + node, |
| + semantics.element, |
| + node.arguments.single, |
| + arg); |
| + case AccessKind.COMPOUND: |
| + CompoundAccessSemantics compoundSemantics = semantics; |
| + switch (compoundSemantics.compoundAccessKind) { |
| + case CompoundAccessKind.STATIC_GETTER_SETTER: |
| + return visitor.visitStaticGetterSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.STATIC_METHOD_SETTER: |
| + return visitor.visitStaticMethodSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_STATIC_GETTER: |
| + return visitor.visitUnresolvedStaticGetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_STATIC_SETTER: |
| + return visitor.visitUnresolvedStaticSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.TOPLEVEL_GETTER_SETTER: |
| + return visitor.visitTopLevelGetterSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.TOPLEVEL_METHOD_SETTER: |
| + return visitor.visitTopLevelMethodSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_TOPLEVEL_GETTER: |
| + return visitor.visitUnresolvedTopLevelGetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_TOPLEVEL_SETTER: |
| + return visitor.visitUnresolvedTopLevelSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.SUPER_FIELD_FIELD: |
| + return visitor.visitSuperFieldFieldSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.SUPER_GETTER_SETTER: |
| + return visitor.visitSuperGetterSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.SUPER_GETTER_FIELD: |
| + return visitor.visitSuperGetterFieldSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.SUPER_METHOD_SETTER: |
| + return visitor.visitSuperMethodSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.SUPER_FIELD_SETTER: |
| + return visitor.visitSuperFieldSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: |
| + return visitor.visitUnresolvedSuperGetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
| + return visitor.visitUnresolvedSuperSetterSetIfNull( |
| + node, |
| + compoundSemantics.getter, |
| + compoundSemantics.setter, |
| + node.arguments.single, |
| + arg); |
| + } |
| + break; |
| + } |
| + throw new SpannableAssertionFailure(node, |
| + "Invalid if-null assigment: ${semantics}"); |
| + } |
| + |
| + String toString() => 'ifNull($semantics)'; |
| +} |
| + |
| /// The structure for a [Send] that is a compound assignment on the index |
| /// operator. For instance `a[b] += c`. |
| class CompoundIndexSetStructure<R, A> implements SendStructure<R, A> { |