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

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

Issue 2968563002: Introduce a reusable mechanism for representing synthetic kernel objects. (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
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698