Version 2.13.0-51.0.dev
Merge commit '8467186ca0aa1d2b716ed00cb9bc55f74d9ddda9' into 'dev'
diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
index d1ddfd7..861711b 100644
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ b/pkg/compiler/lib/src/ir/constants.dart
@@ -204,11 +204,21 @@
}
@override
+ R accept1<R, A>(ir.TreeVisitor1<R, A> v, A arg) {
+ throw new UnsupportedError("ConstantReference.accept");
+ }
+
+ @override
transformChildren(ir.Transformer v) {
throw new UnsupportedError("ConstantReference.transformChildren");
}
@override
+ transformOrRemoveChildren(ir.RemovingTransformer v) {
+ throw new UnsupportedError("ConstantReference.transformOrRemoveChildren");
+ }
+
+ @override
int get hashCode => 13 * constant.hashCode;
@override
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 958d410..101244f 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -15,7 +15,8 @@
import 'package:kernel/binary/ast_to_binary.dart' as kernel show BinaryPrinter;
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart' hide MapEntry;
+import 'package:kernel/kernel.dart';
+import 'package:kernel/ast.dart' show NonNullableByDefaultCompiledMode;
import 'package:kernel/target/targets.dart';
import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
import 'package:path/path.dart' as p;
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 81fadbf..8318288 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -5,7 +5,6 @@
// @dart = 2.9
import 'dart:collection';
-import 'dart:core' hide MapEntry;
import 'package:_fe_analyzer_shared/src/messages/codes.dart'
show Message, LocatedMessage;
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index b98d56b..432df8c 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
index 0ba64f4..ed02387 100644
--- a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import '../messages.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index 84205dc..79c6bc6 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 736be55..1fe24be 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -8,7 +8,7 @@
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/src/legacy_erasure.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
index 3f91098..b0ba617 100644
--- a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import '../problems.dart';
import 'library_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 4bdfca5..b938323 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -6,8 +6,6 @@
library fasta.procedure_builder;
-import 'dart:core' hide MapEntry;
-
import 'package:front_end/src/fasta/kernel/kernel_api.dart';
import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index f496386..51ee376 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -6,8 +6,6 @@
library fasta.member_builder;
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 0678910..6004b66 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -8,7 +8,7 @@
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import '../fasta_codes.dart'
show
diff --git a/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart b/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
index d14f2dc..4270ba8 100644
--- a/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/nullability_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import '../kernel/body_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index cecc308..c7b250b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:front_end/src/fasta/dill/dill_member_builder.dart';
import 'package:front_end/src/fasta/kernel/kernel_api.dart';
import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 93ee939..ea2e411 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -6,7 +6,7 @@
library fasta.dill_class_builder;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import '../builder/class_builder.dart';
import '../builder/library_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index b460387..ea03898 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import '../builder/extension_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
index d946f72..d12400f 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import '../builder/builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index bedea60..6809bc9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6,10 +6,7 @@
library fasta.body_builder;
-import 'dart:core' hide MapEntry;
-
-import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart'
- hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
@@ -43,8 +40,7 @@
import 'package:_fe_analyzer_shared/src/util/link.dart';
-import 'package:kernel/ast.dart'
- hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
import 'package:kernel/type_environment.dart';
import '../builder/builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index b97967d..25e0a70 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -6,7 +6,7 @@
library fasta.class_hierarchy_builder;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart'
show ClassHierarchy, ClassHierarchyBase;
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index 1e2f994..5a055f9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -6,21 +6,7 @@
library fasta.collections;
-import 'dart:core' hide MapEntry;
-
-import 'package:kernel/ast.dart'
- show
- DartType,
- Expression,
- ExpressionStatement,
- MapEntry,
- NullLiteral,
- Statement,
- TreeNode,
- VariableDeclaration,
- setParents,
- transformList,
- visitList;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
@@ -92,14 +78,22 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
expression?.accept(v);
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
@@ -138,24 +132,40 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
condition?.accept(v);
then?.accept(v);
otherwise?.accept(v);
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
+ condition = v.transform(condition);
condition?.parent = this;
}
if (then != null) {
- then = then.accept<TreeNode>(v);
+ then = v.transform(then);
then?.parent = this;
}
if (otherwise != null) {
- otherwise = otherwise.accept<TreeNode>(v);
+ otherwise = v.transform(otherwise);
+ otherwise?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (condition != null) {
+ condition = v.transformOrRemoveExpression(condition);
+ condition?.parent = this;
+ }
+ if (then != null) {
+ then = v.transformOrRemoveExpression(then);
+ then?.parent = this;
+ }
+ if (otherwise != null) {
+ otherwise = v.transformOrRemoveExpression(otherwise);
otherwise?.parent = this;
}
}
@@ -213,7 +223,7 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
visitList(variables, v);
condition?.accept(v);
visitList(updates, v);
@@ -221,15 +231,29 @@
}
@override
- transformChildren(Transformer v) {
- transformList(variables, v, this);
+ void transformChildren(Transformer v) {
+ v.transformList(variables, this);
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
+ condition = v.transform(condition);
condition?.parent = this;
}
- transformList(updates, v, this);
+ v.transformList(updates, this);
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformVariableDeclarationList(variables, this);
+ if (condition != null) {
+ condition = v.transformOrRemoveExpression(condition);
+ condition?.parent = this;
+ }
+ v.transformExpressionList(updates, this);
+ if (body != null) {
+ body = v.transformOrRemoveExpression(body);
body?.parent = this;
}
}
@@ -286,7 +310,7 @@
..fileOffset = syntheticAssignment.fileOffset)
: expressionEffects;
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
variable?.accept(v);
iterable?.accept(v);
syntheticAssignment?.accept(v);
@@ -295,29 +319,57 @@
problem?.accept(v);
}
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (iterable != null) {
- iterable = iterable.accept<TreeNode>(v);
+ iterable = v.transform(iterable);
iterable?.parent = this;
}
if (syntheticAssignment != null) {
- syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+ syntheticAssignment = v.transform(syntheticAssignment);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
- expressionEffects = expressionEffects.accept<TreeNode>(v);
+ expressionEffects = v.transform(expressionEffects);
expressionEffects?.parent = this;
}
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body);
body?.parent = this;
}
if (problem != null) {
- problem = problem.accept<TreeNode>(v);
+ problem = v.transform(problem);
+ problem?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (iterable != null) {
+ iterable = v.transformOrRemoveExpression(iterable);
+ iterable?.parent = this;
+ }
+ if (syntheticAssignment != null) {
+ syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment);
+ syntheticAssignment?.parent = this;
+ }
+ if (expressionEffects != null) {
+ expressionEffects = v.transformOrRemoveStatement(expressionEffects);
+ expressionEffects?.parent = this;
+ }
+ if (body != null) {
+ body = v.transformOrRemoveExpression(body);
+ body?.parent = this;
+ }
+ if (problem != null) {
+ problem = v.transformOrRemoveExpression(problem);
problem?.parent = this;
}
}
@@ -374,6 +426,9 @@
R accept<R>(TreeVisitor<R> v) => v.defaultTreeNode(this);
@override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.defaultTreeNode(this, arg);
+
+ @override
String toStringInternal() => toText(defaultAstTextStrategy);
@override
@@ -400,14 +455,22 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
expression?.accept(v);
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
@@ -436,24 +499,40 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
condition?.accept(v);
then?.accept(v);
otherwise?.accept(v);
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
+ condition = v.transform(condition);
condition?.parent = this;
}
if (then != null) {
- then = then.accept<TreeNode>(v);
+ then = v.transform(then);
then?.parent = this;
}
if (otherwise != null) {
- otherwise = otherwise.accept<TreeNode>(v);
+ otherwise = v.transform(otherwise);
+ otherwise?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (condition != null) {
+ condition = v.transformOrRemoveExpression(condition);
+ condition?.parent = this;
+ }
+ if (then != null) {
+ then = v.transformOrRemove(then, dummyMapEntry);
+ then?.parent = this;
+ }
+ if (otherwise != null) {
+ otherwise = v.transformOrRemove(otherwise, dummyMapEntry);
otherwise?.parent = this;
}
}
@@ -484,7 +563,7 @@
}
@override
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
visitList(variables, v);
condition?.accept(v);
visitList(updates, v);
@@ -492,15 +571,29 @@
}
@override
- transformChildren(Transformer v) {
- transformList(variables, v, this);
+ void transformChildren(Transformer v) {
+ v.transformList(variables, this);
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
+ condition = v.transform(condition);
condition?.parent = this;
}
- transformList(updates, v, this);
+ v.transformList(updates, this);
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformVariableDeclarationList(variables, this);
+ if (condition != null) {
+ condition = v.transformOrRemoveExpression(condition);
+ condition?.parent = this;
+ }
+ v.transformExpressionList(updates, this);
+ if (body != null) {
+ body = v.transformOrRemove(body, dummyMapEntry);
body?.parent = this;
}
}
@@ -543,7 +636,7 @@
..fileOffset = syntheticAssignment.fileOffset)
: expressionEffects;
- visitChildren(Visitor<Object> v) {
+ void visitChildren(Visitor<Object> v) {
variable?.accept(v);
iterable?.accept(v);
syntheticAssignment?.accept(v);
@@ -552,29 +645,57 @@
problem?.accept(v);
}
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (iterable != null) {
- iterable = iterable.accept<TreeNode>(v);
+ iterable = v.transform(iterable);
iterable?.parent = this;
}
if (syntheticAssignment != null) {
- syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+ syntheticAssignment = v.transform(syntheticAssignment);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
- expressionEffects = expressionEffects.accept<TreeNode>(v);
+ expressionEffects = v.transform(expressionEffects);
expressionEffects?.parent = this;
}
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body);
body?.parent = this;
}
if (problem != null) {
- problem = problem.accept<TreeNode>(v);
+ problem = v.transform(problem);
+ problem?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (iterable != null) {
+ iterable = v.transformOrRemoveExpression(iterable);
+ iterable?.parent = this;
+ }
+ if (syntheticAssignment != null) {
+ syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment);
+ syntheticAssignment?.parent = this;
+ }
+ if (expressionEffects != null) {
+ expressionEffects = v.transformOrRemoveStatement(expressionEffects);
+ expressionEffects?.parent = this;
+ }
+ if (body != null) {
+ body = v.transformOrRemove(body, dummyMapEntry);
+ body?.parent = this;
+ }
+ if (problem != null) {
+ problem = v.transformOrRemoveExpression(problem);
problem?.parent = this;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 641352a..86496d4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 2f96cfa..9709c98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -20,8 +20,6 @@
/// language. Issue(http://dartbug.com/31799)
library fasta.constant_evaluator;
-import 'dart:core' hide MapEntry;
-
import 'dart:io' as io;
import 'package:kernel/ast.dart';
@@ -157,7 +155,7 @@
typeEnvironment,
errorReporter,
evaluationMode);
- constantsTransformer.visitProcedure(procedure);
+ constantsTransformer.visitProcedure(procedure, null);
}
enum EvaluationMode {
@@ -329,7 +327,7 @@
Constant visitUnevaluatedConstant(UnevaluatedConstant node) => null;
}
-class ConstantsTransformer extends Transformer {
+class ConstantsTransformer extends RemovingTransformer {
final ConstantsBackend backend;
final ConstantEvaluator constantEvaluator;
final TypeEnvironment typeEnvironment;
@@ -369,12 +367,12 @@
transformAnnotations(library.annotations, library);
- transformList(library.dependencies, this, library);
- transformList(library.parts, this, library);
- transformList(library.typedefs, this, library);
- transformList(library.classes, this, library);
- transformList(library.procedures, this, library);
- transformList(library.fields, this, library);
+ transformLibraryDependencyList(library.dependencies, library);
+ transformLibraryPartList(library.parts, library);
+ transformTypedefList(library.typedefs, library);
+ transformClassList(library.classes, library);
+ transformProcedureList(library.procedures, library);
+ transformFieldList(library.fields, library);
if (!keepFields) {
// The transformer API does not iterate over `Library.additionalExports`,
@@ -387,7 +385,7 @@
}
@override
- LibraryPart visitLibraryPart(LibraryPart node) {
+ LibraryPart visitLibraryPart(LibraryPart node, TreeNode removalSentinel) {
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
});
@@ -395,7 +393,8 @@
}
@override
- LibraryDependency visitLibraryDependency(LibraryDependency node) {
+ LibraryDependency visitLibraryDependency(
+ LibraryDependency node, TreeNode removalSentinel) {
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
});
@@ -403,78 +402,80 @@
}
@override
- Class visitClass(Class node) {
+ Class visitClass(Class node, TreeNode removalSentinel) {
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext.forAnnotations(
node.enclosingLibrary, typeEnvironment);
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
- transformList(node.fields, this, node);
- transformList(node.typeParameters, this, node);
- transformList(node.constructors, this, node);
- transformList(node.procedures, this, node);
- transformList(node.redirectingFactoryConstructors, this, node);
+ transformFieldList(node.fields, node);
+ transformTypeParameterList(node.typeParameters, node);
+ transformConstructorList(node.constructors, node);
+ transformProcedureList(node.procedures, node);
+ transformRedirectingFactoryConstructorList(
+ node.redirectingFactoryConstructors, node);
});
_staticTypeContext = oldStaticTypeContext;
return node;
}
@override
- Procedure visitProcedure(Procedure node) {
+ Procedure visitProcedure(Procedure node, TreeNode removalSentinel) {
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext(node, typeEnvironment);
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
- node.function = node.function.accept<TreeNode>(this)..parent = node;
+ node.function = transform(node.function)..parent = node;
});
_staticTypeContext = oldStaticTypeContext;
return node;
}
@override
- Constructor visitConstructor(Constructor node) {
+ Constructor visitConstructor(Constructor node, TreeNode removalSentinel) {
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext(node, typeEnvironment);
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
- transformList(node.initializers, this, node);
- node.function = node.function.accept<TreeNode>(this)..parent = node;
+ transformInitializerList(node.initializers, node);
+ node.function = transform(node.function)..parent = node;
});
_staticTypeContext = oldStaticTypeContext;
return node;
}
@override
- Typedef visitTypedef(Typedef node) {
+ Typedef visitTypedef(Typedef node, TreeNode removalSentinel) {
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
- transformList(node.typeParameters, this, node);
- transformList(node.typeParametersOfFunctionType, this, node);
- transformList(node.positionalParameters, this, node);
- transformList(node.namedParameters, this, node);
+ transformTypeParameterList(node.typeParameters, node);
+ transformTypeParameterList(node.typeParametersOfFunctionType, node);
+ transformVariableDeclarationList(node.positionalParameters, node);
+ transformVariableDeclarationList(node.namedParameters, node);
});
return node;
}
@override
RedirectingFactoryConstructor visitRedirectingFactoryConstructor(
- RedirectingFactoryConstructor node) {
+ RedirectingFactoryConstructor node, TreeNode removalSentinel) {
// Currently unreachable as the compiler doesn't produce
// RedirectingFactoryConstructor.
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext(node, typeEnvironment);
constantEvaluator.withNewEnvironment(() {
transformAnnotations(node.annotations, node);
- transformList(node.typeParameters, this, node);
- transformList(node.positionalParameters, this, node);
- transformList(node.namedParameters, this, node);
+ transformTypeParameterList(node.typeParameters, node);
+ transformVariableDeclarationList(node.positionalParameters, node);
+ transformVariableDeclarationList(node.namedParameters, node);
});
_staticTypeContext = oldStaticTypeContext;
return node;
}
@override
- TypeParameter visitTypeParameter(TypeParameter node) {
+ TypeParameter visitTypeParameter(
+ TypeParameter node, TreeNode removalSentinel) {
transformAnnotations(node.annotations, node);
return node;
}
@@ -497,8 +498,8 @@
// Handle definition of constants:
@override
- FunctionNode visitFunctionNode(FunctionNode node) {
- transformList(node.typeParameters, this, node);
+ FunctionNode visitFunctionNode(FunctionNode node, TreeNode removalSentinel) {
+ transformTypeParameterList(node.typeParameters, node);
final int positionalParameterCount = node.positionalParameters.length;
for (int i = 0; i < positionalParameterCount; ++i) {
final VariableDeclaration variable = node.positionalParameters[i];
@@ -518,13 +519,14 @@
}
}
if (node.body != null) {
- node.body = node.body.accept<TreeNode>(this)..parent = node;
+ node.body = transform(node.body)..parent = node;
}
return node;
}
@override
- VariableDeclaration visitVariableDeclaration(VariableDeclaration node) {
+ Statement visitVariableDeclaration(
+ VariableDeclaration node, TreeNode removalSentinel) {
transformAnnotations(node.annotations, node);
if (node.initializer != null) {
@@ -540,19 +542,18 @@
// If the constant is unevaluated we need to keep the expression,
// so that, in the case the constant contains error but the local
// is unused, the error will still be reported.
- return null;
+ return removalSentinel /*!*/ ?? node;
}
}
} else {
- node.initializer = node.initializer.accept<TreeNode>(this)
- ..parent = node;
+ node.initializer = transform(node.initializer)..parent = node;
}
}
return node;
}
@override
- Field visitField(Field node) {
+ Field visitField(Field node, TreeNode removalSentinel) {
StaticTypeContext oldStaticTypeContext = _staticTypeContext;
_staticTypeContext = new StaticTypeContext(node, typeEnvironment);
Field field = constantEvaluator.withNewEnvironment(() {
@@ -564,13 +565,12 @@
// If this constant is inlined, remove it.
if (!keepFields && shouldInline(node.initializer)) {
- return null;
+ return removalSentinel;
}
} else {
transformAnnotations(node.annotations, node);
if (node.initializer != null) {
- node.initializer = node.initializer.accept<TreeNode>(this)
- ..parent = node;
+ node.initializer = transform(node.initializer)..parent = node;
}
}
return node;
@@ -582,7 +582,7 @@
// Handle use-sites of constants (and "inline" constant expressions):
@override
- Expression visitSymbolLiteral(SymbolLiteral node) {
+ Expression visitSymbolLiteral(SymbolLiteral node, TreeNode removalSentinel) {
return makeConstantExpression(
constantEvaluator.evaluate(_staticTypeContext, node), node);
}
@@ -593,9 +593,9 @@
}
@override
- Expression visitEqualsCall(EqualsCall node) {
- Expression left = node.left.accept<TreeNode>(this);
- Expression right = node.right.accept<TreeNode>(this);
+ Expression visitEqualsCall(EqualsCall node, TreeNode removalSentinel) {
+ Expression left = transform(node.left);
+ Expression right = transform(node.right);
if (_isNull(left)) {
return new EqualsNull(right, isNot: node.isNot)
..fileOffset = node.fileOffset;
@@ -609,7 +609,7 @@
}
@override
- Expression visitStaticGet(StaticGet node) {
+ Expression visitStaticGet(StaticGet node, TreeNode removalSentinel) {
final Member target = node.target;
if (target is Field && target.isConst) {
// Make sure the initializer is evaluated first.
@@ -625,27 +625,28 @@
} else if (target is Procedure && target.kind == ProcedureKind.Method) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitStaticGet(node);
+ return super.visitStaticGet(node, removalSentinel);
}
@override
- Expression visitStaticTearOff(StaticTearOff node) {
+ Expression visitStaticTearOff(StaticTearOff node, TreeNode removalSentinel) {
final Member target = node.target;
if (target is Procedure && target.kind == ProcedureKind.Method) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitStaticTearOff(node);
+ return super.visitStaticTearOff(node, removalSentinel);
}
@override
- SwitchCase visitSwitchCase(SwitchCase node) {
+ SwitchCase visitSwitchCase(SwitchCase node, TreeNode removalSentinel) {
transformExpressions(node.expressions, node);
- return super.visitSwitchCase(node);
+ return super.visitSwitchCase(node, removalSentinel);
}
@override
- SwitchStatement visitSwitchStatement(SwitchStatement node) {
- SwitchStatement result = super.visitSwitchStatement(node);
+ SwitchStatement visitSwitchStatement(
+ SwitchStatement node, TreeNode removalSentinel) {
+ SwitchStatement result = super.visitSwitchStatement(node, removalSentinel);
Library library = constantEvaluator.libraryOf(node);
if (library != null && library.isNonNullableByDefault) {
for (SwitchCase switchCase in node.cases) {
@@ -672,7 +673,7 @@
}
@override
- Expression visitVariableGet(VariableGet node) {
+ Expression visitVariableGet(VariableGet node, TreeNode removalSentinel) {
final VariableDeclaration variable = node.variable;
if (variable.isConst) {
variable.initializer =
@@ -682,74 +683,80 @@
return evaluateAndTransformWithContext(node, node);
}
}
- return super.visitVariableGet(node);
+ return super.visitVariableGet(node, removalSentinel);
}
@override
- Expression visitListLiteral(ListLiteral node) {
+ Expression visitListLiteral(ListLiteral node, TreeNode removalSentinel) {
if (node.isConst) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitListLiteral(node);
+ return super.visitListLiteral(node, removalSentinel);
}
@override
- Expression visitListConcatenation(ListConcatenation node) {
+ Expression visitListConcatenation(
+ ListConcatenation node, TreeNode removalSentinel) {
return evaluateAndTransformWithContext(node, node);
}
@override
- Expression visitSetLiteral(SetLiteral node) {
+ Expression visitSetLiteral(SetLiteral node, TreeNode removalSentinel) {
if (node.isConst) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitSetLiteral(node);
+ return super.visitSetLiteral(node, removalSentinel);
}
@override
- Expression visitSetConcatenation(SetConcatenation node) {
+ Expression visitSetConcatenation(
+ SetConcatenation node, TreeNode removalSentinel) {
return evaluateAndTransformWithContext(node, node);
}
@override
- Expression visitMapLiteral(MapLiteral node) {
+ Expression visitMapLiteral(MapLiteral node, TreeNode removalSentinel) {
if (node.isConst) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitMapLiteral(node);
+ return super.visitMapLiteral(node, removalSentinel);
}
@override
- Expression visitTypeLiteral(TypeLiteral node) {
+ Expression visitTypeLiteral(TypeLiteral node, TreeNode removalSentinel) {
if (!containsFreeTypeVariables(node.type)) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitTypeLiteral(node);
+ return super.visitTypeLiteral(node, removalSentinel);
}
@override
- Expression visitMapConcatenation(MapConcatenation node) {
+ Expression visitMapConcatenation(
+ MapConcatenation node, TreeNode removalSentinel) {
return evaluateAndTransformWithContext(node, node);
}
@override
- Expression visitConstructorInvocation(ConstructorInvocation node) {
+ Expression visitConstructorInvocation(
+ ConstructorInvocation node, TreeNode removalSentinel) {
if (node.isConst) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitConstructorInvocation(node);
+ return super.visitConstructorInvocation(node, removalSentinel);
}
@override
- Expression visitStaticInvocation(StaticInvocation node) {
+ Expression visitStaticInvocation(
+ StaticInvocation node, TreeNode removalSentinel) {
if (node.isConst) {
return evaluateAndTransformWithContext(node, node);
}
- return super.visitStaticInvocation(node);
+ return super.visitStaticInvocation(node, removalSentinel);
}
@override
- Expression visitConstantExpression(ConstantExpression node) {
+ Expression visitConstantExpression(
+ ConstantExpression node, TreeNode removalSentinel) {
Constant constant = node.constant;
if (constant is UnevaluatedConstant) {
Expression expression = constant.expression;
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
index 8d0c5b0..fbbd0ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/target/targets.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index c407429..d179e00 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -7,8 +7,6 @@
/// A library to help generate expression.
library fasta.expression_generator;
-import 'dart:core' hide MapEntry;
-
import 'package:_fe_analyzer_shared/src/parser/parser.dart'
show lengthForToken, lengthOfSpan;
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 30344fd..9be6294 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -6,8 +6,6 @@
library fasta.fangorn;
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
@@ -777,6 +775,10 @@
throw unsupported("transformChildren", fileOffset, uri);
}
+ transformOrRemoveChildren(v) {
+ throw unsupported("transformOrRemoveChildren", fileOffset, uri);
+ }
+
@override
String toString() {
return "_VariablesDeclaration(${toStringInternal()})";
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index f37b35c..b45a75c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -8,7 +8,7 @@
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/assumptions.dart';
import 'package:kernel/src/legacy_erasure.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index be8f723..13d0970 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -4,12 +4,9 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:_fe_analyzer_shared/src/util/link.dart';
import 'package:front_end/src/api_prototype/lowering_predicates.dart';
-import 'package:kernel/ast.dart'
- hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/type_algebra.dart' show Substitution;
import 'package:kernel/type_environment.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 89039e8..faf4716 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -20,8 +20,6 @@
/// kernel class, because multiple constructs in Dart may desugar to a tree
/// with the same kind of root node.
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
import 'package:kernel/src/printer.dart';
@@ -262,23 +260,47 @@
@override
void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (iterable != null) {
- iterable = iterable.accept<TreeNode>(v);
+ iterable = v.transform(iterable);
iterable?.parent = this;
}
if (syntheticAssignment != null) {
- syntheticAssignment = syntheticAssignment.accept<TreeNode>(v);
+ syntheticAssignment = v.transform(syntheticAssignment);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
- expressionEffects = expressionEffects.accept<TreeNode>(v);
+ expressionEffects = v.transform(expressionEffects);
expressionEffects?.parent = this;
}
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable?.parent = this;
+ }
+ if (iterable != null) {
+ iterable = v.transform(iterable);
+ iterable?.parent = this;
+ }
+ if (syntheticAssignment != null) {
+ syntheticAssignment = v.transform(syntheticAssignment);
+ syntheticAssignment?.parent = this;
+ }
+ if (expressionEffects != null) {
+ expressionEffects = v.transform(expressionEffects);
+ expressionEffects?.parent = this;
+ }
+ if (body != null) {
+ body = v.transform(body);
body?.parent = this;
}
}
@@ -320,12 +342,25 @@
@override
void transformChildren(Transformer v) {
if (tryBlock != null) {
- tryBlock = tryBlock.accept<TreeNode>(v);
+ tryBlock = v.transform(tryBlock);
tryBlock?.parent = this;
}
- transformList(catchBlocks, v, this);
+ v.transformList(catchBlocks, this);
if (finallyBlock != null) {
- finallyBlock = finallyBlock.accept<TreeNode>(v);
+ finallyBlock = v.transform(finallyBlock);
+ finallyBlock?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (tryBlock != null) {
+ tryBlock = v.transformOrRemoveStatement(tryBlock);
+ tryBlock?.parent = this;
+ }
+ v.transformCatchList(catchBlocks, this);
+ if (finallyBlock != null) {
+ finallyBlock = v.transformOrRemoveStatement(finallyBlock);
finallyBlock?.parent = this;
}
}
@@ -586,10 +621,19 @@
@override
void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
- transformList(expressions, v, this);
+ v.transformList(expressions, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ v.transformExpressionList(expressions, this);
}
@override
@@ -646,11 +690,23 @@
@override
void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
@@ -849,11 +905,23 @@
@override
void transformChildren(Transformer v) {
if (left != null) {
- left = left.accept<TreeNode>(v);
+ left = v.transform(left);
left?.parent = this;
}
if (right != null) {
- right = right.accept<TreeNode>(v);
+ right = v.transform(right);
+ right?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (left != null) {
+ left = v.transformOrRemoveExpression(left);
+ left?.parent = this;
+ }
+ if (right != null) {
+ right = v.transformOrRemoveExpression(right);
right?.parent = this;
}
}
@@ -1040,11 +1108,23 @@
@override
void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
expression?.parent = this;
}
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
+ arguments = v.transform(arguments);
+ arguments?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
+ expression?.parent = this;
+ }
+ if (arguments != null) {
+ arguments = v.transformOrRemove(arguments, dummyArguments);
arguments?.parent = this;
}
}
@@ -1122,13 +1202,25 @@
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (invocation != null) {
- invocation = invocation.accept<TreeNode>(v);
+ invocation = v.transform(invocation);
+ invocation?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (invocation != null) {
+ invocation = v.transformOrRemoveExpression(invocation);
invocation?.parent = this;
}
}
@@ -1195,13 +1287,25 @@
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (read != null) {
- read = read.accept<TreeNode>(v);
+ read = v.transform(read);
+ read?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable?.parent = this;
+ }
+ if (read != null) {
+ read = v.transform(read);
read?.parent = this;
}
}
@@ -1267,13 +1371,25 @@
}
@override
- transformChildren(Transformer v) {
+ void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (write != null) {
+ write = v.transformOrRemoveExpression(write);
write?.parent = this;
}
}
@@ -1510,6 +1626,11 @@
isLate: isLate || lateGetter != null, type: lateType ?? type);
printer.write(';');
}
+
+ @override
+ String toString() {
+ return "VariableDeclarationImpl(${toStringInternal()})";
+ }
}
/// Front end specific implementation of [VariableGet].
@@ -1570,19 +1691,14 @@
@override
void visitChildren(Visitor<dynamic> v) {
- import?.accept(v);
- target?.accept(v);
+ v.visitProcedureReference(target);
}
@override
- void transformChildren(Transformer v) {
- if (import != null) {
- import = import.accept<TreeNode>(v);
- }
- if (target != null) {
- target = target.accept<TreeNode>(v);
- }
- }
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -1651,11 +1767,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -1720,11 +1848,23 @@
@override
void transformChildren(Transformer v) {
if (read != null) {
- read = read.accept<TreeNode>(v);
+ read = v.transform(read);
read?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (read != null) {
+ read = v.transformOrRemoveExpression(read);
+ read?.parent = this;
+ }
+ if (write != null) {
+ write = v.transformOrRemoveExpression(write);
write?.parent = this;
}
}
@@ -1843,11 +1983,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -1923,11 +2075,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -1999,11 +2163,23 @@
@override
void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (write != null) {
+ write = v.transformOrRemoveVariableDeclaration(write);
write?.parent = this;
}
}
@@ -2052,11 +2228,23 @@
@override
void transformChildren(Transformer v) {
if (read != null) {
- read = read.accept<TreeNode>(v);
+ read = v.transform(read);
read?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (read != null) {
+ read = v.transformOrRemoveVariableDeclaration(read);
+ read?.parent = this;
+ }
+ if (write != null) {
+ write = v.transformOrRemoveVariableDeclaration(write);
write?.parent = this;
}
}
@@ -2105,11 +2293,23 @@
@override
void transformChildren(Transformer v) {
if (read != null) {
- read = read.accept<TreeNode>(v);
+ read = v.transform(read);
read?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (read != null) {
+ read = v.transform(read);
+ read?.parent = this;
+ }
+ if (write != null) {
+ write = v.transform(write);
write?.parent = this;
}
}
@@ -2158,11 +2358,23 @@
@override
void transformChildren(Transformer v) {
if (read != null) {
- read = read.accept<TreeNode>(v);
+ read = v.transform(read);
read?.parent = this;
}
if (write != null) {
- write = write.accept<TreeNode>(v);
+ write = v.transform(write);
+ write?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (read != null) {
+ read = v.transformOrRemoveVariableDeclaration(read);
+ read?.parent = this;
+ }
+ if (write != null) {
+ write = v.transformOrRemoveVariableDeclaration(write);
write?.parent = this;
}
}
@@ -2204,11 +2416,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
+ index?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
index?.parent = this;
}
}
@@ -2270,15 +2494,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2335,11 +2575,23 @@
@override
void transformChildren(Transformer v) {
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2416,15 +2668,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2524,15 +2792,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2615,11 +2899,23 @@
@override
void transformChildren(Transformer v) {
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2715,15 +3011,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -2808,15 +3120,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -2947,11 +3275,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -3056,11 +3396,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (value != null) {
+ value = v.transformOrRemoveExpression(value);
value?.parent = this;
}
}
@@ -3156,11 +3508,23 @@
@override
void transformChildren(Transformer v) {
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -3274,15 +3638,31 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (index != null) {
- index = index.accept<TreeNode>(v);
+ index = v.transform(index);
index?.parent = this;
}
if (rhs != null) {
- rhs = rhs.accept<TreeNode>(v);
+ rhs = v.transform(rhs);
+ rhs?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transformOrRemoveExpression(receiver);
+ receiver?.parent = this;
+ }
+ if (index != null) {
+ index = v.transformOrRemoveExpression(index);
+ index?.parent = this;
+ }
+ if (rhs != null) {
+ rhs = v.transformOrRemoveExpression(rhs);
rhs?.parent = this;
}
}
@@ -3360,11 +3740,23 @@
@override
void transformChildren(Transformer v) {
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
+ receiver = v.transform(receiver);
receiver?.parent = this;
}
if (value != null) {
- value = value.accept<TreeNode>(v);
+ value = v.transform(value);
+ value?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver?.parent = this;
+ }
+ if (value != null) {
+ value = v.transform(value);
value?.parent = this;
}
}
@@ -3411,11 +3803,23 @@
@override
void transformChildren(Transformer v) {
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
+ variable = v.transform(variable);
variable?.parent = this;
}
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (variable != null) {
+ variable = v.transformOrRemoveVariableDeclaration(variable);
+ variable?.parent = this;
+ }
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
@@ -3486,7 +3890,15 @@
@override
void transformChildren(Transformer v) {
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
+ arguments = v.transform(arguments);
+ arguments?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (arguments != null) {
+ arguments = v.transformOrRemove(arguments, dummyArguments);
arguments?.parent = this;
}
}
@@ -3527,11 +3939,23 @@
@override
void transformChildren(Transformer v) {
if (left != null) {
- left = left.accept<TreeNode>(v);
+ left = v.transform(left);
left?.parent = this;
}
if (right != null) {
- right = right.accept<TreeNode>(v);
+ right = v.transform(right);
+ right?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (left != null) {
+ left = v.transformOrRemoveExpression(left);
+ left?.parent = this;
+ }
+ if (right != null) {
+ right = v.transformOrRemoveExpression(right);
right?.parent = this;
}
}
@@ -3582,11 +4006,23 @@
@override
void transformChildren(Transformer v) {
if (left != null) {
- left = left.accept<TreeNode>(v);
+ left = v.transform(left);
left?.parent = this;
}
if (right != null) {
- right = right.accept<TreeNode>(v);
+ right = v.transform(right);
+ right?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (left != null) {
+ left = v.transformOrRemoveExpression(left);
+ left?.parent = this;
+ }
+ if (right != null) {
+ right = v.transformOrRemoveExpression(right);
right?.parent = this;
}
}
@@ -3633,7 +4069,15 @@
@override
void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
@@ -3682,7 +4126,15 @@
@override
void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression);
expression?.parent = this;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index c361101..93b6350 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/visitor.dart';
import '../type_inference/type_schema.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index 577359b..1f87bde 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import '../../base/nnbd_mode.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
index 6d4a9f1..c4901b9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
@@ -6,7 +6,7 @@
import 'dart:math';
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
/// Class that holds the covariant and generic-covariant-impl information for
/// a member.
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 220157ef..0866c33 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -6,8 +6,6 @@
library fasta.transform_collections;
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
@@ -281,8 +279,8 @@
element.condition?.accept<TreeNode>(this),
element.updates,
loopBody);
- transformList(loop.variables, this, loop);
- transformList(loop.updates, this, loop);
+ transformList(loop.variables, loop);
+ transformList(loop.updates, loop);
_dataForTesting?.registerAlias(element, loop);
body.add(loop);
}
@@ -533,8 +531,8 @@
ForStatement loop = _createForStatement(entry.fileOffset, entry.variables,
entry.condition?.accept<TreeNode>(this), entry.updates, loopBody);
_dataForTesting?.registerAlias(entry, loop);
- transformList(loop.variables, this, loop);
- transformList(loop.updates, this, loop);
+ transformList(loop.variables, loop);
+ transformList(loop.updates, loop);
body.add(loop);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index 250493f..7195f01 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -6,8 +6,6 @@
library fasta.transform_set_literals;
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index ddfef29..468697e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -6,8 +6,6 @@
library fasta.verifier;
-import 'dart:core' hide MapEntry;
-
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
import 'package:kernel/ast.dart';
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index 4f8e52b..004901a 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -6,7 +6,7 @@
library fasta.scope;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'builder/builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 6d6dca8..92ac343 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -7,7 +7,7 @@
library fasta.source_class_builder;
import 'package:front_end/src/fasta/kernel/combined_member_signature.dart';
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/reference_from_index.dart' show IndexedClass;
import 'package:kernel/src/bounds_checks.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 1538023..a1f535a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/type_environment.dart';
diff --git a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
index a72c547..7e90983 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/type_environment.dart';
/// Computes the "remainder" of [T] when [S] has been removed from consideration
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 4039519..24f2850 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -4,8 +4,6 @@
// @dart = 2.9
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 705469d..569d058 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
index c75bd34..f391d17 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/replacement_visitor.dart';
/// Returns `true` if type contains a promoted type variable.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 58ad7fc..a61e28f 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -7,8 +7,7 @@
import 'dart:core' hide MapEntry;
import 'dart:core' as core;
-import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart'
- hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
import 'package:_fe_analyzer_shared/src/testing/id.dart';
import 'package:_fe_analyzer_shared/src/util/link.dart';
@@ -17,8 +16,7 @@
import 'package:front_end/src/fasta/type_inference/type_demotion.dart';
import 'package:front_end/src/testing/id_extractor.dart';
-import 'package:kernel/ast.dart'
- hide Reference; // Work around https://github.com/dart-lang/sdk/issues/44667
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/core_types.dart' show CoreTypes;
import 'package:kernel/type_algebra.dart';
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index f6598b6..9e7c2ea 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/replacement_visitor.dart';
import 'type_schema.dart' show UnknownType;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 5e32e19..7b37c14 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -4,7 +4,7 @@
// @dart = 2.9
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 3858ee0..30beca7e 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -375,6 +375,7 @@
enforce
enforced
enforces
+enforcing
enumerates
env
eof
diff --git a/pkg/front_end/test/text_representation/empty_reference_test.dart b/pkg/front_end/test/text_representation/empty_reference_test.dart
index 22643b3..a33bd6b 100644
--- a/pkg/front_end/test/text_representation/empty_reference_test.dart
+++ b/pkg/front_end/test/text_representation/empty_reference_test.dart
@@ -85,7 +85,7 @@
void testMembers() {
testExpression(new PropertyGet(new IntLiteral(0), new Name('foo')), '''
0.foo''');
- testExpression(new StaticGet(null), '''
+ testExpression(new StaticGet.byReference(null), '''
<missing-member-reference>''');
Reference unlinkedMemberName = new Reference();
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
index dbfbb79..32e478f 100644
--- a/pkg/front_end/tool/_fasta/bench_maker.dart
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -10,7 +10,7 @@
import "dart:io" show File;
-import "package:kernel/ast.dart" hide MapEntry;
+import "package:kernel/ast.dart";
import "package:front_end/src/fasta/type_inference/type_schema.dart"
show UnknownType;
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index 5911b3a..c3ec736 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -63,8 +63,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
//
// Instead modify 'tools/experimental_features.yaml' and run
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index fa63366..fd0b0bc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
/// -----------------------------------------------------------------------
/// WHEN CHANGING THIS FILE:
/// -----------------------------------------------------------------------
@@ -142,7 +140,7 @@
final int hashCode = _hashCounter = (_hashCounter + 1) & 0x3fffffff;
static const int noOffset = -1;
- TreeNode parent;
+ TreeNode? parent;
/// Offset in the source file it comes from.
///
@@ -151,8 +149,10 @@
int fileOffset = noOffset;
R accept<R>(TreeVisitor<R> v);
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg);
void visitChildren(Visitor v);
void transformChildren(Transformer v);
+ void transformOrRemoveChildren(RemovingTransformer v);
/// Replaces [child] with [replacement].
///
@@ -164,6 +164,7 @@
///
/// [replacement] must be non-null.
void replaceChild(TreeNode child, TreeNode replacement) {
+ // ignore: unnecessary_null_comparison
assert(replacement != null);
transformChildren(new _ChildReplacer(child, replacement));
}
@@ -176,24 +177,26 @@
///
/// [replacement] must be non-null.
void replaceWith(TreeNode replacement) {
+ // ignore: unnecessary_null_comparison
assert(replacement != null);
- parent.replaceChild(this, replacement);
+ parent!.replaceChild(this, replacement);
parent = null;
}
- Component get enclosingComponent => parent?.enclosingComponent;
+ // TODO(johnniwinther): Make this non-nullable.
+ Component? get enclosingComponent => parent?.enclosingComponent;
/// Returns the best known source location of the given AST node, or `null` if
/// the node is orphaned.
///
/// This getter is intended for diagnostics and debugging, and should be
/// avoided in production code.
- Location get location {
+ Location? get location {
if (fileOffset == noOffset) return parent?.location;
return _getLocationInEnclosingFile(fileOffset);
}
- Location _getLocationInEnclosingFile(int offset) {
+ Location? _getLocationInEnclosingFile(int offset) {
return parent?._getLocationInEnclosingFile(offset);
}
}
@@ -205,17 +208,16 @@
abstract class NamedNode extends TreeNode {
final Reference reference;
- NamedNode(Reference reference)
+ NamedNode(Reference? reference)
: this.reference = reference ?? new Reference() {
if (this is Field) {
- Field me = this;
- me.getterReference.node = this;
+ (this as Field).getterReference.node = this;
} else {
this.reference.node = this;
}
}
- CanonicalName get canonicalName => reference?.canonicalName;
+ CanonicalName? get canonicalName => reference.canonicalName;
/// This is an advanced feature.
///
@@ -229,7 +231,8 @@
abstract class FileUriNode extends TreeNode {
/// The URI of the source file this node was loaded from.
- Uri get fileUri;
+ // TODO(johnniwinther): Make this non-nullable.
+ Uri? get fileUri;
}
abstract class Annotatable extends TreeNode {
@@ -241,17 +244,17 @@
///
/// There is only one reference object per [NamedNode].
class Reference {
- CanonicalName canonicalName;
+ CanonicalName? canonicalName;
- NamedNode _node;
+ NamedNode? _node;
- NamedNode get node {
+ NamedNode? get node {
if (_node == null) {
// Either this is an unbound reference or it belongs to a lazy-loaded
// (and not yet loaded) class. If it belongs to a lazy-loaded class,
// load the class.
- CanonicalName canonicalNameParent = canonicalName?.parent;
+ CanonicalName? canonicalNameParent = canonicalName?.parent;
while (canonicalNameParent != null) {
if (canonicalNameParent.name.startsWith("@")) {
break;
@@ -259,8 +262,8 @@
canonicalNameParent = canonicalNameParent.parent;
}
if (canonicalNameParent != null) {
- NamedNode parentNamedNode =
- canonicalNameParent?.parent?.reference?._node;
+ NamedNode? parentNamedNode =
+ canonicalNameParent.parent?.reference?._node;
if (parentNamedNode is Class) {
Class parentClass = parentNamedNode;
if (parentClass.lazyBuilder != null) {
@@ -272,7 +275,7 @@
return _node;
}
- void set node(NamedNode node) {
+ void set node(NamedNode? node) {
_node = node;
}
@@ -282,10 +285,10 @@
String toStringInternal() {
if (canonicalName != null) {
- return '${canonicalName.toStringInternal()}';
+ return '${canonicalName!.toStringInternal()}';
}
if (node != null) {
- return node.toStringInternal();
+ return node!.toStringInternal();
}
return 'Unbound reference';
}
@@ -356,12 +359,14 @@
Uri importUri;
/// The URI of the source file this library was loaded from.
- Uri fileUri;
+ @override
+ Uri? fileUri;
- Version _languageVersion;
+ Version? _languageVersion;
Version get languageVersion => _languageVersion ?? defaultLanguageVersion;
void setLanguageVersion(Version languageVersion) {
+ // ignore: unnecessary_null_comparison
if (languageVersion == null) {
throw new StateError("Trying to set language version 'null'");
}
@@ -421,14 +426,15 @@
}
}
- String name;
+ String? name;
/// Problems in this [Library] encoded as json objects.
///
/// Note that this field can be null, and by convention should be null if the
/// list is empty.
- List<String> problemsAsJson;
+ List<String>? problemsAsJson;
+ @override
final List<Expression> annotations;
final List<LibraryDependency> dependencies;
@@ -449,16 +455,16 @@
Library(this.importUri,
{this.name,
- List<Expression> annotations,
- List<LibraryDependency> dependencies,
- List<LibraryPart> parts,
- List<Typedef> typedefs,
- List<Class> classes,
- List<Extension> extensions,
- List<Procedure> procedures,
- List<Field> fields,
+ List<Expression>? annotations,
+ List<LibraryDependency>? dependencies,
+ List<LibraryPart>? parts,
+ List<Typedef>? typedefs,
+ List<Class>? classes,
+ List<Extension>? extensions,
+ List<Procedure>? procedures,
+ List<Field>? fields,
this.fileUri,
- Reference reference})
+ Reference? reference})
: this.annotations = annotations ?? <Expression>[],
this.dependencies = dependencies ?? <LibraryDependency>[],
this.parts = parts ?? <LibraryPart>[],
@@ -501,6 +507,7 @@
Iterable<Member> get members =>
<Iterable<Member>>[fields, procedures].expand((x) => x);
+ @override
void addAnnotation(Expression node) {
node.parent = this;
annotations.add(node);
@@ -532,7 +539,7 @@
}
void computeCanonicalNames() {
- assert(canonicalName != null);
+ CanonicalName canonicalName = this.canonicalName!;
for (int i = 0; i < typedefs.length; ++i) {
Typedef typedef_ = typedefs[i];
canonicalName.getChildFromTypedef(typedef_).bindTo(typedef_.reference);
@@ -543,7 +550,7 @@
if (field.hasSetter) {
canonicalName
.getChildFromFieldSetter(field)
- .bindTo(field.setterReference);
+ .bindTo(field.setterReference!);
}
}
for (int i = 0; i < procedures.length; ++i) {
@@ -552,12 +559,12 @@
}
for (int i = 0; i < classes.length; ++i) {
Class class_ = classes[i];
- canonicalName.getChild(class_.name).bindTo(class_.reference);
+ canonicalName.getChild(class_.name!).bindTo(class_.reference);
class_.computeCanonicalNames();
}
for (int i = 0; i < extensions.length; ++i) {
Extension extension = extensions[i];
- canonicalName.getChild(extension.name).bindTo(extension.reference);
+ canonicalName.getChild(extension.name!).bindTo(extension.reference);
}
}
@@ -600,9 +607,14 @@
parts.add(node..parent = this);
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitLibrary(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitLibrary(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
visitList(dependencies, v);
visitList(parts, v);
@@ -613,20 +625,34 @@
visitList(fields, v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformList(dependencies, v, this);
- transformList(parts, v, this);
- transformList(typedefs, v, this);
- transformList(classes, v, this);
- transformList(extensions, v, this);
- transformList(procedures, v, this);
- transformList(fields, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformList(dependencies, this);
+ v.transformList(parts, this);
+ v.transformList(typedefs, this);
+ v.transformList(classes, this);
+ v.transformList(extensions, this);
+ v.transformList(procedures, this);
+ v.transformList(fields, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformLibraryDependencyList(dependencies, this);
+ v.transformLibraryPartList(parts, this);
+ v.transformTypedefList(typedefs, this);
+ v.transformClassList(classes, this);
+ v.transformExtensionList(extensions, this);
+ v.transformProcedureList(procedures, this);
+ v.transformFieldList(fields, this);
}
static int _libraryIdCounter = 0;
int _libraryId = ++_libraryIdCounter;
+ @override
int compareTo(Library other) => _libraryId - other._libraryId;
/// Returns a possibly synthesized name for this library, consistent with
@@ -639,7 +665,7 @@
printer.write(libraryNameToString(this));
}
- Location _getLocationInEnclosingFile(int offset) {
+ Location? _getLocationInEnclosingFile(int offset) {
return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
@@ -667,7 +693,7 @@
/// with a prefix.
///
/// Must be non-null for deferred imports, and must be null for exports.
- String name;
+ String? name;
final List<Combinator> combinators;
@@ -677,17 +703,19 @@
flags, annotations, importedLibrary.reference, name, combinators);
LibraryDependency.deferredImport(Library importedLibrary, String name,
- {List<Combinator> combinators, List<Expression> annotations})
+ {List<Combinator>? combinators, List<Expression>? annotations})
: this.byReference(DeferredFlag, annotations ?? <Expression>[],
importedLibrary.reference, name, combinators ?? <Combinator>[]);
LibraryDependency.import(Library importedLibrary,
- {String name, List<Combinator> combinators, List<Expression> annotations})
+ {String? name,
+ List<Combinator>? combinators,
+ List<Expression>? annotations})
: this.byReference(0, annotations ?? <Expression>[],
importedLibrary.reference, name, combinators ?? <Combinator>[]);
LibraryDependency.export(Library importedLibrary,
- {List<Combinator> combinators, List<Expression> annotations})
+ {List<Combinator>? combinators, List<Expression>? annotations})
: this.byReference(ExportFlag, annotations ?? <Expression>[],
importedLibrary.reference, null, combinators ?? <Combinator>[]);
@@ -697,7 +725,7 @@
setParents(combinators, this);
}
- Library get enclosingLibrary => parent;
+ Library get enclosingLibrary => parent as Library;
Library get targetLibrary => importedLibraryReference.asLibrary;
static const int ExportFlag = 1 << 0;
@@ -711,16 +739,29 @@
annotations.add(annotation..parent = this);
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitLibraryDependency(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+ v.visitLibraryDependency(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
visitList(combinators, v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformList(combinators, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformList(combinators, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformCombinatorList(combinators, this);
}
@override
@@ -751,14 +792,25 @@
annotations.add(annotation..parent = this);
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitLibraryPart(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitLibraryPart(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
}
@override
@@ -778,7 +830,7 @@
final List<String> names;
- LibraryDependency get dependency => parent;
+ LibraryDependency get dependency => parent as LibraryDependency;
Combinator(this.isShow, this.names);
Combinator.show(this.names) : isShow = true;
@@ -790,10 +842,16 @@
R accept<R>(TreeVisitor<R> v) => v.visitCombinator(this);
@override
- visitChildren(Visitor v) {}
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitCombinator(this, arg);
@override
- transformChildren(Transformer v) {}
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -809,11 +867,13 @@
/// Declaration of a type alias.
class Typedef extends NamedNode implements FileUriNode {
/// The URI of the source file that contains the declaration of this typedef.
- Uri fileUri;
+ @override
+ Uri? fileUri;
+
List<Expression> annotations = const <Expression>[];
String name;
final List<TypeParameter> typeParameters;
- DartType type;
+ DartType? type;
// The following two fields describe parameters of the underlying type when
// that is a function type. They are needed to keep such attributes as names
@@ -824,12 +884,12 @@
final List<VariableDeclaration> namedParameters;
Typedef(this.name, this.type,
- {Reference reference,
+ {Reference? reference,
this.fileUri,
- List<TypeParameter> typeParameters,
- List<TypeParameter> typeParametersOfFunctionType,
- List<VariableDeclaration> positionalParameters,
- List<VariableDeclaration> namedParameters})
+ List<TypeParameter>? typeParameters,
+ List<TypeParameter>? typeParametersOfFunctionType,
+ List<VariableDeclaration>? positionalParameters,
+ List<VariableDeclaration>? namedParameters})
: this.typeParameters = typeParameters ?? <TypeParameter>[],
this.typeParametersOfFunctionType =
typeParametersOfFunctionType ?? <TypeParameter>[],
@@ -840,26 +900,44 @@
setParents(this.typeParameters, this);
}
- Library get enclosingLibrary => parent;
+ Library get enclosingLibrary => parent as Library;
- R accept<R>(TreeVisitor<R> v) {
- return v.visitTypedef(this);
- }
+ @override
+ R accept<R>(TreeVisitor<R> v) => v.visitTypedef(this);
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformList(typeParameters, v, this);
- if (type != null) {
- type = v.visitDartType(type);
- }
- }
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitTypedef(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
visitList(typeParameters, v);
type?.accept(v);
}
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformList(typeParameters, this);
+ if (type != null) {
+ type = v.visitDartType(type!);
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformTypeParameterList(typeParameters, this);
+ if (type != null) {
+ DartType newType = v.visitDartType(type!, dummyDartType);
+ if (identical(newType, dummyDartType)) {
+ type = null;
+ } else {
+ type = newType;
+ }
+ }
+ }
+
void addAnnotation(Expression node) {
if (annotations.isEmpty) {
annotations = <Expression>[];
@@ -868,8 +946,9 @@
node.parent = this;
}
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
@override
@@ -943,6 +1022,7 @@
///
/// This defaults to an immutable empty list. Use [addAnnotation] to add
/// annotations if needed.
+ @override
List<Expression> annotations = const <Expression>[];
/// Name of the class.
@@ -952,7 +1032,8 @@
/// The name may contain characters that are not valid in a Dart identifier,
/// in particular, the symbol '&' is used in class names generated for mixin
/// applications.
- String name;
+ // TODO(johnniwinther): Make this non-nullable.
+ String? name;
// Must match serialized bit positions.
static const int FlagAbstract = 1 << 0;
@@ -1037,7 +1118,7 @@
// Otherwise we have a left-linear binary tree (subtrees are supertype and
// mixedInType) of constraints, where all the interior nodes are anonymous
// mixin applications.
- Supertype current = supertype;
+ Supertype? current = supertype;
while (current != null && current.classNode.isAnonymousMixin) {
Class currentClass = current.classNode;
assert(currentClass.implementedTypes.length == 2);
@@ -1047,19 +1128,20 @@
current =
substitution.substituteSupertype(currentClass.implementedTypes[0]);
}
- return constraints..add(current);
+ return constraints..add(current!);
}
/// The URI of the source file this class was loaded from.
- Uri fileUri;
+ @override
+ Uri? fileUri;
final List<TypeParameter> typeParameters;
/// The immediate super type, or `null` if this is the root class.
- Supertype supertype;
+ Supertype? supertype;
/// The mixed-in type if this is a mixin application, otherwise `null`.
- Supertype mixedInType;
+ Supertype? mixedInType;
/// The types from the `implements` clause.
final List<Supertype> implementedTypes;
@@ -1069,14 +1151,14 @@
/// If non-null, the function that will have to be called to fill-out the
/// content of this class. Note that this should not be called directly
/// though.
- void Function() lazyBuilder;
+ void Function()? lazyBuilder;
/// Makes sure the class is loaded, i.e. the fields, procedures etc have been
/// loaded from the dill. Generally, one should not need to call this as it is
/// done automatically when accessing the lists.
void ensureLoaded() {
- if (lazyBuilder != null) {
- void Function() lazyBuilderLocal = lazyBuilder;
+ void Function()? lazyBuilderLocal = lazyBuilder;
+ if (lazyBuilderLocal != null) {
lazyBuilder = null;
lazyBuilderLocal();
}
@@ -1086,7 +1168,7 @@
///
/// Used for adding fields when reading the dill file.
final List<Field> fieldsInternal;
- DirtifyingList<Field> _fieldsView;
+ DirtifyingList<Field>? _fieldsView;
/// Fields declared in the class.
///
@@ -1095,30 +1177,28 @@
ensureLoaded();
// If already dirty the caller just might as well add stuff directly too.
if (dirty) return fieldsInternal;
- _fieldsView ??= new DirtifyingList(this, fieldsInternal);
- return _fieldsView;
+ return _fieldsView ??= new DirtifyingList(this, fieldsInternal);
}
/// Internal. Should *ONLY* be used from within kernel.
///
/// Used for adding constructors when reading the dill file.
final List<Constructor> constructorsInternal;
- DirtifyingList<Constructor> _constructorsView;
+ DirtifyingList<Constructor>? _constructorsView;
/// Constructors declared in the class.
List<Constructor> get constructors {
ensureLoaded();
// If already dirty the caller just might as well add stuff directly too.
if (dirty) return constructorsInternal;
- _constructorsView ??= new DirtifyingList(this, constructorsInternal);
- return _constructorsView;
+ return _constructorsView ??= new DirtifyingList(this, constructorsInternal);
}
/// Internal. Should *ONLY* be used from within kernel.
///
/// Used for adding procedures when reading the dill file.
final List<Procedure> proceduresInternal;
- DirtifyingList<Procedure> _proceduresView;
+ DirtifyingList<Procedure>? _proceduresView;
/// Procedures declared in the class.
///
@@ -1127,8 +1207,7 @@
ensureLoaded();
// If already dirty the caller just might as well add stuff directly too.
if (dirty) return proceduresInternal;
- _proceduresView ??= new DirtifyingList(this, proceduresInternal);
- return _proceduresView;
+ return _proceduresView ??= new DirtifyingList(this, proceduresInternal);
}
/// Internal. Should *ONLY* be used from within kernel.
@@ -1137,7 +1216,7 @@
/// file.
final List<RedirectingFactoryConstructor>
redirectingFactoryConstructorsInternal;
- DirtifyingList<RedirectingFactoryConstructor>
+ DirtifyingList<RedirectingFactoryConstructor>?
_redirectingFactoryConstructorsView;
/// Redirecting factory constructors declared in the class.
@@ -1147,9 +1226,8 @@
ensureLoaded();
// If already dirty the caller just might as well add stuff directly too.
if (dirty) return redirectingFactoryConstructorsInternal;
- _redirectingFactoryConstructorsView ??=
+ return _redirectingFactoryConstructorsView ??=
new DirtifyingList(this, redirectingFactoryConstructorsInternal);
- return _redirectingFactoryConstructorsView;
}
Class(
@@ -1158,14 +1236,14 @@
bool isAnonymousMixin: false,
this.supertype,
this.mixedInType,
- List<TypeParameter> typeParameters,
- List<Supertype> implementedTypes,
- List<Constructor> constructors,
- List<Procedure> procedures,
- List<Field> fields,
- List<RedirectingFactoryConstructor> redirectingFactoryConstructors,
+ List<TypeParameter>? typeParameters,
+ List<Supertype>? implementedTypes,
+ List<Constructor>? constructors,
+ List<Procedure>? procedures,
+ List<Field>? fields,
+ List<RedirectingFactoryConstructor>? redirectingFactoryConstructors,
this.fileUri,
- Reference reference})
+ Reference? reference})
: this.typeParameters = typeParameters ?? <TypeParameter>[],
this.implementedTypes = implementedTypes ?? <Supertype>[],
this.fieldsInternal = fields ?? <Field>[],
@@ -1184,7 +1262,7 @@
}
void computeCanonicalNames() {
- assert(canonicalName != null);
+ CanonicalName canonicalName = this.canonicalName!;
if (!dirty) return;
for (int i = 0; i < fields.length; ++i) {
Field member = fields[i];
@@ -1192,7 +1270,7 @@
if (member.hasSetter) {
canonicalName
.getChildFromFieldSetter(member)
- .bindTo(member.setterReference);
+ .bindTo(member.setterReference!);
}
}
for (int i = 0; i < procedures.length; ++i) {
@@ -1241,13 +1319,13 @@
}
/// The immediate super class, or `null` if this is the root class.
- Class get superclass => supertype?.classNode;
+ Class? get superclass => supertype?.classNode;
/// The mixed-in class if this is a mixin application, otherwise `null`.
///
/// Note that this may itself be a mixin application. Use [mixin] to get the
/// class that has the fields and procedures.
- Class get mixedInClass => mixedInType?.classNode;
+ Class? get mixedInClass => mixedInType?.classNode;
/// The class that declares the field and procedures of this class.
Class get mixin => mixedInClass?.mixin ?? this;
@@ -1256,18 +1334,18 @@
String get demangledName {
if (isAnonymousMixin) return nameAsMixinApplication;
- assert(!name.contains('&'));
- return name;
+ assert(!name!.contains('&'));
+ return name!;
}
String get nameAsMixinApplication {
assert(isAnonymousMixin);
- return demangleMixinApplicationName(name);
+ return demangleMixinApplicationName(name!);
}
String get nameAsMixinApplicationSubclass {
assert(isAnonymousMixin);
- return demangleMixinApplicationSubclassName(name);
+ return demangleMixinApplicationSubclassName(name!);
}
/// Members declared in this class.
@@ -1286,13 +1364,13 @@
/// This getter is for convenience, not efficiency. Consider manually
/// iterating the super types to speed up code in production.
Iterable<Supertype> get supers => <Iterable<Supertype>>[
- supertype == null ? const [] : [supertype],
- mixedInType == null ? const [] : [mixedInType],
+ supertype == null ? const [] : [supertype!],
+ mixedInType == null ? const [] : [mixedInType!],
implementedTypes
].expand((x) => x);
/// The library containing this class.
- Library get enclosingLibrary => parent;
+ Library get enclosingLibrary => parent as Library;
/// Internal. Should *ONLY* be used from within kernel.
///
@@ -1329,6 +1407,7 @@
redirectingFactoryConstructorsInternal.add(redirectingFactoryConstructor);
}
+ @override
void addAnnotation(Expression node) {
if (annotations.isEmpty) {
annotations = <Expression>[];
@@ -1337,7 +1416,12 @@
node.parent = this;
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitClass(this);
+
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitClass(this, arg);
+
R acceptReference<R>(Visitor<R> v) => v.visitClassReference(this);
Supertype get asRawSupertype {
@@ -1363,7 +1447,8 @@
printer.writeClassName(reference);
}
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
visitList(typeParameters, v);
supertype?.accept(v);
@@ -1375,24 +1460,54 @@
visitList(redirectingFactoryConstructors, v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformList(typeParameters, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformList(typeParameters, this);
if (supertype != null) {
- supertype = v.visitSupertype(supertype);
+ supertype = v.visitSupertype(supertype!);
}
if (mixedInType != null) {
- mixedInType = v.visitSupertype(mixedInType);
+ mixedInType = v.visitSupertype(mixedInType!);
}
- transformSupertypeList(implementedTypes, v);
- transformList(constructors, v, this);
- transformList(procedures, v, this);
- transformList(fields, v, this);
- transformList(redirectingFactoryConstructors, v, this);
+ v.transformSupertypeList(implementedTypes);
+ v.transformList(constructors, this);
+ v.transformList(procedures, this);
+ v.transformList(fields, this);
+ v.transformList(redirectingFactoryConstructors, this);
}
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformTypeParameterList(typeParameters, this);
+ if (supertype != null) {
+ Supertype newSupertype = v.visitSupertype(supertype!, dummySupertype);
+ if (identical(newSupertype, dummySupertype)) {
+ supertype = null;
+ } else {
+ supertype = newSupertype;
+ }
+ }
+ if (mixedInType != null) {
+ Supertype newMixedInType = v.visitSupertype(mixedInType!, dummySupertype);
+ if (identical(newMixedInType, dummySupertype)) {
+ mixedInType = null;
+ } else {
+ mixedInType = newMixedInType;
+ }
+ }
+ v.transformSupertypeList(implementedTypes);
+ v.transformConstructorList(constructors, this);
+ v.transformProcedureList(procedures, this);
+ v.transformFieldList(fields, this);
+ v.transformRedirectingFactoryConstructorList(
+ redirectingFactoryConstructors, this);
+ }
+
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
}
@@ -1405,10 +1520,11 @@
///
/// If unnamed, the extension will be given a synthesized name by the
/// front end.
- String name;
+ // TODO(johnniwinther): Make this non-nullable.
+ String? name;
/// The URI of the source file this class was loaded from.
- Uri fileUri;
+ Uri? fileUri;
/// Type parameters declared on the extension.
final List<TypeParameter> typeParameters;
@@ -1420,7 +1536,8 @@
/// class A {}
/// extension B on A {}
///
- DartType onType;
+ // TODO(johnniwinther): Should this be late non-nullable?
+ DartType? onType;
/// The members declared by the extension.
///
@@ -1430,39 +1547,55 @@
Extension(
{this.name,
- List<TypeParameter> typeParameters,
+ List<TypeParameter>? typeParameters,
this.onType,
- List<ExtensionMemberDescriptor> members,
+ List<ExtensionMemberDescriptor>? members,
this.fileUri,
- Reference reference})
+ Reference? reference})
: this.typeParameters = typeParameters ?? <TypeParameter>[],
this.members = members ?? <ExtensionMemberDescriptor>[],
super(reference) {
setParents(this.typeParameters, this);
}
- Library get enclosingLibrary => parent;
+ Library get enclosingLibrary => parent as Library;
@override
R accept<R>(TreeVisitor<R> v) => v.visitExtension(this);
@override
- visitChildren(Visitor v) {
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitExtension(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(typeParameters, v);
onType?.accept(v);
}
@override
- transformChildren(Transformer v) {
- transformList(typeParameters, v, this);
+ void transformChildren(Transformer v) {
+ v.transformList(typeParameters, this);
if (onType != null) {
- onType = v.visitDartType(onType);
+ onType = v.visitDartType(onType!);
}
}
@override
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformTypeParameterList(typeParameters, this);
+ if (onType != null) {
+ DartType newOnType = v.visitDartType(onType!, dummyDartType);
+ if (identical(newOnType, dummyDartType)) {
+ onType = null;
+ } else {
+ onType = newOnType;
+ }
+ }
+ }
+
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
@override
@@ -1521,10 +1654,13 @@
int flags = 0;
/// Reference to the top-level member created for the extension method.
- Reference member;
+ final Reference member;
ExtensionMemberDescriptor(
- {this.name, this.kind, bool isStatic: false, this.member}) {
+ {required this.name,
+ required this.kind,
+ bool isStatic: false,
+ required this.member}) {
this.isStatic = isStatic;
}
@@ -1558,12 +1694,15 @@
///
/// This defaults to an immutable empty list. Use [addAnnotation] to add
/// annotations if needed.
+ @override
List<Expression> annotations = const <Expression>[];
- Name name;
+ // TODO(johnniwinther): Make this non-nullable.
+ Name? name;
/// The URI of the source file this member was loaded from.
- Uri fileUri;
+ @override
+ Uri? fileUri;
/// Flags summarizing the kinds of AST nodes contained in this member, for
/// speeding up transformations that only affect certain types of nodes.
@@ -1582,13 +1721,19 @@
// TODO(asgerf): It might be worthwhile to put this on classes as well.
int transformerFlags = 0;
- Member(this.name, this.fileUri, Reference reference) : super(reference);
+ Member(this.name, this.fileUri, Reference? reference) : super(reference);
- Class get enclosingClass => parent is Class ? parent : null;
- Library get enclosingLibrary => parent is Class ? parent.parent : parent;
+ Class? get enclosingClass => parent is Class ? parent as Class : null;
+ Library get enclosingLibrary =>
+ (parent is Class ? parent!.parent : parent) as Library;
+ @override
R accept<R>(MemberVisitor<R> v);
- acceptReference(MemberReferenceVisitor v);
+
+ @override
+ R accept1<R, A>(MemberVisitor1<R, A> v, A arg);
+
+ R acceptReference<R>(MemberReferenceVisitor<R> v);
/// Returns true if this is an abstract procedure.
bool get isAbstract => false;
@@ -1635,8 +1780,9 @@
bool get isNonNullableByDefault;
void set isNonNullableByDefault(bool value);
- /// The body of the procedure or constructor, or `null` if this is a field.
- FunctionNode get function => null;
+ /// The function signature and body of the procedure or constructor, or `null`
+ /// if this is a field.
+ FunctionNode? get function => null;
/// Returns a possibly synthesized name for this member, consistent with
/// the names used across all [toString] calls.
@@ -1648,6 +1794,7 @@
printer.writeMemberName(reference);
}
+ @override
void addAnnotation(Expression node) {
if (annotations.isEmpty) {
annotations = <Expression>[];
@@ -1665,7 +1812,7 @@
/// If this member is a member signature, [memberSignatureOrigin] is one of
/// the non-member signature members from which it was created.
- Member get memberSignatureOrigin => null;
+ Member? get memberSignatureOrigin => null;
}
/// A field declaration.
@@ -1675,17 +1822,22 @@
class Field extends Member {
DartType type; // Not null. Defaults to DynamicType.
int flags = 0;
- Expression initializer; // May be null.
- final Reference setterReference;
+ Expression? initializer; // May be null.
+ final Reference? setterReference;
+
+ @override
@Deprecated("Use the specific getterReference/setterReference instead")
Reference get reference => super.reference;
Reference get getterReference => super.reference;
+
+ @override
@Deprecated(
"Use the specific getterCanonicalName/setterCanonicalName instead")
- CanonicalName get canonicalName => reference?.canonicalName;
- CanonicalName get getterCanonicalName => getterReference?.canonicalName;
- CanonicalName get setterCanonicalName => setterReference?.canonicalName;
+ CanonicalName? get canonicalName => reference.canonicalName;
+
+ CanonicalName? get getterCanonicalName => getterReference.canonicalName;
+ CanonicalName? get setterCanonicalName => setterReference?.canonicalName;
Field.mutable(Name name,
{this.type: const DynamicType(),
@@ -1695,12 +1847,13 @@
bool isStatic: false,
bool isLate: false,
int transformerFlags: 0,
- Uri fileUri,
- Reference getterReference,
- Reference setterReference})
+ Uri? fileUri,
+ Reference? getterReference,
+ Reference? setterReference})
: this.setterReference = setterReference ?? new Reference(),
super(name, fileUri, getterReference) {
- this.setterReference.node = this;
+ this.setterReference!.node = this;
+ // ignore: unnecessary_null_comparison
assert(type != null);
initializer?.parent = this;
this.isCovariant = isCovariant;
@@ -1719,10 +1872,11 @@
bool isStatic: false,
bool isLate: false,
int transformerFlags: 0,
- Uri fileUri,
- Reference getterReference})
+ Uri? fileUri,
+ Reference? getterReference})
: this.setterReference = null,
super(name, fileUri, getterReference) {
+ // ignore: unnecessary_null_comparison
assert(type != null);
initializer?.parent = this;
this.isCovariant = isCovariant;
@@ -1737,7 +1891,7 @@
void _relinkNode() {
super._relinkNode();
if (hasSetter) {
- this.setterReference.node = this;
+ this.setterReference!.node = this;
}
}
@@ -1755,7 +1909,10 @@
bool get isCovariant => flags & FlagCovariant != 0;
bool get isFinal => flags & FlagFinal != 0;
+
+ @override
bool get isConst => flags & FlagConst != 0;
+
bool get isStatic => flags & FlagStatic != 0;
@override
@@ -1815,11 +1972,19 @@
: (flags & ~FlagInternalImplementation);
}
+ @override
bool get isInstanceMember => !isStatic;
+
+ @override
bool get hasGetter => true;
+
+ @override
bool get hasSetter => setterReference != null;
+ @override
bool get isExternal => false;
+
+ @override
void set isExternal(bool value) {
if (value) throw 'Fields cannot be external';
}
@@ -1834,31 +1999,53 @@
: (flags & ~FlagNonNullableByDefault);
}
+ @override
R accept<R>(MemberVisitor<R> v) => v.visitField(this);
- acceptReference(MemberReferenceVisitor v) => v.visitFieldReference(this);
+ @override
+ R accept1<R, A>(MemberVisitor1<R, A> v, A arg) => v.visitField(this, arg);
- visitChildren(Visitor v) {
+ @override
+ R acceptReference<R>(MemberReferenceVisitor<R> v) =>
+ v.visitFieldReference(this);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
- type?.accept(v);
+ type.accept(v);
name?.accept(v);
initializer?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
type = v.visitDartType(type);
- transformList(annotations, v, this);
+ v.transformList(annotations, this);
if (initializer != null) {
- initializer = initializer.accept<TreeNode>(v);
+ initializer = v.transform(initializer!);
initializer?.parent = this;
}
}
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ type = v.visitDartType(type, null);
+ v.transformExpressionList(annotations, this);
+ if (initializer != null) {
+ initializer = v.transformOrRemoveExpression(initializer!);
+ initializer?.parent = this;
+ }
+ }
+
+ @override
DartType get getterType => type;
+
+ @override
DartType get setterType => hasSetter ? type : const BottomType();
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
@override
@@ -1886,18 +2073,22 @@
int startFileOffset = TreeNode.noOffset;
int flags = 0;
- FunctionNode function;
+
+ // TODO(johnniwinther): Make this non-nullable.
+ @override
+ FunctionNode? function;
+
List<Initializer> initializers;
Constructor(this.function,
- {Name name,
+ {Name? name,
bool isConst: false,
bool isExternal: false,
bool isSynthetic: false,
- List<Initializer> initializers,
+ List<Initializer>? initializers,
int transformerFlags: 0,
- Uri fileUri,
- Reference reference})
+ Uri? fileUri,
+ Reference? reference})
: this.initializers = initializers ?? <Initializer>[],
super(name, fileUri, reference) {
function?.parent = this;
@@ -1913,7 +2104,10 @@
static const int FlagSynthetic = 1 << 2;
static const int FlagNonNullableByDefault = 1 << 3;
+ @override
bool get isConst => flags & FlagConst != 0;
+
+ @override
bool get isExternal => flags & FlagExternal != 0;
/// True if this is a synthetic constructor inserted in a class that
@@ -1924,6 +2118,7 @@
flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
}
+ @override
void set isExternal(bool value) {
flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
}
@@ -1932,8 +2127,13 @@
flags = value ? (flags | FlagSynthetic) : (flags & ~FlagSynthetic);
}
+ @override
bool get isInstanceMember => false;
+
+ @override
bool get hasGetter => false;
+
+ @override
bool get hasSetter => false;
@override
@@ -1949,32 +2149,54 @@
: (flags & ~FlagNonNullableByDefault);
}
+ @override
R accept<R>(MemberVisitor<R> v) => v.visitConstructor(this);
- acceptReference(MemberReferenceVisitor v) =>
+ @override
+ R accept1<R, A>(MemberVisitor1<R, A> v, A arg) =>
+ v.visitConstructor(this, arg);
+
+ @override
+ R acceptReference<R>(MemberReferenceVisitor<R> v) =>
v.visitConstructorReference(this);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
name?.accept(v);
visitList(initializers, v);
function?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformList(initializers, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformList(initializers, this);
if (function != null) {
- function = function.accept<TreeNode>(v);
+ function = v.transform(function!);
function?.parent = this;
}
}
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformInitializerList(initializers, this);
+ if (function != null) {
+ function = v.transformOrRemove(function!, dummyFunctionNode);
+ function?.parent = this;
+ }
+ }
+
+ @override
DartType get getterType => const BottomType();
+
+ @override
DartType get setterType => const BottomType();
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
}
@@ -2009,7 +2231,7 @@
/// Reference to the constructor or the factory that this
/// [RedirectingFactoryConstructor] redirects to.
- Reference targetReference;
+ Reference? targetReference;
/// [typeParameters] are duplicates of the type parameters of the enclosing
/// class. Because [RedirectingFactoryConstructor]s aren't instance members,
@@ -2028,17 +2250,17 @@
List<VariableDeclaration> namedParameters;
RedirectingFactoryConstructor(this.targetReference,
- {Name name,
+ {Name? name,
bool isConst: false,
bool isExternal: false,
int transformerFlags: 0,
- List<DartType> typeArguments,
- List<TypeParameter> typeParameters,
- List<VariableDeclaration> positionalParameters,
- List<VariableDeclaration> namedParameters,
- int requiredParameterCount,
- Uri fileUri,
- Reference reference})
+ List<DartType>? typeArguments,
+ List<TypeParameter>? typeParameters,
+ List<VariableDeclaration>? positionalParameters,
+ List<VariableDeclaration>? namedParameters,
+ int? requiredParameterCount,
+ Uri? fileUri,
+ Reference? reference})
: this.typeArguments = typeArguments ?? <DartType>[],
this.typeParameters = typeParameters ?? <TypeParameter>[],
this.positionalParameters =
@@ -2059,19 +2281,28 @@
static const int FlagExternal = 1 << 1;
static const int FlagNonNullableByDefault = 1 << 2;
+ @override
bool get isConst => flags & FlagConst != 0;
+
+ @override
bool get isExternal => flags & FlagExternal != 0;
void set isConst(bool value) {
flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
}
+ @override
void set isExternal(bool value) {
flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
}
+ @override
bool get isInstanceMember => false;
+
+ @override
bool get hasGetter => false;
+
+ @override
bool get hasSetter => false;
@override
@@ -2089,36 +2320,54 @@
: (flags & ~FlagNonNullableByDefault);
}
- Member get target => targetReference?.asMember;
+ Member? get target => targetReference?.asMember;
- void set target(Member member) {
+ void set target(Member? member) {
assert(member is Constructor ||
(member is Procedure && member.kind == ProcedureKind.Factory));
targetReference = getMemberReferenceGetter(member);
}
+ @override
R accept<R>(MemberVisitor<R> v) => v.visitRedirectingFactoryConstructor(this);
- acceptReference(MemberReferenceVisitor v) =>
+ @override
+ R accept1<R, A>(MemberVisitor1<R, A> v, A arg) =>
+ v.visitRedirectingFactoryConstructor(this, arg);
+
+ @override
+ R acceptReference<R>(MemberReferenceVisitor<R> v) =>
v.visitRedirectingFactoryConstructorReference(this);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
target?.acceptReference(v);
visitList(typeArguments, v);
name?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- transformTypeList(typeArguments, v);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ v.transformDartTypeList(typeArguments);
}
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ v.transformDartTypeList(typeArguments);
+ }
+
+ @override
DartType get getterType => const BottomType();
+
+ @override
DartType get setterType => const BottomType();
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
}
@@ -2333,12 +2582,15 @@
final ProcedureKind kind;
int flags = 0;
- // function is null if and only if abstract, external.
- FunctionNode function;
+
+ // TODO(johnniwinther): Make this non-nullable.
+ @override
+ FunctionNode? function;
// The function node's body might be lazily loaded, meaning that this value
// might not be set correctly yet. Make sure the body is loaded before
// returning anything.
+ @override
int get transformerFlags {
function?.body;
return super.transformerFlags;
@@ -2347,6 +2599,7 @@
// The function node's body might be lazily loaded, meaning that this value
// might get overwritten later (when the body is read). To avoid that read the
// body now and only set the value afterwards.
+ @override
void set transformerFlags(int newValue) {
function?.body;
super.transformerFlags = newValue;
@@ -2360,7 +2613,7 @@
}
ProcedureStubKind stubKind;
- Reference stubTargetReference;
+ Reference? stubTargetReference;
Procedure(Name name, ProcedureKind kind, FunctionNode function,
{bool isAbstract: false,
@@ -2370,10 +2623,10 @@
bool isExtensionMember: false,
bool isSynthetic: false,
int transformerFlags: 0,
- Uri fileUri,
- Reference reference,
+ Uri? fileUri,
+ Reference? reference,
ProcedureStubKind stubKind: ProcedureStubKind.Regular,
- Member stubTarget})
+ Member? stubTarget})
: this._byReferenceRenamed(name, kind, function,
isAbstract: isAbstract,
isStatic: isStatic,
@@ -2396,10 +2649,11 @@
bool isExtensionMember: false,
bool isSynthetic: false,
int transformerFlags: 0,
- Uri fileUri,
- Reference reference,
+ Uri? fileUri,
+ Reference? reference,
this.stubKind: ProcedureStubKind.Regular,
this.stubTargetReference})
+ // ignore: unnecessary_null_comparison
: assert(kind != null),
super(name, fileUri, reference) {
function?.parent = this;
@@ -2430,11 +2684,16 @@
static const int FlagSynthetic = 1 << 7;
bool get isStatic => flags & FlagStatic != 0;
+
+ @override
bool get isAbstract => flags & FlagAbstract != 0;
+
+ @override
bool get isExternal => flags & FlagExternal != 0;
/// True if this has the `const` modifier. This is only possible for external
/// constant factories, such as `String.fromEnvironment`.
+ @override
bool get isConst => flags & FlagConst != 0;
/// If set, this flag indicates that this function's implementation exists
@@ -2488,6 +2747,7 @@
flags = value ? (flags | FlagAbstract) : (flags & ~FlagAbstract);
}
+ @override
void set isExternal(bool value) {
flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
}
@@ -2511,12 +2771,19 @@
flags = value ? (flags | FlagSynthetic) : (flags & ~FlagSynthetic);
}
+ @override
bool get isInstanceMember => !isStatic;
+
bool get isGetter => kind == ProcedureKind.Getter;
bool get isSetter => kind == ProcedureKind.Setter;
bool get isAccessor => isGetter || isSetter;
+
+ @override
bool get hasGetter => kind != ProcedureKind.Setter;
+
+ @override
bool get hasSetter => kind == ProcedureKind.Setter;
+
bool get isFactory => kind == ProcedureKind.Factory;
@override
@@ -2529,59 +2796,80 @@
: (flags & ~FlagNonNullableByDefault);
}
- Member get concreteForwardingStubTarget =>
+ Member? get concreteForwardingStubTarget =>
stubKind == ProcedureStubKind.ConcreteForwardingStub
? stubTargetReference?.asMember
: null;
- Member get abstractForwardingStubTarget =>
+ Member? get abstractForwardingStubTarget =>
stubKind == ProcedureStubKind.AbstractForwardingStub
? stubTargetReference?.asMember
: null;
- Member get stubTarget => stubTargetReference?.asMember;
+ Member? get stubTarget => stubTargetReference?.asMember;
- void set stubTarget(Member target) {
+ void set stubTarget(Member? target) {
stubTargetReference = getMemberReferenceBasedOnProcedureKind(target, kind);
}
- Member get memberSignatureOrigin =>
+ @override
+ Member? get memberSignatureOrigin =>
stubKind == ProcedureStubKind.MemberSignature
? stubTargetReference?.asMember
: null;
+ @override
R accept<R>(MemberVisitor<R> v) => v.visitProcedure(this);
- acceptReference(MemberReferenceVisitor v) => v.visitProcedureReference(this);
+ @override
+ R accept1<R, A>(MemberVisitor1<R, A> v, A arg) => v.visitProcedure(this, arg);
- visitChildren(Visitor v) {
+ @override
+ R acceptReference<R>(MemberReferenceVisitor<R> v) =>
+ v.visitProcedureReference(this);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
name?.accept(v);
function?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
if (function != null) {
- function = function.accept<TreeNode>(v);
+ function = v.transform(function!);
function?.parent = this;
}
}
- DartType get getterType {
- return isGetter
- ? function.returnType
- : function.computeFunctionType(enclosingLibrary.nonNullable);
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ if (function != null) {
+ function = v.transformOrRemove(function!, dummyFunctionNode);
+ function?.parent = this;
+ }
}
+ @override
+ DartType get getterType {
+ return isGetter
+ ? function!.returnType
+ : function!.computeFunctionType(enclosingLibrary.nonNullable);
+ }
+
+ @override
DartType get setterType {
return isSetter
- ? function.positionalParameters[0].type
+ ? function!.positionalParameters[0].type
: const BottomType();
}
- Location _getLocationInEnclosingFile(int offset) {
- return _getLocationInComponent(enclosingComponent, fileUri, offset);
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
+ return _getLocationInComponent(enclosingComponent, fileUri!, offset);
}
}
@@ -2603,7 +2891,11 @@
@informative
bool isSynthetic = false;
+ @override
R accept<R>(InitializerVisitor<R> v);
+
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg);
}
/// An initializer with a compile-time error.
@@ -2613,10 +2905,21 @@
// DESIGN TODO: The frontend should use this in a lot more cases to catch
// invalid cases.
class InvalidInitializer extends Initializer {
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitInvalidInitializer(this);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitInvalidInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -2645,30 +2948,47 @@
FieldInitializer(Field field, Expression value)
: this.byReference(
// getterReference is used since this refers to the field itself
- field?.getterReference,
+ field.getterReference,
value);
FieldInitializer.byReference(this.fieldReference, this.value) {
- value?.parent = this;
+ value.parent = this;
}
- Field get field => fieldReference?.node;
+ Field get field => fieldReference.asField;
void set field(Field field) {
- fieldReference = field?.getterReference;
+ fieldReference = field.getterReference;
}
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitFieldInitializer(this);
- visitChildren(Visitor v) {
- field?.acceptReference(v);
- value?.accept(v);
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitFieldInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ field.acceptReference(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -2700,31 +3020,48 @@
SuperInitializer(Constructor target, Arguments arguments)
: this.byReference(
// Getter vs setter doesn't matter for constructors.
- getMemberReferenceGetter(target),
+ getNonNullableMemberReferenceGetter(target),
arguments);
SuperInitializer.byReference(this.targetReference, this.arguments) {
- arguments?.parent = this;
+ arguments.parent = this;
}
- Constructor get target => targetReference?.asConstructor;
+ Constructor get target => targetReference.asConstructor;
void set target(Constructor target) {
// Getter vs setter doesn't matter for constructors.
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitSuperInitializer(this);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
- arguments?.accept(v);
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitSuperInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -2752,31 +3089,48 @@
RedirectingInitializer(Constructor target, Arguments arguments)
: this.byReference(
// Getter vs setter doesn't matter for constructors.
- getMemberReferenceGetter(target),
+ getNonNullableMemberReferenceGetter(target),
arguments);
RedirectingInitializer.byReference(this.targetReference, this.arguments) {
- arguments?.parent = this;
+ arguments.parent = this;
}
- Constructor get target => targetReference?.asConstructor;
+ Constructor get target => targetReference.asConstructor;
void set target(Constructor target) {
// Getter vs setter doesn't matter for constructors.
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitRedirectingInitializer(this);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
- arguments?.accept(v);
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitRedirectingInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -2799,19 +3153,36 @@
VariableDeclaration variable;
LocalInitializer(this.variable) {
- variable?.parent = this;
+ variable.parent = this;
}
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitLocalInitializer(this);
- visitChildren(Visitor v) {
- variable?.accept(v);
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitLocalInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ variable.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
- variable?.parent = this;
+ variable = v.transform(variable);
+ variable.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable.parent = this;
}
}
@@ -2833,14 +3204,27 @@
statement.parent = this;
}
+ @override
R accept<R>(InitializerVisitor<R> v) => v.visitAssertInitializer(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(InitializerVisitor1<R, A> v, A arg) =>
+ v.visitAssertInitializer(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
statement.accept(v);
}
- transformChildren(Transformer v) {
- statement = statement.accept<TreeNode>(v);
+ @override
+ void transformChildren(Transformer v) {
+ statement = v.transform(statement);
+ statement.parent = this;
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ statement = v.transform(statement);
statement.parent = this;
}
@@ -2890,7 +3274,7 @@
List<VariableDeclaration> positionalParameters;
List<VariableDeclaration> namedParameters;
DartType returnType; // Not null.
- Statement _body;
+ Statement? _body;
/// The future value type of this is an async function, otherwise `null`.
///
@@ -2903,55 +3287,56 @@
/// here the return types are `Future<Foo>` and `FutureOr<Foo>` for `method1`
/// and `method2`, respectively, but the future value type is in both cases
/// `Foo`.
- DartType futureValueType;
+ DartType? futureValueType;
- void Function() lazyBuilder;
+ void Function()? lazyBuilder;
void _buildLazy() {
- if (lazyBuilder != null) {
- void Function() lazyBuilderLocal = lazyBuilder;
+ void Function()? lazyBuilderLocal = lazyBuilder;
+ if (lazyBuilderLocal != null) {
lazyBuilder = null;
lazyBuilderLocal();
}
}
- Statement get body {
+ Statement? get body {
_buildLazy();
return _body;
}
- void set body(Statement body) {
+ void set body(Statement? body) {
_buildLazy();
_body = body;
}
FunctionNode(this._body,
- {List<TypeParameter> typeParameters,
- List<VariableDeclaration> positionalParameters,
- List<VariableDeclaration> namedParameters,
- int requiredParameterCount,
+ {List<TypeParameter>? typeParameters,
+ List<VariableDeclaration>? positionalParameters,
+ List<VariableDeclaration>? namedParameters,
+ int? requiredParameterCount,
this.returnType: const DynamicType(),
this.asyncMarker: AsyncMarker.Sync,
- this.dartAsyncMarker,
+ AsyncMarker? dartAsyncMarker,
this.futureValueType})
: this.positionalParameters =
positionalParameters ?? <VariableDeclaration>[],
this.requiredParameterCount =
requiredParameterCount ?? positionalParameters?.length ?? 0,
this.namedParameters = namedParameters ?? <VariableDeclaration>[],
- this.typeParameters = typeParameters ?? <TypeParameter>[] {
+ this.typeParameters = typeParameters ?? <TypeParameter>[],
+ this.dartAsyncMarker = dartAsyncMarker ?? asyncMarker {
+ // ignore: unnecessary_null_comparison
assert(returnType != null);
setParents(this.typeParameters, this);
setParents(this.positionalParameters, this);
setParents(this.namedParameters, this);
_body?.parent = this;
- dartAsyncMarker ??= asyncMarker;
}
static DartType _getTypeOfVariable(VariableDeclaration node) => node.type;
static NamedType _getNamedTypeOfVariable(VariableDeclaration node) {
- return new NamedType(node.name, node.type, isRequired: node.isRequired);
+ return new NamedType(node.name!, node.type, isRequired: node.isRequired);
}
/// Returns the function type of the node reusing its type parameters.
@@ -2963,7 +3348,7 @@
/// type of the enclosing generic function and in combination with
/// [FunctionType.withoutTypeParameters].
FunctionType computeThisFunctionType(Nullability nullability) {
- TreeNode parent = this.parent;
+ TreeNode? parent = this.parent;
List<NamedType> named =
namedParameters.map(_getNamedTypeOfVariable).toList(growable: false);
named.sort();
@@ -2971,7 +3356,7 @@
// transformations like erasure don't work.
List<TypeParameter> typeParametersCopy = new List<TypeParameter>.from(
parent is Constructor
- ? parent.enclosingClass.typeParameters
+ ? parent.enclosingClass!.typeParameters
: typeParameters);
return new FunctionType(
positionalParameters.map(_getTypeOfVariable).toList(growable: false),
@@ -3006,13 +3391,12 @@
/// constructor invocations.
FunctionType computeAliasedConstructorFunctionType(
Typedef typedef, Library library) {
- TreeNode parent = this.parent;
assert(parent is Constructor, "Only run this method on constructors");
- Constructor parentConstructor = parent;
+ Constructor parentConstructor = parent as Constructor;
// We need create a copy of the list of type parameters, otherwise
// transformations like erasure don't work.
List<TypeParameter> classTypeParametersCopy =
- List.from(parentConstructor.enclosingClass.typeParameters);
+ List.from(parentConstructor.enclosingClass!.typeParameters);
List<TypeParameter> typedefTypeParametersCopy =
List.from(typedef.typeParameters);
List<DartType> asTypeArguments =
@@ -3022,7 +3406,7 @@
DartType unaliasedTypedef = typedefType.unalias;
assert(unaliasedTypedef is InterfaceType,
"[typedef] is assumed to resolve to an interface type");
- InterfaceType targetType = unaliasedTypedef;
+ InterfaceType targetType = unaliasedTypedef as InterfaceType;
Substitution substitution = Substitution.fromPairs(
classTypeParametersCopy, targetType.typeArguments);
List<DartType> positional = positionalParameters
@@ -3031,7 +3415,7 @@
.toList(growable: false);
List<NamedType> named = namedParameters
.map((VariableDeclaration decl) => NamedType(
- decl.name, substitution.substituteType(decl.type),
+ decl.name!, substitution.substituteType(decl.type),
isRequired: decl.isRequired))
.toList(growable: false);
named.sort();
@@ -3066,7 +3450,7 @@
DartType unaliasedTypedef = typedefType.unalias;
assert(unaliasedTypedef is InterfaceType,
"[typedef] is assumed to resolve to an interface type");
- InterfaceType targetType = unaliasedTypedef;
+ InterfaceType targetType = unaliasedTypedef as InterfaceType;
Substitution substitution = Substitution.fromPairs(
classTypeParametersCopy, targetType.typeArguments);
List<DartType> positional = positionalParameters
@@ -3075,7 +3459,7 @@
.toList(growable: false);
List<NamedType> named = namedParameters
.map((VariableDeclaration decl) => NamedType(
- decl.name, substitution.substituteType(decl.type),
+ decl.name!, substitution.substituteType(decl.type),
isRequired: decl.isRequired))
.toList(growable: false);
named.sort();
@@ -3085,23 +3469,42 @@
requiredParameterCount: requiredParameterCount);
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitFunctionNode(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+ v.visitFunctionNode(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(typeParameters, v);
visitList(positionalParameters, v);
visitList(namedParameters, v);
- returnType?.accept(v);
+ returnType.accept(v);
body?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(typeParameters, v, this);
- transformList(positionalParameters, v, this);
- transformList(namedParameters, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(typeParameters, this);
+ v.transformList(positionalParameters, this);
+ v.transformList(namedParameters, this);
returnType = v.visitDartType(returnType);
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body!);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformTypeParameterList(typeParameters, this);
+ v.transformVariableDeclarationList(positionalParameters, this);
+ v.transformVariableDeclarationList(namedParameters, this);
+ returnType = v.visitDartType(returnType, cannotRemoveSentinel);
+ if (body != null) {
+ body = v.transformOrRemoveStatement(body!);
body?.parent = this;
}
}
@@ -3206,8 +3609,7 @@
DartType type = getStaticType(context);
while (type is TypeParameterType) {
TypeParameterType typeParameterType = type;
- type =
- typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+ type = typeParameterType.bound;
}
if (type is NullType) {
return context.typeEnvironment.coreTypes
@@ -3217,7 +3619,7 @@
.bottomInterfaceType(superclass, type.nullability);
}
if (type is InterfaceType) {
- List<DartType> upcastTypeArguments = context.typeEnvironment
+ List<DartType>? upcastTypeArguments = context.typeEnvironment
.getTypeArgumentsAsInstanceOf(type, superclass);
if (upcastTypeArguments != null) {
return new InterfaceType(
@@ -3257,18 +3659,20 @@
.rawType(superclass, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg);
int get precedence => astToText.Precedence.of(this);
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
printer.writeExpression(this);
return printer.getText();
}
-
- void toTextInternal(AstPrinter printer);
}
/// An expression containing compile-time errors.
@@ -3304,6 +3708,9 @@
void transformChildren(Transformer v) {}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
+
+ @override
String toString() {
return "InvalidExpression(${toStringInternal()})";
}
@@ -3319,10 +3726,13 @@
/// Read a local variable, a local function, or a function parameter.
class VariableGet extends Expression {
VariableDeclaration variable;
- DartType promotedType; // Null if not promoted.
+ DartType? promotedType; // Null if not promoted.
- VariableGet(this.variable, [this.promotedType]) : assert(variable != null);
+ VariableGet(this.variable, [this.promotedType])
+ // ignore: unnecessary_null_comparison
+ : assert(variable != null);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -3331,17 +3741,34 @@
return promotedType ?? variable.type;
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitVariableGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitVariableGet(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
promotedType?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
if (promotedType != null) {
- promotedType = v.visitDartType(promotedType);
+ promotedType = v.visitDartType(promotedType!);
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (promotedType != null) {
+ DartType newPromotedType = v.visitDartType(promotedType!, dummyDartType);
+ if (identical(newPromotedType, dummyDartType)) {
+ promotedType = null;
+ } else {
+ promotedType = newPromotedType;
+ }
}
}
@@ -3355,7 +3782,7 @@
printer.write(printer.getVariableName(variable));
if (promotedType != null) {
printer.write('{');
- printer.writeType(promotedType);
+ printer.writeType(promotedType!);
printer.write('}');
}
}
@@ -3368,10 +3795,13 @@
VariableDeclaration variable;
Expression value;
- VariableSet(this.variable, this.value) : assert(variable != null) {
- value?.parent = this;
+ VariableSet(this.variable, this.value)
+ // ignore: unnecessary_null_comparison
+ : assert(variable != null) {
+ value.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -3379,18 +3809,33 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitVariableSet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitVariableSet(this, arg);
- visitChildren(Visitor v) {
- value?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -3440,10 +3885,13 @@
Name name;
DynamicGet(this.kind, this.receiver, this.name) {
- receiver?.parent = this;
+ receiver.parent = this;
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitDynamicGet(this, arg);
@@ -3458,20 +3906,29 @@
case DynamicAccessKind.Unresolved:
return const InvalidType();
}
- return const DynamicType();
}
@override
void visitChildren(Visitor v) {
- receiver?.accept(v);
- name?.accept(v);
+ receiver.accept(v);
+ name.accept(v);
}
@override
void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
}
@@ -3514,41 +3971,59 @@
Reference interfaceTargetReference;
InstanceGet(InstanceAccessKind kind, Expression receiver, Name name,
- {Member interfaceTarget, DartType resultType})
+ {required Member interfaceTarget, required DartType resultType})
: this.byReference(kind, receiver, name,
- interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+ interfaceTargetReference:
+ getNonNullableMemberReferenceGetter(interfaceTarget),
resultType: resultType);
InstanceGet.byReference(this.kind, this.receiver, this.name,
- {this.interfaceTargetReference, this.resultType})
+ {required this.interfaceTargetReference, required this.resultType})
+ // ignore: unnecessary_null_comparison
: assert(interfaceTargetReference != null),
+ // ignore: unnecessary_null_comparison
assert(resultType != null) {
- receiver?.parent = this;
+ receiver.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member get interfaceTarget => interfaceTargetReference.asMember;
void set interfaceTarget(Member member) {
- interfaceTargetReference = getMemberReferenceSetter(member);
+ interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
}
@override
DartType getStaticTypeInternal(StaticTypeContext context) => resultType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstanceGet(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- interfaceTarget?.acceptReference(v);
- name?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ interfaceTarget.acceptReference(v);
+ name.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
}
@@ -3572,24 +4047,40 @@
Expression receiver;
FunctionTearOff(this.receiver) {
- receiver?.parent = this;
+ receiver.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
receiver.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionTearOff(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitFunctionTearOff(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
}
@@ -3631,39 +4122,55 @@
Reference interfaceTargetReference;
InstanceTearOff(InstanceAccessKind kind, Expression receiver, Name name,
- {Procedure interfaceTarget, DartType resultType})
+ {required Procedure interfaceTarget, required DartType resultType})
: this.byReference(kind, receiver, name,
- interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+ interfaceTargetReference:
+ getNonNullableMemberReferenceGetter(interfaceTarget),
resultType: resultType);
InstanceTearOff.byReference(this.kind, this.receiver, this.name,
- {this.interfaceTargetReference, this.resultType}) {
- receiver?.parent = this;
+ {required this.interfaceTargetReference, required this.resultType}) {
+ receiver.parent = this;
}
- Procedure get interfaceTarget => interfaceTargetReference?.asMember;
+ Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
- void set interfaceTarget(Member member) {
- interfaceTargetReference = getMemberReferenceSetter(member);
+ void set interfaceTarget(Procedure procedure) {
+ interfaceTargetReference = getNonNullableMemberReferenceSetter(procedure);
}
@override
DartType getStaticTypeInternal(StaticTypeContext context) => resultType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceTearOff(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstanceTearOff(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- interfaceTarget?.acceptReference(v);
- name?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ interfaceTarget.acceptReference(v);
+ name.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
}
@@ -3688,27 +4195,28 @@
Expression receiver;
Name name;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
- PropertyGet(Expression receiver, Name name, [Member interfaceTarget])
+ PropertyGet(Expression receiver, Name name, [Member? interfaceTarget])
: this.byReference(
receiver, name, getMemberReferenceGetter(interfaceTarget));
PropertyGet.byReference(
this.receiver, this.name, this.interfaceTargetReference) {
- receiver?.parent = this;
+ receiver.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member? get interfaceTarget => interfaceTargetReference?.asMember;
- void set interfaceTarget(Member member) {
+ void set interfaceTarget(Member? member) {
interfaceTargetReference = getMemberReferenceGetter(member);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
- Member interfaceTarget = this.interfaceTarget;
+ Member? interfaceTarget = this.interfaceTarget;
if (interfaceTarget != null) {
- Class superclass = interfaceTarget.enclosingClass;
+ Class superclass = interfaceTarget.enclosingClass!;
InterfaceType receiverType =
receiver.getStaticTypeAsInstanceOf(superclass, context);
return Substitution.fromInterfaceType(receiverType)
@@ -3724,20 +4232,35 @@
return const DynamicType();
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitPropertyGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitPropertyGet(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
interfaceTarget?.acceptReference(v);
- name?.accept(v);
+ name.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
}
@@ -3762,31 +4285,53 @@
Expression value;
DynamicSet(this.kind, this.receiver, this.name, this.value) {
- receiver?.parent = this;
- value?.parent = this;
+ receiver.parent = this;
+ value.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicSet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitDynamicSet(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- name?.accept(v);
- value?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ name.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -3818,46 +4363,69 @@
InstanceSet(
InstanceAccessKind kind, Expression receiver, Name name, Expression value,
- {Member interfaceTarget})
+ {required Member interfaceTarget})
: this.byReference(kind, receiver, name, value,
interfaceTargetReference:
- getMemberReferenceSetter(interfaceTarget));
+ getNonNullableMemberReferenceSetter(interfaceTarget));
InstanceSet.byReference(this.kind, this.receiver, this.name, this.value,
- {this.interfaceTargetReference})
+ {required this.interfaceTargetReference})
+ // ignore: unnecessary_null_comparison
: assert(interfaceTargetReference != null) {
- receiver?.parent = this;
- value?.parent = this;
+ receiver.parent = this;
+ value.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member get interfaceTarget => interfaceTargetReference.asMember;
void set interfaceTarget(Member member) {
- interfaceTargetReference = getMemberReferenceSetter(member);
+ interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceSet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstanceSet(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- interfaceTarget?.acceptReference(v);
- name?.accept(v);
- value?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ interfaceTarget.acceptReference(v);
+ name.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -3887,47 +4455,69 @@
Name name;
Expression value;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
PropertySet(Expression receiver, Name name, Expression value,
- [Member interfaceTarget])
+ [Member? interfaceTarget])
: this.byReference(
receiver, name, value, getMemberReferenceSetter(interfaceTarget));
PropertySet.byReference(
this.receiver, this.name, this.value, this.interfaceTargetReference) {
- receiver?.parent = this;
- value?.parent = this;
+ receiver.parent = this;
+ value.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member? get interfaceTarget => interfaceTargetReference?.asMember;
- void set interfaceTarget(Member member) {
+ void set interfaceTarget(Member? member) {
interfaceTargetReference = getMemberReferenceSetter(member);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitPropertySet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitPropertySet(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
interfaceTarget?.acceptReference(v);
- name?.accept(v);
- value?.accept(v);
+ name.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -3953,46 +4543,56 @@
class SuperPropertyGet extends Expression {
Name name;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
- SuperPropertyGet(Name name, [Member interfaceTarget])
+ SuperPropertyGet(Name name, [Member? interfaceTarget])
: this.byReference(name, getMemberReferenceGetter(interfaceTarget));
SuperPropertyGet.byReference(this.name, this.interfaceTargetReference);
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member? get interfaceTarget => interfaceTargetReference?.asMember;
- void set interfaceTarget(Member member) {
+ void set interfaceTarget(Member? member) {
interfaceTargetReference = getMemberReferenceGetter(member);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
+ Member? interfaceTarget = this.interfaceTarget;
if (interfaceTarget == null) {
// TODO(johnniwinther): SuperPropertyGet without a target should be
// replaced by invalid expressions.
return const DynamicType();
}
- Class declaringClass = interfaceTarget.enclosingClass;
+ Class declaringClass = interfaceTarget.enclosingClass!;
if (declaringClass.typeParameters.isEmpty) {
return interfaceTarget.getterType;
}
- List<DartType> receiverArguments = context.typeEnvironment
- .getTypeArgumentsAsInstanceOf(context.thisType, declaringClass);
+ List<DartType>? receiverArguments = context.typeEnvironment
+ .getTypeArgumentsAsInstanceOf(context.thisType!, declaringClass);
return Substitution.fromPairs(
- declaringClass.typeParameters, receiverArguments)
+ declaringClass.typeParameters, receiverArguments!)
.substituteType(interfaceTarget.getterType);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSuperPropertyGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSuperPropertyGet(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
interfaceTarget?.acceptReference(v);
- name?.accept(v);
+ name.accept(v);
}
- transformChildren(Transformer v) {}
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -4015,7 +4615,7 @@
Name name;
Expression value;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
SuperPropertySet(Name name, Expression value, Member interfaceTarget)
: this.byReference(
@@ -4023,32 +4623,48 @@
SuperPropertySet.byReference(
this.name, this.value, this.interfaceTargetReference) {
- value?.parent = this;
+ value.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member? get interfaceTarget => interfaceTargetReference?.asMember;
- void set interfaceTarget(Member member) {
+ void set interfaceTarget(Member? member) {
interfaceTargetReference = getMemberReferenceSetter(member);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSuperPropertySet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSuperPropertySet(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
interfaceTarget?.acceptReference(v);
- name?.accept(v);
- value?.accept(v);
+ name.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -4071,28 +4687,38 @@
/// A static field, getter, or method (for tear-off).
Reference targetReference;
- StaticGet(Member target) : this.byReference(getMemberReferenceGetter(target));
+ StaticGet(Member target)
+ : this.byReference(getNonNullableMemberReferenceGetter(target));
StaticGet.byReference(this.targetReference);
- Member get target => targetReference?.asMember;
+ Member get target => targetReference.asMember;
void set target(Member target) {
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
target.getterType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStaticGet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStaticGet(this, arg);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
}
- transformChildren(Transformer v) {}
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -4110,28 +4736,37 @@
Reference targetReference;
StaticTearOff(Procedure target)
- : this.byReference(getMemberReferenceGetter(target));
+ : this.byReference(getNonNullableMemberReferenceGetter(target));
StaticTearOff.byReference(this.targetReference);
- Procedure get target => targetReference?.asProcedure;
+ Procedure get target => targetReference.asProcedure;
void set target(Procedure target) {
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
target.getterType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStaticTearOff(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStaticTearOff(this, arg);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
}
- transformChildren(Transformer v) {}
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -4153,34 +4788,50 @@
Expression value;
StaticSet(Member target, Expression value)
- : this.byReference(getMemberReferenceSetter(target), value);
+ : this.byReference(getNonNullableMemberReferenceSetter(target), value);
StaticSet.byReference(this.targetReference, this.value) {
- value?.parent = this;
+ value.parent = this;
}
- Member get target => targetReference?.asMember;
+ Member get target => targetReference.asMember;
void set target(Member target) {
- targetReference = getMemberReferenceSetter(target);
+ targetReference = getNonNullableMemberReferenceSetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStaticSet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStaticSet(this, arg);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
- value?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -4205,7 +4856,7 @@
List<NamedExpression> named;
Arguments(this.positional,
- {List<DartType> types, List<NamedExpression> named})
+ {List<DartType>? types, List<NamedExpression>? named})
: this.types = types ?? <DartType>[],
this.named = named ?? <NamedExpression>[] {
setParents(this.positional, this);
@@ -4223,7 +4874,7 @@
.map<Expression>((p) => new VariableGet(p))
.toList(),
named: function.namedParameters
- .map((p) => new NamedExpression(p.name, new VariableGet(p)))
+ .map((p) => new NamedExpression(p.name!, new VariableGet(p)))
.toList(),
types: function.typeParameters
.map<DartType>((p) =>
@@ -4232,18 +4883,31 @@
.toList());
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitArguments(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitArguments(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(types, v);
visitList(positional, v);
visitList(named, v);
}
- transformChildren(Transformer v) {
- transformTypeList(types, v);
- transformList(positional, v, this);
- transformList(named, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformDartTypeList(types);
+ v.transformList(positional, this);
+ v.transformList(named, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformDartTypeList(types);
+ v.transformExpressionList(positional, this);
+ v.transformNamedExpressionList(named, this);
}
@override
@@ -4251,12 +4915,14 @@
return "Arguments(${toStringInternal()})";
}
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
printer.writeArguments(this);
return printer.getText();
}
+ @override
void toTextInternal(AstPrinter printer, {bool includeTypeArguments: true}) {
if (includeTypeArguments) {
printer.writeTypeArguments(types);
@@ -4289,19 +4955,36 @@
Expression value;
NamedExpression(this.name, this.value) {
- value?.parent = this;
+ value.parent = this;
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitNamedExpression(this);
- visitChildren(Visitor v) {
- value?.accept(v);
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+ v.visitNamedExpression(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -4310,12 +4993,14 @@
return "NamedExpression(${toStringInternal()})";
}
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
toTextInternal(printer);
return printer.getText();
}
+ @override
void toTextInternal(AstPrinter printer) {
printer.write(name);
printer.write(': ');
@@ -4330,20 +5015,22 @@
void set arguments(Arguments value);
/// Name of the invoked method.
- ///
- /// May be `null` if the target is a synthetic static member without a name.
Name get name;
}
class DynamicInvocation extends InvocationExpression {
final DynamicAccessKind kind;
Expression receiver;
+
+ @override
Name name;
+
+ @override
Arguments arguments;
DynamicInvocation(this.kind, this.receiver, this.name, this.arguments) {
- receiver?.parent = this;
- arguments?.parent = this;
+ receiver.parent = this;
+ arguments.parent = this;
}
@override
@@ -4357,27 +5044,47 @@
case DynamicAccessKind.Unresolved:
return const InvalidType();
}
- return const DynamicType();
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitDynamicInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitDynamicInvocation(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- name?.accept(v);
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ name.accept(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -4458,8 +5165,13 @@
final InstanceAccessKind kind;
Expression receiver;
+
+ @override
Name name;
+
+ @override
Arguments arguments;
+
int flags = 0;
/// The static type of the invocation.
@@ -4481,25 +5193,29 @@
Reference interfaceTargetReference;
InstanceInvocation(InstanceAccessKind kind, Expression receiver, Name name,
- Arguments arguments, {Member interfaceTarget, FunctionType functionType})
+ Arguments arguments,
+ {required Member interfaceTarget, required FunctionType functionType})
: this.byReference(kind, receiver, name, arguments,
- interfaceTargetReference: getMemberReferenceGetter(interfaceTarget),
+ interfaceTargetReference:
+ getNonNullableMemberReferenceGetter(interfaceTarget),
functionType: functionType);
InstanceInvocation.byReference(
this.kind, this.receiver, this.name, this.arguments,
- {this.interfaceTargetReference, this.functionType})
+ {required this.interfaceTargetReference, required this.functionType})
+ // ignore: unnecessary_null_comparison
: assert(interfaceTargetReference != null),
+ // ignore: unnecessary_null_comparison
assert(functionType != null),
assert(functionType.typeParameters.isEmpty) {
- receiver?.parent = this;
- arguments?.parent = this;
+ receiver.parent = this;
+ arguments.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member get interfaceTarget => interfaceTargetReference.asMember;
void set interfaceTarget(Member target) {
- interfaceTargetReference = getMemberReferenceGetter(target);
+ interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
}
/// If `true`, this call is known to be safe wrt. parameter covariance checks.
@@ -4537,28 +5253,50 @@
flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
functionType.returnType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstanceInvocation(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- interfaceTarget?.acceptReference(v);
- name?.accept(v);
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ interfaceTarget.acceptReference(v);
+ name.accept(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -4629,6 +5367,7 @@
Expression receiver;
+ @override
Arguments arguments;
/// The static type of the invocation.
@@ -4646,37 +5385,60 @@
/// local(0); // The function type is `int Function(int)`.
/// }
///
- FunctionType functionType;
+ FunctionType? functionType;
FunctionInvocation(this.kind, this.receiver, this.arguments,
- {this.functionType}) {
- receiver?.parent = this;
- arguments?.parent = this;
+ {required this.functionType}) {
+ receiver.parent = this;
+ arguments.parent = this;
}
+ @override
Name get name => Name.callName;
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) =>
functionType?.returnType ?? const DynamicType();
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitFunctionInvocation(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
- name?.accept(v);
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ name.accept(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -4697,6 +5459,8 @@
class LocalFunctionInvocation extends InvocationExpression {
/// The variable declaration for the function declaration.
VariableDeclaration variable;
+
+ @override
Arguments arguments;
/// The static type of the invocation.
@@ -4713,29 +5477,47 @@
///
FunctionType functionType;
- LocalFunctionInvocation(this.variable, this.arguments, {this.functionType})
+ LocalFunctionInvocation(this.variable, this.arguments,
+ {required this.functionType})
+ // ignore: unnecessary_null_comparison
: assert(functionType != null) {
- arguments?.parent = this;
+ arguments.parent = this;
}
+ @override
Name get name => Name.callName;
@override
DartType getStaticTypeInternal(StaticTypeContext context) =>
functionType.returnType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitLocalFunctionInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitLocalFunctionInvocation(this, arg);
- visitChildren(Visitor v) {
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -4763,26 +5545,43 @@
/// test.
final bool isNot;
- EqualsNull(this.expression, {this.isNot}) : assert(isNot != null) {
- expression?.parent = this;
+ EqualsNull(this.expression, {required this.isNot})
+ // ignore: unnecessary_null_comparison
+ : assert(isNot != null) {
+ expression.parent = this;
}
@override
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitEqualsNull(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitEqualsNull(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
}
}
@@ -4831,49 +5630,75 @@
Reference interfaceTargetReference;
EqualsCall(Expression left, Expression right,
- {bool isNot, FunctionType functionType, Procedure interfaceTarget})
+ {required bool isNot,
+ required FunctionType functionType,
+ required Procedure interfaceTarget})
: this.byReference(left, right,
isNot: isNot,
functionType: functionType,
interfaceTargetReference:
- getMemberReferenceGetter(interfaceTarget));
+ getNonNullableMemberReferenceGetter(interfaceTarget));
EqualsCall.byReference(this.left, this.right,
- {this.isNot, this.functionType, this.interfaceTargetReference})
+ {required this.isNot,
+ required this.functionType,
+ required this.interfaceTargetReference})
+ // ignore: unnecessary_null_comparison
: assert(isNot != null) {
- left?.parent = this;
- right?.parent = this;
+ left.parent = this;
+ right.parent = this;
}
- Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
+ Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
void set interfaceTarget(Procedure target) {
- interfaceTargetReference = getMemberReferenceGetter(target);
+ interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
- return functionType?.returnType ??
- context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ return functionType.returnType;
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitEqualsCall(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitEqualsCall(this, arg);
- visitChildren(Visitor v) {
- left?.accept(v);
- interfaceTarget?.acceptReference(v);
- right?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ left.accept(v);
+ interfaceTarget.acceptReference(v);
+ right.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (left != null) {
- left = left.accept<TreeNode>(v);
- left?.parent = this;
+ left = v.transform(left);
+ left.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (right != null) {
- right = right.accept<TreeNode>(v);
- right?.parent = this;
+ right = v.transform(right);
+ right.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (left != null) {
+ left = v.transform(left);
+ left.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (right != null) {
+ right = v.transform(right);
+ right.parent = this;
}
}
@@ -4902,14 +5727,19 @@
static const int FlagBoundsSafe = 1 << 1;
Expression receiver;
+
+ @override
Name name;
+
+ @override
Arguments arguments;
+
int flags = 0;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
MethodInvocation(Expression receiver, Name name, Arguments arguments,
- [Member interfaceTarget])
+ [Member? interfaceTarget])
: this.byReference(
receiver,
name,
@@ -4919,13 +5749,13 @@
MethodInvocation.byReference(
this.receiver, this.name, this.arguments, this.interfaceTargetReference) {
- receiver?.parent = this;
- arguments?.parent = this;
+ receiver.parent = this;
+ arguments.parent = this;
}
- Member get interfaceTarget => interfaceTargetReference?.asMember;
+ Member? get interfaceTarget => interfaceTargetReference?.asMember;
- void set interfaceTarget(Member target) {
+ void set interfaceTarget(Member? target) {
// An invocation doesn't refer to the setter.
interfaceTargetReference = getMemberReferenceGetter(target);
}
@@ -4965,8 +5795,9 @@
flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
- Member interfaceTarget = this.interfaceTarget;
+ Member? interfaceTarget = this.interfaceTarget;
if (interfaceTarget != null) {
if (interfaceTarget is Procedure &&
context.typeEnvironment
@@ -4975,8 +5806,8 @@
receiver.getStaticType(context),
arguments.positional[0].getStaticType(context));
}
- Class superclass = interfaceTarget.enclosingClass;
- DartType receiverType =
+ Class superclass = interfaceTarget.enclosingClass!;
+ InterfaceType receiverType =
receiver.getStaticTypeAsInstanceOf(superclass, context);
DartType getterType = Substitution.fromInterfaceType(receiverType)
.substituteType(interfaceTarget.getterType);
@@ -4993,7 +5824,7 @@
getterType.typeParameters,
getterType.typeParameters
.map((TypeParameter typeParameter) =>
- typeParameter.defaultType)
+ typeParameter.defaultType!)
.toList());
}
return substitution.substituteType(getterType.returnType);
@@ -5004,7 +5835,7 @@
// TODO(johnniwinther): Remove this when the front end performs the
// correct replacement.
if (getterType is InterfaceType) {
- Member member = context.typeEnvironment
+ Member? member = context.typeEnvironment
.getInterfaceMember(getterType.classNode, new Name('call'));
if (member != null) {
DartType callType = member.getterType;
@@ -5034,25 +5865,46 @@
return const DynamicType();
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitMethodInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitMethodInvocation(this, arg);
- visitChildren(Visitor v) {
- receiver?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
interfaceTarget?.acceptReference(v);
- name?.accept(v);
- arguments?.accept(v);
+ name.accept(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (receiver != null) {
- receiver = receiver.accept<TreeNode>(v);
- receiver?.parent = this;
+ receiver = v.transform(receiver);
+ receiver.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -5075,13 +5927,16 @@
///
/// The provided arguments might not match the parameters of the target.
class SuperMethodInvocation extends InvocationExpression {
+ @override
Name name;
+
+ @override
Arguments arguments;
- Reference interfaceTargetReference;
+ Reference? interfaceTargetReference;
SuperMethodInvocation(Name name, Arguments arguments,
- [Procedure interfaceTarget])
+ [Procedure? interfaceTarget])
: this.byReference(
name,
arguments,
@@ -5090,43 +5945,60 @@
SuperMethodInvocation.byReference(
this.name, this.arguments, this.interfaceTargetReference) {
- arguments?.parent = this;
+ arguments.parent = this;
}
- Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
+ Procedure? get interfaceTarget => interfaceTargetReference?.asProcedure;
- void set interfaceTarget(Procedure target) {
+ void set interfaceTarget(Procedure? target) {
// An invocation doesn't refer to the setter.
interfaceTargetReference = getMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
+ Procedure? interfaceTarget = this.interfaceTarget;
if (interfaceTarget == null) return const DynamicType();
- Class superclass = interfaceTarget.enclosingClass;
- List<DartType> receiverTypeArguments = context.typeEnvironment
- .getTypeArgumentsAsInstanceOf(context.thisType, superclass);
- DartType returnType =
- Substitution.fromPairs(superclass.typeParameters, receiverTypeArguments)
- .substituteType(interfaceTarget.function.returnType);
+ Class superclass = interfaceTarget.enclosingClass!;
+ List<DartType>? receiverTypeArguments = context.typeEnvironment
+ .getTypeArgumentsAsInstanceOf(context.thisType!, superclass);
+ DartType returnType = Substitution.fromPairs(
+ superclass.typeParameters, receiverTypeArguments!)
+ .substituteType(interfaceTarget.function!.returnType);
return Substitution.fromPairs(
- interfaceTarget.function.typeParameters, arguments.types)
+ interfaceTarget.function!.typeParameters, arguments.types)
.substituteType(returnType);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSuperMethodInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSuperMethodInvocation(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
interfaceTarget?.acceptReference(v);
- name?.accept(v);
- arguments?.accept(v);
+ name.accept(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -5149,51 +6021,70 @@
/// The provided arguments might not match the parameters of the target.
class StaticInvocation extends InvocationExpression {
Reference targetReference;
+
+ @override
Arguments arguments;
/// True if this is a constant call to an external constant factory.
bool isConst;
- Name get name => target?.name;
+ @override
+ Name get name => target.name!;
StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
: this.byReference(
// An invocation doesn't refer to the setter.
- getMemberReferenceGetter(target),
+ getNonNullableMemberReferenceGetter(target),
arguments,
isConst: isConst);
StaticInvocation.byReference(this.targetReference, this.arguments,
{this.isConst: false}) {
- arguments?.parent = this;
+ arguments.parent = this;
}
- Procedure get target => targetReference?.asProcedure;
+ Procedure get target => targetReference.asProcedure;
void set target(Procedure target) {
// An invocation doesn't refer to the setter.
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
return Substitution.fromPairs(
- target.function.typeParameters, arguments.types)
- .substituteType(target.function.returnType);
+ target.function!.typeParameters, arguments.types)
+ .substituteType(target.function!.returnType);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStaticInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStaticInvocation(this, arg);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
@@ -5218,58 +6109,78 @@
// generic functions.
class ConstructorInvocation extends InvocationExpression {
Reference targetReference;
+
+ @override
Arguments arguments;
+
bool isConst;
- Name get name => target?.name;
+ @override
+ Name get name => target.name!;
ConstructorInvocation(Constructor target, Arguments arguments,
{bool isConst: false})
: this.byReference(
// A constructor doesn't refer to the setter.
- getMemberReferenceGetter(target),
+ getNonNullableMemberReferenceGetter(target),
arguments,
isConst: isConst);
ConstructorInvocation.byReference(this.targetReference, this.arguments,
{this.isConst: false}) {
- arguments?.parent = this;
+ arguments.parent = this;
}
- Constructor get target => targetReference?.asConstructor;
+ Constructor get target => targetReference.asConstructor;
void set target(Constructor target) {
// A constructor doesn't refer to the setter.
- targetReference = getMemberReferenceGetter(target);
+ targetReference = getNonNullableMemberReferenceGetter(target);
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
return arguments.types.isEmpty
? context.typeEnvironment.coreTypes
- .rawType(target.enclosingClass, context.nonNullable)
+ .rawType(target.enclosingClass!, context.nonNullable)
: new InterfaceType(
- target.enclosingClass, context.nonNullable, arguments.types);
+ target.enclosingClass!, context.nonNullable, arguments.types);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitConstructorInvocation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitConstructorInvocation(this, arg);
- visitChildren(Visitor v) {
- target?.acceptReference(v);
- arguments?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ target.acceptReference(v);
+ arguments.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (arguments != null) {
- arguments = arguments.accept<TreeNode>(v);
- arguments?.parent = this;
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
}
}
// TODO(dmitryas): Change the getter into a method that accepts a CoreTypes.
InterfaceType get constructedType {
- Class enclosingClass = target.enclosingClass;
+ Class enclosingClass = target.enclosingClass!;
// TODO(dmitryas): Get raw type from a CoreTypes object if arguments is
// empty.
return arguments.types.isEmpty
@@ -5291,11 +6202,11 @@
} else {
printer.write('new ');
}
- printer.writeClassName(target.enclosingClass.reference);
+ printer.writeClassName(target.enclosingClass!.reference);
printer.writeTypeArguments(arguments.types);
- if (target.name.text.isNotEmpty) {
+ if (target.name!.text.isNotEmpty) {
printer.write('.');
- printer.write(target.name.text);
+ printer.write(target.name!.text);
}
printer.writeArguments(arguments, includeTypeArguments: false);
}
@@ -5307,30 +6218,47 @@
final List<DartType> typeArguments;
Instantiation(this.expression, this.typeArguments) {
- expression?.parent = this;
+ expression.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
- FunctionType type = expression.getStaticType(context);
+ FunctionType type = expression.getStaticType(context) as FunctionType;
return Substitution.fromPairs(type.typeParameters, typeArguments)
.substituteType(type.withoutTypeParameters);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstantiation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstantiation(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
visitList(typeArguments, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
}
- transformTypeList(typeArguments, v);
+ v.transformDartTypeList(typeArguments);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ v.transformDartTypeList(typeArguments);
}
@override
@@ -5353,9 +6281,10 @@
Expression operand;
Not(this.operand) {
- operand?.parent = this;
+ operand.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5363,17 +6292,32 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitNot(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitNot(this, arg);
- visitChildren(Visitor v) {
- operand?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ operand.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (operand != null) {
- operand = operand.accept<TreeNode>(v);
- operand?.parent = this;
+ operand = v.transform(operand);
+ operand.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (operand != null) {
+ operand = v.transform(operand);
+ operand.parent = this;
}
}
@@ -5399,7 +6343,6 @@
case LogicalExpressionOperator.OR:
return "||";
}
- throw "Unhandled LogicalExpressionOperator: ${operator}";
}
/// Expression of form `x && y` or `x || y`
@@ -5409,10 +6352,11 @@
Expression right;
LogicalExpression(this.left, this.operatorEnum, this.right) {
- left?.parent = this;
- right?.parent = this;
+ left.parent = this;
+ right.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5420,23 +6364,44 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitLogicalExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitLogicalExpression(this, arg);
- visitChildren(Visitor v) {
- left?.accept(v);
- right?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ left.accept(v);
+ right.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (left != null) {
- left = left.accept<TreeNode>(v);
- left?.parent = this;
+ left = v.transform(left);
+ left.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (right != null) {
- right = right.accept<TreeNode>(v);
- right?.parent = this;
+ right = v.transform(right);
+ right.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (left != null) {
+ left = v.transform(left);
+ left.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (right != null) {
+ right = v.transform(right);
+ right.parent = this;
}
}
@@ -5460,52 +6425,85 @@
Expression then;
Expression otherwise;
- /// The static type of the expression. Should not be `null`.
+ /// The static type of the expression.
DartType staticType;
ConditionalExpression(
this.condition, this.then, this.otherwise, this.staticType) {
- condition?.parent = this;
- then?.parent = this;
- otherwise?.parent = this;
+ condition.parent = this;
+ then.parent = this;
+ otherwise.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@override
DartType getStaticTypeInternal(StaticTypeContext context) => staticType;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitConditionalExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitConditionalExpression(this, arg);
- visitChildren(Visitor v) {
- condition?.accept(v);
- then?.accept(v);
- otherwise?.accept(v);
- staticType?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ condition.accept(v);
+ then.accept(v);
+ otherwise.accept(v);
+ staticType.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
- condition?.parent = this;
+ condition = v.transform(condition);
+ condition.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (then != null) {
- then = then.accept<TreeNode>(v);
- then?.parent = this;
+ then = v.transform(then);
+ then.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (otherwise != null) {
- otherwise = otherwise.accept<TreeNode>(v);
- otherwise?.parent = this;
+ otherwise = v.transform(otherwise);
+ otherwise.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (staticType != null) {
staticType = v.visitDartType(staticType);
}
}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (condition != null) {
+ condition = v.transform(condition);
+ condition.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (then != null) {
+ then = v.transform(then);
+ then.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (otherwise != null) {
+ otherwise = v.transform(otherwise);
+ otherwise.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (staticType != null) {
+ staticType = v.visitDartType(staticType, cannotRemoveSentinel);
+ }
+ }
+
+ @override
String toString() {
return "ConditionalExpression(${toStringInternal()})";
}
@@ -5515,6 +6513,7 @@
printer.writeExpression(condition,
minimumPrecedence: astToText.Precedence.LOGICAL_OR);
printer.write(' ?');
+ // ignore: unnecessary_null_comparison
if (staticType != null) {
printer.write('{');
printer.writeType(staticType);
@@ -5541,6 +6540,7 @@
setParents(expressions, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5548,16 +6548,26 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStringConcatenation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStringConcatenation(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(expressions, v);
}
- transformChildren(Transformer v) {
- transformList(expressions, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(expressions, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(expressions, this);
}
@override
@@ -5596,6 +6606,7 @@
setParents(lists, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5604,18 +6615,29 @@
return context.typeEnvironment.listType(typeArgument, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitListConcatenation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitListConcatenation(this, arg);
- visitChildren(Visitor v) {
- typeArgument?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ typeArgument.accept(v);
visitList(lists, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
typeArgument = v.visitDartType(typeArgument);
- transformList(lists, v, this);
+ v.transformList(lists, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+ v.transformExpressionList(lists, this);
}
@override
@@ -5654,6 +6676,7 @@
setParents(sets, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5662,18 +6685,29 @@
return context.typeEnvironment.setType(typeArgument, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSetConcatenation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSetConcatenation(this, arg);
- visitChildren(Visitor v) {
- typeArgument?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ typeArgument.accept(v);
visitList(sets, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
typeArgument = v.visitDartType(typeArgument);
- transformList(sets, v, this);
+ v.transformList(sets, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+ v.transformExpressionList(sets, this);
}
@override
@@ -5715,6 +6749,7 @@
setParents(maps, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5724,20 +6759,32 @@
.mapType(keyType, valueType, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitMapConcatenation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitMapConcatenation(this, arg);
- visitChildren(Visitor v) {
- keyType?.accept(v);
- valueType?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ keyType.accept(v);
+ valueType.accept(v);
visitList(maps, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
keyType = v.visitDartType(keyType);
valueType = v.visitDartType(valueType);
- transformList(maps, v, this);
+ v.transformList(maps, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ keyType = v.visitDartType(keyType, cannotRemoveSentinel);
+ valueType = v.visitDartType(valueType, cannotRemoveSentinel);
+ v.transformExpressionList(maps, this);
}
@override
@@ -5780,6 +6827,7 @@
Class get classNode => classReference.asClass;
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5791,11 +6839,15 @@
: new InterfaceType(classNode, context.nonNullable, typeArguments);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceCreation(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitInstanceCreation(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
classReference.asClass.acceptReference(v);
visitList(typeArguments, v);
for (final Reference reference in fieldValues.keys) {
@@ -5808,16 +6860,31 @@
visitList(unusedArguments, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
fieldValues.forEach((Reference fieldRef, Expression value) {
- Expression transformed = value.accept<TreeNode>(v);
+ Expression transformed = v.transform(value);
+ // ignore: unnecessary_null_comparison
if (transformed != null && !identical(value, transformed)) {
fieldValues[fieldRef] = transformed;
transformed.parent = this;
}
});
- transformList(asserts, v, this);
- transformList(unusedArguments, v, this);
+ v.transformList(asserts, this);
+ v.transformList(unusedArguments, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ fieldValues.forEach((Reference fieldRef, Expression value) {
+ Expression transformed = v.transform(value);
+ if (!identical(value, transformed)) {
+ fieldValues[fieldRef] = transformed;
+ transformed.parent = this;
+ }
+ });
+ v.transformList(asserts, this, dummyAssertStatement);
+ v.transformExpressionList(unusedArguments, this);
}
@override
@@ -5848,7 +6915,7 @@
printer.writeExpression(assert_.condition);
if (assert_.message != null) {
printer.write(', ');
- printer.writeExpression(assert_.message);
+ printer.writeExpression(assert_.message!);
}
printer.write(')');
first = false;
@@ -5881,6 +6948,7 @@
expression.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -5888,19 +6956,30 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
expression.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitFileUriExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitFileUriExpression(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
expression.accept(v);
}
- transformChildren(Transformer v) {
- expression = expression.accept<TreeNode>(v)..parent = this;
+ @override
+ void transformChildren(Transformer v) {
+ expression = v.transform(expression)..parent = this;
}
- Location _getLocationInEnclosingFile(int offset) {
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ expression = v.transform(expression)..parent = this;
+ }
+
+ @override
+ Location? _getLocationInEnclosingFile(int offset) {
return _getLocationInComponent(enclosingComponent, fileUri, offset);
}
@@ -5927,7 +7006,7 @@
DartType type;
IsExpression(this.operand, this.type) {
- operand?.parent = this;
+ operand.parent = this;
}
// Must match serialized bit positions.
@@ -5953,24 +7032,40 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitIsExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitIsExpression(this, arg);
- visitChildren(Visitor v) {
- operand?.accept(v);
- type?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ operand.accept(v);
+ type.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (operand != null) {
- operand = operand.accept<TreeNode>(v);
- operand?.parent = this;
+ operand = v.transform(operand);
+ operand.parent = this;
}
type = v.visitDartType(type);
}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (operand != null) {
+ operand = v.transform(operand);
+ operand.parent = this;
+ }
+ type = v.visitDartType(type, cannotRemoveSentinel);
+ }
+
+ @override
String toString() {
return "IsExpression(${toStringInternal()})";
}
@@ -5995,7 +7090,7 @@
DartType type;
AsExpression(this.operand, this.type) {
- operand?.parent = this;
+ operand.parent = this;
}
// Must match serialized bit positions.
@@ -6060,30 +7155,47 @@
: (flags & ~FlagForNonNullableByDefault);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@override
DartType getStaticTypeInternal(StaticTypeContext context) => type;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitAsExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitAsExpression(this, arg);
- visitChildren(Visitor v) {
- operand?.accept(v);
- type?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ operand.accept(v);
+ type.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (operand != null) {
- operand = operand.accept<TreeNode>(v);
- operand?.parent = this;
+ operand = v.transform(operand);
+ operand.parent = this;
}
type = v.visitDartType(type);
}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (operand != null) {
+ operand = v.transform(operand);
+ operand.parent = this;
+ }
+ type = v.visitDartType(type, cannotRemoveSentinel);
+ }
+
+ @override
String toString() {
return "AsExpression(${toStringInternal()})";
}
@@ -6124,9 +7236,10 @@
Expression operand;
NullCheck(this.operand) {
- operand?.parent = this;
+ operand.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
DartType operandType = operand.getStaticType(context);
return operandType is NullType
@@ -6134,18 +7247,33 @@
: operandType.withDeclaredNullability(Nullability.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitNullCheck(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitNullCheck(this, arg);
- visitChildren(Visitor v) {
- operand?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ operand.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (operand != null) {
- operand = operand.accept<TreeNode>(v);
- operand?.parent = this;
+ operand = v.transform(operand);
+ operand.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (operand != null) {
+ operand = v.transform(operand);
+ operand.parent = this;
}
}
@@ -6164,17 +7292,25 @@
/// An integer, double, boolean, string, or null constant.
abstract class BasicLiteral extends Expression {
- Object get value;
+ Object? get value;
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
}
class StringLiteral extends BasicLiteral {
+ @override
String value;
StringLiteral(this.value);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6182,7 +7318,10 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitStringLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitStringLiteral(this, arg);
@@ -6204,10 +7343,12 @@
/// E.g. "0x8000000000000000" will be saved as "-9223372036854775808" despite
/// technically (on some platforms, particularly Javascript) being positive.
/// If the number is meant to be negative it will be wrapped in a "unary-".
+ @override
int value;
IntLiteral(this.value);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6215,7 +7356,10 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.intRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitIntLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitIntLiteral(this, arg);
@@ -6231,10 +7375,12 @@
}
class DoubleLiteral extends BasicLiteral {
+ @override
double value;
DoubleLiteral(this.value);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6242,7 +7388,10 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.doubleRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitDoubleLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitDoubleLiteral(this, arg);
@@ -6258,10 +7407,12 @@
}
class BoolLiteral extends BasicLiteral {
+ @override
bool value;
BoolLiteral(this.value);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6269,7 +7420,10 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitBoolLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitBoolLiteral(this, arg);
@@ -6285,7 +7439,8 @@
}
class NullLiteral extends BasicLiteral {
- Object get value => null;
+ @override
+ Object? get value => null;
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6293,7 +7448,10 @@
@override
DartType getStaticTypeInternal(StaticTypeContext context) => const NullType();
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitNullLiteral(this, arg);
@@ -6313,6 +7471,7 @@
SymbolLiteral(this.value);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6320,12 +7479,21 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.symbolRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSymbolLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSymbolLiteral(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -6344,6 +7512,7 @@
TypeLiteral(this.type);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6351,19 +7520,29 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
context.typeEnvironment.coreTypes.typeRawType(context.nonNullable);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitTypeLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitTypeLiteral(this, arg);
- visitChildren(Visitor v) {
- type?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ type.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
type = v.visitDartType(type);
}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ type = v.visitDartType(type, cannotRemoveSentinel);
+ }
+
+ @override
String toString() {
return "TypeLiteral(${toStringInternal()})";
}
@@ -6379,14 +7558,24 @@
getStaticTypeInternal(context);
@override
- DartType getStaticTypeInternal(StaticTypeContext context) => context.thisType;
+ DartType getStaticTypeInternal(StaticTypeContext context) =>
+ context.thisType!;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitThisExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitThisExpression(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -6400,6 +7589,7 @@
}
class Rethrow extends Expression {
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6409,12 +7599,21 @@
? const NeverType.nonNullable()
: const BottomType();
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitRethrow(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitRethrow(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -6431,9 +7630,10 @@
Expression expression;
Throw(this.expression) {
- expression?.parent = this;
+ expression.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6443,17 +7643,32 @@
? const NeverType.nonNullable()
: const BottomType();
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitThrow(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitThrow(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
}
}
@@ -6476,10 +7691,12 @@
ListLiteral(this.expressions,
{this.typeArgument: const DynamicType(), this.isConst: false}) {
+ // ignore: unnecessary_null_comparison
assert(typeArgument != null);
setParents(expressions, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6488,18 +7705,29 @@
return context.typeEnvironment.listType(typeArgument, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitListLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitListLiteral(this, arg);
- visitChildren(Visitor v) {
- typeArgument?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ typeArgument.accept(v);
visitList(expressions, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
typeArgument = v.visitDartType(typeArgument);
- transformList(expressions, v, this);
+ v.transformList(expressions, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+ v.transformExpressionList(expressions, this);
}
@override
@@ -6527,10 +7755,12 @@
SetLiteral(this.expressions,
{this.typeArgument: const DynamicType(), this.isConst: false}) {
+ // ignore: unnecessary_null_comparison
assert(typeArgument != null);
setParents(expressions, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6539,18 +7769,29 @@
return context.typeEnvironment.setType(typeArgument, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitSetLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitSetLiteral(this, arg);
- visitChildren(Visitor v) {
- typeArgument?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ typeArgument.accept(v);
visitList(expressions, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
typeArgument = v.visitDartType(typeArgument);
- transformList(expressions, v, this);
+ v.transformList(expressions, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ typeArgument = v.visitDartType(typeArgument, cannotRemoveSentinel);
+ v.transformExpressionList(expressions, this);
}
@override
@@ -6581,11 +7822,14 @@
{this.keyType: const DynamicType(),
this.valueType: const DynamicType(),
this.isConst: false}) {
+ // ignore: unnecessary_null_comparison
assert(keyType != null);
+ // ignore: unnecessary_null_comparison
assert(valueType != null);
setParents(entries, this);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6595,20 +7839,32 @@
.mapType(keyType, valueType, context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitMapLiteral(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitMapLiteral(this, arg);
- visitChildren(Visitor v) {
- keyType?.accept(v);
- valueType?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ keyType.accept(v);
+ valueType.accept(v);
visitList(entries, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
keyType = v.visitDartType(keyType);
valueType = v.visitDartType(valueType);
- transformList(entries, v, this);
+ v.transformList(entries, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ keyType = v.visitDartType(keyType, cannotRemoveSentinel);
+ valueType = v.visitDartType(valueType, cannotRemoveSentinel);
+ v.transformMapEntryList(entries, this);
}
@override
@@ -6641,25 +7897,47 @@
Expression value;
MapEntry(this.key, this.value) {
- key?.parent = this;
- value?.parent = this;
+ key.parent = this;
+ value.parent = this;
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitMapEntry(this);
- visitChildren(Visitor v) {
- key?.accept(v);
- value?.accept(v);
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitMapEntry(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ key.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (key != null) {
- key = key.accept<TreeNode>(v);
- key?.parent = this;
+ key = v.transform(key);
+ key.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (key != null) {
+ key = v.transform(key);
+ key.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -6686,25 +7964,41 @@
Expression operand;
AwaitExpression(this.operand) {
- operand?.parent = this;
+ operand.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
return context.typeEnvironment.flatten(operand.getStaticType(context));
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitAwaitExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitAwaitExpression(this, arg);
- visitChildren(Visitor v) {
- operand?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ operand.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (operand != null) {
- operand = operand.accept<TreeNode>(v);
- operand?.parent = this;
+ operand = v.transform(operand);
+ operand.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (operand != null) {
+ operand = v.transform(operand);
+ operand.parent = this;
}
}
@@ -6722,35 +8016,53 @@
/// Common super-interface for [FunctionExpression] and [FunctionDeclaration].
abstract class LocalFunction implements TreeNode {
- FunctionNode get function;
+ // TODO(johnniwinther): Make this non-nullable.
+ FunctionNode? get function;
}
/// Expression of form `(x,y) => ...` or `(x,y) { ... }`
///
/// The arrow-body form `=> e` is desugared into `return e;`.
class FunctionExpression extends Expression implements LocalFunction {
+ @override
FunctionNode function;
FunctionExpression(this.function) {
- function?.parent = this;
+ function.parent = this;
}
+ @override
DartType getStaticTypeInternal(StaticTypeContext context) {
return function.computeFunctionType(context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitFunctionExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitFunctionExpression(this, arg);
- visitChildren(Visitor v) {
- function?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ function.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (function != null) {
- function = function.accept<TreeNode>(v);
- function?.parent = this;
+ function = v.transform(function);
+ function.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (function != null) {
+ function = v.transform(function);
+ function.parent = this;
}
}
@@ -6770,30 +8082,43 @@
DartType type;
ConstantExpression(this.constant, [this.type = const DynamicType()]) {
+ // ignore: unnecessary_null_comparison
assert(constant != null);
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@override
DartType getStaticTypeInternal(StaticTypeContext context) => type;
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitConstantExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitConstantExpression(this, arg);
- visitChildren(Visitor v) {
- constant?.acceptReference(v);
- type?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ constant.acceptReference(v);
+ type.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
constant = v.visitConstant(constant);
type = v.visitDartType(type);
}
@override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ constant = v.visitConstant(constant, cannotRemoveSentinel);
+ type = v.visitDartType(type, cannotRemoveSentinel);
+ }
+
+ @override
String toString() {
return "ConstantExpression(${toStringInternal()})";
}
@@ -6810,10 +8135,11 @@
Expression body;
Let(this.variable, this.body) {
- variable?.parent = this;
- body?.parent = this;
+ variable.parent = this;
+ body.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6821,22 +8147,43 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
body.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitLet(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) => v.visitLet(this, arg);
- visitChildren(Visitor v) {
- variable?.accept(v);
- body?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ variable.accept(v);
+ body.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
- variable?.parent = this;
+ variable = v.transform(variable);
+ variable.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
}
}
@@ -6859,10 +8206,11 @@
Expression value;
BlockExpression(this.body, this.value) {
- body?.parent = this;
- value?.parent = this;
+ body.parent = this;
+ value.parent = this;
}
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6870,23 +8218,44 @@
DartType getStaticTypeInternal(StaticTypeContext context) =>
value.getStaticType(context);
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitBlockExpression(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitBlockExpression(this, arg);
- visitChildren(Visitor v) {
- body?.accept(v);
- value?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ body.accept(v);
+ value.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (value != null) {
- value = value.accept<TreeNode>(v);
- value?.parent = this;
+ value = v.transform(value);
+ value.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (value != null) {
+ value = v.transform(value);
+ value.parent = this;
}
}
@@ -6922,6 +8291,7 @@
LoadLibrary(this.import);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6931,12 +8301,21 @@
.futureType(const DynamicType(), context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitLoadLibrary(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitLoadLibrary(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -6945,7 +8324,7 @@
@override
void toTextInternal(AstPrinter printer) {
- printer.write(import.name);
+ printer.write(import.name!);
printer.write('.loadLibrary()');
}
}
@@ -6957,6 +8336,7 @@
CheckLibraryIsLoaded(this.import);
+ @override
DartType getStaticType(StaticTypeContext context) =>
getStaticTypeInternal(context);
@@ -6965,12 +8345,21 @@
return context.typeEnvironment.coreTypes.objectRawType(context.nonNullable);
}
+ @override
R accept<R>(ExpressionVisitor<R> v) => v.visitCheckLibraryIsLoaded(this);
+
+ @override
R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
v.visitCheckLibraryIsLoaded(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -6979,7 +8368,7 @@
@override
void toTextInternal(AstPrinter printer) {
- printer.write(import.name);
+ printer.write(import.name!);
printer.write('.checkLibraryIsLoaded()');
}
}
@@ -6989,11 +8378,13 @@
// ------------------------------------------------------------------------
abstract class Statement extends TreeNode {
+ @override
R accept<R>(StatementVisitor<R> v);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg);
- void toTextInternal(AstPrinter printer);
-
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
printer.writeStatement(this);
@@ -7005,21 +8396,36 @@
Expression expression;
ExpressionStatement(this.expression) {
- expression?.parent = this;
+ expression.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitExpressionStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitExpressionStatement(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
}
}
@@ -7045,22 +8451,29 @@
Block(this.statements) {
// Ensure statements is mutable.
- assert((statements
- ..add(null)
- ..removeLast()) !=
- null);
+ assert(checkListIsMutable(statements, dummyStatement));
setParents(statements, this);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitBlock(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) => v.visitBlock(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(statements, v);
}
- transformChildren(Transformer v) {
- transformList(statements, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(statements, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformStatementList(statements, this);
}
void addStatement(Statement node) {
@@ -7089,22 +8502,29 @@
AssertBlock(this.statements) {
// Ensure statements is mutable.
- assert((statements
- ..add(null)
- ..removeLast()) !=
- null);
+ assert(checkListIsMutable(statements, dummyStatement));
setParents(statements, this);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitAssertBlock(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitAssertBlock(this, arg);
- transformChildren(Transformer v) {
- transformList(statements, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(statements, this);
}
- visitChildren(Visitor v) {
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformStatementList(statements, this);
+ }
+
+ @override
+ void visitChildren(Visitor v) {
visitList(statements, v);
}
@@ -7126,12 +8546,21 @@
}
class EmptyStatement extends Statement {
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitEmptyStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitEmptyStatement(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -7146,7 +8575,7 @@
class AssertStatement extends Statement {
Expression condition;
- Expression message; // May be null.
+ Expression? message; // May be null.
/// Character offset in the source where the assertion condition begins.
///
@@ -7159,27 +8588,48 @@
int conditionEndOffset;
AssertStatement(this.condition,
- {this.message, this.conditionStartOffset, this.conditionEndOffset}) {
- condition?.parent = this;
+ {this.message,
+ required this.conditionStartOffset,
+ required this.conditionEndOffset}) {
+ condition.parent = this;
message?.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitAssertStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitAssertStatement(this, arg);
- visitChildren(Visitor v) {
- condition?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ condition.accept(v);
message?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
- condition?.parent = this;
+ condition = v.transform(condition);
+ condition.parent = this;
}
if (message != null) {
- message = message.accept<TreeNode>(v);
+ message = v.transform(message!);
+ message?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (condition != null) {
+ condition = v.transform(condition);
+ condition.parent = this;
+ }
+ if (message != null) {
+ message = v.transformOrRemoveExpression(message!);
message?.parent = this;
}
}
@@ -7195,7 +8645,7 @@
printer.writeExpression(condition);
if (message != null) {
printer.write(', ');
- printer.writeExpression(message);
+ printer.writeExpression(message!);
}
printer.write(');');
}
@@ -7207,23 +8657,37 @@
///
/// The frontend does not generate labeled statements without uses.
class LabeledStatement extends Statement {
- Statement body;
+ // TODO(johnniwinther): Make this non-nullable.
+ Statement? body;
LabeledStatement(this.body) {
body?.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitLabeledStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitLabeledStatement(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
body?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body!);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (body != null) {
+ body = v.transformOrRemoveStatement(body!);
body?.parent = this;
}
}
@@ -7238,7 +8702,7 @@
printer.write(printer.getLabelName(this));
printer.write(':');
printer.newLine();
- printer.writeStatement(body);
+ printer.writeStatement(body!);
}
}
@@ -7267,12 +8731,21 @@
BreakStatement(this.target);
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitBreakStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitBreakStatement(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -7292,27 +8765,48 @@
Statement body;
WhileStatement(this.condition, this.body) {
- condition?.parent = this;
- body?.parent = this;
+ condition.parent = this;
+ body.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitWhileStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitWhileStatement(this, arg);
- visitChildren(Visitor v) {
- condition?.accept(v);
- body?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ condition.accept(v);
+ body.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
- condition?.parent = this;
+ condition = v.transform(condition);
+ condition.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (condition != null) {
+ condition = v.transform(condition);
+ condition.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
}
}
@@ -7335,27 +8829,48 @@
Expression condition;
DoStatement(this.body, this.condition) {
- body?.parent = this;
- condition?.parent = this;
+ body.parent = this;
+ condition.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitDoStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitDoStatement(this, arg);
- visitChildren(Visitor v) {
- body?.accept(v);
- condition?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ body.accept(v);
+ condition.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
- condition?.parent = this;
+ condition = v.transform(condition);
+ condition.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (condition != null) {
+ condition = v.transform(condition);
+ condition.parent = this;
}
}
@@ -7376,7 +8891,7 @@
class ForStatement extends Statement {
final List<VariableDeclaration> variables; // May be empty, but not null.
- Expression condition; // May be null.
+ Expression? condition; // May be null.
final List<Expression> updates; // May be empty, but not null.
Statement body;
@@ -7384,30 +8899,51 @@
setParents(variables, this);
condition?.parent = this;
setParents(updates, this);
- body?.parent = this;
+ body.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitForStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitForStatement(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(variables, v);
condition?.accept(v);
visitList(updates, v);
- body?.accept(v);
+ body.accept(v);
}
- transformChildren(Transformer v) {
- transformList(variables, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(variables, this);
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
+ condition = v.transform(condition!);
condition?.parent = this;
}
- transformList(updates, v, this);
+ v.transformList(updates, this);
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformVariableDeclarationList(variables, this);
+ if (condition != null) {
+ condition = v.transformOrRemoveExpression(condition!);
+ condition?.parent = this;
+ }
+ v.transformExpressionList(updates, this);
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
}
}
@@ -7428,7 +8964,7 @@
}
printer.write('; ');
if (condition != null) {
- printer.writeExpression(condition);
+ printer.writeExpression(condition!);
}
printer.write('; ');
printer.writeExpressions(updates);
@@ -7451,33 +8987,60 @@
ForInStatement(this.variable, this.iterable, this.body,
{this.isAsync: false}) {
- variable?.parent = this;
- iterable?.parent = this;
- body?.parent = this;
+ variable.parent = this;
+ iterable.parent = this;
+ body.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitForInStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitForInStatement(this, arg);
+ @override
void visitChildren(Visitor v) {
- variable?.accept(v);
- iterable?.accept(v);
- body?.accept(v);
+ variable.accept(v);
+ iterable.accept(v);
+ body.accept(v);
}
+ @override
void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
- variable?.parent = this;
+ variable = v.transform(variable);
+ variable.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (iterable != null) {
- iterable = iterable.accept<TreeNode>(v);
- iterable?.parent = this;
+ iterable = v.transform(iterable);
+ iterable.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (iterable != null) {
+ iterable = v.transform(iterable);
+ iterable.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
}
}
@@ -7494,10 +9057,11 @@
/// This is called by `StaticTypeContext.getForInIteratorType` if the iterator
/// type of this for-in statement is not already cached in [context].
DartType getIteratorTypeInternal(StaticTypeContext context) {
- DartType iteratorType;
+ DartType? iteratorType;
if (isAsync) {
- InterfaceType streamType = iterable.getStaticTypeAsInstanceOf(
+ InterfaceType? streamType = iterable.getStaticTypeAsInstanceOf(
context.typeEnvironment.coreTypes.streamClass, context);
+ // ignore: unnecessary_null_comparison
if (streamType != null) {
iteratorType = new InterfaceType(
context.typeEnvironment.coreTypes.streamIteratorClass,
@@ -7507,14 +9071,14 @@
} else {
InterfaceType iterableType = iterable.getStaticTypeAsInstanceOf(
context.typeEnvironment.coreTypes.iterableClass, context);
- Member member = context.typeEnvironment.hierarchy
+ Member? member = context.typeEnvironment.hierarchy
.getInterfaceMember(iterableType.classNode, new Name('iterator'));
if (member != null) {
iteratorType = Substitution.fromInterfaceType(iterableType)
.substituteType(member.getterType);
}
}
- return iteratorType ??= const DynamicType();
+ return iteratorType ?? const DynamicType();
}
/// Returns the type of the element in this for-in statement.
@@ -7535,18 +9099,17 @@
// `iterable.iterator.current` if inference is updated accordingly.
while (iterableType is TypeParameterType) {
TypeParameterType typeParameterType = iterableType;
- iterableType =
- typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+ iterableType = typeParameterType.bound;
}
if (isAsync) {
List<DartType> typeArguments = context.typeEnvironment
- .getTypeArgumentsAsInstanceOf(
- iterableType, context.typeEnvironment.coreTypes.streamClass);
+ .getTypeArgumentsAsInstanceOf(iterableType as InterfaceType,
+ context.typeEnvironment.coreTypes.streamClass)!;
return typeArguments.single;
} else {
List<DartType> typeArguments = context.typeEnvironment
- .getTypeArgumentsAsInstanceOf(
- iterableType, context.typeEnvironment.coreTypes.iterableClass);
+ .getTypeArgumentsAsInstanceOf(iterableType as InterfaceType,
+ context.typeEnvironment.coreTypes.iterableClass)!;
return typeArguments.single;
}
}
@@ -7577,25 +9140,41 @@
final List<SwitchCase> cases;
SwitchStatement(this.expression, this.cases) {
- expression?.parent = this;
+ expression.parent = this;
setParents(cases, this);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitSwitchStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitSwitchStatement(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
visitList(cases, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
}
- transformList(cases, v, this);
+ v.transformList(cases, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ v.transformSwitchCaseList(cases, this);
}
@override
@@ -7625,7 +9204,8 @@
class SwitchCase extends TreeNode {
final List<Expression> expressions;
final List<int> expressionOffsets;
- Statement body;
+ // TODO(johnniwinther): Make this non-nullable.
+ Statement? body;
bool isDefault;
SwitchCase(this.expressions, this.expressionOffsets, this.body,
@@ -7647,17 +9227,32 @@
body = null,
isDefault = false;
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitSwitchCase(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitSwitchCase(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(expressions, v);
body?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(expressions, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(expressions, this);
if (body != null) {
- body = body.accept<TreeNode>(v);
+ body = v.transform(body!);
+ body?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(expressions, this);
+ if (body != null) {
+ body = v.transformOrRemoveStatement(body!);
body?.parent = this;
}
}
@@ -7667,12 +9262,14 @@
return "SwitchCase(${toStringInternal()})";
}
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
toTextInternal(printer);
return printer.getText();
}
+ @override
void toTextInternal(AstPrinter printer) {
for (int index = 0; index < expressions.length; index++) {
if (index > 0) {
@@ -7689,7 +9286,7 @@
printer.write('default:');
}
printer.incIndentation();
- Statement block = body;
+ Statement? block = body;
if (block is Block) {
for (Statement statement in block.statements) {
printer.newLine();
@@ -7697,7 +9294,7 @@
}
} else {
printer.write(' ');
- printer.writeStatement(body);
+ printer.writeStatement(body!);
}
printer.decIndentation();
}
@@ -7709,12 +9306,21 @@
ContinueSwitchStatement(this.target);
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitContinueSwitchStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitContinueSwitchStatement(this, arg);
- visitChildren(Visitor v) {}
- transformChildren(Transformer v) {}
+ @override
+ void visitChildren(Visitor v) {}
+
+ @override
+ void transformChildren(Transformer v) {}
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {}
@override
String toString() {
@@ -7732,35 +9338,60 @@
class IfStatement extends Statement {
Expression condition;
Statement then;
- Statement otherwise;
+ Statement? otherwise;
IfStatement(this.condition, this.then, this.otherwise) {
- condition?.parent = this;
- then?.parent = this;
+ condition.parent = this;
+ then.parent = this;
otherwise?.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitIfStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitIfStatement(this, arg);
- visitChildren(Visitor v) {
- condition?.accept(v);
- then?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ condition.accept(v);
+ then.accept(v);
otherwise?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (condition != null) {
- condition = condition.accept<TreeNode>(v);
- condition?.parent = this;
+ condition = v.transform(condition);
+ condition.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (then != null) {
- then = then.accept<TreeNode>(v);
- then?.parent = this;
+ then = v.transform(then);
+ then.parent = this;
}
if (otherwise != null) {
- otherwise = otherwise.accept<TreeNode>(v);
+ otherwise = v.transform(otherwise!);
+ otherwise?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (condition != null) {
+ condition = v.transform(condition);
+ condition.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (then != null) {
+ then = v.transform(then);
+ then.parent = this;
+ }
+ if (otherwise != null) {
+ otherwise = v.transformOrRemoveStatement(otherwise!);
otherwise?.parent = this;
}
}
@@ -7778,29 +9409,42 @@
printer.writeStatement(then);
if (otherwise != null) {
printer.write(' else ');
- printer.writeStatement(otherwise);
+ printer.writeStatement(otherwise!);
}
}
}
class ReturnStatement extends Statement {
- Expression expression; // May be null.
+ Expression? expression; // May be null.
ReturnStatement([this.expression]) {
expression?.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitReturnStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitReturnStatement(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
expression?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
+ expression = v.transform(expression!);
+ expression?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ if (expression != null) {
+ expression = v.transformOrRemoveExpression(expression!);
expression?.parent = this;
}
}
@@ -7815,7 +9459,7 @@
printer.write('return');
if (expression != null) {
printer.write(' ');
- printer.writeExpression(expression);
+ printer.writeExpression(expression!);
}
printer.write(';');
}
@@ -7827,25 +9471,41 @@
bool isSynthetic;
TryCatch(this.body, this.catches, {this.isSynthetic: false}) {
- body?.parent = this;
+ body.parent = this;
setParents(catches, this);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitTryCatch(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitTryCatch(this, arg);
- visitChildren(Visitor v) {
- body?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ body.accept(v);
visitList(catches, v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
}
- transformList(catches, v, this);
+ v.transformList(catches, this);
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
+ }
+ v.transformCatchList(catches, this);
}
@override
@@ -7866,40 +9526,66 @@
class Catch extends TreeNode {
DartType guard; // Not null, defaults to dynamic.
- VariableDeclaration exception; // May be null.
- VariableDeclaration stackTrace; // May be null.
+ VariableDeclaration? exception;
+ VariableDeclaration? stackTrace;
Statement body;
Catch(this.exception, this.body,
{this.guard: const DynamicType(), this.stackTrace}) {
+ // ignore: unnecessary_null_comparison
assert(guard != null);
exception?.parent = this;
stackTrace?.parent = this;
- body?.parent = this;
+ body.parent = this;
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitCatch(this);
- visitChildren(Visitor v) {
- guard?.accept(v);
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitCatch(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ guard.accept(v);
exception?.accept(v);
stackTrace?.accept(v);
- body?.accept(v);
+ body.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
guard = v.visitDartType(guard);
if (exception != null) {
- exception = exception.accept<TreeNode>(v);
+ exception = v.transform(exception!);
exception?.parent = this;
}
if (stackTrace != null) {
- stackTrace = stackTrace.accept<TreeNode>(v);
+ stackTrace = v.transform(stackTrace!);
stackTrace?.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ guard = v.visitDartType(guard, cannotRemoveSentinel);
+ if (exception != null) {
+ exception = v.transformOrRemoveVariableDeclaration(exception!);
+ exception?.parent = this;
+ }
+ if (stackTrace != null) {
+ stackTrace = v.transformOrRemoveVariableDeclaration(stackTrace!);
+ stackTrace?.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
}
}
@@ -7908,12 +9594,14 @@
return "Catch(${toStringInternal()})";
}
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
toTextInternal(printer);
return printer.getText();
}
+ @override
void toTextInternal(AstPrinter printer) {
bool isImplicitType(DartType type) {
if (type is DynamicType) {
@@ -7922,9 +9610,9 @@
if (type is InterfaceType &&
type.className.node != null &&
type.classNode.name == 'Object') {
- Uri uri = type.classNode.enclosingLibrary?.importUri;
- return uri?.scheme == 'dart' &&
- uri?.path == 'core' &&
+ Uri uri = type.classNode.enclosingLibrary.importUri;
+ return uri.scheme == 'dart' &&
+ uri.path == 'core' &&
type.nullability == Nullability.nonNullable;
}
return false;
@@ -7937,11 +9625,11 @@
printer.write(' ');
}
printer.write('catch (');
- printer.writeVariableDeclaration(exception,
+ printer.writeVariableDeclaration(exception!,
includeModifiersAndType: false);
if (stackTrace != null) {
printer.write(', ');
- printer.writeVariableDeclaration(stackTrace,
+ printer.writeVariableDeclaration(stackTrace!,
includeModifiersAndType: false);
}
printer.write(') ');
@@ -7959,27 +9647,48 @@
Statement finalizer;
TryFinally(this.body, this.finalizer) {
- body?.parent = this;
- finalizer?.parent = this;
+ body.parent = this;
+ finalizer.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitTryFinally(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitTryFinally(this, arg);
- visitChildren(Visitor v) {
- body?.accept(v);
- finalizer?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ body.accept(v);
+ finalizer.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (body != null) {
- body = body.accept<TreeNode>(v);
- body?.parent = this;
+ body = v.transform(body);
+ body.parent = this;
}
+ // ignore: unnecessary_null_comparison
if (finalizer != null) {
- finalizer = finalizer.accept<TreeNode>(v);
- finalizer?.parent = this;
+ finalizer = v.transform(finalizer);
+ finalizer.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (body != null) {
+ body = v.transform(body);
+ body.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (finalizer != null) {
+ finalizer = v.transform(finalizer);
+ finalizer.parent = this;
}
}
@@ -8009,7 +9718,7 @@
YieldStatement(this.expression,
{bool isYieldStar: false, bool isNative: false}) {
- expression?.parent = this;
+ expression.parent = this;
this.isYieldStar = isYieldStar;
this.isNative = isNative;
}
@@ -8028,18 +9737,33 @@
flags = value ? (flags | FlagNative) : (flags & ~FlagNative);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitYieldStatement(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitYieldStatement(this, arg);
- visitChildren(Visitor v) {
- expression?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ expression.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (expression != null) {
- expression = expression.accept<TreeNode>(v);
- expression?.parent = this;
+ expression = v.transform(expression);
+ expression.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (expression != null) {
+ expression = v.transform(expression);
+ expression.parent = this;
}
}
@@ -8087,7 +9811,7 @@
///
/// In all other cases, the name is cosmetic, may be empty or null,
/// and is not necessarily unique.
- String name;
+ String? name;
int flags = 0;
DartType type; // Not null, defaults to dynamic.
@@ -8098,7 +9822,7 @@
/// For parameters, this is the default value.
///
/// Should be null in other cases.
- Expression initializer; // May be null.
+ Expression? initializer; // May be null.
VariableDeclaration(this.name,
{this.initializer,
@@ -8111,6 +9835,7 @@
bool isLate: false,
bool isRequired: false,
bool isLowered: false}) {
+ // ignore: unnecessary_null_comparison
assert(type != null);
initializer?.parent = this;
if (flags != -1) {
@@ -8135,6 +9860,7 @@
bool isRequired: false,
bool isLowered: false,
this.type: const DynamicType()}) {
+ // ignore: unnecessary_null_comparison
assert(type != null);
initializer?.parent = this;
this.isFinal = isFinal;
@@ -8254,27 +9980,43 @@
annotations.add(annotation..parent = this);
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitVariableDeclaration(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitVariableDeclaration(this, arg);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
- type?.accept(v);
+ type.accept(v);
initializer?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
type = v.visitDartType(type);
if (initializer != null) {
- initializer = initializer.accept<TreeNode>(v);
+ initializer = v.transform(initializer!);
+ initializer?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ type = v.visitDartType(type, cannotRemoveSentinel);
+ if (initializer != null) {
+ initializer = v.transformOrRemoveExpression(initializer!);
initializer?.parent = this;
}
}
/// Returns a possibly synthesized name for this variable, consistent with
/// the names used across all [toString] calls.
+ @override
String toString() {
return "VariableDeclaration(${toStringInternal()})";
}
@@ -8298,29 +10040,50 @@
/// The body of the function may use [variable] as its self-reference.
class FunctionDeclaration extends Statement implements LocalFunction {
VariableDeclaration variable; // Is final and has no initializer.
- FunctionNode function;
+
+ @override
+ FunctionNode? function;
FunctionDeclaration(this.variable, this.function) {
- variable?.parent = this;
+ variable.parent = this;
function?.parent = this;
}
+ @override
R accept<R>(StatementVisitor<R> v) => v.visitFunctionDeclaration(this);
+
+ @override
R accept1<R, A>(StatementVisitor1<R, A> v, A arg) =>
v.visitFunctionDeclaration(this, arg);
- visitChildren(Visitor v) {
- variable?.accept(v);
+ @override
+ void visitChildren(Visitor v) {
+ variable.accept(v);
function?.accept(v);
}
- transformChildren(Transformer v) {
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
if (variable != null) {
- variable = variable.accept<TreeNode>(v);
- variable?.parent = this;
+ variable = v.transform(variable);
+ variable.parent = this;
}
if (function != null) {
- function = function.accept<TreeNode>(v);
+ function = v.transform(function!);
+ function?.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (variable != null) {
+ variable = v.transform(variable);
+ variable.parent = this;
+ }
+ if (function != null) {
+ function = v.transformOrRemove(function!, dummyFunctionNode);
function?.parent = this;
}
}
@@ -8332,9 +10095,11 @@
@override
void toTextInternal(AstPrinter printer) {
- printer.writeFunctionNode(function, printer.getVariableName(variable));
- if (function.body is ReturnStatement) {
- printer.write(';');
+ if (function != null) {
+ printer.writeFunctionNode(function!, printer.getVariableName(variable));
+ if (function!.body is ReturnStatement) {
+ printer.write(';');
+ }
}
}
}
@@ -8354,23 +10119,25 @@
/// The [toString] method returns a human-readable string that includes the
/// library name for private names; uniqueness is not guaranteed.
abstract class Name extends Node {
+ @override
final int hashCode;
+
final String text;
- Reference get libraryName;
- Library get library;
+ Reference? get libraryName;
+ Library? get library;
bool get isPrivate;
Name._internal(this.hashCode, this.text);
- factory Name(String text, [Library library]) =>
+ factory Name(String text, [Library? library]) =>
new Name.byReference(text, library?.reference);
- factory Name.byReference(String text, Reference libraryName) {
+ factory Name.byReference(String text, Reference? libraryName) {
/// Use separate subclasses for the public and private case to save memory
/// for public names.
if (text.startsWith('_')) {
assert(libraryName != null);
- return new _PrivateName(text, libraryName);
+ return new _PrivateName(text, libraryName!);
} else {
return new _PublicName(text);
}
@@ -8380,13 +10147,16 @@
// use [text].
String get name => text;
+ @override
bool operator ==(other) {
return other is Name && text == other.text && library == other.library;
}
+ @override
R accept<R>(Visitor<R> v) => v.visitName(this);
- visitChildren(Visitor v) {
+ @override
+ void visitChildren(Visitor v) {
// DESIGN TODO: Should we visit the library as a library reference?
}
@@ -8394,6 +10164,7 @@
///
/// Note that this adds some nodes to a static map to ensure consistent
/// naming, but that it thus also leaks memory.
+ @override
String leakingDebugToString() => astToText.debugNodeToString(this);
@override
@@ -8409,17 +10180,25 @@
}
class _PrivateName extends Name {
+ @override
final Reference libraryName;
+
+ @override
bool get isPrivate => true;
_PrivateName(String text, Reference libraryName)
: this.libraryName = libraryName,
super._internal(_computeHashCode(text, libraryName), text);
+ @override
String toString() => toStringInternal();
- String toStringInternal() => library != null ? '$library::$text' : text;
+ @override
+ String toStringInternal() =>
+ // ignore: unnecessary_null_comparison
+ library != null ? '$library::$text' : text;
+ @override
Library get library => libraryName.asLibrary;
static int _computeHashCode(String name, Reference libraryName) {
@@ -8431,12 +10210,18 @@
}
class _PublicName extends Name {
- Reference get libraryName => null;
- Library get library => null;
+ @override
+ Reference? get libraryName => null;
+
+ @override
+ Library? get library => null;
+
+ @override
bool get isPrivate => false;
_PublicName(String text) : super._internal(text.hashCode, text);
+ @override
String toString() => toStringInternal();
}
@@ -8554,17 +10339,19 @@
nullability == Nullability.undetermined;
}
- bool equals(Object other, Assumptions assumptions);
+ bool equals(Object other, Assumptions? assumptions);
/// Returns a textual representation of the this type.
///
/// If [verbose] is `true`, qualified names will include the library name/uri.
+ @override
String toText(AstTextStrategy strategy) {
AstPrinter printer = new AstPrinter(strategy);
printer.writeType(this);
return printer.getText();
}
+ @override
void toTextInternal(AstPrinter printer);
}
@@ -8592,7 +10379,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) => other is InvalidType;
+ bool equals(Object other, Assumptions? assumptions) => other is InvalidType;
@override
Nullability get declaredNullability {
@@ -8640,7 +10427,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) => other is DynamicType;
+ bool equals(Object other, Assumptions? assumptions) => other is DynamicType;
@override
Nullability get declaredNullability => Nullability.nullable;
@@ -8682,7 +10469,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) => other is VoidType;
+ bool equals(Object other, Assumptions? assumptions) => other is VoidType;
@override
Nullability get declaredNullability => Nullability.nullable;
@@ -8729,7 +10516,6 @@
case Nullability.undetermined:
return const NeverType.undetermined();
}
- throw new StateError("Unhandled nullability value '${nullability}'.");
}
@override
@@ -8754,7 +10540,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) =>
+ bool equals(Object other, Assumptions? assumptions) =>
other is NeverType && nullability == other.nullability;
@override
@@ -8796,7 +10582,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) => other is BottomType;
+ bool equals(Object other, Assumptions? assumptions) => other is BottomType;
@override
Nullability get declaredNullability => Nullability.nonNullable;
@@ -8839,7 +10625,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) => other is NullType;
+ bool equals(Object other, Assumptions? assumptions) => other is NullType;
@override
Nullability get declaredNullability => Nullability.nullable;
@@ -8872,12 +10658,15 @@
/// The [typeArguments] list must not be modified after this call. If the
/// list is omitted, 'dynamic' type arguments are filled in.
InterfaceType(Class classNode, Nullability declaredNullability,
- [List<DartType> typeArguments])
- : this.byReference(getClassReference(classNode), declaredNullability,
+ [List<DartType>? typeArguments])
+ : this.byReference(
+ getNonNullableClassReference(classNode),
+ declaredNullability,
typeArguments ?? _defaultTypeArguments(classNode));
InterfaceType.byReference(
this.className, this.declaredNullability, this.typeArguments)
+ // ignore: unnecessary_null_comparison
: assert(declaredNullability != null);
Class get classNode => className.asClass;
@@ -8912,7 +10701,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
if (identical(this, other)) return true;
if (other is InterfaceType) {
if (nullability != other.nullability) return false;
@@ -8972,24 +10761,26 @@
final Nullability declaredNullability;
/// The [Typedef] this function type is created for.
- final TypedefType typedefType;
+ final TypedefType? typedefType;
final DartType returnType;
- int _hashCode;
+
+ @override
+ late final int hashCode = _computeHashCode();
FunctionType(List<DartType> positionalParameters, this.returnType,
this.declaredNullability,
{this.namedParameters: const <NamedType>[],
this.typeParameters: const <TypeParameter>[],
- int requiredParameterCount,
+ int? requiredParameterCount,
this.typedefType})
: this.positionalParameters = positionalParameters,
this.requiredParameterCount =
requiredParameterCount ?? positionalParameters.length;
- Reference get typedefReference => typedefType?.typedefReference;
+ Reference? get typedefReference => typedefType?.typedefReference;
- Typedef get typedef => typedefReference?.asTypedef;
+ Typedef? get typedef => typedefReference?.asTypedef;
@override
Nullability get nullability => declaredNullability;
@@ -9014,7 +10805,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
if (identical(this, other)) {
return true;
} else if (other is FunctionType) {
@@ -9033,8 +10824,8 @@
}
for (int index = 0; index < typeParameters.length; index++) {
if (!typeParameters[index]
- .bound
- .equals(other.typeParameters[index].bound, assumptions)) {
+ .bound!
+ .equals(other.typeParameters[index].bound!, assumptions)) {
return false;
}
}
@@ -9057,8 +10848,8 @@
}
if (typeParameters.isNotEmpty) {
for (int index = 0; index < typeParameters.length; index++) {
- assumptions.forget(
- typeParameters[index], other.typeParameters[index]);
+ assumptions!
+ .forget(typeParameters[index], other.typeParameters[index]);
}
}
return true;
@@ -9083,7 +10874,7 @@
/// Looks up the type of the named parameter with the given name.
///
/// Returns `null` if there is no named parameter with the given name.
- DartType getNamedParameter(String name) {
+ DartType? getNamedParameter(String name) {
int lower = 0;
int upper = namedParameters.length - 1;
while (lower <= upper) {
@@ -9101,9 +10892,6 @@
return null;
}
- @override
- int get hashCode => _hashCode ??= _computeHashCode();
-
int _computeHashCode() {
int hash = 1237;
hash = 0x3fffffff & (hash * 31 + requiredParameterCount);
@@ -9186,7 +10974,7 @@
final List<DartType> typeArguments;
TypedefType(Typedef typedefNode, Nullability nullability,
- [List<DartType> typeArguments])
+ [List<DartType>? typeArguments])
: this.byReference(typedefNode.reference, nullability,
typeArguments ?? const <DartType>[]);
@@ -9216,7 +11004,7 @@
@override
DartType get unaliasOnce {
DartType result =
- Substitution.fromTypedefType(this).substituteType(typedefNode.type);
+ Substitution.fromTypedefType(this).substituteType(typedefNode.type!);
return result.withDeclaredNullability(
combineNullabilitiesForSubstitution(result.nullability, nullability));
}
@@ -9230,7 +11018,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
if (identical(this, other)) {
return true;
} else if (other is TypedefType) {
@@ -9311,7 +11099,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
if (identical(this, other)) return true;
if (other is FutureOrType) {
if (declaredNullability != other.declaredNullability) return false;
@@ -9369,7 +11157,7 @@
@override
bool operator ==(Object other) => equals(other, null);
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
return other is NamedType &&
name == other.name &&
isRequired == other.isRequired &&
@@ -9435,10 +11223,11 @@
///
/// 'null' indicates that the type parameter's bound has not been promoted and
/// is therefore the same as the bound of [parameter].
- DartType promotedBound;
+ DartType? promotedBound;
TypeParameterType.internal(
- this.parameter, this.declaredNullability, this.promotedBound) {
+ this.parameter, this.declaredNullability, DartType? promotedBound)
+ : this.promotedBound = promotedBound {
assert(
promotedBound == null ||
(declaredNullability == Nullability.nonNullable &&
@@ -9512,7 +11301,7 @@
}
TypeParameterType(TypeParameter parameter, Nullability declaredNullability,
- [DartType promotedBound])
+ [DartType? promotedBound])
: this.internal(parameter, declaredNullability, promotedBound);
/// Creates an intersection type between a type parameter and [promotedBound].
@@ -9539,11 +11328,10 @@
/// `Nullability.undetermined` will be used, depending on the nullability of
/// the bound of [parameter].
TypeParameterType.withDefaultNullabilityForLibrary(
- this.parameter, Library library) {
- declaredNullability = library.isNonNullableByDefault
- ? computeNullabilityFromBound(parameter)
- : Nullability.legacy;
- }
+ this.parameter, Library library)
+ : declaredNullability = library.isNonNullableByDefault
+ ? computeNullabilityFromBound(parameter)
+ : Nullability.legacy;
@override
R accept<R>(DartTypeVisitor<R> v) => v.visitTypeParameterType(this);
@@ -9559,7 +11347,7 @@
bool operator ==(Object other) => equals(other, null);
@override
- bool equals(Object other, Assumptions assumptions) {
+ bool equals(Object other, Assumptions? assumptions) {
if (identical(this, other)) {
return true;
} else if (other is TypeParameterType) {
@@ -9579,7 +11367,7 @@
}
if (promotedBound != null) {
if (other.promotedBound == null) return false;
- if (!promotedBound.equals(other.promotedBound, assumptions)) {
+ if (!promotedBound!.equals(other.promotedBound!, assumptions)) {
return false;
}
} else if (other.promotedBound != null) {
@@ -9604,7 +11392,7 @@
}
/// Returns the bound of the type parameter, accounting for promotions.
- DartType get bound => promotedBound ?? parameter.bound;
+ DartType get bound => (promotedBound ?? parameter.bound)!;
/// Nullability of the type, calculated from its parts.
///
@@ -9627,9 +11415,7 @@
/// }
@override
Nullability get nullability {
- return getNullability(
- declaredNullability ?? computeNullabilityFromBound(parameter),
- promotedBound);
+ return getNullability(declaredNullability, promotedBound);
}
/// Gets a new [TypeParameterType] with given [typeParameterTypeNullability].
@@ -9659,7 +11445,7 @@
// non-nullable types can be passed in for the type parameter, making the
// corresponding type parameter types 'undetermined.' Otherwise, the
// nullability matches that of the bound.
- DartType bound = typeParameter.bound;
+ DartType? bound = typeParameter.bound;
if (bound == null) {
throw new StateError("Can't compute nullability from an absent bound.");
}
@@ -9670,9 +11456,9 @@
// other ways for such a dependency to exist, they should be checked here.
bool nullabilityDependsOnItself = false;
{
- DartType type = typeParameter.bound;
+ DartType? type = typeParameter.bound;
while (type is FutureOrType) {
- type = (type as FutureOrType).typeArgument;
+ type = type.typeArgument;
}
if (type is TypeParameterType && type.parameter == typeParameter) {
// Intersection types can't appear in the bound.
@@ -9701,7 +11487,7 @@
/// is null), the nullability of the intersection type is simply
/// [typeParameterTypeNullability].
static Nullability getNullability(
- Nullability typeParameterTypeNullability, DartType promotedBound) {
+ Nullability typeParameterTypeNullability, DartType? promotedBound) {
// If promotedBound is null, getNullability simply returns the nullability
// of the type parameter type.
Nullability lhsNullability = typeParameterTypeNullability;
@@ -9872,7 +11658,7 @@
printer.writeTypeParameterName(parameter);
printer.write(nullabilityToString(declaredNullability));
printer.write(" & ");
- printer.writeType(promotedBound);
+ printer.writeType(promotedBound!);
printer.write(')');
printer.write(nullabilityToString(nullability));
} else {
@@ -10006,20 +11792,22 @@
/// annotations if needed.
List<Expression> annotations = const <Expression>[];
- String name; // Cosmetic name.
+ String? name; // Cosmetic name.
/// The bound on the type variable.
///
/// Should not be null except temporarily during IR construction. Should
/// be set to the root class for type parameters without an explicit bound.
- DartType bound;
+ // TODO(johnniwinther): Can we make this late non-nullable?
+ DartType? bound;
/// The default value of the type variable. It is used to provide the
/// corresponding missing type argument in type annotations and as the
/// fall-back type value in type inference at compile time. At run time,
/// [defaultType] is used by the backends in place of the missing type
/// argument of a dynamic invocation of a generic function.
- DartType defaultType;
+ // TODO(johnniwinther): Can we make this late non-nullable?
+ DartType? defaultType;
/// Describes variance of the type parameter w.r.t. declaration on which it is
/// defined. For classes, if variance is not explicitly set, the type
@@ -10027,11 +11815,11 @@
/// on the lattice is equivalent to [Variance.covariant]. For typedefs, it's
/// the variance of the type parameters in the type term on the r.h.s. of the
/// typedef.
- int _variance;
+ int? _variance;
int get variance => _variance ?? Variance.covariant;
- void set variance(int newVariance) => _variance = newVariance;
+ void set variance(int? newVariance) => _variance = newVariance;
bool get isLegacyCovariant => _variance == null;
@@ -10063,24 +11851,55 @@
annotations.add(annotation..parent = this);
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitTypeParameter(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+ v.visitTypeParameter(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(annotations, v);
- bound.accept(v);
+ bound?.accept(v);
defaultType?.accept(v);
}
- transformChildren(Transformer v) {
- transformList(annotations, v, this);
- bound = v.visitDartType(bound);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(annotations, this);
+ if (bound != null) {
+ bound = v.visitDartType(bound!);
+ }
if (defaultType != null) {
- defaultType = v.visitDartType(defaultType);
+ defaultType = v.visitDartType(defaultType!);
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformExpressionList(annotations, this);
+ if (bound != null) {
+ DartType newBound = v.visitDartType(bound!, dummyDartType);
+ if (identical(newBound, dummyDartType)) {
+ bound = null;
+ } else {
+ bound = newBound;
+ }
+ }
+ if (defaultType != null) {
+ DartType newDefaultType = v.visitDartType(defaultType!, dummyDartType);
+ if (identical(newDefaultType, dummyDartType)) {
+ defaultType = null;
+ } else {
+ defaultType = newDefaultType;
+ }
}
}
/// Returns a possibly synthesized name for this type parameter, consistent
/// with the names used across all [toString] calls.
+ @override
String toString() {
return "TypeParameter(${toStringInternal()})";
}
@@ -10098,7 +11917,8 @@
final List<DartType> typeArguments;
Supertype(Class classNode, List<DartType> typeArguments)
- : this.byReference(getClassReference(classNode), typeArguments);
+ : this.byReference(
+ getNonNullableClassReference(classNode), typeArguments);
Supertype.byReference(this.className, this.typeArguments);
@@ -10273,6 +12093,7 @@
class StringConstant extends PrimitiveConstant<String> {
StringConstant(String value) : super(value) {
+ // ignore: unnecessary_null_comparison
assert(value != null);
}
@@ -10322,6 +12143,7 @@
@override
void toTextInternal(AstPrinter printer) {
printer.write('#');
+ // ignore: unnecessary_null_comparison
if (printer.includeAuxiliaryProperties && libraryReference != null) {
printer.write(libraryNameToString(libraryReference.asLibrary));
printer.write('::');
@@ -10368,11 +12190,9 @@
@override
String toString() => 'MapConstant(${toStringInternal()})';
- int _cachedHashCode;
- int get hashCode {
- return _cachedHashCode ??= _Hash.combine2Finish(
- keyType.hashCode, valueType.hashCode, _Hash.combineListHash(entries));
- }
+ @override
+ late final int hashCode = _Hash.combine2Finish(
+ keyType.hashCode, valueType.hashCode, _Hash.combineListHash(entries));
bool operator ==(Object other) =>
identical(this, other) ||
@@ -10448,11 +12268,9 @@
@override
String toString() => 'ListConstant(${toStringInternal()})';
- int _cachedHashCode;
- int get hashCode {
- return _cachedHashCode ??= _Hash.combineFinish(
- typeArgument.hashCode, _Hash.combineListHash(entries));
- }
+ @override
+ late final int hashCode = _Hash.combineFinish(
+ typeArgument.hashCode, _Hash.combineListHash(entries));
bool operator ==(Object other) =>
identical(this, other) ||
@@ -10497,11 +12315,9 @@
@override
String toString() => 'SetConstant(${toStringInternal()})';
- int _cachedHashCode;
- int get hashCode {
- return _cachedHashCode ??= _Hash.combineFinish(
- typeArgument.hashCode, _Hash.combineListHash(entries));
- }
+ @override
+ late final int hashCode = _Hash.combineFinish(
+ typeArgument.hashCode, _Hash.combineListHash(entries));
bool operator ==(Object other) =>
identical(this, other) ||
@@ -10556,13 +12372,9 @@
@override
String toString() => 'InstanceConstant(${toStringInternal()})';
- int _cachedHashCode;
- int get hashCode {
- return _cachedHashCode ??= _Hash.combine2Finish(
- classReference.hashCode,
- listHashCode(typeArguments),
- _Hash.combineMapHashUnordered(fieldValues));
- }
+ @override
+ late final int hashCode = _Hash.combine2Finish(classReference.hashCode,
+ listHashCode(typeArguments), _Hash.combineMapHashUnordered(fieldValues));
bool operator ==(Object other) {
return identical(this, other) ||
@@ -10630,7 +12442,7 @@
TearOffConstant.byReference(this.procedureReference);
- Procedure get procedure => procedureReference?.asProcedure;
+ Procedure get procedure => procedureReference.asProcedure;
visitChildren(Visitor v) {
procedureReference.asProcedure.acceptReference(v);
@@ -10655,7 +12467,7 @@
}
FunctionType getType(StaticTypeContext context) {
- return procedure.function.computeFunctionType(context.nonNullable);
+ return procedure.function!.computeFunctionType(context.nonNullable);
}
}
@@ -10694,7 +12506,7 @@
final Expression expression;
UnevaluatedConstant(this.expression) {
- expression?.parent = null;
+ expression.parent = null;
}
visitChildren(Visitor v) {
@@ -10744,7 +12556,7 @@
///
/// Note that this field can be null, and by convention should be null if the
/// list is empty.
- List<String> problemsAsJson;
+ List<String>? problemsAsJson;
final List<Library> libraries;
@@ -10759,19 +12571,19 @@
<String, MetadataRepository<dynamic>>{};
/// Reference to the main method in one of the libraries.
- Reference _mainMethodName;
- Reference get mainMethodName => _mainMethodName;
- NonNullableByDefaultCompiledMode _mode;
+ Reference? _mainMethodName;
+ Reference? get mainMethodName => _mainMethodName;
+ NonNullableByDefaultCompiledMode? _mode;
NonNullableByDefaultCompiledMode get mode {
return _mode ?? NonNullableByDefaultCompiledMode.Weak;
}
- NonNullableByDefaultCompiledMode get modeRaw => _mode;
+ NonNullableByDefaultCompiledMode? get modeRaw => _mode;
Component(
- {CanonicalName nameRoot,
- List<Library> libraries,
- Map<Uri, Source> uriToSource})
+ {CanonicalName? nameRoot,
+ List<Library>? libraries,
+ Map<Uri, Source>? uriToSource})
: root = nameRoot ?? new CanonicalName.root(),
libraries = libraries ?? <Library>[],
uriToSource = uriToSource ?? <Uri, Source>{} {
@@ -10779,13 +12591,14 @@
}
void adoptChildren() {
+ // ignore: unnecessary_null_comparison
if (libraries != null) {
for (int i = 0; i < libraries.length; ++i) {
// The libraries are owned by this component, and so are their canonical
// names if they exist.
Library library = libraries[i];
library.parent = this;
- CanonicalName name = library.reference.canonicalName;
+ CanonicalName? name = library.reference.canonicalName;
if (name != null && name.parent != root) {
root.adoptChild(name);
}
@@ -10848,7 +12661,7 @@
root.unbindAll();
}
- Procedure get mainMethod => mainMethodName?.asProcedure;
+ Procedure? get mainMethod => mainMethodName?.asProcedure;
void setMainMethodAndMode(Reference main, bool overwriteMainIfSet,
NonNullableByDefaultCompiledMode mode) {
@@ -10858,21 +12671,33 @@
_mode = mode;
}
+ @override
R accept<R>(TreeVisitor<R> v) => v.visitComponent(this);
- visitChildren(Visitor v) {
+ @override
+ R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitComponent(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
visitList(libraries, v);
mainMethod?.acceptReference(v);
}
- transformChildren(Transformer v) {
- transformList(libraries, v, this);
+ @override
+ void transformChildren(Transformer v) {
+ v.transformList(libraries, this);
}
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ v.transformLibraryList(libraries, this);
+ }
+
+ @override
Component get enclosingComponent => this;
/// Translates an offset to line and column numbers in the given file.
- Location getLocation(Uri file, int offset) {
+ Location? getLocation(Uri? file, int offset) {
return uriToSource[file]?.getLocation(file, offset);
}
@@ -10905,7 +12730,8 @@
/// A tuple with file, line, and column number, for displaying human-readable
/// locations.
class Location {
- final Uri file;
+ // TODO(johnniwinther): Make this non-nullable.
+ final Uri? file;
final int line; // 1-based.
final int column; // 1-based.
@@ -11030,49 +12856,6 @@
}
}
-void transformTypeList(List<DartType> nodes, Transformer visitor) {
- int storeIndex = 0;
- for (int i = 0; i < nodes.length; ++i) {
- DartType result = visitor.visitDartType(nodes[i]);
- if (result != null) {
- nodes[storeIndex] = result;
- ++storeIndex;
- }
- }
- if (storeIndex < nodes.length) {
- nodes.length = storeIndex;
- }
-}
-
-void transformSupertypeList(List<Supertype> nodes, Transformer visitor) {
- int storeIndex = 0;
- for (int i = 0; i < nodes.length; ++i) {
- Supertype result = visitor.visitSupertype(nodes[i]);
- if (result != null) {
- nodes[storeIndex] = result;
- ++storeIndex;
- }
- }
- if (storeIndex < nodes.length) {
- nodes.length = storeIndex;
- }
-}
-
-void transformList(List<TreeNode> nodes, Transformer visitor, TreeNode parent) {
- int storeIndex = 0;
- for (int i = 0; i < nodes.length; ++i) {
- TreeNode result = nodes[i].accept(visitor);
- if (result != null) {
- nodes[storeIndex] = result;
- result.parent = parent;
- ++storeIndex;
- }
- }
- if (storeIndex < nodes.length) {
- nodes.length = storeIndex;
- }
-}
-
class _ChildReplacer extends Transformer {
final TreeNode child;
final TreeNode replacement;
@@ -11080,7 +12863,7 @@
_ChildReplacer(this.child, this.replacement);
@override
- defaultTreeNode(TreeNode node) {
+ TreeNode defaultTreeNode(TreeNode node) {
if (node == child) {
return replacement;
} else {
@@ -11090,31 +12873,35 @@
}
class Source {
- final List<int> lineStarts;
+ final List<int>? lineStarts;
/// A UTF8 encoding of the original source file.
- final List<int> source;
+ final List<int>? source;
final Uri importUri;
final Uri fileUri;
- Set<Reference> constantCoverageConstructors;
+ Set<Reference>? constantCoverageConstructors;
- String cachedText;
+ String? cachedText;
Source(this.lineStarts, this.source, this.importUri, this.fileUri);
/// Return the text corresponding to [line] which is a 1-based line
/// number. The returned line contains no line separators.
- String getTextLine(int line) {
+ String? getTextLine(int line) {
+ List<int>? lineStarts = this.lineStarts;
if (source == null ||
- source.isEmpty ||
+ source!.isEmpty ||
lineStarts == null ||
- lineStarts.isEmpty) return null;
+ lineStarts.isEmpty) {
+ return null;
+ }
RangeError.checkValueInInterval(line, 1, lineStarts.length, 'line');
- cachedText ??= utf8.decode(source, allowMalformed: true);
+ String cachedText =
+ this.cachedText ??= utf8.decode(source!, allowMalformed: true);
// -1 as line numbers start at 1.
int index = line - 1;
if (index + 1 == lineStarts.length) {
@@ -11135,7 +12922,8 @@
}
/// Translates an offset to 1-based line and column numbers in the given file.
- Location getLocation(Uri file, int offset) {
+ Location getLocation(Uri? file, int offset) {
+ List<int>? lineStarts = this.lineStarts;
if (lineStarts == null || lineStarts.isEmpty) {
return new Location(file, TreeNode.noOffset, TreeNode.noOffset);
}
@@ -11163,6 +12951,7 @@
/// has no lines.
/// Throws [RangeError] if line or calculated offset are out of range.
int getOffset(int line, int column) {
+ List<int>? lineStarts = this.lineStarts;
if (lineStarts == null || lineStarts.isEmpty) {
return -1;
}
@@ -11177,11 +12966,11 @@
/// ProcedureKind.
///
/// Returns `null` if the member is `null`.
-Reference getMemberReferenceBasedOnProcedureKind(
- Member member, ProcedureKind kind) {
+Reference? getMemberReferenceBasedOnProcedureKind(
+ Member? member, ProcedureKind kind) {
if (member == null) return null;
if (member is Field) {
- if (kind == ProcedureKind.Setter) return member.setterReference;
+ if (kind == ProcedureKind.Setter) return member.setterReference!;
return member.getterReference;
}
return member.reference;
@@ -11191,8 +12980,12 @@
///
/// Returns `null` if the member is `null`.
/// TODO(jensj): Should it be called NotSetter instead of Getter?
-Reference getMemberReferenceGetter(Member member) {
+Reference? getMemberReferenceGetter(Member? member) {
if (member == null) return null;
+ return getNonNullableMemberReferenceGetter(member);
+}
+
+Reference getNonNullableMemberReferenceGetter(Member member) {
if (member is Field) return member.getterReference;
return member.reference;
}
@@ -11200,26 +12993,35 @@
/// Returns the setter [Reference] object for the given member.
///
/// Returns `null` if the member is `null`.
-Reference getMemberReferenceSetter(Member member) {
+Reference? getMemberReferenceSetter(Member? member) {
if (member == null) return null;
- if (member is Field) return member.setterReference;
+ return getNonNullableMemberReferenceSetter(member);
+}
+
+Reference getNonNullableMemberReferenceSetter(Member member) {
+ if (member is Field) return member.setterReference!;
return member.reference;
}
/// Returns the [Reference] object for the given class.
///
/// Returns `null` if the class is `null`.
-Reference getClassReference(Class class_) {
+Reference? getClassReference(Class? class_) {
return class_?.reference;
}
+/// Returns the [Reference] object for the given class.
+Reference getNonNullableClassReference(Class class_) {
+ return class_.reference;
+}
+
/// Returns the canonical name of [member], or throws an exception if the
/// member has not been assigned a canonical name yet.
///
/// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMemberGetter(Member member) {
+CanonicalName? getCanonicalNameOfMemberGetter(Member? member) {
if (member == null) return null;
- CanonicalName canonicalName;
+ CanonicalName? canonicalName;
if (member is Field) {
canonicalName = member.getterCanonicalName;
} else {
@@ -11235,9 +13037,9 @@
/// member has not been assigned a canonical name yet.
///
/// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMemberSetter(Member member) {
+CanonicalName? getCanonicalNameOfMemberSetter(Member? member) {
if (member == null) return null;
- CanonicalName canonicalName;
+ CanonicalName? canonicalName;
if (member is Field) {
canonicalName = member.setterCanonicalName;
} else {
@@ -11253,7 +13055,7 @@
/// class has not been assigned a canonical name yet.
///
/// Returns `null` if the class is `null`.
-CanonicalName getCanonicalNameOfClass(Class class_) {
+CanonicalName? getCanonicalNameOfClass(Class? class_) {
if (class_ == null) return null;
if (class_.canonicalName == null) {
throw '$class_ has no canonical name';
@@ -11265,7 +13067,7 @@
/// class has not been assigned a canonical name yet.
///
/// Returns `null` if the extension is `null`.
-CanonicalName getCanonicalNameOfExtension(Extension extension) {
+CanonicalName? getCanonicalNameOfExtension(Extension? extension) {
if (extension == null) return null;
if (extension.canonicalName == null) {
throw '$extension has no canonical name';
@@ -11277,7 +13079,7 @@
/// library has not been assigned a canonical name yet.
///
/// Returns `null` if the library is `null`.
-CanonicalName getCanonicalNameOfLibrary(Library library) {
+CanonicalName? getCanonicalNameOfLibrary(Library? library) {
if (library == null) return null;
if (library.canonicalName == null) {
throw '$library has no canonical name';
@@ -11356,9 +13158,12 @@
return hash;
}
- static int combineMapHashUnordered(Map map, [int hash = 2]) {
+ static int combineMapHashUnordered(Map? map, [int hash = 2]) {
if (map == null || map.isEmpty) return hash;
- List<int> entryHashes = List.filled(map.length, null);
+ List<int> entryHashes = List.filled(
+ map.length,
+ // `-1` is used as a dummy default value.
+ -1);
int i = 0;
for (core.MapEntry entry in map.entries) {
entryHashes[i++] = combine(entry.key.hashCode, entry.value.hashCode);
@@ -11375,7 +13180,7 @@
}
}
-int listHashCode(List list) {
+int listHashCode(List<Object> list) {
return _Hash.finish(_Hash.combineListHash(list));
}
@@ -11417,7 +13222,7 @@
/// typedef has not been assigned a canonical name yet.
///
/// Returns `null` if the typedef is `null`.
-CanonicalName getCanonicalNameOfTypedef(Typedef typedef_) {
+CanonicalName? getCanonicalNameOfTypedef(Typedef? typedef_) {
if (typedef_ == null) return null;
if (typedef_.canonicalName == null) {
throw '$typedef_ has no canonical name';
@@ -11430,7 +13235,8 @@
/// static analysis and runtime behavior of the library are unaffected.
const Null informative = null;
-Location _getLocationInComponent(Component component, Uri fileUri, int offset) {
+Location? _getLocationInComponent(
+ Component? component, Uri? fileUri, int offset) {
if (component != null) {
return component.getLocation(fileUri, offset);
} else {
@@ -11471,13 +13277,11 @@
List<DartType> getAsTypeArguments(
List<TypeParameter> typeParameters, Library library) {
if (typeParameters.isEmpty) return const <DartType>[];
- List<DartType> result =
- new List<DartType>.filled(typeParameters.length, null, growable: false);
- for (int i = 0; i < result.length; ++i) {
- result[i] = new TypeParameterType.withDefaultNullabilityForLibrary(
- typeParameters[i], library);
- }
- return result;
+ return new List<DartType>.generate(
+ typeParameters.length,
+ (int i) => new TypeParameterType.withDefaultNullabilityForLibrary(
+ typeParameters[i], library),
+ growable: false);
}
class Version extends Object {
@@ -11485,7 +13289,9 @@
final int minor;
const Version(this.major, this.minor)
+ // ignore: unnecessary_null_comparison
: assert(major != null),
+ // ignore: unnecessary_null_comparison
assert(minor != null);
bool operator <(Version other) {
@@ -11544,15 +13350,218 @@
}
}
-/// Non-nullable `DartType` value to be used as a dummy initial value for the
-/// `List.filled` constructor.
-const DartType dartTypeDummy = const DynamicType();
+/// Non-nullable [DartType] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final DartType dummyDartType = new DynamicType();
-/// Non-nullable `NamedType` value to be used as a dummy initial value for the
-/// `List.filled` constructor.
-const NamedType namedTypeDummy =
- const NamedType('', dartTypeDummy, isRequired: false);
+/// Non-nullable [Supertype] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Supertype dummySupertype = new Supertype(dummyClass, const []);
-/// Non-nullable `Member` value to be used as a dummy initial value for the
+/// Non-nullable [NamedType] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final NamedType dummyNamedType =
+ new NamedType('', dummyDartType, isRequired: false);
+
+/// Non-nullable [Uri] dummy value.
+final Uri dummyUri = new Uri(scheme: 'dummy');
+
+/// Non-nullable [Name] dummy value.
+final Name dummyName = new _PublicName('');
+
+/// Non-nullable [Library] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Library dummyLibrary = new Library(dummyUri);
+
+/// Non-nullable [LibraryDependency] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final LibraryDependency dummyLibraryDependency =
+ new LibraryDependency.import(dummyLibrary);
+
+/// Non-nullable [Combinator] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Combinator dummyCombinator = new Combinator(false, const []);
+
+/// Non-nullable [LibraryPart] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final LibraryPart dummyLibraryPart = new LibraryPart(const [], '');
+
+/// Non-nullable [Class] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Class dummyClass = new Class();
+
+/// Non-nullable [Constructor] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Constructor dummyConstructor = new Constructor(dummyFunctionNode);
+
+/// Non-nullable [Extension] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Extension dummyExtension = new Extension();
+
+/// Non-nullable [Member] dummy value.
+///
+/// This can be used for instance as a dummy initial value for the
/// `List.filled` constructor.
final Member dummyMember = new Field.mutable(new _PublicName(''));
+
+/// Non-nullable [Procedure] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Procedure dummyProcedure =
+ new Procedure(dummyName, ProcedureKind.Method, dummyFunctionNode);
+
+/// Non-nullable [Field] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Field dummyField = new Field.mutable(dummyName);
+
+/// Non-nullable [RedirectingFactoryConstructor] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final RedirectingFactoryConstructor dummyRedirectingFactoryConstructor =
+ new RedirectingFactoryConstructor(null);
+
+/// Non-nullable [Typedef] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Typedef dummyTypedef = new Typedef('', null);
+
+/// Non-nullable [Initializer] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Initializer dummyInitializer = new InvalidInitializer();
+
+/// Non-nullable [FunctionNode] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final FunctionNode dummyFunctionNode = new FunctionNode(null);
+
+/// Non-nullable [Statement] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Statement dummyStatement = new EmptyStatement();
+
+/// Non-nullable [Expression] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Expression dummyExpression = new NullLiteral();
+
+/// Non-nullable [NamedExpression] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final NamedExpression dummyNamedExpression =
+ new NamedExpression('', dummyExpression);
+
+/// Non-nullable [VariableDeclaration] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final VariableDeclaration dummyVariableDeclaration =
+ new VariableDeclaration(null);
+
+/// Non-nullable [TypeParameter] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final TypeParameter dummyTypeParameter = new TypeParameter();
+
+/// Non-nullable [MapEntry] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final MapEntry dummyMapEntry = new MapEntry(dummyExpression, dummyExpression);
+
+/// Non-nullable [Arguments] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Arguments dummyArguments = new Arguments(const []);
+
+/// Non-nullable [AssertStatement] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final AssertStatement dummyAssertStatement = new AssertStatement(
+ dummyExpression,
+ conditionStartOffset: TreeNode.noOffset,
+ conditionEndOffset: TreeNode.noOffset);
+
+/// Non-nullable [SwitchCase] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final SwitchCase dummySwitchCase = new SwitchCase.empty();
+
+/// Non-nullable [Catch] dummy value.
+///
+/// This is used as the removal sentinel in [RemovingTransformer] and can be
+/// used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Catch dummyCatch = new Catch(null, dummyStatement);
+
+/// Sentinel value used to signal that a node cannot be removed through the
+/// [RemovingTransformer].
+const Null cannotRemoveSentinel = null;
+
+/// Helper that can be used in asserts to check that [list] is mutable by
+/// adding and removing [dummyElement].
+bool checkListIsMutable<E>(List<E> list, E dummyElement) {
+ list
+ ..add(dummyElement)
+ ..removeLast();
+ return true;
+}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7eb93df..f6ae627 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -6,7 +6,6 @@
library kernel.ast_from_binary;
-import 'dart:core' hide MapEntry;
import 'dart:developer';
import 'dart:convert';
import 'dart:typed_data';
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 821b2f9..bed4058 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -6,7 +6,6 @@
library kernel.ast_to_binary;
-import 'dart:core' hide MapEntry;
import 'dart:convert';
import 'dart:developer';
import 'dart:io' show BytesBuilder;
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 70f3004..af7344e 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
library kernel.canonical_name;
import 'ast.dart';
@@ -69,25 +67,27 @@
/// The "qualified name" allows a member to have a name that is private to
/// a library other than the one containing that member.
class CanonicalName {
- CanonicalName _parent;
+ CanonicalName? _parent;
- CanonicalName get parent => _parent;
+ CanonicalName? get parent => _parent;
final String name;
- CanonicalName _nonRootTop;
+ CanonicalName? _nonRootTop;
- Map<String, CanonicalName> _children;
+ Map<String, CanonicalName>? _children;
/// The library, class, or member bound to this name.
- Reference reference;
+ Reference? reference;
/// Temporary index used during serialization.
int index = -1;
- CanonicalName._(this._parent, this.name) {
+ CanonicalName._(CanonicalName parent, this.name) : _parent = parent {
+ // ignore: unnecessary_null_comparison
assert(name != null);
+ // ignore: unnecessary_null_comparison
assert(parent != null);
- _nonRootTop = _parent.isRoot ? this : _parent._nonRootTop;
+ _nonRootTop = parent.isRoot ? this : parent._nonRootTop;
}
CanonicalName.root()
@@ -96,15 +96,16 @@
name = '';
bool get isRoot => _parent == null;
- CanonicalName get nonRootTop => _nonRootTop;
+
+ CanonicalName? get nonRootTop => _nonRootTop;
Iterable<CanonicalName> get children =>
_children?.values ?? const <CanonicalName>[];
- Iterable<CanonicalName> get childrenOrNull => _children?.values;
+ Iterable<CanonicalName>? get childrenOrNull => _children?.values;
bool hasChild(String name) {
- return _children != null && _children.containsKey(name);
+ return _children != null && _children!.containsKey(name);
}
CanonicalName getChild(String name) {
@@ -121,32 +122,32 @@
CanonicalName getChildFromQualifiedName(Name name) {
return name.isPrivate
- ? getChildFromUri(name.library.importUri).getChild(name.text)
+ ? getChildFromUri(name.library!.importUri).getChild(name.text)
: getChild(name.text);
}
CanonicalName getChildFromProcedure(Procedure procedure) {
return getChild(getProcedureQualifier(procedure))
- .getChildFromQualifiedName(procedure.name);
+ .getChildFromQualifiedName(procedure.name!);
}
CanonicalName getChildFromField(Field field) {
- return getChild('@fields').getChildFromQualifiedName(field.name);
+ return getChild('@fields').getChildFromQualifiedName(field.name!);
}
CanonicalName getChildFromFieldSetter(Field field) {
- return getChild('@=fields').getChildFromQualifiedName(field.name);
+ return getChild('@=fields').getChildFromQualifiedName(field.name!);
}
CanonicalName getChildFromConstructor(Constructor constructor) {
return getChild('@constructors')
- .getChildFromQualifiedName(constructor.name);
+ .getChildFromQualifiedName(constructor.name!);
}
CanonicalName getChildFromRedirectingFactoryConstructor(
RedirectingFactoryConstructor redirectingFactoryConstructor) {
return getChild('@factories')
- .getChildFromQualifiedName(redirectingFactoryConstructor.name);
+ .getChildFromQualifiedName(redirectingFactoryConstructor.name!);
}
CanonicalName getChildFromFieldWithName(Name name) {
@@ -175,26 +176,27 @@
/// the same name.
void adoptChild(CanonicalName child) {
if (child._parent == this) return;
- if (_children != null && _children.containsKey(child.name)) {
+ if (_children != null && _children!.containsKey(child.name)) {
throw 'Cannot add a child to $this because this name already has a '
'child named ${child.name}';
}
- child._parent.removeChild(child.name);
+ child._parent?.removeChild(child.name);
child._parent = this;
- if (_children == null) _children = <String, CanonicalName>{};
- _children[child.name] = child;
+ _children ??= <String, CanonicalName>{};
+ _children![child.name] = child;
}
void removeChild(String name) {
if (_children != null) {
- _children.remove(name);
- if (_children.isEmpty) {
+ _children!.remove(name);
+ if (_children!.isEmpty) {
_children = null;
}
}
}
void bindTo(Reference target) {
+ // ignore: unnecessary_null_comparison
if (target == null) {
throw '$this cannot be bound to null';
}
@@ -217,25 +219,25 @@
// canonical name tree. We need to establish better invariants about the
// state of the canonical name tree, since for instance [unbindAll] doesn't
// remove unneeded leaf nodes.
- _parent.removeChild(name);
+ _parent?.removeChild(name);
}
void _unbindInternal() {
if (reference == null) return;
- assert(reference.canonicalName == this);
- if (reference.node is Class) {
+ assert(reference!.canonicalName == this);
+ if (reference!.node is Class) {
// TODO(jensj): Get rid of this. This is only needed because pkg:vm does
// weird stuff in transformations. `unbind` should probably be private.
- Class c = reference.node;
+ Class c = reference!.asClass;
c.ensureLoaded();
}
- reference.canonicalName = null;
+ reference!.canonicalName = null;
reference = null;
}
void unbindAll() {
_unbindInternal();
- Iterable<CanonicalName> children_ = childrenOrNull;
+ Iterable<CanonicalName>? children_ = childrenOrNull;
if (children_ != null) {
for (CanonicalName child in children_) {
child.unbindAll();
@@ -246,8 +248,8 @@
String toString() => _parent == null ? 'root' : '$parent::$name';
String toStringInternal() {
if (isRoot) return "";
- if (parent.isRoot) return "$name";
- return "${parent.toStringInternal()}::$name";
+ if (parent!.isRoot) return "$name";
+ return "${parent!.toStringInternal()}::$name";
}
Reference getReference() {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 08ed371..0c6e3f3 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -8,7 +8,6 @@
import 'dart:math';
import 'dart:typed_data';
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart' hide MapEntry;
import 'core_types.dart';
import 'type_algebra.dart';
@@ -283,7 +282,7 @@
/// [getDeclaredMembers] and [getInterfaceMembers].
static int compareMembers(Member first, Member second) {
if (first == second) return 0;
- return compareNames(first.name, second.name);
+ return compareNames(first.name!, second.name!);
}
/// Compares names, using the same sort order as [getDeclaredMembers] and
@@ -329,7 +328,7 @@
while (low <= high) {
int mid = low + ((high - low) >> 1);
Member pivot = members[mid];
- int comparison = compareNames(name, pivot.name);
+ int comparison = compareNames(name, pivot.name!);
if (comparison < 0) {
high = mid - 1;
} else if (comparison > 0) {
@@ -418,9 +417,9 @@
Member? getSingleTargetForInterfaceInvocation(Member interfaceTarget,
{bool setter: false}) {
if (invalidated) throw "This data structure has been invalidated";
- Name name = interfaceTarget.name;
+ Name name = interfaceTarget.name!;
Member? target = null;
- ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass);
+ ClassSet subtypes = getSubtypesOf(interfaceTarget.enclosingClass!);
for (Class c in subtypes) {
if (!c.isAbstract) {
Member? candidate =
@@ -591,8 +590,14 @@
heap.add(infoFor(supertype.classNode));
}
- if (classNode.supertype != null) addToHeap(classNode.supertype);
- if (classNode.mixedInType != null) addToHeap(classNode.mixedInType);
+ Supertype? supertype = classNode.supertype;
+ if (supertype != null) {
+ addToHeap(supertype);
+ }
+ Supertype? mixedInType = classNode.mixedInType;
+ if (mixedInType != null) {
+ addToHeap(mixedInType);
+ }
classNode.implementedTypes.forEach(addToHeap);
}
return chain;
@@ -861,11 +866,13 @@
void removeClass(Class cls) {
_ClassInfo? info = _infoMap[cls];
if (info == null) return;
- if (cls.supertype != null) {
- _infoMap[cls.supertype.classNode]?.directExtenders.remove(info);
+ Supertype? supertype = cls.supertype;
+ if (supertype != null) {
+ _infoMap[supertype.classNode]?.directExtenders.remove(info);
}
- if (cls.mixedInType != null) {
- _infoMap[cls.mixedInType.classNode]?.directMixers.remove(info);
+ Supertype? mixedInType = cls.mixedInType;
+ if (mixedInType != null) {
+ _infoMap[mixedInType.classNode]?.directMixers.remove(info);
}
for (Supertype supertype in cls.implementedTypes) {
_infoMap[supertype.classNode]?.directImplementers.remove(info);
@@ -1095,12 +1102,14 @@
}
_collectSupersForClass(class_);
- if (class_.supertype != null) {
- _recordSuperTypes(info, class_.supertype);
+ Supertype? supertype = class_.supertype;
+ if (supertype != null) {
+ _recordSuperTypes(info, supertype);
}
- if (class_.mixedInType != null) {
+ Supertype? mixedInType = class_.mixedInType;
+ if (mixedInType != null) {
mixinInferrer?.infer(this, class_);
- _recordSuperTypes(info, class_.mixedInType);
+ _recordSuperTypes(info, mixedInType);
}
for (Supertype supertype in class_.implementedTypes) {
_recordSuperTypes(info, supertype);
@@ -1169,10 +1178,11 @@
if (members != null) return members;
List<Member> inherited;
- if (classNode.supertype == null) {
+ Supertype? supertype = classNode.supertype;
+ if (supertype == null) {
inherited = const <Member>[];
} else {
- Class superClassNode = classNode.supertype.classNode;
+ Class superClassNode = supertype.classNode;
_ClassInfo superInfo = _infoMap[superClassNode]!;
inherited =
_buildImplementedMembers(superClassNode, superInfo, setters: setters);
@@ -1208,7 +1218,7 @@
setters: setters)) {
if (mixinMember is! Procedure ||
(mixinMember is Procedure && !mixinMember.isSynthetic)) {
- memberMap[mixinMember.name] = mixinMember;
+ memberMap[mixinMember.name!] = mixinMember;
}
}
}
@@ -1217,21 +1227,21 @@
if (procedure.isStatic) continue;
if (procedure.kind == ProcedureKind.Setter) {
if (setters) {
- memberMap[procedure.name] = procedure;
+ memberMap[procedure.name!] = procedure;
}
} else {
if (!setters) {
- memberMap[procedure.name] = procedure;
+ memberMap[procedure.name!] = procedure;
}
}
}
for (Field field in classNode.fields) {
if (field.isStatic) continue;
if (!setters) {
- memberMap[field.name] = field;
+ memberMap[field.name!] = field;
}
if (setters && field.hasSetter) {
- memberMap[field.name] = field;
+ memberMap[field.name!] = field;
}
}
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 83a94a1..979d08f 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -6,8 +6,6 @@
library kernel.clone;
-import 'dart:core' hide MapEntry;
-
import 'ast.dart';
import 'type_algebra.dart';
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 2fa52ac..edac20b 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -4,7 +4,6 @@
library kernel.core_types;
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
import 'library_index.dart';
import 'type_algebra.dart';
@@ -1137,13 +1136,13 @@
if (type is TypeParameterType &&
type.promotedBound != null &&
type.isPotentiallyNonNullable) {
- return isBottom(type.promotedBound);
+ return isBottom(type.promotedBound!);
}
// BOTTOM(X extends T) is true iff BOTTOM(T).
if (type is TypeParameterType && type.isPotentiallyNonNullable) {
assert(type.promotedBound == null);
- return isBottom(type.parameter.bound);
+ return isBottom(type.parameter.bound!);
}
if (type is BottomType) return true;
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index 5b39ec4..6de3073 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
//
// Instead modify 'tools/experimental_features.yaml' and run
diff --git a/pkg/kernel/lib/import_table.dart b/pkg/kernel/lib/import_table.dart
index 1cc27c2..d6bf7ee 100644
--- a/pkg/kernel/lib/import_table.dart
+++ b/pkg/kernel/lib/import_table.dart
@@ -4,7 +4,6 @@
library kernel.import_table;
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
abstract class ImportTable {
@@ -111,7 +110,7 @@
visitLibrary(Library node) {
super.visitLibrary(node);
for (Reference exportedReference in node.additionalExports) {
- addLibraryImport(exportedReference.node.parent as Library);
+ addLibraryImport(exportedReference.node!.parent as Library);
}
}
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 630763d..2619b62 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -4,7 +4,6 @@
library kernel.library_index;
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
/// Provides name-based access to library, class, and member AST nodes.
@@ -142,18 +141,18 @@
_classes = <String, _MemberTable>{};
_classes![LibraryIndex.topLevel] = new _MemberTable.topLevel(this);
for (Class class_ in library.classes) {
- _classes![class_.name] = new _MemberTable.fromClass(this, class_);
+ _classes![class_.name!] = new _MemberTable.fromClass(this, class_);
}
for (Extension extension_ in library.extensions) {
- _classes![extension_.name] =
+ _classes![extension_.name!] =
new _MemberTable.fromExtension(this, extension_);
}
for (Reference reference in library.additionalExports) {
- NamedNode node = reference.node;
+ NamedNode? node = reference.node;
if (node is Class) {
- _classes![node.name] = new _MemberTable.fromClass(this, node);
+ _classes![node.name!] = new _MemberTable.fromClass(this, node);
} else if (node is Extension) {
- _classes![node.name] = new _MemberTable.fromExtension(this, node);
+ _classes![node.name!] = new _MemberTable.fromExtension(this, node);
}
}
}
@@ -222,14 +221,14 @@
String getDisambiguatedName(Member member) {
if (member is Procedure) {
- if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
- if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
+ if (member.isGetter) return LibraryIndex.getterPrefix + member.name!.text;
+ if (member.isSetter) return LibraryIndex.setterPrefix + member.name!.text;
}
- return member.name.text;
+ return member.name!.text;
}
void _addMember(Member member) {
- if (member.name.isPrivate && member.name.library != library) {
+ if (member.name!.isPrivate && member.name!.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;
@@ -252,10 +251,10 @@
}
void _addExtensionMember(ExtensionMemberDescriptor extensionMember) {
- final NamedNode replacement = extensionMember.member.node;
+ final NamedNode? replacement = extensionMember.member.node;
if (replacement is! Member) return;
Member member = replacement;
- if (member.name.isPrivate && member.name.library != library) {
+ if (member.name!.isPrivate && member.name!.library != library) {
// Members whose name is private to other libraries cannot currently
// be found with the LibraryIndex class.
return;
diff --git a/pkg/kernel/lib/src/assumptions.dart b/pkg/kernel/lib/src/assumptions.dart
index 00b07a9..1d96904 100644
--- a/pkg/kernel/lib/src/assumptions.dart
+++ b/pkg/kernel/lib/src/assumptions.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart';
/// Pairs of [TypeParameter]s that are currently assumed to be
diff --git a/pkg/kernel/lib/src/const_canonical_type.dart b/pkg/kernel/lib/src/const_canonical_type.dart
index 186c980..8e0567e 100644
--- a/pkg/kernel/lib/src/const_canonical_type.dart
+++ b/pkg/kernel/lib/src/const_canonical_type.dart
@@ -6,7 +6,7 @@
import 'package:kernel/src/bounds_checks.dart';
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../core_types.dart';
import '../type_algebra.dart';
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index 4a02f4e..58186dd 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -4,7 +4,6 @@
library kernel.hierarchy_based_type_environment;
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart' show Class, DartType, InterfaceType, Library, Member, Name;
import '../class_hierarchy.dart' show ClassHierarchyBase;
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index fee2dc4..316a701 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -2,9 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
-
+import '../ast.dart';
import 'replacement_visitor.dart';
/// Returns legacy erasure of [type], that is, the type in which all nnbd
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index f089d75..392c59a 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -2,8 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../type_algebra.dart';
/// Helper visitor that merges two types, and return the merged type or `null`
@@ -73,13 +72,13 @@
for (int i = 0; i < newTypeParameters.length; i++) {
DartType? newBound =
- mergeTypes(a.typeParameters[i].bound, b.typeParameters[i].bound);
+ mergeTypes(a.typeParameters[i].bound!, b.typeParameters[i].bound!);
if (newBound == null) {
return null;
}
newTypeParameters[i].bound = newBound;
DartType? newDefaultType = mergeTypes(
- a.typeParameters[i].defaultType, b.typeParameters[i].defaultType);
+ a.typeParameters[i].defaultType!, b.typeParameters[i].defaultType!);
if (newDefaultType == null) {
return null;
}
@@ -90,7 +89,7 @@
DartType? newReturnType = mergeTypes(a.returnType, b.returnType);
if (newReturnType == null) return null;
List<DartType> newPositionalParameters =
- new List<DartType>.filled(a.positionalParameters.length, dartTypeDummy);
+ new List<DartType>.filled(a.positionalParameters.length, dummyDartType);
for (int i = 0; i < a.positionalParameters.length; i++) {
DartType? newType =
mergeTypes(a.positionalParameters[i], b.positionalParameters[i]);
@@ -100,7 +99,7 @@
newPositionalParameters[i] = newType;
}
List<NamedType> newNamedParameters =
- new List<NamedType>.filled(a.namedParameters.length, namedTypeDummy);
+ new List<NamedType>.filled(a.namedParameters.length, dummyNamedType);
for (int i = 0; i < a.namedParameters.length; i++) {
DartType? newType =
mergeTypes(a.namedParameters[i].type, b.namedParameters[i].type);
@@ -116,7 +115,8 @@
}
TypedefType? newTypedefType;
if (a.typedefType != null && b.typedefType != null) {
- newTypedefType = mergeTypes(a.typedefType, b.typedefType) as TypedefType?;
+ newTypedefType =
+ mergeTypes(a.typedefType!, b.typedefType!) as TypedefType?;
// If the typedef couldn't be merged we just omit it from the resulting
// function type since the typedef type is only informational.
}
@@ -157,7 +157,7 @@
return new InterfaceType(a.classNode, nullability);
}
List<DartType> newTypeArguments =
- new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+ new List<DartType>.filled(a.typeArguments.length, dummyDartType);
for (int i = 0; i < a.typeArguments.length; i++) {
DartType? newType = a.typeArguments[i].accept1(this, b.typeArguments[i]);
if (newType == null) {
@@ -259,7 +259,8 @@
assert(a.parameter == b.parameter);
assert(a.promotedBound != null);
assert(b.promotedBound != null);
- DartType? newPromotedBound = a.promotedBound.accept1(this, b.promotedBound);
+ DartType? newPromotedBound =
+ a.promotedBound!.accept1(this, b.promotedBound);
if (newPromotedBound == null) {
return null;
}
@@ -287,7 +288,7 @@
return new TypedefType(a.typedefNode, nullability);
}
List<DartType> newTypeArguments =
- new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+ new List<DartType>.filled(a.typeArguments.length, dummyDartType);
for (int i = 0; i < a.typeArguments.length; i++) {
DartType? newType = a.typeArguments[i].accept1(this, b.typeArguments[i]);
if (newType == null) return null;
diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart
index 7a81f62..632ccc3 100644
--- a/pkg/kernel/lib/src/nnbd_top_merge.dart
+++ b/pkg/kernel/lib/src/nnbd_top_merge.dart
@@ -2,8 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../core_types.dart';
import 'merge_visitor.dart';
@@ -17,7 +16,7 @@
return a;
}
List<DartType> newTypeArguments =
- new List<DartType>.filled(a.typeArguments.length, dartTypeDummy);
+ new List<DartType>.filled(a.typeArguments.length, dummyDartType);
for (int i = 0; i < a.typeArguments.length; i++) {
DartType? newTypeArgument =
nnbdTopMerge(coreTypes, a.typeArguments[i], b.typeArguments[i]);
diff --git a/pkg/kernel/lib/src/non_null.dart b/pkg/kernel/lib/src/non_null.dart
index c3df22a..2223d74 100644
--- a/pkg/kernel/lib/src/non_null.dart
+++ b/pkg/kernel/lib/src/non_null.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart';
/// Returns the type defines as `NonNull(type)` in the nnbd specification.
@@ -78,12 +77,12 @@
return null;
}
if (node.promotedBound != null) {
- if (node.promotedBound.nullability == Nullability.nonNullable) {
+ if (node.promotedBound!.nullability == Nullability.nonNullable) {
// The promoted bound is already non-nullable so we set the declared
// nullability to non-nullable.
return node.withDeclaredNullability(Nullability.nonNullable);
}
- DartType? promotedBound = node.promotedBound.accept(this);
+ DartType? promotedBound = node.promotedBound!.accept(this);
if (promotedBound == null) {
// The promoted bound could not be made non-nullable so we set the
// declared nullability to undetermined.
@@ -91,7 +90,7 @@
return null;
}
return new TypeParameterType.intersection(
- node.parameter, Nullability.undetermined, node.promotedBound);
+ node.parameter, Nullability.undetermined, node.promotedBound!);
} else if (promotedBound.nullability == Nullability.nonNullable) {
// The bound could be made non-nullable so we use it as the promoted
// bound.
diff --git a/pkg/kernel/lib/src/norm.dart b/pkg/kernel/lib/src/norm.dart
index f828120..78ab826 100644
--- a/pkg/kernel/lib/src/norm.dart
+++ b/pkg/kernel/lib/src/norm.dart
@@ -2,8 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../core_types.dart';
import '../type_algebra.dart';
@@ -94,7 +93,7 @@
@override
DartType? visitTypeParameterType(TypeParameterType node, int variance) {
if (node.promotedBound == null) {
- DartType bound = node.parameter.bound;
+ DartType bound = node.parameter.bound!;
if (normalizesToNever(bound)) {
DartType result = NeverType.fromNullability(node.nullability);
return result.accept1(this, variance) ?? result;
@@ -103,7 +102,7 @@
// If the bound isn't Never, the type is already normalized.
return null;
} else {
- DartType bound = node.promotedBound;
+ DartType bound = node.promotedBound!;
bound = bound.accept1(this, variance) ?? bound;
if (bound is NeverType && bound.nullability == Nullability.nonNullable) {
return bound;
@@ -119,7 +118,7 @@
assert(!coreTypes.isTop(bound));
return new TypeParameterType(node.parameter, node.declaredNullability);
} else if (bound == coreTypes.objectNonNullableRawType &&
- norm(coreTypes, node.parameter.bound) ==
+ norm(coreTypes, node.parameter.bound!) ==
coreTypes.objectNonNullableRawType) {
return new TypeParameterType(node.parameter, node.declaredNullability);
} else if (identical(bound, node.promotedBound)) {
@@ -144,9 +143,9 @@
return true;
} else if (type is TypeParameterType) {
if (type.promotedBound == null) {
- return normalizesToNever(type.parameter.bound);
+ return normalizesToNever(type.parameter.bound!);
} else {
- return normalizesToNever(type.promotedBound);
+ return normalizesToNever(type.promotedBound!);
}
}
return false;
diff --git a/pkg/kernel/lib/src/printer.dart b/pkg/kernel/lib/src/printer.dart
index d14c8cd..5874ca7 100644
--- a/pkg/kernel/lib/src/printer.dart
+++ b/pkg/kernel/lib/src/printer.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart';
import 'text_util.dart';
@@ -157,8 +156,9 @@
}
String getVariableName(VariableDeclaration node) {
- if (node.name != null) {
- return node.name;
+ String? name = node.name;
+ if (name != null) {
+ return name;
}
return _variableNames[node] ??= '#${_variableNames.length}';
}
@@ -259,22 +259,22 @@
for (TypeParameter typeParameter in typeParameters) {
_sb.write(comma);
_sb.write(typeParameter.name);
- DartType bound = typeParameter.bound;
+ DartType bound = typeParameter.bound!;
bool isTopObject(DartType type) {
if (type is InterfaceType &&
type.className.node != null &&
type.classNode.name == 'Object') {
- Uri? uri = type.classNode.enclosingLibrary?.importUri;
- return uri?.scheme == 'dart' &&
- uri?.path == 'core' &&
+ Uri uri = type.classNode.enclosingLibrary.importUri;
+ return uri.scheme == 'dart' &&
+ uri.path == 'core' &&
(type.nullability == Nullability.legacy ||
type.nullability == Nullability.nullable);
}
return false;
}
- if (!isTopObject(bound) || isTopObject(typeParameter.defaultType)) {
+ if (!isTopObject(bound) || isTopObject(typeParameter.defaultType!)) {
// Include explicit bounds only.
_sb.write(' extends ');
writeType(bound);
@@ -385,7 +385,7 @@
_sb.write(getVariableName(node));
if (includeInitializer && node.initializer != null && !node.isRequired) {
_sb.write(' = ');
- writeExpression(node.initializer);
+ writeExpression(node.initializer!);
}
}
@@ -401,7 +401,7 @@
}
_sb.write(node.typeParameters[index].name);
_sb.write(' extends ');
- writeType(node.typeParameters[index].bound);
+ writeType(node.typeParameters[index].bound!);
}
_sb.write('>');
}
@@ -437,7 +437,7 @@
if (body != null) {
if (body is ReturnStatement) {
_sb.write(' => ');
- writeExpression(body.expression);
+ writeExpression(body.expression!);
} else {
_sb.write(' ');
writeStatement(body);
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index 45e823e..8fbce4a 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -2,8 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../type_algebra.dart';
/// Helper visitor that clones a type if a nested type is replaced, and
@@ -49,7 +48,7 @@
Substitution.fromPairs(node.typeParameters, typeParameterTypes);
for (int i = 0; i < newTypeParameters.length; i++) {
newTypeParameters[i].bound =
- substitution.substituteType(newTypeParameters[i].bound);
+ substitution.substituteType(newTypeParameters[i].bound!);
}
}
@@ -211,7 +210,7 @@
DartType? visitTypeParameterType(TypeParameterType node, int variance) {
Nullability? newNullability = visitNullability(node);
if (node.promotedBound != null) {
- DartType newPromotedBound = node.promotedBound.accept1(this, variance);
+ DartType? newPromotedBound = node.promotedBound!.accept1(this, variance);
return createPromotedTypeParameterType(
node, newNullability, newPromotedBound);
}
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index efab942..dba4d98 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -4,8 +4,7 @@
import 'dart:math' as math;
-// ignore: import_of_legacy_library_into_null_safe
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
import '../class_hierarchy.dart';
import '../core_types.dart';
import '../type_algebra.dart';
@@ -216,7 +215,7 @@
s.promotedBound != null &&
t is TypeParameterType &&
t.promotedBound != null) {
- return morebottom(s.promotedBound, t.promotedBound);
+ return morebottom(s.promotedBound!, t.promotedBound!);
}
// MOREBOTTOM(X&S, T) = true.
@@ -233,7 +232,7 @@
if (s is TypeParameterType && t is TypeParameterType) {
assert(s.promotedBound == null);
assert(t.promotedBound == null);
- return morebottom(s.parameter.bound, t.parameter.bound);
+ return morebottom(s.parameter.bound!, t.parameter.bound!);
}
throw new UnsupportedError("morebottom($s, $t)");
@@ -950,8 +949,8 @@
// TODO(dmitryas): Figure out if a procedure for syntactic equality
// should be used instead.
if (!areMutualSubtypes(
- f.typeParameters[i].bound,
- substitution.substituteType(g.typeParameters[i].bound),
+ f.typeParameters[i].bound!,
+ substitution.substituteType(g.typeParameters[i].bound!),
SubtypeCheckMode.withNullabilities)) {
boundsMatch = false;
}
@@ -967,7 +966,7 @@
List<TypeParameter> typeParameters = f.typeParameters;
List<DartType> positionalParameters =
- new List<DartType>.filled(maxPos, dartTypeDummy);
+ new List<DartType>.filled(maxPos, dummyDartType);
for (int i = 0; i < minPos; ++i) {
positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
f.positionalParameters[i],
@@ -1149,8 +1148,8 @@
// TODO(dmitryas): Figure out if a procedure for syntactic
// equality should be used instead.
if (!areMutualSubtypes(
- f.typeParameters[i].bound,
- substitution.substituteType(g.typeParameters[i].bound),
+ f.typeParameters[i].bound!,
+ substitution.substituteType(g.typeParameters[i].bound!),
SubtypeCheckMode.withNullabilities)) {
boundsMatch = false;
}
@@ -1164,7 +1163,7 @@
List<TypeParameter> typeParameters = f.typeParameters;
List<DartType> positionalParameters =
- new List<DartType>.filled(minPos, dartTypeDummy);
+ new List<DartType>.filled(minPos, dummyDartType);
for (int i = 0; i < minPos; ++i) {
positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
f.positionalParameters[i],
@@ -1233,12 +1232,12 @@
topFunctionType: coreTypes.functionNonNullableRawType,
unhandledTypeHandler: (type, recursor) => false);
return _getNullabilityAwareStandardUpperBound(
- eliminator.eliminateToGreatest(type1.parameter.bound),
+ eliminator.eliminateToGreatest(type1.parameter.bound!),
type2,
clientLibrary)
.withDeclaredNullability(uniteNullabilities(
type1.declaredNullability,
- uniteNullabilities(type1.parameter.bound.declaredNullability,
+ uniteNullabilities(type1.parameter.bound!.declaredNullability,
type2.declaredNullability)));
} else {
// UP(X1 & B1, T2) =
@@ -1265,11 +1264,11 @@
topFunctionType: coreTypes.functionNonNullableRawType,
unhandledTypeHandler: (type, recursor) => false);
return _getNullabilityAwareStandardUpperBound(
- eliminator.eliminateToGreatest(type1.promotedBound),
+ eliminator.eliminateToGreatest(type1.promotedBound!),
type2,
clientLibrary)
.withDeclaredNullability(uniteNullabilities(
- type1.promotedBound.declaredNullability,
+ type1.promotedBound!.declaredNullability,
type2.declaredNullability));
}
}
@@ -1419,7 +1418,7 @@
int totalPositional =
math.max(f.positionalParameters.length, g.positionalParameters.length);
List<DartType> positionalParameters =
- new List<DartType>.filled(totalPositional, dartTypeDummy);
+ new List<DartType>.filled(totalPositional, dummyDartType);
for (int i = 0; i < totalPositional; i++) {
if (i < f.positionalParameters.length) {
DartType fType = f.positionalParameters[i];
@@ -1523,7 +1522,7 @@
int totalPositional =
math.min(f.positionalParameters.length, g.positionalParameters.length);
List<DartType> positionalParameters =
- new List<DartType>.filled(totalPositional, dartTypeDummy);
+ new List<DartType>.filled(totalPositional, dummyDartType);
for (int i = 0; i < totalPositional; i++) {
positionalParameters[i] = getStandardLowerBound(
f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
@@ -1602,7 +1601,7 @@
assert(tArgs1.length == tArgs2.length);
assert(tArgs1.length == tParams.length);
- List<DartType> tArgs = new List.filled(tArgs1.length, dartTypeDummy);
+ List<DartType> tArgs = new List.filled(tArgs1.length, dummyDartType);
for (int i = 0; i < tArgs1.length; i++) {
if (tParams[i].variance == Variance.contravariant) {
tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
@@ -1675,14 +1674,14 @@
// we need to replicate that behavior?
return getStandardUpperBound(
Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
- .substituteType(type1.parameter.bound),
+ .substituteType(type1.parameter.bound!),
type2,
clientLibrary);
} else if (type2 is TypeParameterType) {
return getStandardUpperBound(
type1,
Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
- .substituteType(type2.parameter.bound),
+ .substituteType(type2.parameter.bound!),
clientLibrary);
} else {
// We should only be called when at least one of the types is a
diff --git a/pkg/kernel/lib/src/text_util.dart b/pkg/kernel/lib/src/text_util.dart
index 0e9e0cc..873fafb 100644
--- a/pkg/kernel/lib/src/text_util.dart
+++ b/pkg/kernel/lib/src/text_util.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart';
String nullabilityToString(Nullability nullability) {
@@ -47,17 +46,17 @@
{bool includeLibraryName: false}) {
if (canonicalName.isRoot) {
return '<root>';
- } else if (canonicalName.parent.isRoot) {
+ } else if (canonicalName.parent!.isRoot) {
return canonicalName.name;
- } else if (canonicalName.parent.parent.isRoot) {
+ } else if (canonicalName.parent!.parent!.isRoot) {
if (!includeLibraryName) {
return canonicalName.name;
}
- String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
+ String parentName = qualifiedCanonicalNameToString(canonicalName.parent!,
includeLibraryName: includeLibraryName);
return '$parentName::${canonicalName.name}';
} else {
- String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
+ String parentName = qualifiedCanonicalNameToString(canonicalName.parent!,
includeLibraryName: includeLibraryName);
return '$parentName.${canonicalName.name}';
}
@@ -165,15 +164,13 @@
}
String typedefNameToString(Typedef? node) {
- return node == null
- ? 'null'
- : node.name ?? 'null-named typedef ${node.runtimeType} ${node.hashCode}';
+ return node == null ? 'null' : node.name;
}
String qualifiedMemberNameToString(Member node,
{bool includeLibraryName: false}) {
if (node.enclosingClass != null) {
- return qualifiedClassNameToString(node.enclosingClass,
+ return qualifiedClassNameToString(node.enclosingClass!,
includeLibraryName: includeLibraryName) +
'.' +
memberNameToString(node);
@@ -215,7 +212,7 @@
String qualifiedTypeParameterNameToString(TypeParameter node,
{bool includeLibraryName: false}) {
- TreeNode parent = node.parent;
+ TreeNode? parent = node.parent;
if (parent is Class) {
return qualifiedClassNameToString(parent,
includeLibraryName: includeLibraryName) +
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index b54c79d..119100c 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart'
show
BottomType,
@@ -381,7 +380,7 @@
IsSubtypeOf isTypeParameterRelated(
TypeParameterType s, InterfaceType t, Types types) {
return types
- .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
+ .performNullabilityAwareSubtypeCheck(s.parameter.bound!, t)
.and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
}
@@ -402,7 +401,7 @@
IsSubtypeOf isIntersectionRelated(
TypeParameterType intersection, InterfaceType t, Types types) {
return types.performNullabilityAwareSubtypeCheck(
- intersection.promotedBound, t); // Rule 12.
+ intersection.promotedBound!, t); // Rule 12.
}
@override
@@ -454,7 +453,7 @@
TypeParameter sTypeVariable = sTypeVariables[i];
TypeParameter tTypeVariable = tTypeVariables[i];
result = result.and(types.performNullabilityAwareMutualSubtypesCheck(
- sTypeVariable.bound, tTypeVariable.bound));
+ sTypeVariable.bound!, tTypeVariable.bound!));
typeVariableSubstitution.add(new TypeParameterType.forAlphaRenaming(
sTypeVariable, tTypeVariable));
}
@@ -468,8 +467,8 @@
TypeParameter sTypeVariable = sTypeVariables[i];
TypeParameter tTypeVariable = tTypeVariables[i];
result = result.and(types.performNullabilityAwareMutualSubtypesCheck(
- substitution.substituteType(sTypeVariable.bound),
- tTypeVariable.bound));
+ substitution.substituteType(sTypeVariable.bound!),
+ tTypeVariable.bound!));
if (!result.isSubtypeWhenIgnoringNullabilities()) {
return const IsSubtypeOf.never();
}
@@ -582,7 +581,7 @@
TypeParameterType intersection, FunctionType t, Types types) {
// Rule 12.
return types.performNullabilityAwareSubtypeCheck(
- intersection.promotedBound, t);
+ intersection.promotedBound!, t);
}
@override
@@ -590,7 +589,7 @@
TypeParameterType s, FunctionType t, Types types) {
// Rule 13.
return types
- .performNullabilityAwareSubtypeCheck(s.parameter.bound, t)
+ .performNullabilityAwareSubtypeCheck(s.parameter.bound!, t)
.and(new IsSubtypeOf.basedSolelyOnNullabilities(s, t));
}
@@ -645,7 +644,7 @@
// Rule 12.
return types.performNullabilityAwareSubtypeCheck(
- intersection.promotedBound
+ intersection.promotedBound!
.withDeclaredNullability(intersection.nullability),
t);
}
@@ -826,9 +825,9 @@
s, t.typeArgument.withDeclaredNullability(t.nullability))
// Rule 13.
.orSubtypeCheckFor(
- s.parameter.bound.withDeclaredNullability(
+ s.parameter.bound!.withDeclaredNullability(
combineNullabilitiesForSubstitution(
- s.parameter.bound.nullability, s.nullability)),
+ s.parameter.bound!.nullability, s.nullability)),
t,
types)
// Rule 10.
@@ -850,7 +849,7 @@
IsSubtypeOf isIntersectionRelated(
TypeParameterType intersection, FutureOrType t, Types types) {
return isTypeParameterRelated(intersection, t, types) // Rule 8.
- .orSubtypeCheckFor(intersection.promotedBound, t, types); // Rule 12.
+ .orSubtypeCheckFor(intersection.promotedBound!, t, types); // Rule 12.
}
@override
@@ -868,7 +867,7 @@
// Rule 9.
return const IsTypeParameterSubtypeOf()
.isIntersectionRelated(sIntersection, tIntersection, types)
- .andSubtypeCheckFor(sIntersection, tIntersection.promotedBound, types);
+ .andSubtypeCheckFor(sIntersection, tIntersection.promotedBound!, types);
}
@override
@@ -877,7 +876,7 @@
// Rule 9.
return const IsTypeParameterSubtypeOf()
.isTypeParameterRelated(s, intersection, types)
- .andSubtypeCheckFor(s, intersection.promotedBound, types);
+ .andSubtypeCheckFor(s, intersection.promotedBound!, types);
}
@override
@@ -936,7 +935,7 @@
IsSubtypeOf isIntersectionRelated(
TypeParameterType intersection, NullType t, Types types) {
return types.performNullabilityAwareMutualSubtypesCheck(
- intersection.promotedBound, t);
+ intersection.promotedBound!, t);
}
IsSubtypeOf isFunctionRelated(FunctionType s, NullType t, Types types) {
@@ -978,7 +977,7 @@
IsSubtypeOf isIntersectionRelated(
TypeParameterType intersection, NeverType t, Types types) {
return types.performNullabilityAwareSubtypeCheck(
- intersection.promotedBound, t);
+ intersection.promotedBound!, t);
}
IsSubtypeOf isFunctionRelated(FunctionType s, NeverType t, Types types) {
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 26699f0..871f92b 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.9
-
library kernel.ast_to_text;
import 'dart:core' hide MapEntry;
@@ -26,11 +24,13 @@
class NormalNamer<T> extends Namer<T> {
final String prefix;
+
NormalNamer(this.prefix);
}
class ConstantNamer extends RecursiveResultVisitor<Null> with Namer<Constant> {
final String prefix;
+
ConstantNamer(this.prefix);
String getName(Constant constant) {
@@ -78,7 +78,7 @@
final Map<U, String> namesU = <U, String>{};
final Set<String> usedNames = new Set<String>();
- String disambiguate(T key1, U key2, String proposeName()) {
+ String disambiguate(T? key1, U? key2, String proposeName()) {
String getNewName() {
String proposedName = proposeName();
if (usedNames.add(proposedName)) return proposedName;
@@ -90,12 +90,12 @@
}
if (key1 != null) {
- String result = namesT[key1];
+ String? result = namesT[key1];
if (result != null) return result;
return namesT[key1] = getNewName();
}
if (key2 != null) {
- String result = namesU[key2];
+ String? result = namesU[key2];
if (result != null) return result;
return namesU[key2] = getNewName();
}
@@ -105,13 +105,13 @@
NameSystem globalDebuggingNames = new NameSystem();
-String debugLibraryName(Library node) {
+String debugLibraryName(Library? node) {
return node == null
? 'null'
: node.name ?? globalDebuggingNames.nameLibrary(node);
}
-String debugClassName(Class node) {
+String debugClassName(Class? node) {
return node == null
? 'null'
: node.name ?? globalDebuggingNames.nameClass(node);
@@ -127,7 +127,7 @@
String debugQualifiedMemberName(Member node) {
if (node.enclosingClass != null) {
- return debugQualifiedClassName(node.enclosingClass) +
+ return debugQualifiedClassName(node.enclosingClass!) +
'::' +
debugMemberName(node);
} else {
@@ -142,13 +142,14 @@
}
String debugQualifiedTypeParameterName(TypeParameter node) {
- if (node.parent is Class) {
- return debugQualifiedClassName(node.parent) +
+ TreeNode? parent = node.parent;
+ if (parent is Class) {
+ return debugQualifiedClassName(parent) +
'::' +
debugTypeParameterName(node);
}
- if (node.parent is Member) {
- return debugQualifiedMemberName(node.parent) +
+ if (parent is Member) {
+ return debugQualifiedMemberName(parent) +
'::' +
debugTypeParameterName(node);
}
@@ -212,11 +213,17 @@
final RegExp pathSeparator = new RegExp('[\\/]');
- String nameLibraryPrefix(Library node, {String proposedName}) {
+ String nameLibraryPrefix(Library node, {String? proposedName}) {
return prefixes.disambiguate(node.reference, node.reference.canonicalName,
() {
- if (proposedName != null) return proposedName;
- if (node.name != null) return abbreviateName(node.name);
+ if (proposedName != null) {
+ return proposedName;
+ }
+ String? name = node.name;
+ if (name != null) {
+ return abbreviateName(name);
+ }
+ // ignore: unnecessary_null_comparison
if (node.importUri != null) {
String path = node.importUri.hasEmptyPath
? '${node.importUri}'
@@ -230,13 +237,13 @@
});
}
- nameCanonicalNameAsLibraryPrefix(Reference node, CanonicalName name,
- {String proposedName}) {
+ nameCanonicalNameAsLibraryPrefix(Reference? node, CanonicalName? name,
+ {String? proposedName}) {
return prefixes.disambiguate(node, name, () {
if (proposedName != null) return proposedName;
- CanonicalName canonicalName = name ?? node.canonicalName;
+ CanonicalName? canonicalName = name ?? node?.canonicalName;
if (canonicalName?.name != null) {
- String path = canonicalName.name;
+ String path = canonicalName!.name;
int slash = path.lastIndexOf(pathSeparator);
if (slash >= 0) {
path = path.substring(slash + 1);
@@ -274,9 +281,9 @@
class Printer extends Visitor<void> with VisitorVoidMixin {
final NameSystem syntheticNames;
final StringSink sink;
- final Annotator annotator;
- final Map<String, MetadataRepository<Object>> metadata;
- ImportTable importTable;
+ final Annotator? annotator;
+ final Map<String, MetadataRepository<dynamic>>? metadata;
+ ImportTable? importTable;
int indentation = 0;
int column = 0;
bool showOffsets;
@@ -288,7 +295,7 @@
int state = SPACE;
Printer(this.sink,
- {NameSystem syntheticNames,
+ {NameSystem? syntheticNames,
this.showOffsets: false,
this.showMetadata: false,
this.importTable,
@@ -297,7 +304,7 @@
: this.syntheticNames = syntheticNames ?? new NameSystem();
Printer createInner(ImportTable importTable,
- Map<String, MetadataRepository<Object>> metadata) {
+ Map<String, MetadataRepository<dynamic>>? metadata) {
return new Printer(sink,
importTable: importTable,
metadata: metadata,
@@ -319,8 +326,9 @@
}
String getLibraryReference(Library node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No Library>';
- if (importTable != null && importTable.getImportIndex(node) != -1) {
+ if (importTable != null && importTable?.getImportIndex(node) != -1) {
return syntheticNames.nameLibraryPrefix(node);
}
return getLibraryName(node);
@@ -335,6 +343,7 @@
}
String getClassReference(Class node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No Class>';
String name = getClassName(node);
String library = getLibraryReference(node.enclosingLibrary);
@@ -342,6 +351,7 @@
}
String getTypedefReference(Typedef node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No Typedef>';
String library = getLibraryReference(node.enclosingLibrary);
return '$library::${node.name}';
@@ -352,15 +362,17 @@
Name getMemberName(Member node) {
if (node.name?.text == '') return emptyName;
- if (node.name != null) return node.name;
+ if (node.name != null) return node.name!;
return new Name(syntheticNames.nameMember(node));
}
String getMemberReference(Member node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No Member>';
String name = getMemberName(node).text;
- if (node.parent is Class) {
- String className = getClassReference(node.parent);
+ Class? enclosingClass = node.enclosingClass;
+ if (enclosingClass != null) {
+ String className = getClassReference(enclosingClass);
return '$className::$name';
} else {
String library = getLibraryReference(node.enclosingLibrary);
@@ -373,6 +385,7 @@
}
String getVariableReference(VariableDeclaration node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No VariableDeclaration>';
return getVariableName(node);
}
@@ -382,13 +395,15 @@
}
String getTypeParameterReference(TypeParameter node) {
+ // ignore: unnecessary_null_comparison
if (node == null) return '<No TypeParameter>';
String name = getTypeParameterName(node);
- if (node.parent is FunctionNode && node.parent.parent is Member) {
- String member = getMemberReference(node.parent.parent);
+ TreeNode? parent = node.parent;
+ if (parent is FunctionNode && parent.parent is Member) {
+ String member = getMemberReference(parent.parent as Member);
return '$member::$name';
- } else if (node.parent is Class) {
- String className = getClassReference(node.parent);
+ } else if (parent is Class) {
+ String className = getClassReference(parent);
return '$className::$name';
} else {
return name; // Bound inside a function type.
@@ -399,8 +414,8 @@
writeProblemsAsJson("Problems in component", component.problemsAsJson);
}
- void writeProblemsAsJson(String header, List<String> problemsAsJson) {
- if (problemsAsJson?.isEmpty == false) {
+ void writeProblemsAsJson(String header, List<String>? problemsAsJson) {
+ if (problemsAsJson != null && problemsAsJson.isNotEmpty) {
endLine("//");
write("// ");
write(header);
@@ -408,7 +423,8 @@
endLine("//");
for (String s in problemsAsJson) {
Map<String, Object> decoded = json.decode(s);
- List<Object> plainTextFormatted = decoded["plainTextFormatted"];
+ List<Object> plainTextFormatted =
+ decoded["plainTextFormatted"] as List<Object>;
List<String> lines = plainTextFormatted.join("\n").split("\n");
for (int i = 0; i < lines.length; i++) {
write("//");
@@ -424,8 +440,9 @@
void writeLibraryFile(Library library) {
writeAnnotationList(library.annotations);
writeWord('library');
- if (library.name != null) {
- writeWord(library.name);
+ String? name = library.name;
+ if (name != null) {
+ writeWord(name);
}
if (library.isNonNullableByDefault) {
writeWord("/*isNonNullableByDefault*/");
@@ -453,7 +470,7 @@
}
void writeStandardLibraryContent(Library library,
- {Printer outerPrinter, LibraryImportTable importsToPrint}) {
+ {Printer? outerPrinter, LibraryImportTable? importsToPrint}) {
outerPrinter ??= this;
outerPrinter.writeProblemsAsJson(
"Problems in library", library.problemsAsJson);
@@ -479,23 +496,23 @@
write('additionalExports = (');
for (int i = 0; i < additionalExports.length; i++) {
Reference reference = additionalExports[i];
- NamedNode node = reference.node;
+ NamedNode? node = reference.node;
if (node is Class) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name);
+ write(prefix + '::' + node.name!);
} else if (node is Extension) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name);
+ write(prefix + '::' + node.name!);
} else if (node is Field) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name.text);
+ write(prefix + '::' + node.name!.text);
} else if (node is Procedure) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
- write(prefix + '::' + node.name.text);
+ write(prefix + '::' + node.name!.text);
} else if (node is Typedef) {
Library nodeLibrary = node.enclosingLibrary;
String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@@ -532,9 +549,11 @@
}
writeAnnotationList(library.annotations);
writeWord('library');
- if (library.name != null) {
- writeWord(library.name);
+ String? name = library.name;
+ if (name != null) {
+ writeWord(name);
}
+ // ignore: unnecessary_null_comparison
if (library.importUri != null) {
writeSpaced('from');
writeWord('"${library.importUri}"');
@@ -567,7 +586,7 @@
endLine('}');
}
- int getPrecedence(TreeNode node) {
+ int getPrecedence(Expression node) {
return Precedence.of(node);
}
@@ -618,7 +637,7 @@
writeSpace(' ' * indentation);
}
- void writeNode(Node node) {
+ void writeNode(Node? node) {
if (node == null) {
writeSymbol("<Null>");
} else {
@@ -642,16 +661,10 @@
}
}
- void writeOptionalNode(Node node) {
- if (node != null) {
- node.accept(this);
- }
- }
-
void writeMetadata(TreeNode node) {
if (metadata != null) {
- for (MetadataRepository<Object> md in metadata.values) {
- final Object nodeMetadata = md.mapping[node];
+ for (MetadataRepository<dynamic> md in metadata!.values) {
+ final dynamic nodeMetadata = md.mapping[node];
if (nodeMetadata != null) {
writeWord("[@${md.tag}=${nodeMetadata}]");
}
@@ -659,7 +672,7 @@
}
}
- void writeAnnotatedType(DartType type, String annotation) {
+ void writeAnnotatedType(DartType type, String? annotation) {
writeType(type);
if (annotation != null) {
write('/');
@@ -669,6 +682,7 @@
}
void writeType(DartType type) {
+ // ignore: unnecessary_null_comparison
if (type == null) {
write('<No DartType>');
} else {
@@ -677,12 +691,14 @@
}
void writeOptionalType(DartType type) {
+ // ignore: unnecessary_null_comparison
if (type != null) {
type.accept(this);
}
}
visitSupertype(Supertype type) {
+ // ignore: unnecessary_null_comparison
if (type == null) {
write('<No Supertype>');
} else {
@@ -711,14 +727,14 @@
}
void writeName(Name name) {
- if (name?.text == '') {
+ if (name.text == '') {
writeWord(emptyNameString);
} else {
- writeWord(name?.text ?? '<anonymous>'); // TODO: write library name
+ writeWord(name.text); // TODO: write library name
}
}
- void endLine([String string]) {
+ void endLine([String? string]) {
if (string != null) {
write(string);
}
@@ -728,7 +744,7 @@
}
void writeFunction(FunctionNode function,
- {name, List<Initializer> initializers, bool terminateLine: true}) {
+ {name, List<Initializer>? initializers, bool terminateLine: true}) {
if (name is String) {
writeWord(name);
} else if (name is Name) {
@@ -758,8 +774,9 @@
writeSpaced(getAsyncMarkerKeyword(function.dartAsyncMarker));
writeSpaced("*/");
}
- if (function.body != null) {
- writeFunctionBody(function.body, terminateLine: terminateLine);
+ Statement? body = function.body;
+ if (body != null) {
+ writeFunctionBody(body, terminateLine: terminateLine);
} else if (terminateLine) {
endLine(';');
} else {
@@ -806,15 +823,15 @@
}
} else if (body is ReturnStatement && !terminateLine) {
writeSpaced('=>');
- writeExpression(body.expression);
+ writeExpression(body.expression!);
} else {
writeBody(body);
}
}
writeFunctionType(FunctionType node,
- {List<VariableDeclaration> typedefPositional,
- List<VariableDeclaration> typedefNamed}) {
+ {List<VariableDeclaration>? typedefPositional,
+ List<VariableDeclaration>? typedefNamed}) {
if (state == WORD) {
ensureSpace();
}
@@ -892,7 +909,8 @@
}
}
- void writeReturnType(DartType type, String annotation) {
+ void writeReturnType(DartType type, String? annotation) {
+ // ignore: unnecessary_null_comparison
if (type == null) return;
writeSpaced('→');
writeAnnotatedType(type, annotation);
@@ -949,23 +967,24 @@
}
String getClassReferenceFromReference(Reference reference) {
+ // ignore: unnecessary_null_comparison
if (reference == null) return '<No Class>';
if (reference.node != null) return getClassReference(reference.asClass);
if (reference.canonicalName != null) {
- return getCanonicalNameString(reference.canonicalName);
+ return getCanonicalNameString(reference.canonicalName!);
}
throw "Neither node nor canonical name found";
}
- void writeMemberReferenceFromReference(Reference reference) {
+ void writeMemberReferenceFromReference(Reference? reference) {
writeWord(getMemberReferenceFromReference(reference));
}
- String getMemberReferenceFromReference(Reference reference) {
+ String getMemberReferenceFromReference(Reference? reference) {
if (reference == null) return '<No Member>';
if (reference.node != null) return getMemberReference(reference.asMember);
if (reference.canonicalName != null) {
- return getCanonicalNameString(reference.canonicalName);
+ return getCanonicalNameString(reference.canonicalName!);
}
throw "Neither node nor canonical name found";
}
@@ -976,28 +995,28 @@
String libraryString(CanonicalName lib) {
if (lib.reference?.node != null) {
- return getLibraryReference(lib.reference.asLibrary);
+ return getLibraryReference(lib.reference!.asLibrary);
}
return syntheticNames.nameCanonicalNameAsLibraryPrefix(
lib.reference, lib);
}
String classString(CanonicalName cls) =>
- libraryString(cls.parent) + '::' + cls.name;
+ libraryString(cls.parent!) + '::' + cls.name;
- if (name.parent.isRoot) return libraryString(name);
- if (name.parent.parent.isRoot) return classString(name);
+ if (name.parent!.isRoot) return libraryString(name);
+ if (name.parent!.parent!.isRoot) return classString(name);
- CanonicalName atNode = name.parent;
+ CanonicalName atNode = name.parent!;
while (!atNode.name.startsWith('@')) {
- atNode = atNode.parent;
+ atNode = atNode.parent!;
}
String parent = "";
- if (atNode.parent.parent.isRoot) {
- parent = libraryString(atNode.parent);
+ if (atNode.parent!.parent!.isRoot) {
+ parent = libraryString(atNode.parent!);
} else {
- parent = classString(atNode.parent);
+ parent = classString(atNode.parent!);
}
if (name.name == '') return "$parent::$emptyNameString";
@@ -1023,7 +1042,7 @@
writeWord(getTypeParameterReference(node));
}
- void writeExpression(Expression node, [int minimumPrecedence]) {
+ void writeExpression(Expression node, [int? minimumPrecedence]) {
final bool highlight = shouldHighlight(node);
if (highlight) {
startHighlight(node);
@@ -1087,9 +1106,10 @@
writeSpace();
writeAnnotatedType(node.type, annotator?.annotateField(this, node));
writeName(getMemberName(node));
- if (node.initializer != null) {
+ Expression? initializer = node.initializer;
+ if (initializer != null) {
writeSpaced('=');
- writeExpression(node.initializer);
+ writeExpression(initializer);
}
List<String> features = <String>[];
if (node.enclosingLibrary.isNonNullableByDefault !=
@@ -1100,10 +1120,10 @@
features.add("isLegacy");
}
}
- if ((node.enclosingClass == null &&
+ Class? enclosingClass = node.enclosingClass;
+ if ((enclosingClass == null &&
node.enclosingLibrary.fileUri != node.fileUri) ||
- (node.enclosingClass != null &&
- node.enclosingClass.fileUri != node.fileUri)) {
+ (enclosingClass != null && enclosingClass.fileUri != node.fileUri)) {
features.add(" from ${node.fileUri} ");
}
if (features.isNotEmpty) {
@@ -1148,10 +1168,10 @@
features.add("isLegacy");
}
}
- if ((node.enclosingClass == null &&
+ Class? enclosingClass = node.enclosingClass;
+ if ((enclosingClass == null &&
node.enclosingLibrary.fileUri != node.fileUri) ||
- (node.enclosingClass != null &&
- node.enclosingClass.fileUri != node.fileUri)) {
+ (enclosingClass != null && enclosingClass.fileUri != node.fileUri)) {
features.add(" from ${node.fileUri} ");
}
if (features.isNotEmpty) {
@@ -1163,17 +1183,17 @@
case ProcedureStubKind.ConcreteForwardingStub:
case ProcedureStubKind.NoSuchMethodForwarder:
case ProcedureStubKind.ConcreteMixinStub:
- writeFunction(node.function, name: getMemberName(node));
+ writeFunction(node.function!, name: getMemberName(node));
break;
case ProcedureStubKind.MemberSignature:
case ProcedureStubKind.AbstractMixinStub:
- writeFunction(node.function,
+ writeFunction(node.function!,
name: getMemberName(node), terminateLine: false);
- if (node.function.body is ReturnStatement) {
+ if (node.function!.body is ReturnStatement) {
writeSymbol(';');
}
writeSymbol(' -> ');
- writeMemberReferenceFromReference(node.stubTargetReference);
+ writeMemberReferenceFromReference(node.stubTargetReference!);
endLine();
break;
}
@@ -1198,7 +1218,7 @@
if (features.isNotEmpty) {
writeWord("/*${features.join(',')}*/");
}
- writeFunction(node.function,
+ writeFunction(node.function!,
name: node.name, initializers: node.initializers);
}
@@ -1210,13 +1230,13 @@
writeWord('redirecting_factory');
if (node.name != null) {
- writeName(node.name);
+ writeName(node.name!);
}
writeTypeParameterList(node.typeParameters);
writeParameterList(node.positionalParameters, node.namedParameters,
node.requiredParameterCount);
writeSpaced('=');
- writeMemberReferenceFromReference(node.targetReference);
+ writeMemberReferenceFromReference(node.targetReference!);
if (node.typeArguments.isNotEmpty) {
writeSymbol('<');
writeList(node.typeArguments, writeType);
@@ -1246,12 +1266,12 @@
writeTypeParameterList(node.typeParameters);
if (node.isMixinApplication) {
writeSpaced('=');
- visitSupertype(node.supertype);
+ visitSupertype(node.supertype!);
writeSpaced('with');
- visitSupertype(node.mixedInType);
+ visitSupertype(node.mixedInType!);
} else if (node.supertype != null) {
writeSpaced('extends');
- visitSupertype(node.supertype);
+ visitSupertype(node.supertype!);
}
if (node.implementedTypes.isNotEmpty) {
writeSpaced('implements');
@@ -1297,7 +1317,7 @@
writeWord(getExtensionName(node));
writeTypeParameterList(node.typeParameters);
writeSpaced('on');
- writeType(node.onType);
+ writeType(node.onType!);
String endLineString = ' {';
if (node.enclosingLibrary.fileUri != node.fileUri) {
endLineString += ' // from ${node.fileUri}';
@@ -1352,18 +1372,20 @@
writeWord(node.name);
writeTypeParameterList(node.typeParameters);
writeSpaced('=');
- if (node.type is FunctionType) {
- writeFunctionType(node.type,
+ DartType? type = node.type;
+ if (type is FunctionType) {
+ writeFunctionType(type,
typedefPositional: node.positionalParameters,
typedefNamed: node.namedParameters);
} else {
- writeNode(node.type);
+ writeNode(type);
}
endLine(';');
}
visitInvalidExpression(InvalidExpression node) {
writeWord('invalid-expression');
+ // ignore: unnecessary_null_comparison
if (node.message != null) {
writeWord('"${escapeString(node.message)}"');
}
@@ -1415,7 +1437,7 @@
writeNode(node.arguments);
if (node.functionType != null) {
writeSymbol('{');
- writeType(node.functionType);
+ writeType(node.functionType!);
writeSymbol('}');
}
}
@@ -1530,8 +1552,8 @@
}
visitLogicalExpression(LogicalExpression node) {
- int precedence = Precedence
- .binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
+ int precedence = Precedence.binaryPrecedence[
+ logicalExpressionOperatorToString(node.operatorEnum)]!;
writeExpression(node.left, precedence);
writeSpaced(logicalExpressionOperatorToString(node.operatorEnum));
writeExpression(node.right, precedence + 1);
@@ -1606,7 +1628,7 @@
if (!first) {
writeComma();
}
- writeWord('${fieldRef.asField.name.text}');
+ writeWord('${fieldRef.asField.name!.text}');
writeSymbol(':');
writeExpression(value);
first = false;
@@ -1617,9 +1639,10 @@
}
write('assert(');
writeExpression(assert_.condition);
- if (assert_.message != null) {
+ Expression? message = assert_.message;
+ if (message != null) {
writeComma();
- writeExpression(assert_.message);
+ writeExpression(message);
}
write(')');
first = false;
@@ -1692,6 +1715,7 @@
writeWord('const');
writeSpace();
}
+ // ignore: unnecessary_null_comparison
if (node.typeArgument != null) {
writeSymbol('<');
writeType(node.typeArgument);
@@ -1707,6 +1731,7 @@
writeWord('const');
writeSpace();
}
+ // ignore: unnecessary_null_comparison
if (node.typeArgument != null) {
writeSymbol('<');
writeType(node.typeArgument);
@@ -1722,6 +1747,7 @@
writeWord('const');
writeSpace();
}
+ // ignore: unnecessary_null_comparison
if (node.keyType != null) {
writeSymbol('<');
writeList([node.keyType, node.valueType], writeType);
@@ -1791,7 +1817,7 @@
visitLoadLibrary(LoadLibrary node) {
writeWord('LoadLibrary');
writeSymbol('(');
- writeWord(node.import.name);
+ writeWord(node.import.name!);
writeSymbol(')');
state = WORD;
}
@@ -1799,7 +1825,7 @@
visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
writeWord('CheckLibraryIsLoaded');
writeSymbol('(');
- writeWord(node.import.name);
+ writeWord(node.import.name!);
writeSymbol(')');
state = WORD;
}
@@ -1816,20 +1842,21 @@
writeIndentation();
writeWord(node.isImport ? 'import' : 'export');
String uriString;
- if (node.importedLibraryReference?.node != null) {
+ if (node.importedLibraryReference.node != null) {
uriString = '${node.targetLibrary.importUri}';
} else {
- uriString = '${node.importedLibraryReference?.canonicalName?.name}';
+ uriString = '${node.importedLibraryReference.canonicalName?.name}';
}
writeWord('"$uriString"');
if (node.isDeferred) {
writeWord('deferred');
}
- if (node.name != null) {
+ String? name = node.name;
+ if (name != null) {
writeWord('as');
- writeWord(node.name);
+ writeWord(name);
}
- String last;
+ String? last;
final String show = 'show';
final String hide = 'hide';
if (node.combinators.isNotEmpty) {
@@ -1859,9 +1886,10 @@
visitVariableGet(VariableGet node) {
writeVariableReference(node.variable);
- if (node.promotedType != null) {
+ DartType? promotedType = node.promotedType;
+ if (promotedType != null) {
writeSymbol('{');
- writeNode(node.promotedType);
+ writeNode(promotedType);
writeSymbol('}');
state = WORD;
}
@@ -1873,7 +1901,7 @@
writeExpression(node.value);
}
- void writeInterfaceTarget(Name name, Reference target) {
+ void writeInterfaceTarget(Name name, Reference? target) {
if (target != null) {
writeSymbol('{');
writeMemberReferenceFromReference(target);
@@ -1884,6 +1912,7 @@
}
void writeStaticType(DartType type) {
+ // ignore: unnecessary_null_comparison
if (type != null) {
writeSymbol('{');
writeType(type);
@@ -2024,9 +2053,10 @@
writeWord('assert');
writeSymbol('(');
writeExpression(node.condition);
- if (node.message != null) {
+ Expression? message = node.message;
+ if (message != null) {
writeComma();
- writeExpression(node.message);
+ writeExpression(message);
}
if (!asExpression) {
endLine(');');
@@ -2075,8 +2105,9 @@
writeSymbol('(');
writeList(node.variables, writeVariableDeclaration);
writeComma(';');
- if (node.condition != null) {
- writeExpression(node.condition);
+ Expression? condition = node.condition;
+ if (condition != null) {
+ writeExpression(condition);
}
writeComma(';');
writeList(node.updates, writeExpression);
@@ -2146,19 +2177,21 @@
writeExpression(node.condition);
writeSymbol(')');
writeBody(node.then);
- if (node.otherwise != null) {
+ Statement? otherwise = node.otherwise;
+ if (otherwise != null) {
writeIndentation();
writeWord('else');
- writeBody(node.otherwise);
+ writeBody(otherwise);
}
}
visitReturnStatement(ReturnStatement node) {
writeIndentation();
writeWord('return');
- if (node.expression != null) {
+ Expression? expression = node.expression;
+ if (expression != null) {
writeSpace();
- writeExpression(node.expression);
+ writeExpression(expression);
}
endLine(';');
}
@@ -2172,6 +2205,7 @@
visitCatch(Catch node) {
writeIndentation();
+ // ignore: unnecessary_null_comparison
if (node.guard != null) {
writeWord('on');
writeType(node.guard);
@@ -2179,14 +2213,16 @@
}
writeWord('catch');
writeSymbol('(');
- if (node.exception != null) {
- writeVariableDeclaration(node.exception);
+ VariableDeclaration? exception = node.exception;
+ if (exception != null) {
+ writeVariableDeclaration(exception);
} else {
writeWord('no-exception-var');
}
- if (node.stackTrace != null) {
+ VariableDeclaration? stackTrace = node.stackTrace;
+ if (stackTrace != null) {
writeComma();
- writeVariableDeclaration(node.stackTrace);
+ writeVariableDeclaration(stackTrace);
}
writeSymbol(')');
writeBody(node.body);
@@ -2225,7 +2261,7 @@
writeIndentation();
writeWord('function');
if (node.function != null) {
- writeFunction(node.function, name: getVariableName(node.variable));
+ writeFunction(node.function!, name: getVariableName(node.variable));
} else {
writeWord(getVariableName(node.variable));
endLine('...;');
@@ -2244,16 +2280,19 @@
writeModifier(node.isGenericCovariantImpl, 'generic-covariant-impl');
writeModifier(node.isFinal, 'final');
writeModifier(node.isConst, 'const');
+ // ignore: unnecessary_null_comparison
if (node.type != null) {
writeAnnotatedType(node.type, annotator?.annotateVariable(this, node));
}
+ // ignore: unnecessary_null_comparison
if (useVarKeyword && !node.isFinal && !node.isConst && node.type == null) {
writeWord('var');
}
writeWord(getVariableName(node));
- if (node.initializer != null) {
+ Expression? initializer = node.initializer;
+ if (initializer != null) {
writeSpaced('=');
- writeExpression(node.initializer);
+ writeExpression(initializer);
}
}
@@ -2407,14 +2446,15 @@
visitTypeParameterType(TypeParameterType node) {
writeTypeParameterReference(node.parameter);
writeNullability(node.declaredNullability);
- if (node.promotedBound != null) {
+ DartType? promotedBound = node.promotedBound;
+ if (promotedBound != null) {
writeSpaced('&');
- writeType(node.promotedBound);
+ writeType(promotedBound);
writeWord("/* '");
writeNullability(node.declaredNullability, inComment: true);
writeWord("' & '");
- writeDartTypeNullability(node.promotedBound, inComment: true);
+ writeDartTypeNullability(promotedBound, inComment: true);
writeWord("' = '");
writeNullability(node.nullability, inComment: true);
writeWord("' */");
@@ -2434,10 +2474,10 @@
}
writeWord(getTypeParameterName(node));
writeSpaced('extends');
- writeType(node.bound);
+ writeType(node.bound!);
if (node.defaultType != null) {
writeSpaced('=');
- writeType(node.defaultType);
+ writeType(node.defaultType!);
}
}
@@ -2488,6 +2528,7 @@
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
+ // ignore: unnecessary_null_comparison
String text = node.libraryReference != null
? '#${node.libraryReference.asLibrary.importUri}::${node.name}'
: '#${node.name}';
@@ -2556,9 +2597,9 @@
writeList(node.fieldValues.entries,
(core.MapEntry<Reference, Constant> entry) {
if (entry.key.node != null) {
- writeWord('${entry.key.asField.name.text}');
+ writeWord('${entry.key.asField.name!.text}');
} else {
- writeWord('${entry.key.canonicalName.name}');
+ writeWord('${entry.key.canonicalName!.name}');
}
writeSymbol(':');
writeConstantReference(entry.value);
@@ -2636,7 +2677,7 @@
static const int PRIMARY = 20;
static const int CALLEE = 21;
- static const Map<String, int> binaryPrecedence = const {
+ static const Map<String?, int> binaryPrecedence = const {
'&&': LOGICAL_AND,
'||': LOGICAL_OR,
'??': LOGICAL_NULL_AWARE,
@@ -2708,7 +2749,7 @@
@override
int visitLogicalExpression(LogicalExpression node) =>
- binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
+ binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)]!;
@override
int visitConditionalExpression(ConditionalExpression node) => CONDITIONAL;
@@ -2862,5 +2903,4 @@
case ProcedureKind.Factory:
return 'factory';
}
- throw 'illegal ProcedureKind: $kind';
}
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 3ababf6..38582df 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1089,10 +1089,15 @@
}
TextSerializer<AssertStatement> assertStatementSerializer =
- Wrapped<Tuple2<Expression, Expression>, AssertStatement>(
- (a) => Tuple2(a.condition, a.message),
- (t) => AssertStatement(t.first, message: t.second),
- Tuple2Serializer(expressionSerializer, Optional(expressionSerializer)));
+ Wrapped<Tuple4<Expression, Expression, int, int>, AssertStatement>(
+ (a) => Tuple4(a.condition, a.message, a.conditionStartOffset,
+ a.conditionEndOffset),
+ (t) => AssertStatement(t.first,
+ message: t.second,
+ conditionStartOffset: t.third,
+ conditionEndOffset: t.fourth),
+ Tuple4Serializer(expressionSerializer, Optional(expressionSerializer),
+ const DartInt(), const DartInt()));
TextSerializer<Block> blockSerializer =
Wrapped<Tuple2<List<Statement>, Expression>, Block>(
@@ -2102,11 +2107,9 @@
Wrapped<Tuple4<Name, ExtensionMemberKind, int, CanonicalName>,
ExtensionMemberDescriptor>(
(w) => Tuple4(w.name, w.kind, w.flags, w.member.canonicalName),
- (u) => ExtensionMemberDescriptor()
- ..name = u.first
- ..kind = u.second
- ..flags = u.third
- ..member = u.fourth.getReference(),
+ (u) => ExtensionMemberDescriptor(
+ name: u.first, kind: u.second, member: u.fourth.getReference())
+ ..flags = u.third,
Tuple4Serializer(
nameSerializer,
extensionMemberKindSerializer,
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index e8ac7ba..736c9cf 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -177,7 +177,7 @@
// Transform an expression given an action to transform the children. For
// this purposes of the await transformer the children should generally be
// translated from right to left, in the reverse of evaluation order.
- Expression transform(Expression expr, void action()) {
+ Expression transformTreeNode(Expression expr, void action()) {
var shouldName = seenAwait;
// 1. If there is an await in a sibling to the right, emit an assignment to
@@ -208,7 +208,7 @@
// Unary expressions.
Expression unary(Expression expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
expr.transformChildren(this);
});
}
@@ -223,7 +223,7 @@
TreeNode visitThrow(Throw expr) => unary(expr);
TreeNode visitPropertySet(PropertySet expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
expr.value = expr.value.accept<TreeNode>(this)..parent = expr;
expr.receiver = expr.receiver.accept<TreeNode>(this)..parent = expr;
});
@@ -243,32 +243,32 @@
}
TreeNode visitMethodInvocation(MethodInvocation expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
visitArguments(expr.arguments);
expr.receiver = expr.receiver.accept<TreeNode>(this)..parent = expr;
});
}
TreeNode visitSuperMethodInvocation(SuperMethodInvocation expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
visitArguments(expr.arguments);
});
}
TreeNode visitStaticInvocation(StaticInvocation expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
visitArguments(expr.arguments);
});
}
TreeNode visitConstructorInvocation(ConstructorInvocation expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
visitArguments(expr.arguments);
});
}
TreeNode visitStringConcatenation(StringConcatenation expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
var expressions = expr.expressions;
for (var i = expressions.length - 1; i >= 0; --i) {
expressions[i] = expressions[i].accept<TreeNode>(this)..parent = expr;
@@ -277,7 +277,7 @@
}
TreeNode visitListLiteral(ListLiteral expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
var expressions = expr.expressions;
for (var i = expressions.length - 1; i >= 0; --i) {
expressions[i] = expr.expressions[i].accept<TreeNode>(this)
@@ -287,7 +287,7 @@
}
TreeNode visitMapLiteral(MapLiteral expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
for (var entry in expr.entries.reversed) {
entry.value = entry.value.accept<TreeNode>(this)..parent = entry;
entry.key = entry.key.accept<TreeNode>(this)..parent = entry;
@@ -310,7 +310,7 @@
if (rightStatements.isEmpty) {
// Easy case: right did not emit any statements.
seenAwait = shouldName;
- return transform(expr, () {
+ return transformTreeNode(expr, () {
expr.left = expr.left.accept<TreeNode>(this)..parent = expr;
seenAwait = seenAwait || rightAwait;
});
@@ -391,7 +391,7 @@
if (thenStatements.isEmpty && otherwiseStatements.isEmpty) {
// Easy case: neither then nor otherwise emitted any statements.
seenAwait = shouldName;
- return transform(expr, () {
+ return transformTreeNode(expr, () {
expr.condition = expr.condition.accept<TreeNode>(this)..parent = expr;
seenAwait = seenAwait || thenAwait || otherwiseAwait;
});
@@ -518,7 +518,7 @@
} else {
// The body in `let x = initializer in body` did not contain an await. We
// can leave a let expression.
- return transform(expr, () {
+ return transformTreeNode(expr, () {
// The body has already been translated.
expr.body = body..parent = expr;
variable.initializer = variable.initializer.accept<TreeNode>(this)
@@ -534,7 +534,7 @@
}
TreeNode visitBlockExpression(BlockExpression expr) {
- return transform(expr, () {
+ return transformTreeNode(expr, () {
expr.value = expr.value.accept<TreeNode>(this)..parent = expr;
List<Statement> body = <Statement>[];
for (Statement stmt in expr.body.statements.reversed) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 0df3e84..24ed26c 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -296,7 +296,7 @@
}
++currentCatchDepth;
- transformList(node.catches, this, node);
+ transformList(node.catches, node);
--currentCatchDepth;
return node;
}
diff --git a/pkg/kernel/lib/transformations/flags.dart b/pkg/kernel/lib/transformations/flags.dart
index 398afeb..f6d2775 100644
--- a/pkg/kernel/lib/transformations/flags.dart
+++ b/pkg/kernel/lib/transformations/flags.dart
@@ -4,7 +4,6 @@
library kernel.transformations.flags;
-// ignore: import_of_legacy_library_into_null_safe
import '../ast.dart';
/// Flags summarizing the kinds of AST nodes contained in a given member or
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 18c4924..0fb8863 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -4,7 +4,6 @@
library kernel.type_algebra;
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
import 'core_types.dart';
import 'src/replacement_visitor.dart';
@@ -41,7 +40,7 @@
result[parameter] = const DynamicType();
}
for (TypeParameter parameter in host.typeParameters) {
- result[parameter] = substitute(parameter.bound, result);
+ result[parameter] = substitute(parameter.bound!, result);
}
return result;
}
@@ -121,9 +120,9 @@
TypeParameter typeParameter = typeParameters[i];
TypeParameter freshTypeParameter = freshParameters[i];
- freshTypeParameter.bound = substitute(typeParameter.bound, map);
+ freshTypeParameter.bound = substitute(typeParameter.bound!, map);
freshTypeParameter.defaultType = typeParameter.defaultType != null
- ? substitute(typeParameter.defaultType, map)
+ ? substitute(typeParameter.defaultType!, map)
: null;
freshTypeParameter.variance =
typeParameter.isLegacyCovariant ? null : typeParameter.variance;
@@ -148,7 +147,7 @@
requiredParameterCount: type.requiredParameterCount,
typedefType: type.typedefType == null
? null
- : substitute(type.typedefType) as TypedefType);
+ : substitute(type.typedefType!) as TypedefType);
}
DartType substitute(DartType type) => substitution.substituteType(type);
@@ -250,7 +249,7 @@
upper[parameter] = const DynamicType();
}
for (TypeParameter parameter in class_.typeParameters) {
- upper[parameter] = substitute(parameter.bound, upper);
+ upper[parameter] = substitute(parameter.bound!, upper);
}
return fromUpperAndLowerBounds(upper, {});
}
@@ -384,9 +383,9 @@
TypeParameter fresh = new TypeParameter(node.name);
TypeParameterType typeParameterType = substitution[node] =
new TypeParameterType.forAlphaRenaming(node, fresh);
- fresh.bound = visit(node.bound);
+ fresh.bound = visit(node.bound!);
if (node.defaultType != null) {
- fresh.defaultType = visit(node.defaultType);
+ fresh.defaultType = visit(node.defaultType!);
}
// If the bound was changed from substituting the bound we need to update
// implicit nullability to be based on the new bound. If the bound wasn't
@@ -561,7 +560,7 @@
DartType returnType = inner.visit(node.returnType);
TypedefType? typedefType = node.typedefType == null
? null
- : inner.visit(node.typedefType) as TypedefType;
+ : inner.visit(node.typedefType!) as TypedefType;
if (this.useCounter == before) return node;
return new FunctionType(positionalParameters, returnType, node.nullability,
namedParameters: namedParameters,
@@ -699,9 +698,9 @@
bool handleTypeParameter(TypeParameter node) {
assert(!variables.contains(node));
- if (node.bound.accept(this)) return true;
+ if (node.bound!.accept(this)) return true;
if (node.defaultType == null) return false;
- return node.defaultType.accept(this);
+ return node.defaultType!.accept(this);
}
}
@@ -755,9 +754,9 @@
bool handleTypeParameter(TypeParameter node) {
assert(variables.contains(node));
- if (node.bound.accept(this)) return true;
+ if (node.bound!.accept(this)) return true;
if (node.defaultType == null) return false;
- return node.defaultType.accept(this);
+ return node.defaultType!.accept(this);
}
}
@@ -811,9 +810,9 @@
bool handleTypeParameter(TypeParameter node) {
assert(variables.contains(node));
- if (node.bound.accept(this)) return true;
+ if (node.bound!.accept(this)) return true;
if (node.defaultType == null) return false;
- return node.defaultType.accept(this);
+ return node.defaultType!.accept(this);
}
}
@@ -1057,7 +1056,7 @@
// - The greatest closure of `S` with respect to `L` is `Function`
if (node.typeParameters.isNotEmpty) {
for (TypeParameter typeParameter in node.typeParameters) {
- if (containsTypeVariable(typeParameter.bound, eliminationTargets,
+ if (containsTypeVariable(typeParameter.bound!, eliminationTargets,
unhandledTypeHandler: unhandledTypeHandler)) {
return getFunctionReplacement(variance);
}
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index da45c08..c8789ae 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -4,7 +4,6 @@
library kernel.type_environment;
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
import 'class_hierarchy.dart';
import 'core_types.dart';
@@ -115,8 +114,7 @@
DartType _resolveTypeParameterType(DartType type) {
while (type is TypeParameterType) {
TypeParameterType typeParameterType = type;
- type =
- typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+ type = typeParameterType.bound;
}
return type;
}
@@ -148,13 +146,13 @@
bool isSpecialCasedBinaryOperator(Procedure member,
{bool isNonNullableByDefault: false}) {
if (isNonNullableByDefault) {
- Class class_ = member.enclosingClass;
+ Class? class_ = member.enclosingClass;
// TODO(johnniwinther): Do we need to recognize backend implementation
// methods?
if (class_ == coreTypes.intClass ||
class_ == coreTypes.numClass ||
class_ == coreTypes.doubleClass) {
- String name = member.name.text;
+ String name = member.name!.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@@ -162,9 +160,9 @@
name == '%';
}
} else {
- Class class_ = member.enclosingClass;
+ Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
- String name = member.name.text;
+ String name = member.name!.text;
return name == '+' ||
name == '-' ||
name == '*' ||
@@ -180,9 +178,9 @@
bool isSpecialCasedTernaryOperator(Procedure member,
{bool isNonNullableByDefault: false}) {
if (isNonNullableByDefault) {
- Class class_ = member.enclosingClass;
+ Class? class_ = member.enclosingClass;
if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
- String name = member.name.text;
+ String name = member.name!.text;
return name == 'clamp';
}
}
@@ -751,7 +749,7 @@
"No member currently associated with StaticTypeContext.");
return _currentMember?.enclosingClass?.getThisType(
typeEnvironment.coreTypes,
- _currentMember?.enclosingLibrary.nonNullable);
+ _currentMember!.enclosingLibrary.nonNullable);
}
@override
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 93a7b3a..13e7f14 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -4,10 +4,8 @@
library kernel.ast.visitor;
-import 'dart:core' hide MapEntry;
import 'dart:collection';
-// ignore: import_of_legacy_library_into_null_safe
import 'ast.dart';
abstract class ExpressionVisitor<R> {
@@ -127,6 +125,20 @@
}
}
+abstract class MemberVisitor1<R, A> {
+ const MemberVisitor1();
+
+ R defaultMember(Member node, A arg);
+
+ R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
+ R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
+ R visitField(Field node, A arg) => defaultMember(node, arg);
+ R visitRedirectingFactoryConstructor(
+ RedirectingFactoryConstructor node, A arg) {
+ return defaultMember(node, arg);
+ }
+}
+
abstract class InitializerVisitor<R> {
const InitializerVisitor();
@@ -142,6 +154,25 @@
R visitAssertInitializer(AssertInitializer node) => defaultInitializer(node);
}
+abstract class InitializerVisitor1<R, A> {
+ const InitializerVisitor1();
+
+ R defaultInitializer(Initializer node, A arg);
+
+ R visitInvalidInitializer(InvalidInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitFieldInitializer(FieldInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitSuperInitializer(SuperInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitLocalInitializer(LocalInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitAssertInitializer(AssertInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+}
+
abstract class TreeVisitor<R>
implements
ExpressionVisitor<R>,
@@ -288,6 +319,195 @@
R visitComponent(Component node) => defaultTreeNode(node);
}
+abstract class TreeVisitor1<R, A>
+ implements
+ ExpressionVisitor1<R, A>,
+ StatementVisitor1<R, A>,
+ MemberVisitor1<R, A>,
+ InitializerVisitor1<R, A> {
+ const TreeVisitor1();
+
+ R defaultTreeNode(TreeNode node, A arg);
+
+ // Expressions
+ R defaultExpression(Expression node, A arg) => defaultTreeNode(node, arg);
+ R defaultBasicLiteral(BasicLiteral node, A arg) =>
+ defaultExpression(node, arg);
+ R visitInvalidExpression(InvalidExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitVariableGet(VariableGet node, A arg) => defaultExpression(node, arg);
+ R visitVariableSet(VariableSet node, A arg) => defaultExpression(node, arg);
+ R visitDynamicGet(DynamicGet node, A arg) => defaultExpression(node, arg);
+ R visitDynamicSet(DynamicSet node, A arg) => defaultExpression(node, arg);
+ R visitFunctionTearOff(FunctionTearOff node, A arg) =>
+ defaultExpression(node, arg);
+ R visitInstanceGet(InstanceGet node, A arg) => defaultExpression(node, arg);
+ R visitInstanceSet(InstanceSet node, A arg) => defaultExpression(node, arg);
+ R visitInstanceTearOff(InstanceTearOff node, A arg) =>
+ defaultExpression(node, arg);
+ R visitPropertyGet(PropertyGet node, A arg) => defaultExpression(node, arg);
+ R visitPropertySet(PropertySet node, A arg) => defaultExpression(node, arg);
+ R visitSuperPropertyGet(SuperPropertyGet node, A arg) =>
+ defaultExpression(node, arg);
+ R visitSuperPropertySet(SuperPropertySet node, A arg) =>
+ defaultExpression(node, arg);
+ R visitStaticGet(StaticGet node, A arg) => defaultExpression(node, arg);
+ R visitStaticSet(StaticSet node, A arg) => defaultExpression(node, arg);
+ R visitStaticTearOff(StaticTearOff node, A arg) =>
+ defaultExpression(node, arg);
+ R visitLocalFunctionInvocation(LocalFunctionInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitDynamicInvocation(DynamicInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitFunctionInvocation(FunctionInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitInstanceInvocation(InstanceInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
+ R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
+ R visitMethodInvocation(MethodInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitSuperMethodInvocation(SuperMethodInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitStaticInvocation(StaticInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitConstructorInvocation(ConstructorInvocation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitNot(Not node, A arg) => defaultExpression(node, arg);
+ R visitNullCheck(NullCheck node, A arg) => defaultExpression(node, arg);
+ R visitLogicalExpression(LogicalExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitConditionalExpression(ConditionalExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitStringConcatenation(StringConcatenation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitListConcatenation(ListConcatenation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitSetConcatenation(SetConcatenation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitMapConcatenation(MapConcatenation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitInstanceCreation(InstanceCreation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitFileUriExpression(FileUriExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitIsExpression(IsExpression node, A arg) => defaultExpression(node, arg);
+ R visitAsExpression(AsExpression node, A arg) => defaultExpression(node, arg);
+ R visitSymbolLiteral(SymbolLiteral node, A arg) =>
+ defaultExpression(node, arg);
+ R visitTypeLiteral(TypeLiteral node, A arg) => defaultExpression(node, arg);
+ R visitThisExpression(ThisExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitRethrow(Rethrow node, A arg) => defaultExpression(node, arg);
+ R visitThrow(Throw node, A arg) => defaultExpression(node, arg);
+ R visitListLiteral(ListLiteral node, A arg) => defaultExpression(node, arg);
+ R visitSetLiteral(SetLiteral node, A arg) => defaultExpression(node, arg);
+ R visitMapLiteral(MapLiteral node, A arg) => defaultExpression(node, arg);
+ R visitAwaitExpression(AwaitExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitFunctionExpression(FunctionExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitConstantExpression(ConstantExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitStringLiteral(StringLiteral node, A arg) =>
+ defaultBasicLiteral(node, arg);
+ R visitIntLiteral(IntLiteral node, A arg) => defaultBasicLiteral(node, arg);
+ R visitDoubleLiteral(DoubleLiteral node, A arg) =>
+ defaultBasicLiteral(node, arg);
+ R visitBoolLiteral(BoolLiteral node, A arg) => defaultBasicLiteral(node, arg);
+ R visitNullLiteral(NullLiteral node, A arg) => defaultBasicLiteral(node, arg);
+ R visitLet(Let node, A arg) => defaultExpression(node, arg);
+ R visitBlockExpression(BlockExpression node, A arg) =>
+ defaultExpression(node, arg);
+ R visitInstantiation(Instantiation node, A arg) =>
+ defaultExpression(node, arg);
+ R visitLoadLibrary(LoadLibrary node, A arg) => defaultExpression(node, arg);
+ R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, A arg) =>
+ defaultExpression(node, arg);
+
+ // Statements
+ R defaultStatement(Statement node, A arg) => defaultTreeNode(node, arg);
+ R visitExpressionStatement(ExpressionStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitBlock(Block node, A arg) => defaultStatement(node, arg);
+ R visitAssertBlock(AssertBlock node, A arg) => defaultStatement(node, arg);
+ R visitEmptyStatement(EmptyStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitAssertStatement(AssertStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitLabeledStatement(LabeledStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitBreakStatement(BreakStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitWhileStatement(WhileStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitDoStatement(DoStatement node, A arg) => defaultStatement(node, arg);
+ R visitForStatement(ForStatement node, A arg) => defaultStatement(node, arg);
+ R visitForInStatement(ForInStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitSwitchStatement(SwitchStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitContinueSwitchStatement(ContinueSwitchStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitIfStatement(IfStatement node, A arg) => defaultStatement(node, arg);
+ R visitReturnStatement(ReturnStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitTryCatch(TryCatch node, A arg) => defaultStatement(node, arg);
+ R visitTryFinally(TryFinally node, A arg) => defaultStatement(node, arg);
+ R visitYieldStatement(YieldStatement node, A arg) =>
+ defaultStatement(node, arg);
+ R visitVariableDeclaration(VariableDeclaration node, A arg) =>
+ defaultStatement(node, arg);
+ R visitFunctionDeclaration(FunctionDeclaration node, A arg) =>
+ defaultStatement(node, arg);
+
+ // Members
+ R defaultMember(Member node, A arg) => defaultTreeNode(node, arg);
+ R visitConstructor(Constructor node, A arg) => defaultMember(node, arg);
+ R visitProcedure(Procedure node, A arg) => defaultMember(node, arg);
+ R visitField(Field node, A arg) => defaultMember(node, arg);
+ R visitRedirectingFactoryConstructor(
+ RedirectingFactoryConstructor node, A arg) {
+ return defaultMember(node, arg);
+ }
+
+ // Classes
+ R visitClass(Class node, A arg) => defaultTreeNode(node, arg);
+ R visitExtension(Extension node, A arg) => defaultTreeNode(node, arg);
+
+ // Initializers
+ R defaultInitializer(Initializer node, A arg) => defaultTreeNode(node, arg);
+ R visitInvalidInitializer(InvalidInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitFieldInitializer(FieldInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitSuperInitializer(SuperInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitRedirectingInitializer(RedirectingInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitLocalInitializer(LocalInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+ R visitAssertInitializer(AssertInitializer node, A arg) =>
+ defaultInitializer(node, arg);
+
+ // Other tree nodes
+ R visitLibrary(Library node, A arg) => defaultTreeNode(node, arg);
+ R visitLibraryDependency(LibraryDependency node, A arg) =>
+ defaultTreeNode(node, arg);
+ R visitCombinator(Combinator node, A arg) => defaultTreeNode(node, arg);
+ R visitLibraryPart(LibraryPart node, A arg) => defaultTreeNode(node, arg);
+ R visitTypedef(Typedef node, A arg) => defaultTreeNode(node, arg);
+ R visitTypeParameter(TypeParameter node, A arg) => defaultTreeNode(node, arg);
+ R visitFunctionNode(FunctionNode node, A arg) => defaultTreeNode(node, arg);
+ R visitArguments(Arguments node, A arg) => defaultTreeNode(node, arg);
+ R visitNamedExpression(NamedExpression node, A arg) =>
+ defaultTreeNode(node, arg);
+ R visitSwitchCase(SwitchCase node, A arg) => defaultTreeNode(node, arg);
+ R visitCatch(Catch node, A arg) => defaultTreeNode(node, arg);
+ R visitMapEntry(MapEntry node, A arg) => defaultTreeNode(node, arg);
+ R visitComponent(Component node, A arg) => defaultTreeNode(node, arg);
+}
+
abstract class DartTypeVisitor<R> {
const DartTypeVisitor();
@@ -776,6 +996,54 @@
class Transformer extends TreeVisitor<TreeNode> {
const Transformer();
+ T transform<T extends TreeNode>(T node) {
+ T result = node.accept<TreeNode>(this) as T;
+ assert(
+ // ignore: unnecessary_null_comparison
+ result != null,
+ 'Attempting to remove ${node} (${node.runtimeType}) '
+ 'in transformer.');
+ return result;
+ }
+
+ void transformDartTypeList(List<DartType> nodes) {
+ for (int i = 0; i < nodes.length; ++i) {
+ DartType result = visitDartType(nodes[i]);
+ assert(
+ // ignore: unnecessary_null_comparison
+ result != null,
+ 'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+ 'in transformer.');
+ nodes[i] = result;
+ }
+ }
+
+ void transformSupertypeList(List<Supertype> nodes) {
+ for (int i = 0; i < nodes.length; ++i) {
+ Supertype result = visitSupertype(nodes[i]);
+ assert(
+ // ignore: unnecessary_null_comparison
+ result != null,
+ 'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+ 'in transformer.');
+ nodes[i] = result;
+ }
+ }
+
+ void transformList<T extends TreeNode>(List<T> nodes, TreeNode parent) {
+ for (int i = 0; i < nodes.length; ++i) {
+ T result = transform(nodes[i]);
+ assert(
+ // ignore: unnecessary_null_comparison
+ result != null,
+ 'Attempting to remove ${nodes[i]} (${nodes[i].runtimeType}) '
+ 'in transformer.');
+ // ignore: invalid_null_aware_operator
+ result.parent = parent;
+ nodes[i] = result;
+ }
+ }
+
/// Replaces a use of a type.
///
/// By default, recursion stops at this point.
@@ -791,6 +1059,362 @@
}
}
+/// Transformer that recursively rewrites each node in tree and supports removal
+/// of nodes.
+///
+/// Visit methods should return a new node, the visited node (possibly
+/// mutated), any node from the visited node's subtree, or the provided
+/// removal sentinel, if non-null.
+///
+/// To support removal of nodes during traversal, while enforcing nullability
+/// invariants, this visitor takes an argument, the removal sentinel. If a
+/// node is visited in a context where it can be removed, for instance in a
+/// list or as an optional child of its parent, a non-null sentinel value is
+/// provided, and this value can be returned to signal to the caller that the
+/// visited node should be removed. If the sentinel value is `null`, the node
+/// cannot be removed from its context, in which case the node itself or a new
+/// non-null node must be returned, possibly a sentinel value specific to the
+/// particular visitor.
+///
+/// For instance
+///
+/// class AssertRemover extends RemovingTransformer {
+/// @override
+/// TreeNode visitAssertStatement(
+/// AssertStatement node,
+/// TreeNode? removalSentinel) {
+/// return removalSentinel ?? new EmptyStatement();
+/// }
+///
+/// @override
+/// TreeNode visitIfStatement(
+/// IfStatement node,
+/// TreeNode? removalSentinel) {
+/// node.transformOrRemoveChildren(this);
+/// if (node.then is EmptyStatement) {
+/// if (node.otherwise != null) {
+/// return new IfStatement(
+/// new Not(node.condition), node.otherwise);
+/// } else {
+/// return removalSentinel ?? new EmptyStatement();
+/// }
+/// }
+/// return node;
+/// }
+/// }
+///
+/// Each subclass is responsible for ensuring that the AST remains a tree.
+///
+/// For example, the following transformer replaces every occurrence of
+/// `!(x && y)` with `(!x || !y)`:
+///
+/// class NegationSinker extends RemovingTransformer {
+/// @override
+/// Node visitNot(Not node) {
+/// var operand = node.operand.accept(this); // Remember to visit.
+/// if (operand is LogicalExpression && operand.operator == '&&') {
+/// return new LogicalExpression(
+/// new Not(operand.left),
+/// '||',
+/// new Not(operand.right));
+/// }
+/// return node;
+/// }
+/// }
+///
+class RemovingTransformer extends TreeVisitor1<TreeNode, TreeNode?> {
+ const RemovingTransformer();
+
+ /// Visits [node], returning the transformation result.
+ ///
+ /// The transformation cannot result in `null`.
+ T transform<T extends TreeNode>(T node) {
+ return node.accept1<TreeNode, TreeNode?>(this, cannotRemoveSentinel) as T;
+ }
+
+ /// Visits [node], returning the transformation result. Removal of [node] is
+ /// supported with `null` as the result.
+ ///
+ /// This is convenience method for calling [transformOrRemove] with removal
+ /// sentinel for [Expression] nodes.
+ Expression? transformOrRemoveExpression(Expression node) {
+ return transformOrRemove(node, dummyExpression);
+ }
+
+ /// Visits [node], returning the transformation result. Removal of [node] is
+ /// supported with `null` as the result.
+ ///
+ /// This is convenience method for calling [transformOrRemove] with removal
+ /// sentinel for [Statement] nodes.
+ Statement? transformOrRemoveStatement(Statement node) {
+ return transformOrRemove(node, dummyStatement);
+ }
+
+ /// Visits [node], returning the transformation result. Removal of [node] is
+ /// supported with `null` as the result.
+ ///
+ /// This is convenience method for calling [transformOrRemove] with removal
+ /// sentinel for [VariableDeclaration] nodes.
+ VariableDeclaration? transformOrRemoveVariableDeclaration(
+ VariableDeclaration node) {
+ return transformOrRemove(node, dummyVariableDeclaration);
+ }
+
+ /// Visits [node] using [removalSentinel] as the removal sentinel.
+ ///
+ /// If [removalSentinel] is the result of visiting [node], `null` is returned.
+ /// Otherwise the result is returned.
+ T? transformOrRemove<T extends TreeNode>(T node, T? removalSentinel) {
+ T result = node.accept1<TreeNode, TreeNode?>(this, removalSentinel) as T;
+ if (identical(result, removalSentinel)) {
+ return null;
+ } else {
+ return result;
+ }
+ }
+
+ /// Transforms or removes [DartType] nodes in [nodes].
+ void transformDartTypeList(List<DartType> nodes) {
+ int storeIndex = 0;
+ for (int i = 0; i < nodes.length; ++i) {
+ DartType result = visitDartType(nodes[i], dummyDartType);
+ if (!identical(result, dummyDartType)) {
+ nodes[storeIndex] = result;
+ ++storeIndex;
+ }
+ }
+ if (storeIndex < nodes.length) {
+ nodes.length = storeIndex;
+ }
+ }
+
+ /// Transforms or removes [Supertype] nodes in [nodes].
+ void transformSupertypeList(List<Supertype> nodes) {
+ int storeIndex = 0;
+ for (int i = 0; i < nodes.length; ++i) {
+ Supertype result = visitSupertype(nodes[i], dummySupertype);
+ if (!identical(result, dummySupertype)) {
+ nodes[storeIndex] = result;
+ ++storeIndex;
+ }
+ }
+ if (storeIndex < nodes.length) {
+ nodes.length = storeIndex;
+ }
+ }
+
+ /// Transforms or removes [Library] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Library] nodes.
+ void transformLibraryList(List<Library> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyLibrary);
+ }
+
+ /// Transforms or removes [LibraryDependency] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [LibraryDependency] nodes.
+ void transformLibraryDependencyList(
+ List<LibraryDependency> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyLibraryDependency);
+ }
+
+ /// Transforms or removes [Combinator] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Combinator] nodes.
+ void transformCombinatorList(List<Combinator> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyCombinator);
+ }
+
+ /// Transforms or removes [LibraryPart] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [LibraryPart] nodes.
+ void transformLibraryPartList(List<LibraryPart> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyLibraryPart);
+ }
+
+ /// Transforms or removes [Class] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Class] nodes.
+ void transformClassList(List<Class> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyClass);
+ }
+
+ /// Transforms or removes [Extension] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Extension] nodes.
+ void transformExtensionList(List<Extension> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyExtension);
+ }
+
+ /// Transforms or removes [Constructor] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Constructor] nodes.
+ void transformConstructorList(List<Constructor> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyConstructor);
+ }
+
+ /// Transforms or removes [Procedure] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Procedure] nodes.
+ void transformProcedureList(List<Procedure> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyProcedure);
+ }
+
+ /// Transforms or removes [Field] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Field] nodes.
+ void transformFieldList(List<Field> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyField);
+ }
+
+ /// Transforms or removes [RedirectingFactoryConstructor] nodes in [nodes] as
+ /// children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [RedirectingFactoryConstructor] nodes.
+ void transformRedirectingFactoryConstructorList(
+ List<RedirectingFactoryConstructor> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyRedirectingFactoryConstructor);
+ }
+
+ /// Transforms or removes [Typedef] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Typedef] nodes.
+ void transformTypedefList(List<Typedef> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyTypedef);
+ }
+
+ /// Transforms or removes [Initializer] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Initializer] nodes.
+ void transformInitializerList(List<Initializer> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyInitializer);
+ }
+
+ /// Transforms or removes [Expression] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Expression] nodes.
+ void transformExpressionList(List<Expression> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyExpression);
+ }
+
+ /// Transforms or removes [NamedExpression] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [NamedExpression] nodes.
+ void transformNamedExpressionList(
+ List<NamedExpression> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyNamedExpression);
+ }
+
+ /// Transforms or removes [MapEntry] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [MapEntry] nodes.
+ void transformMapEntryList(List<MapEntry> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyMapEntry);
+ }
+
+ /// Transforms or removes [Statement] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Statement] nodes.
+ void transformStatementList(List<Statement> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyStatement);
+ }
+
+ /// Transforms or removes [SwitchCase] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [SwitchCase] nodes.
+ void transformSwitchCaseList(List<SwitchCase> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummySwitchCase);
+ }
+
+ /// Transforms or removes [Catch] nodes in [nodes] as children of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [Catch] nodes.
+ void transformCatchList(List<Catch> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyCatch);
+ }
+
+ /// Transforms or removes [TypeParameter] nodes in [nodes] as children of
+ /// [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [TypeParameter] nodes.
+ void transformTypeParameterList(List<TypeParameter> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyTypeParameter);
+ }
+
+ /// Transforms or removes [VariableDeclaration] nodes in [nodes] as children
+ /// of [parent].
+ ///
+ /// This is convenience method for calling [transformList] with removal
+ /// sentinel for [VariableDeclaration] nodes.
+ void transformVariableDeclarationList(
+ List<VariableDeclaration> nodes, TreeNode parent) {
+ transformList(nodes, parent, dummyVariableDeclaration);
+ }
+
+ /// Transforms or removes [T] nodes in [nodes] as children of [parent] by
+ /// calling [transformOrRemove] using [removalSentinel] as the removal
+ /// sentinel.
+ void transformList<T extends TreeNode>(
+ List<T> nodes, TreeNode parent, T removalSentinel) {
+ int storeIndex = 0;
+ for (int i = 0; i < nodes.length; ++i) {
+ T? result = transformOrRemove(nodes[i], removalSentinel);
+ if (result != null) {
+ nodes[storeIndex] = result;
+ result.parent = parent;
+ ++storeIndex;
+ }
+ }
+ if (storeIndex < nodes.length) {
+ nodes.length = storeIndex;
+ }
+ }
+
+ /// Replaces a use of a type.
+ ///
+ /// By default, recursion stops at this point.
+ DartType visitDartType(DartType node, DartType? removalSentinel) => node;
+
+ Constant visitConstant(Constant node, Constant? removalSentinel) => node;
+
+ Supertype visitSupertype(Supertype node, Supertype? removalSentinel) => node;
+
+ TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
+ return node;
+ }
+}
+
abstract class ExpressionVisitor1<R, T> {
const ExpressionVisitor1();
diff --git a/pkg/kernel/test/dart_type_equivalence_test.dart b/pkg/kernel/test/dart_type_equivalence_test.dart
index aeb980e..acf4b96 100644
--- a/pkg/kernel/test/dart_type_equivalence_test.dart
+++ b/pkg/kernel/test/dart_type_equivalence_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/dart_type_equivalence.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/flatten_test.dart b/pkg/kernel/test/flatten_test.dart
index 00c707a..2dd50b8 100644
--- a/pkg/kernel/test/flatten_test.dart
+++ b/pkg/kernel/test/flatten_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/testing/type_parser_environment.dart';
import 'package:kernel/type_environment.dart';
diff --git a/pkg/kernel/test/future_value_type_test.dart b/pkg/kernel/test/future_value_type_test.dart
index 5eed73f..f256cfe 100644
--- a/pkg/kernel/test/future_value_type_test.dart
+++ b/pkg/kernel/test/future_value_type_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/future_value_type.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/legacy_erasure_test.dart b/pkg/kernel/test/legacy_erasure_test.dart
index f62eba0..4e14b3b 100644
--- a/pkg/kernel/test/legacy_erasure_test.dart
+++ b/pkg/kernel/test/legacy_erasure_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/nnbd_top_merge_test.dart b/pkg/kernel/test/nnbd_top_merge_test.dart
index 1296889..73d07d2 100644
--- a/pkg/kernel/test/nnbd_top_merge_test.dart
+++ b/pkg/kernel/test/nnbd_top_merge_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/nnbd_top_merge.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/non_null_test.dart b/pkg/kernel/test/non_null_test.dart
index c4f2570..ef3b433 100644
--- a/pkg/kernel/test/non_null_test.dart
+++ b/pkg/kernel/test/non_null_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/non_null.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/norm_test.dart b/pkg/kernel/test/norm_test.dart
index 5fe8429..0f2cd38 100644
--- a/pkg/kernel/test/norm_test.dart
+++ b/pkg/kernel/test/norm_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart" show Expect;
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
import 'package:kernel/src/norm.dart';
import 'package:kernel/testing/type_parser_environment.dart';
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 7b6a238..097200d 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -227,7 +227,7 @@
negative1Test(
'Dangling interface type',
(TestHarness test) {
- Class orphan = new Class();
+ Class orphan = new Class(name: 'Class');
test.addNode(
new TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
return orphan;
@@ -264,27 +264,6 @@
test.addNode(procedure);
},
);
- simpleNegativeTest(
- 'StaticGet without target',
- "StaticGet without target.",
- (TestHarness test) {
- test.addNode(StaticGet(null));
- },
- );
- simpleNegativeTest(
- 'StaticSet without target',
- "StaticSet without target.",
- (TestHarness test) {
- test.addNode(StaticSet(null, new NullLiteral()));
- },
- );
- simpleNegativeTest(
- 'StaticInvocation without target',
- "StaticInvocation without target.",
- (TestHarness test) {
- test.addNode(StaticInvocation(null, new Arguments.empty()));
- },
- );
positiveTest(
'Correct StaticInvocation',
(TestHarness test) {
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index e08f278..d91154e 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -3,8 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
library vm.target.vm;
-import 'dart:core' hide MapEntry;
-
import 'package:kernel/ast.dart';
import 'package:kernel/clone.dart';
import 'package:kernel/class_hierarchy.dart';
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 31481a8..dce3d1b 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+// @dart=2.12
+
library vm.transformations.mixin_deduplication;
import 'package:kernel/ast.dart';
@@ -13,7 +15,8 @@
// Deduplicate mixins and re-resolve super initializers.
// (this is a shallow transformation)
- component.libraries.forEach(deduplicateMixins.visitLibrary);
+ component.libraries
+ .forEach((library) => deduplicateMixins.visitLibrary(library, null));
// Do a deep transformation to update references to the removed mixin
// application classes in the interface targets and types.
@@ -83,29 +86,30 @@
}
}
-class DeduplicateMixinsTransformer extends Transformer {
+class DeduplicateMixinsTransformer extends RemovingTransformer {
final _canonicalMixins = new Map<_DeduplicateMixinKey, Class>();
final _duplicatedMixins = new Map<Class, Class>();
@override
- TreeNode visitLibrary(Library node) {
- transformList(node.classes, this, node);
+ TreeNode visitLibrary(Library node, TreeNode? removalSentinel) {
+ transformClassList(node.classes, node);
return node;
}
@override
- TreeNode visitClass(Class c) {
+ TreeNode visitClass(Class c, TreeNode? removalSentinel) {
if (_duplicatedMixins.containsKey(c)) {
- return null; // Class was de-duplicated already, just remove it.
+ // Class was de-duplicated already, just remove it.
+ return removalSentinel!;
}
if (c.supertype != null) {
- c.supertype = _transformSupertype(c.supertype, c, true);
+ c.supertype = _transformSupertype(c.supertype!, c, true);
}
if (c.mixedInType != null) {
throw 'All mixins should be transformed already.';
}
- transformSupertypeList(c.implementedTypes, this);
+ transformSupertypeList(c.implementedTypes);
if (!c.isAnonymousMixin) {
return c;
@@ -113,6 +117,7 @@
Class canonical =
_canonicalMixins.putIfAbsent(new _DeduplicateMixinKey(c), () => c);
+ // ignore: unnecessary_null_comparison
assert(canonical != null);
if (canonical != c) {
@@ -120,34 +125,34 @@
// write a dangling reference to the deleted class.
c.reference.canonicalName = null;
_duplicatedMixins[c] = canonical;
- return null; // Remove class.
+ // Remove class.
+ return removalSentinel!;
}
return c;
}
@override
- Supertype visitSupertype(Supertype node) {
+ Supertype visitSupertype(Supertype node, Supertype? removalSentinel) {
return _transformSupertype(node, null, false);
}
Supertype _transformSupertype(
- Supertype supertype, Class cls, bool isSuperclass) {
+ Supertype supertype, Class? cls, bool isSuperclass) {
Class oldSuper = supertype.classNode;
- Class newSuper = visitClass(oldSuper);
- if (newSuper == null) {
- Class canonicalSuper = _duplicatedMixins[oldSuper];
- assert(canonicalSuper != null);
+ Class newSuper = visitClass(oldSuper, dummyClass) as Class;
+ if (identical(newSuper, dummyClass)) {
+ Class canonicalSuper = _duplicatedMixins[oldSuper]!;
supertype = new Supertype(canonicalSuper, supertype.typeArguments);
if (isSuperclass) {
- _correctForwardingConstructors(cls, oldSuper, canonicalSuper);
+ _correctForwardingConstructors(cls!, oldSuper, canonicalSuper);
}
}
return supertype;
}
@override
- TreeNode defaultTreeNode(TreeNode node) =>
+ TreeNode defaultTreeNode(TreeNode node, TreeNode? removalSentinel) =>
throw 'Unexpected node ${node.runtimeType}: $node';
}
@@ -204,17 +209,18 @@
@override
visitSuperMethodInvocation(SuperMethodInvocation node) {
- node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget);
+ node.interfaceTarget =
+ _resolveNewInterfaceTarget(node.interfaceTarget) as Procedure?;
super.visitSuperMethodInvocation(node);
}
- Member _resolveNewInterfaceTarget(Member m) {
- final Class c = m?.enclosingClass;
+ Member? _resolveNewInterfaceTarget(Member? m) {
+ final Class? c = m?.enclosingClass;
if (c != null && c.isAnonymousMixin) {
- final Class replacement = transformer._duplicatedMixins[c];
+ final Class? replacement = transformer._duplicatedMixins[c];
if (replacement != null) {
// The class got removed, so we need to re-resolve the interface target.
- return _findMember(replacement, m);
+ return _findMember(replacement, m!);
}
}
return m;
@@ -240,8 +246,8 @@
Reference _updateClassReference(Reference classRef) {
final Class c = classRef.asClass;
- if (c != null && c.isAnonymousMixin) {
- final Class replacement = transformer._duplicatedMixins[c];
+ if (c.isAnonymousMixin) {
+ final Class? replacement = transformer._duplicatedMixins[c];
if (replacement != null) {
return replacement.reference;
}
@@ -279,7 +285,7 @@
for (var initializer in constructor.initializers) {
if ((initializer is SuperInitializer) &&
initializer.target.enclosingClass == oldSuper) {
- Constructor replacement = null;
+ Constructor? replacement = null;
for (var c in newSuper.constructors) {
if (c.name == initializer.target.name) {
replacement = c;
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index ba36509..ac88a41 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -523,8 +523,8 @@
}
transformComponent(Component component) {
- _pass1.transform(component);
- _pass2.transform(component);
+ _pass1.transformComponent(component);
+ _pass2.transformComponent(component);
}
bool isClassReferencedFromNativeCode(Class c) =>
@@ -563,8 +563,8 @@
}
_usedClasses.add(c);
visitIterable(c.supers, typeVisitor);
- transformList(c.typeParameters, _pass1, c);
- transformList(c.annotations, _pass1, c);
+ _pass1.transformTypeParameterList(c.typeParameters, c);
+ _pass1.transformExpressionList(c.annotations, c);
// Preserve NSM forwarders. They are overlooked by TFA / tree shaker
// as they are abstract and don't have a body.
for (Procedure p in c.procedures) {
@@ -615,13 +615,14 @@
}
if (func != null) {
- transformList(func.typeParameters, _pass1, func);
- transformList(func.positionalParameters, _pass1, func);
- transformList(func.namedParameters, _pass1, func);
+ _pass1.transformTypeParameterList(func.typeParameters, func);
+ _pass1.transformVariableDeclarationList(
+ func.positionalParameters, func);
+ _pass1.transformVariableDeclarationList(func.namedParameters, func);
func.returnType.accept(typeVisitor);
}
- transformList(m.annotations, _pass1, m);
+ _pass1.transformExpressionList(m.annotations, m);
// If the member is kept alive we need to keep the extension alive.
if (m.isExtensionMember) {
@@ -641,18 +642,20 @@
void addUsedExtension(Extension node) {
if (_usedExtensions.add(node)) {
- transformList(node.typeParameters, _pass1, node);
+ _pass1.transformTypeParameterList(node.typeParameters, node);
node.onType?.accept(typeVisitor);
}
}
void addUsedTypedef(Typedef typedef) {
if (_usedTypedefs.add(typedef)) {
- transformList(typedef.annotations, _pass1, typedef);
- transformList(typedef.typeParameters, _pass1, typedef);
- transformList(typedef.typeParametersOfFunctionType, _pass1, typedef);
- transformList(typedef.positionalParameters, _pass1, typedef);
- transformList(typedef.namedParameters, _pass1, typedef);
+ _pass1.transformExpressionList(typedef.annotations, typedef);
+ _pass1.transformTypeParameterList(typedef.typeParameters, typedef);
+ _pass1.transformTypeParameterList(
+ typedef.typeParametersOfFunctionType, typedef);
+ _pass1.transformVariableDeclarationList(
+ typedef.positionalParameters, typedef);
+ _pass1.transformVariableDeclarationList(typedef.namedParameters, typedef);
typedef.type?.accept(typeVisitor);
}
}
@@ -786,7 +789,7 @@
/// Visits all classes, members and bodies of reachable members.
/// Collects all used classes, members and types, and
/// transforms unreachable calls into 'throw' expressions.
-class _TreeShakerPass1 extends Transformer {
+class _TreeShakerPass1 extends RemovingTransformer {
final TreeShaker shaker;
final FieldMorpher fieldMorpher;
final TypeEnvironment environment;
@@ -808,8 +811,8 @@
: fieldMorpher = shaker.fieldMorpher,
environment = shaker.typeFlowAnalysis.environment;
- void transform(Component component) {
- component.transformChildren(this);
+ void transformComponent(Component component) {
+ component.transformOrRemoveChildren(this);
}
bool _isUnreachable(TreeNode node) {
@@ -870,61 +873,62 @@
NarrowNotNull _getNullTest(TreeNode node) =>
shaker.typeFlowAnalysis.nullTest(node);
- TreeNode _visitAssertNode(TreeNode node) {
+ TreeNode _visitAssertNode(TreeNode node, TreeNode removalSentinel) {
if (kRemoveAsserts) {
- return null;
+ return removalSentinel;
} else {
- node.transformChildren(this);
+ node.transformOrRemoveChildren(this);
return node;
}
}
@override
- DartType visitDartType(DartType node) {
+ DartType visitDartType(DartType node, DartType removalSentinel) {
node.accept(shaker.typeVisitor);
return node;
}
@override
- Supertype visitSupertype(Supertype node) {
+ Supertype visitSupertype(Supertype node, Supertype removalSentinel) {
node.accept(shaker.typeVisitor);
return node;
}
@override
- TreeNode visitTypedef(Typedef node) {
+ TreeNode visitTypedef(Typedef node, TreeNode removalSentinel) {
return node; // Do not go deeper.
}
@override
- Extension visitExtension(Extension node) {
+ Extension visitExtension(Extension node, TreeNode removalSentinel) {
// The extension can be considered a weak node, we'll only retain it if
// normal code references any of it's members.
return node;
}
@override
- TreeNode visitClass(Class node) {
+ TreeNode visitClass(Class node, TreeNode removalSentinel) {
if (shaker.isClassAllocated(node) ||
shaker.isClassReferencedFromNativeCode(node)) {
shaker.addClassUsedInType(node);
}
- transformList(node.constructors, this, node);
- transformList(node.procedures, this, node);
- transformList(node.fields, this, node);
- transformList(node.redirectingFactoryConstructors, this, node);
+ transformConstructorList(node.constructors, node);
+ transformProcedureList(node.procedures, node);
+ transformFieldList(node.fields, node);
+ transformRedirectingFactoryConstructorList(
+ node.redirectingFactoryConstructors, node);
return node;
}
@override
- TreeNode defaultMember(Member node) {
+ TreeNode defaultMember(Member node, TreeNode removalSentinel) {
currentMember = node;
if (shaker.isMemberBodyReachable(node)) {
if (kPrintTrace) {
tracePrint("Visiting $node");
}
shaker.addUsedMember(node);
- node.transformChildren(this);
+ node.transformOrRemoveChildren(this);
} else if (shaker.isMemberReferencedFromNativeCode(node)) {
// Preserve members referenced from native code to satisfy lookups, even
// if they are not reachable. An instance member could be added via
@@ -937,7 +941,7 @@
}
@override
- TreeNode visitField(Field node) {
+ TreeNode visitField(Field node, TreeNode removalSentinel) {
currentMember = node;
if (shaker.retainField(node)) {
if (kPrintTrace) {
@@ -946,7 +950,7 @@
shaker.addUsedMember(node);
if (node.initializer != null) {
if (shaker.isFieldInitializerReachable(node)) {
- node.transformChildren(this);
+ node.transformOrRemoveChildren(this);
} else {
node.initializer = _makeUnreachableCall([])..parent = node;
}
@@ -961,8 +965,9 @@
}
@override
- TreeNode visitMethodInvocation(MethodInvocation node) {
- node.transformChildren(this);
+ TreeNode visitMethodInvocation(
+ MethodInvocation node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall(
_flattenArguments(node.arguments, receiver: node.receiver));
@@ -984,8 +989,8 @@
}
@override
- TreeNode visitPropertyGet(PropertyGet node) {
- node.transformChildren(this);
+ TreeNode visitPropertyGet(PropertyGet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([node.receiver]);
} else {
@@ -999,8 +1004,8 @@
}
@override
- TreeNode visitPropertySet(PropertySet node) {
- node.transformChildren(this);
+ TreeNode visitPropertySet(PropertySet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([node.receiver, node.value]);
} else {
@@ -1014,8 +1019,9 @@
}
@override
- TreeNode visitSuperMethodInvocation(SuperMethodInvocation node) {
- node.transformChildren(this);
+ TreeNode visitSuperMethodInvocation(
+ SuperMethodInvocation node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall(_flattenArguments(node.arguments));
} else {
@@ -1029,8 +1035,9 @@
}
@override
- TreeNode visitSuperPropertyGet(SuperPropertyGet node) {
- node.transformChildren(this);
+ TreeNode visitSuperPropertyGet(
+ SuperPropertyGet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([]);
} else {
@@ -1044,8 +1051,9 @@
}
@override
- TreeNode visitSuperPropertySet(SuperPropertySet node) {
- node.transformChildren(this);
+ TreeNode visitSuperPropertySet(
+ SuperPropertySet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([node.value]);
} else {
@@ -1059,8 +1067,9 @@
}
@override
- TreeNode visitStaticInvocation(StaticInvocation node) {
- node.transformChildren(this);
+ TreeNode visitStaticInvocation(
+ StaticInvocation node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall(_flattenArguments(node.arguments));
}
@@ -1073,8 +1082,8 @@
}
@override
- TreeNode visitStaticGet(StaticGet node) {
- node.transformChildren(this);
+ TreeNode visitStaticGet(StaticGet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([]);
} else {
@@ -1088,14 +1097,14 @@
}
@override
- Constant visitConstant(Constant node) {
+ Constant visitConstant(Constant node, Constant removalSentinel) {
shaker.constantVisitor.analyzeConstant(node);
return node;
}
@override
- TreeNode visitStaticSet(StaticSet node) {
- node.transformChildren(this);
+ TreeNode visitStaticSet(StaticSet node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall([node.value]);
} else {
@@ -1110,8 +1119,9 @@
}
@override
- TreeNode visitConstructorInvocation(ConstructorInvocation node) {
- node.transformChildren(this);
+ TreeNode visitConstructorInvocation(
+ ConstructorInvocation node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableCall(_flattenArguments(node.arguments));
} else {
@@ -1125,8 +1135,9 @@
}
@override
- TreeNode visitRedirectingInitializer(RedirectingInitializer node) {
- node.transformChildren(this);
+ TreeNode visitRedirectingInitializer(
+ RedirectingInitializer node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableInitializer(_flattenArguments(node.arguments));
} else {
@@ -1137,8 +1148,9 @@
}
@override
- TreeNode visitSuperInitializer(SuperInitializer node) {
- node.transformChildren(this);
+ TreeNode visitSuperInitializer(
+ SuperInitializer node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableInitializer(_flattenArguments(node.arguments));
} else {
@@ -1148,8 +1160,9 @@
}
@override
- TreeNode visitFieldInitializer(FieldInitializer node) {
- node.transformChildren(this);
+ TreeNode visitFieldInitializer(
+ FieldInitializer node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
if (_isUnreachable(node)) {
return _makeUnreachableInitializer([node.value]);
} else {
@@ -1160,7 +1173,7 @@
return LocalInitializer(
VariableDeclaration(null, initializer: node.value));
} else {
- return null;
+ return removalSentinel;
}
}
return node;
@@ -1168,23 +1181,25 @@
}
@override
- TreeNode visitAssertStatement(AssertStatement node) {
- return _visitAssertNode(node);
+ TreeNode visitAssertStatement(
+ AssertStatement node, TreeNode removalSentinel) {
+ return _visitAssertNode(node, removalSentinel);
}
@override
- TreeNode visitAssertBlock(AssertBlock node) {
- return _visitAssertNode(node);
+ TreeNode visitAssertBlock(AssertBlock node, TreeNode removalSentinel) {
+ return _visitAssertNode(node, removalSentinel);
}
@override
- TreeNode visitAssertInitializer(AssertInitializer node) {
- return _visitAssertNode(node);
+ TreeNode visitAssertInitializer(
+ AssertInitializer node, TreeNode removalSentinel) {
+ return _visitAssertNode(node, removalSentinel);
}
@override
- TreeNode visitAsExpression(AsExpression node) {
- node.transformChildren(this);
+ TreeNode visitAsExpression(AsExpression node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
TypeCheck check = shaker.typeFlowAnalysis.explicitCast(node);
if (check != null && check.canAlwaysSkip) {
return StaticInvocation(
@@ -1195,8 +1210,8 @@
}
@override
- TreeNode visitNullCheck(NullCheck node) {
- node.transformChildren(this);
+ TreeNode visitNullCheck(NullCheck node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
final nullTest = _getNullTest(node);
if (nullTest.isAlwaysNotNull) {
return StaticInvocation(
@@ -1221,13 +1236,13 @@
/// This pass visits classes and members and removes unused classes and members.
/// Bodies of unreachable but used members are replaced with 'throw'
/// expressions. This pass does not dive deeper than member level.
-class _TreeShakerPass2 extends Transformer {
+class _TreeShakerPass2 extends RemovingTransformer {
final TreeShaker shaker;
_TreeShakerPass2(this.shaker);
- void transform(Component component) {
- component.transformChildren(this);
+ void transformComponent(Component component) {
+ component.transformOrRemoveChildren(this);
for (Source source in component.uriToSource.values) {
source?.constantCoverageConstructors?.removeWhere((Reference reference) {
Member node = reference.asMember;
@@ -1237,8 +1252,8 @@
}
@override
- TreeNode visitLibrary(Library node) {
- node.transformChildren(this);
+ TreeNode visitLibrary(Library node, TreeNode removalSentinel) {
+ node.transformOrRemoveChildren(this);
// The transformer API does not iterate over `Library.additionalExports`,
// so we manually delete the references to shaken nodes.
node.additionalExports.removeWhere((Reference reference) {
@@ -1257,19 +1272,19 @@
}
@override
- Typedef visitTypedef(Typedef node) {
- return shaker.isTypedefUsed(node) ? node : null;
+ Typedef visitTypedef(Typedef node, TreeNode removalSentinel) {
+ return shaker.isTypedefUsed(node) ? node : removalSentinel;
}
@override
- Class visitClass(Class node) {
+ Class visitClass(Class node, TreeNode removalSentinel) {
if (!shaker.isClassUsed(node)) {
debugPrint('Dropped class ${node.name}');
// Ensure that kernel file writer will not be able to
// write a dangling reference to the deleted class.
node.reference.canonicalName = null;
Statistics.classesDropped++;
- return null; // Remove the class.
+ return removalSentinel; // Remove the class.
}
if (!shaker.isClassUsedInType(node)) {
@@ -1292,7 +1307,7 @@
node.isAbstract = true;
}
- node.transformChildren(this);
+ node.transformOrRemoveChildren(this);
return node;
}
@@ -1305,13 +1320,13 @@
node.enclosingClass.isEnum;
@override
- Member defaultMember(Member node) {
+ Member defaultMember(Member node, TreeNode removalSentinel) {
if (!shaker.isMemberUsed(node) && !_preserveSpecialMember(node)) {
// Ensure that kernel file writer will not be able to
// write a dangling reference to the deleted member.
node.reference.canonicalName = null;
Statistics.membersDropped++;
- return null;
+ return removalSentinel;
}
if (!shaker.isMemberBodyReachable(node)) {
@@ -1358,7 +1373,7 @@
}
@override
- Extension visitExtension(Extension node) {
+ Extension visitExtension(Extension node, TreeNode removalSentinel) {
if (shaker.isExtensionUsed(node)) {
int writeIndex = 0;
for (int i = 0; i < node.members.length; ++i) {
@@ -1379,7 +1394,7 @@
assert(node.members.length > 0);
return node;
}
- return null;
+ return removalSentinel;
}
void _makeUnreachableBody(FunctionNode function) {
@@ -1391,7 +1406,7 @@
}
@override
- TreeNode defaultTreeNode(TreeNode node) {
+ TreeNode defaultTreeNode(TreeNode node, TreeNode removalSentinel) {
return node; // Do not traverse into other nodes.
}
}
diff --git a/pkg/vm/lib/transformations/unreachable_code_elimination.dart b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
index 8444ce7..10bd958 100644
--- a/pkg/vm/lib/transformations/unreachable_code_elimination.dart
+++ b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
@@ -2,17 +2,20 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+// @dart=2.12
+
import 'package:kernel/ast.dart';
/// Simple unreachable code elimination: removes asserts and if statements
/// with constant conditions. Does a very limited constant folding of
/// logical expressions.
Component transformComponent(Component component, bool enableAsserts) {
- new SimpleUnreachableCodeElimination(enableAsserts).visitComponent(component);
+ new SimpleUnreachableCodeElimination(enableAsserts)
+ .visitComponent(component, null);
return component;
}
-class SimpleUnreachableCodeElimination extends Transformer {
+class SimpleUnreachableCodeElimination extends RemovingTransformer {
final bool enableAsserts;
SimpleUnreachableCodeElimination(this.enableAsserts);
@@ -37,24 +40,27 @@
Expression _createBoolLiteral(bool value, int fileOffset) =>
new BoolLiteral(value)..fileOffset = fileOffset;
- Statement _makeEmptyBlockIfNull(Statement node, TreeNode parent) =>
- node == null ? (Block(<Statement>[])..parent = parent) : node;
+ Statement _makeEmptyBlockIfEmptyStatement(Statement node, TreeNode parent) =>
+ node is EmptyStatement ? (Block(<Statement>[])..parent = parent) : node;
@override
- TreeNode visitIfStatement(IfStatement node) {
- node.transformChildren(this);
+ TreeNode visitIfStatement(IfStatement node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final condition = node.condition;
if (_isBoolConstant(condition)) {
final value = _getBoolConstantValue(condition);
- return value ? node.then : node.otherwise;
+ return value
+ ? node.then
+ : (node.otherwise ?? removalSentinel ?? new EmptyStatement());
}
- node.then = _makeEmptyBlockIfNull(node.then, node);
+ node.then = _makeEmptyBlockIfEmptyStatement(node.then, node);
return node;
}
@override
- visitConditionalExpression(ConditionalExpression node) {
- node.transformChildren(this);
+ visitConditionalExpression(
+ ConditionalExpression node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final condition = node.condition;
if (_isBoolConstant(condition)) {
final value = _getBoolConstantValue(condition);
@@ -64,8 +70,8 @@
}
@override
- TreeNode visitNot(Not node) {
- node.transformChildren(this);
+ TreeNode visitNot(Not node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final operand = node.operand;
if (_isBoolConstant(operand)) {
return _createBoolLiteral(
@@ -75,8 +81,9 @@
}
@override
- TreeNode visitLogicalExpression(LogicalExpression node) {
- node.transformChildren(this);
+ TreeNode visitLogicalExpression(
+ LogicalExpression node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final left = node.left;
final right = node.right;
final operatorEnum = node.operatorEnum;
@@ -104,8 +111,8 @@
}
@override
- visitStaticGet(StaticGet node) {
- node.transformChildren(this);
+ visitStaticGet(StaticGet node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final target = node.target;
if (target is Field && target.isConst) {
throw 'StaticGet from const field $target should be evaluated by front-end: $node';
@@ -114,34 +121,38 @@
}
@override
- TreeNode visitAssertStatement(AssertStatement node) {
+ TreeNode visitAssertStatement(
+ AssertStatement node, TreeNode? removalSentinel) {
if (!enableAsserts) {
- return null;
+ return removalSentinel ?? new EmptyStatement();
}
- return super.visitAssertStatement(node);
+ return super.visitAssertStatement(node, removalSentinel);
}
@override
- TreeNode visitAssertBlock(AssertBlock node) {
+ TreeNode visitAssertBlock(AssertBlock node, TreeNode? removalSentinel) {
if (!enableAsserts) {
- return null;
+ return removalSentinel ?? new EmptyStatement();
}
- return super.visitAssertBlock(node);
+ return super.visitAssertBlock(node, removalSentinel);
}
@override
- TreeNode visitAssertInitializer(AssertInitializer node) {
+ TreeNode visitAssertInitializer(
+ AssertInitializer node, TreeNode? removalSentinel) {
if (!enableAsserts) {
- return null;
+ // Initializers only occur in the initializer list where they are always
+ // removable.
+ return removalSentinel!;
}
- return super.visitAssertInitializer(node);
+ return super.visitAssertInitializer(node, removalSentinel);
}
@override
- TreeNode visitTryFinally(TryFinally node) {
- node.transformChildren(this);
+ TreeNode visitTryFinally(TryFinally node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
final fin = node.finalizer;
- if (fin == null || (fin is Block && fin.statements.isEmpty)) {
+ if (fin is EmptyStatement || (fin is Block && fin.statements.isEmpty)) {
return node.body;
}
return node;
@@ -157,8 +168,8 @@
}
@override
- TreeNode visitTryCatch(TryCatch node) {
- node.transformChildren(this);
+ TreeNode visitTryCatch(TryCatch node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
// Can replace try/catch with its body if all catches are just rethow.
for (Catch catchClause in node.catches) {
if (!_isRethrow(catchClause.body)) {
@@ -174,30 +185,30 @@
// need to guard against null.
@override
- TreeNode visitWhileStatement(WhileStatement node) {
- node.transformChildren(this);
- node.body = _makeEmptyBlockIfNull(node.body, node);
+ TreeNode visitWhileStatement(WhileStatement node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
+ node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
return node;
}
@override
- TreeNode visitDoStatement(DoStatement node) {
- node.transformChildren(this);
- node.body = _makeEmptyBlockIfNull(node.body, node);
+ TreeNode visitDoStatement(DoStatement node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
+ node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
return node;
}
@override
- TreeNode visitForStatement(ForStatement node) {
- node.transformChildren(this);
- node.body = _makeEmptyBlockIfNull(node.body, node);
+ TreeNode visitForStatement(ForStatement node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
+ node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
return node;
}
@override
- TreeNode visitForInStatement(ForInStatement node) {
- node.transformChildren(this);
- node.body = _makeEmptyBlockIfNull(node.body, node);
+ TreeNode visitForInStatement(ForInStatement node, TreeNode? removalSentinel) {
+ node.transformOrRemoveChildren(this);
+ node.body = _makeEmptyBlockIfEmptyStatement(node.body, node);
return node;
}
}
diff --git a/tools/VERSION b/tools/VERSION
index ad78b64..f0413ea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 13
PATCH 0
-PRERELEASE 50
+PRERELEASE 51
PRERELEASE_PATCH 0
\ No newline at end of file