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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2935783003: Add type inference for assignments to `super[...]` (Closed)
Patch Set: Created 3 years, 6 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
Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 5c2f72a163237e29b82aea3123375b564fdc4437..0bec829e7815227f4f79423f37882f640c81fcb2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -366,6 +366,40 @@ abstract class KernelComplexAssignment extends Expression
}
}
+/// Abstract shadow object representing a complex assignment involving a
+/// receiver.
+abstract class KernelComplexAssignmentWithReceiver
+ extends KernelComplexAssignment {
+ /// The receiver of the assignment target (e.g. `a` in `a[b] = c`).
+ final Expression receiver;
+
+ /// Indicates whether this assignment uses `super`.
+ final bool isSuper;
+
+ KernelComplexAssignmentWithReceiver(
+ this.receiver, Expression rhs, this.isSuper)
+ : super(rhs);
+
+ @override
+ List<String> _getToStringParts() {
+ var parts = super._getToStringParts();
+ if (receiver != null) parts.add('receiver=$receiver');
+ if (isSuper) parts.add('isSuper=true');
+ return parts;
+ }
+
+ DartType _inferReceiver(KernelTypeInferrer inferrer) {
+ if (receiver != null) {
+ return inferrer.inferExpression(receiver, null, true);
+ } else if (isSuper) {
+ return inferrer.classHierarchy.getTypeAsInstanceOf(
+ inferrer.thisType, inferrer.thisType.classNode.supertype.classNode);
+ } else {
+ return inferrer.thisType;
+ }
+ }
+}
+
/// Concrete shadow object representing a conditional expression in kernel form.
/// Shadow object for [ConditionalExpression].
class KernelConditionalExpression extends ConditionalExpression
@@ -911,19 +945,17 @@ class KernelIfStatement extends IfStatement implements KernelStatement {
/// Concrete shadow object representing an assignment to a target of the form
/// `a[b]`.
-class KernelIndexAssign extends KernelComplexAssignment {
- /// The receiver of the assignment target (e.g. `a` in `a[b] = c`).
- Expression receiver;
-
+class KernelIndexAssign extends KernelComplexAssignmentWithReceiver {
/// In an assignment to an index expression, the index expression.
Expression index;
- KernelIndexAssign(this.receiver, this.index, Expression rhs) : super(rhs);
+ KernelIndexAssign(Expression receiver, this.index, Expression rhs,
+ {bool isSuper: false})
+ : super(receiver, rhs, isSuper);
@override
List<String> _getToStringParts() {
var parts = super._getToStringParts();
- if (receiver != null) parts.add('receiver=$receiver');
if (index != null) parts.add('index=$index');
return parts;
}
@@ -935,7 +967,7 @@ class KernelIndexAssign extends KernelComplexAssignment {
typeNeeded;
// TODO(paulberry): record the appropriate types on let variables and
// conditional expressions.
- var receiverType = inferrer.inferExpression(receiver, null, true);
+ var receiverType = _inferReceiver(inferrer);
if (read != null) {
inferrer.findMethodInvocationMember(receiverType, read, silent: true);
}
@@ -1298,25 +1330,18 @@ class KernelNullLiteral extends NullLiteral implements KernelExpression {
}
/// Concrete shadow object representing an assignment to a property.
-class KernelPropertyAssign extends KernelComplexAssignment {
- /// The receiver of the assignment target (e.g. `a` in `a.b = c`), or `null`
- /// if there is no receiver (implicit `this`).
- Expression receiver;
-
+class KernelPropertyAssign extends KernelComplexAssignmentWithReceiver {
/// If this assignment uses null-aware access (`?.`), the conditional
/// expression that guards the access; otherwise `null`.
Expression nullAwareGuard;
- /// Indicates whether this assignment uses `super`.
- final bool isSuper;
-
- KernelPropertyAssign(this.receiver, Expression rhs, {this.isSuper: false})
- : super(rhs);
+ KernelPropertyAssign(Expression receiver, Expression rhs,
+ {bool isSuper: false})
+ : super(receiver, rhs, isSuper);
@override
List<String> _getToStringParts() {
var parts = super._getToStringParts();
- if (receiver != null) parts.add('receiver=$receiver');
if (nullAwareGuard != null) parts.add('nullAwareGuard=$nullAwareGuard');
return parts;
}
@@ -1329,15 +1354,7 @@ class KernelPropertyAssign extends KernelComplexAssignment {
typeNeeded;
// TODO(paulberry): record the appropriate types on let variables and
// conditional expressions.
- DartType receiverType;
- if (receiver != null) {
- receiverType = inferrer.inferExpression(receiver, null, true);
- } else if (isSuper) {
- receiverType = inferrer.classHierarchy.getTypeAsInstanceOf(
- inferrer.thisType, inferrer.thisType.classNode.supertype.classNode);
- } else {
- receiverType = inferrer.thisType;
- }
+ var receiverType = _inferReceiver(inferrer);
if (read != null) {
inferrer.findPropertyGetMember(receiverType, read, silent: true);
}

Powered by Google App Engine
This is Rietveld 408576698