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

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

Issue 1313323002: Add visitor methods specific to ??= to SemanticSendVisitor. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 4 months 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/semantic_visitor_mixins.dart ('k') | pkg/compiler/lib/src/ssa/builder.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..f2850cee5998fc60dcd358465e07dc2463a35921 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 an if-null assignment. For instance
+/// `a ??= b`.
+class SetIfNullStructure<R, A> implements SendStructure<R, A> {
+ /// The target of the if-null 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> {
« no previous file with comments | « pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart ('k') | pkg/compiler/lib/src/ssa/builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698