| 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 4aab9826dd637415df5913a866d8b2e556b3063c..1293511b19a8f154d576f5671d16478e508c4ee5 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
|
| @@ -272,11 +272,7 @@ class KernelCascadeExpression extends Let implements KernelExpression {
|
| ///
|
| /// TODO(paulberry): once we know exactly what constitutes a "complex
|
| /// assignment", document it here.
|
| -abstract class KernelComplexAssignment extends Expression
|
| - implements KernelExpression {
|
| - /// The full desugared assignment expression
|
| - Expression desugared;
|
| -
|
| +abstract class KernelComplexAssignment extends KernelSyntheticExpression {
|
| /// In a compound assignment, the expression that reads the old value, or
|
| /// `null` if this is not a compound assignment.
|
| Expression read;
|
| @@ -311,34 +307,13 @@ abstract class KernelComplexAssignment extends Expression
|
| /// pre-decrement.
|
| bool isPreIncDec = false;
|
|
|
| - KernelComplexAssignment(this.rhs);
|
| -
|
| - void set parent(TreeNode node) {
|
| - super.parent = node;
|
| - desugared?.parent = node;
|
| - }
|
| -
|
| - @override
|
| - accept(ExpressionVisitor v) => desugared.accept(v);
|
| -
|
| - @override
|
| - accept1(ExpressionVisitor1 v, arg) => desugared.accept1(v, arg);
|
| -
|
| - @override
|
| - DartType getStaticType(TypeEnvironment types) =>
|
| - desugared.getStaticType(types);
|
| + KernelComplexAssignment(this.rhs) : super(null);
|
|
|
| String toString() {
|
| var parts = _getToStringParts();
|
| return '${runtimeType}(${parts.join(', ')})';
|
| }
|
|
|
| - @override
|
| - transformChildren(Transformer v) => desugared.transformChildren(v);
|
| -
|
| - @override
|
| - visitChildren(Visitor v) => desugared.visitChildren(v);
|
| -
|
| @override
|
| void _collectDependencies(KernelDependencyCollector collector) {
|
| // Assignment expressions are not immediately evident expressions.
|
| @@ -1903,6 +1878,90 @@ class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression {
|
| }
|
| }
|
|
|
| +/// Shadow object for expressions that are introduced by the front end as part
|
| +/// of desugaring or the handling of error conditions.
|
| +///
|
| +/// By default, type inference skips these expressions entirely. Some derived
|
| +/// classes have type inference behaviors.
|
| +///
|
| +/// Visitors skip over objects of this type, so it is not included in serialized
|
| +/// output.
|
| +class KernelSyntheticExpression extends Expression implements KernelExpression {
|
| + /// The desugared kernel representation of this synthetic expression.
|
| + Expression desugared;
|
| +
|
| + KernelSyntheticExpression(this.desugared);
|
| +
|
| + @override
|
| + void set parent(TreeNode node) {
|
| + super.parent = node;
|
| + desugared?.parent = node;
|
| + }
|
| +
|
| + @override
|
| + accept(ExpressionVisitor v) => desugared.accept(v);
|
| +
|
| + @override
|
| + accept1(ExpressionVisitor1 v, arg) => desugared.accept1(v, arg);
|
| +
|
| + @override
|
| + DartType getStaticType(TypeEnvironment types) =>
|
| + desugared.getStaticType(types);
|
| +
|
| + @override
|
| + transformChildren(Transformer v) => desugared.transformChildren(v);
|
| +
|
| + @override
|
| + visitChildren(Visitor v) => desugared.visitChildren(v);
|
| +
|
| + @override
|
| + _collectDependencies(KernelDependencyCollector collector) {
|
| + // No inference dependencies.
|
| + }
|
| +
|
| + @override
|
| + DartType _inferExpression(
|
| + KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
|
| + return typeNeeded ? const DynamicType() : null;
|
| + }
|
| +}
|
| +
|
| +/// Shadow object for statements that are introduced by the front end as part
|
| +/// of desugaring or the handling of error conditions.
|
| +///
|
| +/// By default, type inference skips these statements entirely. Some derived
|
| +/// classes may have type inference behaviors.
|
| +///
|
| +/// Visitors skip over objects of this type, so it is not included in serialized
|
| +/// output.
|
| +class KernelSyntheticStatement extends Statement implements KernelStatement {
|
| + /// The desugared kernel representation of this synthetic statement.
|
| + Statement desugared;
|
| +
|
| + KernelSyntheticStatement(this.desugared);
|
| +
|
| + @override
|
| + void set parent(TreeNode node) {
|
| + super.parent = node;
|
| + desugared?.parent = node;
|
| + }
|
| +
|
| + @override
|
| + accept(StatementVisitor v) => desugared.accept(v);
|
| +
|
| + @override
|
| + accept1(StatementVisitor1 v, arg) => desugared.accept1(v, arg);
|
| +
|
| + @override
|
| + transformChildren(Transformer v) => desugared.transformChildren(v);
|
| +
|
| + @override
|
| + visitChildren(Visitor v) => desugared.visitChildren(v);
|
| +
|
| + @override
|
| + void _inferStatement(KernelTypeInferrer inferrer) {}
|
| +}
|
| +
|
| /// Shadow object for [ThisExpression].
|
| class KernelThisExpression extends ThisExpression implements KernelExpression {
|
| @override
|
| @@ -2060,6 +2119,7 @@ class KernelTypeInferrer extends TypeInferrerImpl {
|
| @override
|
| DartType inferFieldTopLevel(
|
| KernelField field, DartType type, bool typeNeeded) {
|
| + if (field.initializer == null) return const DynamicType();
|
| return inferExpression(field.initializer, type, typeNeeded);
|
| }
|
|
|
|
|