diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 7d1287c85cb..f1f7cc375d2 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -110,7 +110,7 @@ import 'expression_generator_helper.dart'; import 'external_ast_helper.dart'; import 'implicit_type_argument.dart' show ImplicitTypeArgument; import 'internal_ast.dart'; -import 'internal_ast_helper.dart'; +import 'internal_ast_helper.dart' as forest; import 'kernel_variable_builder.dart'; import 'load_library_builder.dart'; import 'type_algorithms.dart' show calculateBounds; @@ -179,9 +179,6 @@ abstract class BodyBuilder { class BodyBuilderImpl extends StackListenerImpl implements BodyBuilder, ExpressionGeneratorHelper { - @override - final Forest forest; - @override final SourceLibraryBuilder libraryBuilder; @@ -372,7 +369,6 @@ class BodyBuilderImpl extends StackListenerImpl required this.extensionScope, required ThisVariable? internalThisVariable, }) : _context = context, - forest = const Forest(), enableNative = libraryBuilder.loader.target.backendTarget.enableNative( libraryBuilder.importUri, ), @@ -4072,10 +4068,7 @@ class BodyBuilderImpl extends StackListenerImpl List? continueStatements; if (continueTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(body); - continueStatements = continueTarget.resolveContinues( - forest, - labeledStatement, - ); + continueStatements = continueTarget.resolveContinues(labeledStatement); body = labeledStatement; } Expression? condition; @@ -4100,7 +4093,7 @@ class BodyBuilderImpl extends StackListenerImpl Statement result = forStatement; if (breakTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(result); - breakTarget.resolveBreaks(forest, labeledStatement, forStatement); + breakTarget.resolveBreaks(labeledStatement, forStatement); result = labeledStatement; } if (variableOrExpression is PatternVariableDeclaration) { @@ -8015,10 +8008,7 @@ class BodyBuilderImpl extends StackListenerImpl List? continueStatements; if (continueTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(body); - continueStatements = continueTarget.resolveContinues( - forest, - labeledStatement, - ); + continueStatements = continueTarget.resolveContinues(labeledStatement); body = labeledStatement; } Statement doStatement = forest.createDoStatement( @@ -8036,7 +8026,7 @@ class BodyBuilderImpl extends StackListenerImpl Statement result = doStatement; if (breakTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(result); - breakTarget.resolveBreaks(forest, labeledStatement, doStatement); + breakTarget.resolveBreaks(labeledStatement, doStatement); result = labeledStatement; } exitLoopOrSwitch(result); @@ -8389,10 +8379,7 @@ class BodyBuilderImpl extends StackListenerImpl List? continueStatements; if (continueTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(body); - continueStatements = continueTarget.resolveContinues( - forest, - labeledStatement, - ); + continueStatements = continueTarget.resolveContinues(labeledStatement); body = labeledStatement; } ForInElements elements = _computeForInElements( @@ -8437,7 +8424,7 @@ class BodyBuilderImpl extends StackListenerImpl Statement result = forInStatement; if (breakTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(result); - breakTarget.resolveBreaks(forest, labeledStatement, forInStatement); + breakTarget.resolveBreaks(labeledStatement, forInStatement); result = labeledStatement; } if (problem != null) { @@ -8496,9 +8483,9 @@ class BodyBuilderImpl extends StackListenerImpl if (statement is! LabeledStatement) { statement = forest.createLabeledStatement(statement); } - target.breakTarget.resolveBreaks(forest, statement, statement); + target.breakTarget.resolveBreaks(statement, statement); List? continueStatements = target.continueTarget - .resolveContinues(forest, statement); + .resolveContinues(statement); if (continueStatements != null) { for (BreakStatementImpl continueStatement in continueStatements) { continueStatement.targetStatement = statement; @@ -8592,10 +8579,7 @@ class BodyBuilderImpl extends StackListenerImpl List? continueStatements; if (continueTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(body); - continueStatements = continueTarget.resolveContinues( - forest, - labeledStatement, - ); + continueStatements = continueTarget.resolveContinues(labeledStatement); body = labeledStatement; } Statement whileStatement = forest.createWhileStatement( @@ -8611,7 +8595,7 @@ class BodyBuilderImpl extends StackListenerImpl Statement result = whileStatement; if (breakTarget.hasUsers) { LabeledStatement labeledStatement = forest.createLabeledStatement(result); - breakTarget.resolveBreaks(forest, labeledStatement, whileStatement); + breakTarget.resolveBreaks(labeledStatement, whileStatement); result = labeledStatement; } exitLoopOrSwitch(result); @@ -9291,7 +9275,7 @@ class BodyBuilderImpl extends StackListenerImpl // when they have no target. if (target.hasUsers || libraryFeatures.patterns.isEnabled) { LabeledStatement labeledStatement = forest.createLabeledStatement(result); - target.resolveBreaks(forest, labeledStatement, switchStatement); + target.resolveBreaks(labeledStatement, switchStatement); result = labeledStatement; } exitLoopOrSwitch(result); @@ -9449,7 +9433,7 @@ class BodyBuilderImpl extends StackListenerImpl JumpTarget? target = _switchScope!.lookupLabel(label.name); if (target != null) { (caseLabelUsers[i] ??= []).addAll(target.users); - target.resolveGotos(forest, current); + target.resolveGotos(current); } } } diff --git a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart index c14909beb4b..56e15de8323 100644 --- a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart +++ b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart @@ -67,11 +67,7 @@ class JumpTarget { users.add(statement); } - void resolveBreaks( - Forest forest, - LabeledStatement target, - Statement targetStatement, - ) { + void resolveBreaks(LabeledStatement target, Statement targetStatement) { assert(isBreakTarget); for (Statement user in users) { BreakStatementImpl breakStatement = user as BreakStatementImpl; @@ -81,10 +77,7 @@ class JumpTarget { users.clear(); } - List? resolveContinues( - Forest forest, - LabeledStatement target, - ) { + List? resolveContinues(LabeledStatement target) { assert(isContinueTarget); List statements = []; for (Statement user in users) { @@ -96,7 +89,7 @@ class JumpTarget { return statements; } - void resolveGotos(Forest forest, SwitchCase target) { + void resolveGotos(SwitchCase target) { assert(isGotoTarget); for (Statement user in users) { ContinueSwitchStatement continueSwitchStatement = @@ -174,26 +167,19 @@ class LabelTarget implements JumpTarget { @override // Coverage-ignore(suite): Not run. - void resolveBreaks( - Forest forest, - LabeledStatement target, - Statement targetStatement, - ) { - breakTarget.resolveBreaks(forest, target, targetStatement); + void resolveBreaks(LabeledStatement target, Statement targetStatement) { + breakTarget.resolveBreaks(target, targetStatement); } @override // Coverage-ignore(suite): Not run. - List? resolveContinues( - Forest forest, - LabeledStatement target, - ) { - return continueTarget.resolveContinues(forest, target); + List? resolveContinues(LabeledStatement target) { + return continueTarget.resolveContinues(target); } @override // Coverage-ignore(suite): Not run. - void resolveGotos(Forest forest, SwitchCase target) { + void resolveGotos(SwitchCase target) { unsupported("resolveGotos", charOffset, fileUri); } } diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart index 1c614887dcf..866004fac7f 100644 --- a/pkg/front_end/lib/src/kernel/expression_generator.dart +++ b/pkg/front_end/lib/src/kernel/expression_generator.dart @@ -54,7 +54,7 @@ import 'constness.dart' show Constness; import 'expression_generator_helper.dart'; import 'external_ast_helper.dart'; import 'internal_ast.dart'; -import 'internal_ast_helper.dart'; +import 'internal_ast_helper.dart' as _forest; import 'load_library_builder.dart'; import 'utils.dart'; @@ -80,9 +80,6 @@ abstract class Generator { Generator(this._helper, this.token) : fileOffset = offsetForToken(token); - /// Easy access to the [Forest] factory object. - Forest get _forest => _helper.forest; - // TODO(johnniwinther): Improve the semantic precision of this property or // remove it. It's unclear if the semantics is inconsistent. It's for instance // used both for the name of a variable in [VariableUseGenerator] and for @@ -524,7 +521,7 @@ class VariableUseGenerator extends Generator { bool isPreIncDec = false, bool isPostIncDec = false, }) { - Expression binary = _helper.forest.createBinary( + Expression binary = _forest.createBinary( operatorOffset, _createRead(), binaryOperator, @@ -588,7 +585,7 @@ class VariableUseGenerator extends Generator { required ActualArguments arguments, bool isTypeArgumentsInForest = false, }) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( adjustForImplicitCall(_plainNameForRead, offset), buildSimpleRead(), typeArguments, @@ -764,7 +761,7 @@ class PropertyAccessGenerator extends Generator { bool voidContext = false, bool forOutput = false, }) { - return _helper.forest.createPropertySet( + return _forest.createPropertySet( fileOffset, receiver, name, @@ -883,7 +880,7 @@ class PropertyAccessGenerator extends Generator { Name name, bool isNullAware, ) { - if (helper.forest.isThisExpression(receiver)) { + if (_forest.isThisExpression(receiver)) { // Coverage-ignore-block(suite): Not run. return new ThisPropertyAccessGenerator( helper, @@ -996,7 +993,7 @@ class ThisPropertyAccessGenerator extends Generator { required bool forEffect, }) { _helper.readInternalThisVariable(); - return _helper.forest.createPropertySet( + return _forest.createPropertySet( fileOffset, _thisExpression, name, @@ -1029,7 +1026,7 @@ class ThisPropertyAccessGenerator extends Generator { bool isPreIncDec = false, bool isPostIncDec = false, }) { - Expression binary = _helper.forest.createBinary( + Expression binary = _forest.createBinary( operatorOffset, _createRead(), binaryOperator, @@ -1378,7 +1375,7 @@ class SuperPropertyAccessGenerator extends Generator { bool isPreIncDec = false, bool isPostIncDec = false, }) { - Expression binary = _helper.forest.createBinary( + Expression binary = _forest.createBinary( operatorOffset, _createRead(), binaryOperator, @@ -1491,7 +1488,7 @@ class SuperPropertyAccessGenerator extends Generator { kind: UnresolvedKind.Method, ); } else if (isFieldOrGetter(getter)) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset, buildSimpleRead(), typeArguments, @@ -1654,7 +1651,7 @@ class IndexedAccessGenerator extends Generator { bool isTypeArgumentsInForest = false, }) { _helper.readInternalThisVariable(); - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( arguments.fileOffset, buildSimpleRead(), typeArguments, @@ -1694,7 +1691,7 @@ class IndexedAccessGenerator extends Generator { Expression index, { required bool isNullAware, }) { - if (helper.forest.isThisExpression(receiver)) { + if (_forest.isThisExpression(receiver)) { // Coverage-ignore-block(suite): Not run. return new ThisIndexedAccessGenerator( helper, @@ -1742,7 +1739,7 @@ class ThisIndexedAccessGenerator extends Generator { @override Expression buildSimpleRead() { _helper.readInternalThisVariable(); - Expression receiver = _helper.forest.createThisExpression(fileOffset); + Expression receiver = _forest.createThisExpression(fileOffset); return _forest.createIndexGet( fileOffset, receiver, @@ -1758,7 +1755,7 @@ class ThisIndexedAccessGenerator extends Generator { bool forOutput = false, }) { _helper.readInternalThisVariable(); - Expression receiver = _helper.forest.createThisExpression(fileOffset); + Expression receiver = _forest.createThisExpression(fileOffset); return _forest.createIndexSet( fileOffset, receiver, @@ -1777,7 +1774,7 @@ class ThisIndexedAccessGenerator extends Generator { bool voidContext = false, }) { _helper.readInternalThisVariable(); - Expression receiver = _helper.forest.createThisExpression(fileOffset); + Expression receiver = _forest.createThisExpression(fileOffset); return new IfNullIndexSet( receiver: receiver, index: index, @@ -1800,7 +1797,7 @@ class ThisIndexedAccessGenerator extends Generator { bool isPostIncDec = false, }) { _helper.readInternalThisVariable(); - Expression receiver = _helper.forest.createThisExpression(fileOffset); + Expression receiver = _forest.createThisExpression(fileOffset); return new CompoundIndexSet( receiver: receiver, index: index, @@ -1840,7 +1837,7 @@ class ThisIndexedAccessGenerator extends Generator { required ActualArguments arguments, bool isTypeArgumentsInForest = false, }) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset, buildSimpleRead(), typeArguments, @@ -1908,12 +1905,12 @@ class SuperIndexedAccessGenerator extends Generator { ); } else { _helper.readInternalThisVariable(); - return _helper.forest.createSuperMethodInvocation( + return _forest.createSuperMethodInvocation( fileOffset, indexGetName, getter, null, - _helper.forest.createArguments( + _forest.createArguments( fileOffset, arguments: [new PositionalArgument(index)], hasNamedBeforePositional: false, @@ -1941,12 +1938,12 @@ class SuperIndexedAccessGenerator extends Generator { } else { if (voidContext) { _helper.readInternalThisVariable(); - return _helper.forest.createSuperMethodInvocation( + return _forest.createSuperMethodInvocation( fileOffset, indexSetName, setter, null, - _helper.forest.createArguments( + _forest.createArguments( fileOffset, arguments: [ new PositionalArgument(index), @@ -2040,7 +2037,7 @@ class SuperIndexedAccessGenerator extends Generator { bool isTypeArgumentsInForest = false, }) { _helper.readInternalThisVariable(); - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset, buildSimpleRead(), typeArguments, @@ -2204,9 +2201,9 @@ class StaticAccessGenerator extends Generator { read = _makeInvalidRead(unresolvedKind: UnresolvedKind.Getter); } else { if (readTarget is Procedure && readTarget.kind == ProcedureKind.Method) { - read = _helper.forest.createStaticTearOff(fileOffset, readTarget); + read = _forest.createStaticTearOff(fileOffset, readTarget); } else { - read = _helper.forest.createStaticGet(fileOffset, readTarget); + read = _forest.createStaticGet(fileOffset, readTarget); } } return read; @@ -2254,7 +2251,7 @@ class StaticAccessGenerator extends Generator { bool isPreIncDec = false, bool isPostIncDec = false, }) { - Expression binary = _helper.forest.createBinary( + Expression binary = _forest.createBinary( operatorOffset, _createRead(), binaryOperator, @@ -2339,7 +2336,7 @@ class StaticAccessGenerator extends Generator { } if (invokeTarget == null || (readTarget != null && isFieldOrGetter(readTarget!))) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset + (readTarget?.name.text.length ?? 0), buildSimpleRead(), typeArguments, @@ -3486,7 +3483,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator { required ActualArguments arguments, bool isTypeArgumentsInForest = false, }) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset, buildSimpleRead(), typeArguments, @@ -3853,7 +3850,7 @@ class LoadLibraryGenerator extends Generator { builder.importDependency.targetLibrary; LoadLibraryTearOff read = new LoadLibraryTearOff( builder.importDependency, - builder.createTearoffMethod(_helper.forest), + builder.createTearoffMethod(), )..fileOffset = fileOffset; return read; } @@ -3927,7 +3924,7 @@ class LoadLibraryGenerator extends Generator { 'loadLibrary'.length, ); } - return builder.createLoadLibrary(offset, _forest, arguments); + return builder.createLoadLibrary(offset, arguments); } @override @@ -4550,24 +4547,23 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { length: name.text.length, ); } - tearOffExpression = _helper.forest.createConstructorTearOff( + tearOffExpression = _forest.createConstructorTearOff( token.charOffset, tearOff, ); } else if (tearOff is Procedure) { if (tearOff.isRedirectingFactory) { - tearOffExpression = _helper.forest - .createRedirectingFactoryTearOff( - token.charOffset, - tearOff, - ); + tearOffExpression = _forest.createRedirectingFactoryTearOff( + token.charOffset, + tearOff, + ); } else if (tearOff.isFactory) { - tearOffExpression = _helper.forest.createConstructorTearOff( + tearOffExpression = _forest.createConstructorTearOff( token.charOffset, tearOff, ); } else { - tearOffExpression = _helper.forest.createStaticTearOff( + tearOffExpression = _forest.createStaticTearOff( token.charOffset, tearOff, ); @@ -4648,12 +4644,12 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { if (tearOffLowering != null) { if (tearOffLowering.isFactory) { // Coverage-ignore-block(suite): Not run. - return _helper.forest.createConstructorTearOff( + return _forest.createConstructorTearOff( token.charOffset, tearOffLowering, ); } else { - return _helper.forest.createStaticTearOff( + return _forest.createStaticTearOff( token.charOffset, tearOffLowering, ); @@ -4677,7 +4673,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { substitutedTypeArguments, ); - tearOffExpression = _helper.forest.createTypedefTearOff( + tearOffExpression = _forest.createTypedefTearOff( token.charOffset, freshTypeParameters.freshTypeParameters, tearOffExpression, @@ -4688,7 +4684,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { builtTypeArguments.isNotEmpty) { builtTypeArguments = unaliasTypes(builtTypeArguments)!; - tearOffExpression = _helper.forest.createInstantiation( + tearOffExpression = _forest.createInstantiation( token.charOffset, tearOffExpression, builtTypeArguments, @@ -5119,7 +5115,7 @@ abstract class AbstractReadOnlyAccessGenerator extends Generator { required ActualArguments arguments, bool isTypeArgumentsInForest = false, }) { - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( adjustForImplicitCall(targetName, offset), _createRead(), typeArguments, @@ -6679,7 +6675,7 @@ class ThisAccessGenerator extends Generator { ); } else { _helper.readInternalThisVariable(); - return _helper.forest.createExpressionInvocation( + return _forest.createExpressionInvocation( offset, _forest.createThisExpression(fileOffset), typeArguments, @@ -7023,7 +7019,7 @@ class ParenthesizedExpressionGenerator extends AbstractReadOnlyAccessGenerator { @override Expression _createRead() => - _helper.forest.createParenthesized(expression.fileOffset, expression); + _forest.createParenthesized(expression.fileOffset, expression); @override // Coverage-ignore(suite): Not run. @@ -7355,7 +7351,7 @@ class AugmentSuperAccessGenerator extends Generator { // augmented getters, and augmenting fields only have read access to the // augmented field initializer expression. - Expression binary = _helper.forest.createBinary( + Expression binary = _forest.createBinary( operatorOffset, _createRead(), binaryOperator, diff --git a/pkg/front_end/lib/src/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/kernel/expression_generator_helper.dart index 9b7acb84c64..d755f6c14ac 100644 --- a/pkg/front_end/lib/src/kernel/expression_generator_helper.dart +++ b/pkg/front_end/lib/src/kernel/expression_generator_helper.dart @@ -25,7 +25,6 @@ import '../source/source_library_builder.dart' show SourceLibraryBuilder; import 'constness.dart' show Constness; import 'expression_generator.dart'; import 'internal_ast.dart'; -import 'internal_ast_helper.dart'; /// Alias for Expression | Generator typedef Expression_Generator = dynamic; @@ -52,8 +51,6 @@ abstract class ExpressionGeneratorHelper { /// [ExpressionGenerator]s. InstanceTypeParameterAccessState get instanceTypeParameterAccessState; - Forest get forest; - ProblemReporting get problemReporting; CompilerContext get compilerContext; diff --git a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart index a7ef4db134d..01f750ef5c5 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart @@ -24,1164 +24,1136 @@ import 'collections.dart' SpreadElement; import 'internal_ast.dart'; -/// A shadow tree factory. -class Forest { - const Forest(); +ActualArguments createArguments( + int fileOffset, { + required List arguments, + required bool hasNamedBeforePositional, + required int positionalCount, +}) { + return new ActualArguments( + argumentList: arguments, + hasNamedBeforePositional: hasNamedBeforePositional, + positionalCount: positionalCount, + )..fileOffset = fileOffset; +} - ActualArguments createArguments( - int fileOffset, { - required List arguments, - required bool hasNamedBeforePositional, - required int positionalCount, - }) { - return new ActualArguments( - argumentList: arguments, - hasNamedBeforePositional: hasNamedBeforePositional, - positionalCount: positionalCount, - )..fileOffset = fileOffset; - } +ActualArguments createArgumentsEmpty(int fileOffset) { + return createArguments( + fileOffset, + arguments: [], + hasNamedBeforePositional: false, + positionalCount: 0, + ); +} - ActualArguments createArgumentsEmpty(int fileOffset) { - return createArguments( - fileOffset, - arguments: [], - hasNamedBeforePositional: false, - positionalCount: 0, - ); - } +/// Return a representation of a boolean literal at the given [fileOffset]. +/// The literal has the given [value]. +BoolLiteral createBoolLiteral(int fileOffset, bool value) { + return new BoolLiteral(value)..fileOffset = fileOffset; +} - /// Return a representation of a boolean literal at the given [fileOffset]. - /// The literal has the given [value]. - BoolLiteral createBoolLiteral(int fileOffset, bool value) { - return new BoolLiteral(value)..fileOffset = fileOffset; - } +/// Return a representation of a double literal at the given [fileOffset]. The +/// literal has the given [value]. +DoubleLiteral createDoubleLiteral(int fileOffset, double value) { + return new DoubleLiteral(value)..fileOffset = fileOffset; +} - /// Return a representation of a double literal at the given [fileOffset]. The - /// literal has the given [value]. - DoubleLiteral createDoubleLiteral(int fileOffset, double value) { - return new DoubleLiteral(value)..fileOffset = fileOffset; - } +/// Return a representation of an integer literal at the given [fileOffset]. +/// The literal has the given [value]. +IntLiteral createIntLiteral(int fileOffset, int value, [String? literal]) { + return new IntJudgment(value, literal)..fileOffset = fileOffset; +} - /// Return a representation of an integer literal at the given [fileOffset]. - /// The literal has the given [value]. - IntLiteral createIntLiteral(int fileOffset, int value, [String? literal]) { - return new IntJudgment(value, literal)..fileOffset = fileOffset; - } +IntLiteral createIntLiteralLarge( + int fileOffset, + String strippedLiteral, + String literal, +) { + return new ShadowLargeIntLiteral(strippedLiteral, literal, fileOffset); +} - IntLiteral createIntLiteralLarge( - int fileOffset, - String strippedLiteral, - String literal, - ) { - return new ShadowLargeIntLiteral(strippedLiteral, literal, fileOffset); - } +/// Return a representation of a list literal at the given [fileOffset]. The +/// [isConst] is `true` if the literal is either explicitly or implicitly a +/// constant. The [typeArgument] is the representation of the single valid +/// type argument preceding the list literal, or `null` if there is no type +/// argument, there is more than one type argument, or if the type argument +/// cannot be resolved. The list of [expressions] is a list of the +/// representations of the list elements. +ListLiteral createListLiteral( + int fileOffset, + DartType typeArgument, + List expressions, { + required bool isConst, +}) { + return new ListLiteral( + expressions, + typeArgument: typeArgument, + isConst: isConst, + )..fileOffset = fileOffset; +} - /// Return a representation of a list literal at the given [fileOffset]. The - /// [isConst] is `true` if the literal is either explicitly or implicitly a - /// constant. The [typeArgument] is the representation of the single valid - /// type argument preceding the list literal, or `null` if there is no type - /// argument, there is more than one type argument, or if the type argument - /// cannot be resolved. The list of [expressions] is a list of the - /// representations of the list elements. - ListLiteral createListLiteral( - int fileOffset, - DartType typeArgument, - List expressions, { - required bool isConst, - }) { - return new ListLiteral( - expressions, - typeArgument: typeArgument, - isConst: isConst, - )..fileOffset = fileOffset; - } +/// Return a representation of a set literal at the given [fileOffset]. The +/// [isConst] is `true` if the literal is either explicitly or implicitly a +/// constant. The [typeArgument] is the representation of the single valid +/// type argument preceding the set literal, or `null` if there is no type +/// argument, there is more than one type argument, or if the type argument +/// cannot be resolved. The list of [expressions] is a list of the +/// representations of the set elements. +SetLiteral createSetLiteral( + int fileOffset, + DartType typeArgument, + List expressions, { + required bool isConst, +}) { + return new SetLiteral( + expressions, + typeArgument: typeArgument, + isConst: isConst, + )..fileOffset = fileOffset; +} - /// Return a representation of a set literal at the given [fileOffset]. The - /// [isConst] is `true` if the literal is either explicitly or implicitly a - /// constant. The [typeArgument] is the representation of the single valid - /// type argument preceding the set literal, or `null` if there is no type - /// argument, there is more than one type argument, or if the type argument - /// cannot be resolved. The list of [expressions] is a list of the - /// representations of the set elements. - SetLiteral createSetLiteral( - int fileOffset, - DartType typeArgument, - List expressions, { - required bool isConst, - }) { - return new SetLiteral( - expressions, - typeArgument: typeArgument, - isConst: isConst, - )..fileOffset = fileOffset; - } +/// Return a representation of a map literal at the given [fileOffset]. The +/// [isConst] is `true` if the literal is either explicitly or implicitly a +/// constant. The [keyType] is the representation of the first type argument +/// preceding the map literal, or `null` if there are not exactly two type +/// arguments or if the first type argument cannot be resolved. The +/// [valueType] is the representation of the second type argument preceding +/// the map literal, or `null` if there are not exactly two type arguments or +/// if the second type argument cannot be resolved. The list of [entries] is a +/// list of the representations of the map entries. +MapLiteral createMapLiteral( + int fileOffset, + DartType keyType, + DartType valueType, + List entries, { + required bool isConst, +}) { + return new MapLiteral( + entries, + keyType: keyType, + valueType: valueType, + isConst: isConst, + )..fileOffset = fileOffset; +} - /// Return a representation of a map literal at the given [fileOffset]. The - /// [isConst] is `true` if the literal is either explicitly or implicitly a - /// constant. The [keyType] is the representation of the first type argument - /// preceding the map literal, or `null` if there are not exactly two type - /// arguments or if the first type argument cannot be resolved. The - /// [valueType] is the representation of the second type argument preceding - /// the map literal, or `null` if there are not exactly two type arguments or - /// if the second type argument cannot be resolved. The list of [entries] is a - /// list of the representations of the map entries. - MapLiteral createMapLiteral( - int fileOffset, - DartType keyType, - DartType valueType, - List entries, { - required bool isConst, - }) { - return new MapLiteral( - entries, - keyType: keyType, - valueType: valueType, - isConst: isConst, - )..fileOffset = fileOffset; - } +/// Return a representation of a null literal at the given [fileOffset]. +NullLiteral createNullLiteral(int fileOffset) { + return new NullLiteral()..fileOffset = fileOffset; +} - /// Return a representation of a null literal at the given [fileOffset]. - NullLiteral createNullLiteral(int fileOffset) { - return new NullLiteral()..fileOffset = fileOffset; - } +/// Return a representation of a simple string literal at the given +/// [fileOffset]. The literal has the given [value]. This does not include +/// either adjacent strings or interpolated strings. +StringLiteral createStringLiteral(int fileOffset, String value) { + return new StringLiteral(value)..fileOffset = fileOffset; +} - /// Return a representation of a simple string literal at the given - /// [fileOffset]. The literal has the given [value]. This does not include - /// either adjacent strings or interpolated strings. - StringLiteral createStringLiteral(int fileOffset, String value) { - return new StringLiteral(value)..fileOffset = fileOffset; - } +/// Return a representation of a symbol literal defined by [value] at the +/// given [fileOffset]. +SymbolLiteral createSymbolLiteral(int fileOffset, String value) { + return new SymbolLiteral(value)..fileOffset = fileOffset; +} - /// Return a representation of a symbol literal defined by [value] at the - /// given [fileOffset]. - SymbolLiteral createSymbolLiteral(int fileOffset, String value) { - return new SymbolLiteral(value)..fileOffset = fileOffset; - } +TypeLiteral createTypeLiteral(int fileOffset, DartType type) { + return new TypeLiteral(type)..fileOffset = fileOffset; +} - TypeLiteral createTypeLiteral(int fileOffset, DartType type) { - return new TypeLiteral(type)..fileOffset = fileOffset; - } +/// Return a representation of a key/value pair in a literal map at the given +/// [fileOffset]. The [key] is the representation of the expression used to +/// compute the key. The [value] is the representation of the expression used +/// to compute the value. +MapLiteralEntry createMapEntry( + int fileOffset, + Expression key, + Expression value, +) { + return new MapLiteralEntry(key, value)..fileOffset = fileOffset; +} - /// Return a representation of a key/value pair in a literal map at the given - /// [fileOffset]. The [key] is the representation of the expression used to - /// compute the key. The [value] is the representation of the expression used - /// to compute the value. - MapLiteralEntry createMapEntry( - int fileOffset, - Expression key, - Expression value, - ) { - return new MapLiteralEntry(key, value)..fileOffset = fileOffset; - } +/// Return a representation of a null-aware key/value pair, were either the +/// key or the value might be `null`, in a literal map at the given +/// [fileOffset]. The [key] is the representation of the expression used to +/// compute the key. The [value] is the representation of the expression used +/// to compute the value. +NullAwareMapEntry createNullAwareMapEntry( + int fileOffset, { + required bool isKeyNullAware, + required Expression key, + required bool isValueNullAware, + required Expression value, +}) { + return new NullAwareMapEntry( + isKeyNullAware: isKeyNullAware, + key: key, + isValueNullAware: isValueNullAware, + value: value, + )..fileOffset = fileOffset; +} - /// Return a representation of a null-aware key/value pair, were either the - /// key or the value might be `null`, in a literal map at the given - /// [fileOffset]. The [key] is the representation of the expression used to - /// compute the key. The [value] is the representation of the expression used - /// to compute the value. - NullAwareMapEntry createNullAwareMapEntry( - int fileOffset, { - required bool isKeyNullAware, - required Expression key, - required bool isValueNullAware, - required Expression value, - }) { - return new NullAwareMapEntry( - isKeyNullAware: isKeyNullAware, - key: key, - isValueNullAware: isValueNullAware, - value: value, - )..fileOffset = fileOffset; - } +LoadLibrary createLoadLibrary( + int fileOffset, + LibraryDependency dependency, + ActualArguments? arguments, +) { + return new LoadLibraryImpl(dependency, arguments)..fileOffset = fileOffset; +} - LoadLibrary createLoadLibrary( - int fileOffset, - LibraryDependency dependency, - ActualArguments? arguments, - ) { - return new LoadLibraryImpl(dependency, arguments)..fileOffset = fileOffset; - } +Expression checkLibraryIsLoaded(int fileOffset, LibraryDependency dependency) { + return new CheckLibraryIsLoaded(dependency)..fileOffset = fileOffset; +} - Expression checkLibraryIsLoaded( - int fileOffset, - LibraryDependency dependency, - ) { - return new CheckLibraryIsLoaded(dependency)..fileOffset = fileOffset; - } +Expression createAsExpression( + int fileOffset, + Expression expression, + DartType type, { + bool forDynamic = false, +}) { + return new AsExpression(expression, type) + ..fileOffset = fileOffset + ..isForDynamic = forDynamic; +} - Expression createAsExpression( - int fileOffset, - Expression expression, - DartType type, { - bool forDynamic = false, - }) { - return new AsExpression(expression, type) - ..fileOffset = fileOffset - ..isForDynamic = forDynamic; - } +Expression createSpreadElement( + int fileOffset, + Expression expression, { + required bool isNullAware, +}) { + return new SpreadElement(expression, isNullAware: isNullAware) + ..fileOffset = fileOffset; +} - Expression createSpreadElement( - int fileOffset, - Expression expression, { - required bool isNullAware, - }) { - return new SpreadElement(expression, isNullAware: isNullAware) - ..fileOffset = fileOffset; - } +Expression createNullAwareElement(int fileOffset, Expression expression) { + return new NullAwareElement(expression)..fileOffset = fileOffset; +} - Expression createNullAwareElement(int fileOffset, Expression expression) { - return new NullAwareElement(expression)..fileOffset = fileOffset; - } +Expression createIfElement( + int fileOffset, + Expression condition, + Expression then, [ + Expression? otherwise, +]) { + return new IfElement(condition, then, otherwise)..fileOffset = fileOffset; +} - Expression createIfElement( - int fileOffset, - Expression condition, - Expression then, [ - Expression? otherwise, - ]) { - return new IfElement(condition, then, otherwise)..fileOffset = fileOffset; - } +Expression createIfCaseElement( + int fileOffset, { + required List prelude, + required Expression expression, + required PatternGuard patternGuard, + required Expression then, + Expression? otherwise, +}) { + return new IfCaseElement( + prelude: prelude, + expression: expression, + patternGuard: patternGuard, + then: then, + otherwise: otherwise, + )..fileOffset = fileOffset; +} - Expression createIfCaseElement( - int fileOffset, { - required List prelude, - required Expression expression, - required PatternGuard patternGuard, - required Expression then, - Expression? otherwise, - }) { - return new IfCaseElement( - prelude: prelude, - expression: expression, - patternGuard: patternGuard, - then: then, - otherwise: otherwise, - )..fileOffset = fileOffset; - } +MapLiteralEntry createIfMapEntry( + int fileOffset, + Expression condition, + MapLiteralEntry then, [ + MapLiteralEntry? otherwise, +]) { + return new IfMapEntry(condition, then, otherwise)..fileOffset = fileOffset; +} - MapLiteralEntry createIfMapEntry( - int fileOffset, - Expression condition, - MapLiteralEntry then, [ - MapLiteralEntry? otherwise, - ]) { - return new IfMapEntry(condition, then, otherwise)..fileOffset = fileOffset; - } +MapLiteralEntry createIfCaseMapEntry( + int fileOffset, { + required List prelude, + required Expression expression, + required PatternGuard patternGuard, + required MapLiteralEntry then, + MapLiteralEntry? otherwise, +}) { + return new IfCaseMapEntry( + prelude: prelude, + expression: expression, + patternGuard: patternGuard, + then: then, + otherwise: otherwise, + )..fileOffset = fileOffset; +} - MapLiteralEntry createIfCaseMapEntry( - int fileOffset, { - required List prelude, - required Expression expression, - required PatternGuard patternGuard, - required MapLiteralEntry then, - MapLiteralEntry? otherwise, - }) { - return new IfCaseMapEntry( - prelude: prelude, - expression: expression, - patternGuard: patternGuard, - then: then, - otherwise: otherwise, - )..fileOffset = fileOffset; - } +ForElement createForElement( + int fileOffset, + List variables, + Expression? condition, + List updates, + Expression body, +) { + return new ForElement(variables, condition, updates, body) + ..fileOffset = fileOffset; +} - ForElement createForElement( - int fileOffset, - List variables, - Expression? condition, - List updates, - Expression body, - ) { - return new ForElement(variables, condition, updates, body) - ..fileOffset = fileOffset; - } +PatternForElement createPatternForElement( + int fileOffset, { + required PatternVariableDeclaration patternVariableDeclaration, + required List intermediateVariables, + required List variables, + required Expression? condition, + required List updates, + required Expression body, +}) { + return new PatternForElement( + patternVariableDeclaration: patternVariableDeclaration, + intermediateVariables: intermediateVariables, + variables: variables, + condition: condition, + updates: updates, + body: body, + )..fileOffset = fileOffset; +} - PatternForElement createPatternForElement( - int fileOffset, { - required PatternVariableDeclaration patternVariableDeclaration, - required List intermediateVariables, - required List variables, - required Expression? condition, - required List updates, - required Expression body, - }) { - return new PatternForElement( - patternVariableDeclaration: patternVariableDeclaration, - intermediateVariables: intermediateVariables, - variables: variables, - condition: condition, - updates: updates, - body: body, - )..fileOffset = fileOffset; - } +ForMapEntry createForMapEntry( + int fileOffset, + List variables, + Expression? condition, + List updates, + MapLiteralEntry body, +) { + return new ForMapEntry(variables, condition, updates, body) + ..fileOffset = fileOffset; +} - ForMapEntry createForMapEntry( - int fileOffset, - List variables, - Expression? condition, - List updates, - MapLiteralEntry body, - ) { - return new ForMapEntry(variables, condition, updates, body) - ..fileOffset = fileOffset; - } +PatternForMapEntry createPatternForMapEntry( + int fileOffset, { + required PatternVariableDeclaration patternVariableDeclaration, + required List intermediateVariables, + required List variableInitializations, + required Expression? condition, + required List updates, + required MapLiteralEntry body, +}) { + return new PatternForMapEntry( + patternVariableDeclaration: patternVariableDeclaration, + intermediateVariables: intermediateVariables, + variables: variableInitializations, + condition: condition, + updates: updates, + body: body, + )..fileOffset = fileOffset; +} - PatternForMapEntry createPatternForMapEntry( - int fileOffset, { - required PatternVariableDeclaration patternVariableDeclaration, - required List intermediateVariables, - required List variableInitializations, - required Expression? condition, - required List updates, - required MapLiteralEntry body, - }) { - return new PatternForMapEntry( - patternVariableDeclaration: patternVariableDeclaration, - intermediateVariables: intermediateVariables, - variables: variableInitializations, - condition: condition, - updates: updates, - body: body, - )..fileOffset = fileOffset; - } +ForInElement createForInElement( + int fileOffset, + Variable variable, + Expression iterable, + Expression? synthesizedAssignment, + Statement? expressionEffects, + Expression body, + Expression? problem, { + bool isAsync = false, +}) { + return new ForInElement( + variable, + iterable, + synthesizedAssignment, + expressionEffects, + body, + problem, + isAsync: isAsync, + )..fileOffset = fileOffset; +} - ForInElement createForInElement( - int fileOffset, - Variable variable, - Expression iterable, - Expression? synthesizedAssignment, - Statement? expressionEffects, - Expression body, - Expression? problem, { - bool isAsync = false, - }) { - return new ForInElement( - variable, - iterable, - synthesizedAssignment, - expressionEffects, - body, - problem, - isAsync: isAsync, - )..fileOffset = fileOffset; - } +ForInMapEntry createForInMapEntry( + int fileOffset, + Variable variable, + Expression iterable, + Expression? synthesizedAssignment, + Statement? expressionEffects, + MapLiteralEntry body, + Expression? problem, { + bool isAsync = false, +}) { + return new ForInMapEntry( + variable, + iterable, + synthesizedAssignment, + expressionEffects, + body, + problem, + isAsync: isAsync, + )..fileOffset = fileOffset; +} - ForInMapEntry createForInMapEntry( - int fileOffset, - Variable variable, - Expression iterable, - Expression? synthesizedAssignment, - Statement? expressionEffects, - MapLiteralEntry body, - Expression? problem, { - bool isAsync = false, - }) { - return new ForInMapEntry( - variable, - iterable, - synthesizedAssignment, - expressionEffects, - body, - problem, - isAsync: isAsync, - )..fileOffset = fileOffset; - } +/// Return a representation of an assert that appears in a constructor's +/// initializer list. +AssertInitializer createAssertInitializer( + int fileOffset, + AssertStatement assertStatement, +) { + return new AssertInitializer(assertStatement)..fileOffset = fileOffset; +} - /// Return a representation of an assert that appears in a constructor's - /// initializer list. - AssertInitializer createAssertInitializer( - int fileOffset, - AssertStatement assertStatement, - ) { - return new AssertInitializer(assertStatement)..fileOffset = fileOffset; - } +/// Return a representation of an assert that appears as a statement. +AssertStatement createAssertStatement( + int fileOffset, + Expression condition, + Expression? message, + int conditionStartOffset, + int conditionEndOffset, +) { + return new AssertStatement( + condition, + conditionStartOffset: conditionStartOffset, + conditionEndOffset: conditionEndOffset, + message: message, + )..fileOffset = fileOffset; +} - /// Return a representation of an assert that appears as a statement. - AssertStatement createAssertStatement( - int fileOffset, - Expression condition, - Expression? message, - int conditionStartOffset, - int conditionEndOffset, - ) { - return new AssertStatement( - condition, - conditionStartOffset: conditionStartOffset, - conditionEndOffset: conditionEndOffset, - message: message, - )..fileOffset = fileOffset; - } +Expression createAwaitExpression(int fileOffset, Expression operand) { + return new AwaitExpression(operand)..fileOffset = fileOffset; +} - Expression createAwaitExpression(int fileOffset, Expression operand) { - return new AwaitExpression(operand)..fileOffset = fileOffset; - } - - /// Return a representation of a block of [statements] at the given - /// [fileOffset]. - Block createBlock( - int fileOffset, - int fileEndOffset, - List statements, - ) { - List? copy; - for (int i = 0; i < statements.length; i++) { - Statement statement = statements[i]; - if (statement is _VariablesDeclaration) { - copy ??= new List.of(statements.getRange(0, i)); - copy.addAll(statement.declarations); - } else if (copy != null) { - copy.add(statement); - } - } - return new Block(copy ?? statements) - ..fileOffset = fileOffset - ..fileEndOffset = fileEndOffset; - } - - /// Return a representation of a break statement. - Statement createBreakStatement(int fileOffset, Object? label) { - // TODO(johnniwinther): Use [label]? - return new BreakStatementImpl(isContinue: false) - ..fileOffset = fileOffset - ..target = label is LabeledStatement ? label : dummyLabeledStatement; - } - - /// Return a representation of a catch clause. - Catch createCatch( - int fileOffset, - DartType exceptionType, - CatchVariable? exceptionParameter, - CatchVariable? stackTraceParameter, - DartType stackTraceType, - Statement body, - ) { - return new Catch( - exceptionParameter, - body, - guard: exceptionType, - stackTrace: stackTraceParameter, - )..fileOffset = fileOffset; - } - - /// Return a representation of a conditional expression at the given - /// [fileOffset]. The [condition] is the expression preceding the question - /// mark. The [thenExpression] is the expression following the question mark. - /// The [elseExpression] is the expression following the colon. - ConditionalExpression createConditionalExpression( - int fileOffset, - Expression condition, - Expression thenExpression, - Expression elseExpression, - ) { - return new ConditionalExpression( - condition, - thenExpression, - elseExpression, - const UnknownType(), - )..fileOffset = fileOffset; - } - - /// Return a representation of a continue statement. - Statement createContinueStatement(int fileOffset, Object? label) { - // TODO(johnniwinther): Use [label]? - return new BreakStatementImpl(isContinue: true)..fileOffset = fileOffset; - } - - /// Return a representation of a do statement. - Statement createDoStatement( - int fileOffset, - Statement body, - Expression condition, - ) { - return new DoStatement(body, condition)..fileOffset = fileOffset; - } - - /// Return a representation of an expression statement at the given - /// [fileOffset] containing the [expression]. - Statement createExpressionStatement(int fileOffset, Expression expression) { - return new ExpressionStatement(expression)..fileOffset = fileOffset; - } - - /// Return a representation of an empty statement at the given [fileOffset]. - Statement createEmptyStatement(int fileOffset) { - return new EmptyStatement()..fileOffset = fileOffset; - } - - /// Return a representation of a for statement. - Statement createForStatement( - int fileOffset, - List? variables, - Expression? condition, - List updaters, - Statement body, - ) { - return new ForStatement( - variables ?? // Coverage-ignore(suite): Not run. - [], - condition, - updaters, - body, - )..fileOffset = fileOffset; - } - - /// Return a representation of an `if` statement. - Statement createIfStatement( - int fileOffset, - Expression condition, - Statement thenStatement, - Statement? elseStatement, - ) { - return new IfStatement(condition, thenStatement, elseStatement) - ..fileOffset = fileOffset; - } - - /// Return a representation of an `is` expression at the given [fileOffset]. - /// The [operand] is the representation of the left operand. The [type] is a - /// representation of the type that is the right operand. If [notFileOffset] - /// is non-null the test is negated the that file offset. - Expression createIsExpression( - int fileOffset, - Expression operand, - DartType type, { - int? notFileOffset, - }) { - Expression result = new IsExpression(operand, type) - ..fileOffset = fileOffset; - if (notFileOffset != null) { - result = createNot(notFileOffset, result); - } - return result; - } - - /// Return a representation of a logical expression at the given [fileOffset] - /// having the [leftOperand], [rightOperand] and the [operatorString] - /// (either `&&` or `||`). - Expression createLogicalExpression( - int fileOffset, - Expression leftOperand, - String operatorString, - Expression rightOperand, - ) { - LogicalExpressionOperator operator; - if (operatorString == '&&') { - operator = LogicalExpressionOperator.AND; - } else if (operatorString == '||') { - operator = LogicalExpressionOperator.OR; - } else { - throw new UnsupportedError( - "Unhandled logical operator '$operatorString'", - ); - } - - return new LogicalExpression(leftOperand, operator, rightOperand) - ..fileOffset = fileOffset; - } - - Expression createNot(int fileOffset, Expression operand) { - return new Not(operand)..fileOffset = fileOffset; - } - - /// Return a representation of a rethrow statement consisting of the - /// rethrow at [rethrowFileOffset] and the statement at [statementFileOffset]. - Statement createRethrowStatement( - int rethrowFileOffset, - int statementFileOffset, - ) { - return new ExpressionStatement( - new Rethrow()..fileOffset = rethrowFileOffset, - )..fileOffset = statementFileOffset; - } - - /// Return a representation of a return statement. - Statement createReturnStatement( - int fileOffset, - Expression? expression, { - bool isArrow = true, - }) { - return new ReturnStatementImpl(isArrow, expression) - ..fileOffset = fileOffset; - } - - Expression createStringConcatenation( - int fileOffset, - List expressions, - ) { - assert(fileOffset != TreeNode.noOffset); - return new StringConcatenation(expressions)..fileOffset = fileOffset; - } - - /// The given [statement] is being used as the target of either a break or - /// continue statement. Return the statement that should be used as the actual - /// target. - LabeledStatement createLabeledStatement(Statement statement) { - return new LabeledStatement(statement)..fileOffset = statement.fileOffset; - } - - Expression createThisExpression(int fileOffset) { - return new ThisExpression()..fileOffset = fileOffset; - } - - /// Return a representation of a throw expression at the given [fileOffset]. - Expression createThrow(int fileOffset, Expression expression) { - return new Throw(expression)..fileOffset = fileOffset; - } - - Statement createTryStatement( - int fileOffset, - Statement tryBlock, - List? catchBlocks, - Statement? finallyBlock, - ) { - return new TryStatement(tryBlock, catchBlocks ?? [], finallyBlock) - ..fileOffset = fileOffset; - } - - _VariablesDeclaration variablesDeclaration( - List declarations, - Uri uri, - ) { - return new _VariablesDeclaration(declarations, uri); - } - - List variablesDeclarationExtractDeclarations( - Object? variablesDeclaration, - ) { - return (variablesDeclaration as _VariablesDeclaration).declarations; - } - - Statement wrapVariables(Statement statement) { +/// Return a representation of a block of [statements] at the given +/// [fileOffset]. +Block createBlock( + int fileOffset, + int fileEndOffset, + List statements, +) { + List? copy; + for (int i = 0; i < statements.length; i++) { + Statement statement = statements[i]; if (statement is _VariablesDeclaration) { - return new Block( - new List.of(statement.declarations, growable: true), - )..fileOffset = statement.fileOffset; - } else if (statement is VariableDeclaration) { - return new Block([statement]) - ..fileOffset = statement.fileOffset; - } else { - return statement; + copy ??= new List.of(statements.getRange(0, i)); + copy.addAll(statement.declarations); + } else if (copy != null) { + copy.add(statement); } } + return new Block(copy ?? statements) + ..fileOffset = fileOffset + ..fileEndOffset = fileEndOffset; +} - /// Return a representation of a while statement at the given [fileOffset] - /// consisting of the given [condition] and [body]. - Statement createWhileStatement( - int fileOffset, - Expression condition, - Statement body, - ) { - return new WhileStatement(condition, body)..fileOffset = fileOffset; +/// Return a representation of a break statement. +Statement createBreakStatement(int fileOffset, Object? label) { + // TODO(johnniwinther): Use [label]? + return new BreakStatementImpl(isContinue: false) + ..fileOffset = fileOffset + ..target = label is LabeledStatement ? label : dummyLabeledStatement; +} + +/// Return a representation of a catch clause. +Catch createCatch( + int fileOffset, + DartType exceptionType, + CatchVariable? exceptionParameter, + CatchVariable? stackTraceParameter, + DartType stackTraceType, + Statement body, +) { + return new Catch( + exceptionParameter, + body, + guard: exceptionType, + stackTrace: stackTraceParameter, + )..fileOffset = fileOffset; +} + +/// Return a representation of a conditional expression at the given +/// [fileOffset]. The [condition] is the expression preceding the question +/// mark. The [thenExpression] is the expression following the question mark. +/// The [elseExpression] is the expression following the colon. +ConditionalExpression createConditionalExpression( + int fileOffset, + Expression condition, + Expression thenExpression, + Expression elseExpression, +) { + return new ConditionalExpression( + condition, + thenExpression, + elseExpression, + const UnknownType(), + )..fileOffset = fileOffset; +} + +/// Return a representation of a continue statement. +Statement createContinueStatement(int fileOffset, Object? label) { + // TODO(johnniwinther): Use [label]? + return new BreakStatementImpl(isContinue: true)..fileOffset = fileOffset; +} + +/// Return a representation of a do statement. +Statement createDoStatement( + int fileOffset, + Statement body, + Expression condition, +) { + return new DoStatement(body, condition)..fileOffset = fileOffset; +} + +/// Return a representation of an expression statement at the given +/// [fileOffset] containing the [expression]. +Statement createExpressionStatement(int fileOffset, Expression expression) { + return new ExpressionStatement(expression)..fileOffset = fileOffset; +} + +/// Return a representation of an empty statement at the given [fileOffset]. +Statement createEmptyStatement(int fileOffset) { + return new EmptyStatement()..fileOffset = fileOffset; +} + +/// Return a representation of a for statement. +Statement createForStatement( + int fileOffset, + List? variables, + Expression? condition, + List updaters, + Statement body, +) { + return new ForStatement( + variables ?? // Coverage-ignore(suite): Not run. + [], + condition, + updaters, + body, + )..fileOffset = fileOffset; +} + +/// Return a representation of an `if` statement. +Statement createIfStatement( + int fileOffset, + Expression condition, + Statement thenStatement, + Statement? elseStatement, +) { + return new IfStatement(condition, thenStatement, elseStatement) + ..fileOffset = fileOffset; +} + +/// Return a representation of an `is` expression at the given [fileOffset]. +/// The [operand] is the representation of the left operand. The [type] is a +/// representation of the type that is the right operand. If [notFileOffset] +/// is non-null the test is negated the that file offset. +Expression createIsExpression( + int fileOffset, + Expression operand, + DartType type, { + int? notFileOffset, +}) { + Expression result = new IsExpression(operand, type)..fileOffset = fileOffset; + if (notFileOffset != null) { + result = createNot(notFileOffset, result); + } + return result; +} + +/// Return a representation of a logical expression at the given [fileOffset] +/// having the [leftOperand], [rightOperand] and the [operatorString] +/// (either `&&` or `||`). +Expression createLogicalExpression( + int fileOffset, + Expression leftOperand, + String operatorString, + Expression rightOperand, +) { + LogicalExpressionOperator operator; + if (operatorString == '&&') { + operator = LogicalExpressionOperator.AND; + } else if (operatorString == '||') { + operator = LogicalExpressionOperator.OR; + } else { + throw new UnsupportedError("Unhandled logical operator '$operatorString'"); } - /// Return a representation of a yield statement at the given [fileOffset] - /// of the given [expression]. If [isYieldStar] is `true` the created - /// statement is a yield* statement. - Statement createYieldStatement( - int fileOffset, - Expression expression, { - required bool isYieldStar, - }) { - return new YieldStatement(expression, isYieldStar: isYieldStar) - ..fileOffset = fileOffset; + return new LogicalExpression(leftOperand, operator, rightOperand) + ..fileOffset = fileOffset; +} + +Expression createNot(int fileOffset, Expression operand) { + return new Not(operand)..fileOffset = fileOffset; +} + +/// Return a representation of a rethrow statement consisting of the +/// rethrow at [rethrowFileOffset] and the statement at [statementFileOffset]. +Statement createRethrowStatement( + int rethrowFileOffset, + int statementFileOffset, +) { + return new ExpressionStatement(new Rethrow()..fileOffset = rethrowFileOffset) + ..fileOffset = statementFileOffset; +} + +/// Return a representation of a return statement. +Statement createReturnStatement( + int fileOffset, + Expression? expression, { + bool isArrow = true, +}) { + return new ReturnStatementImpl(isArrow, expression)..fileOffset = fileOffset; +} + +Expression createStringConcatenation( + int fileOffset, + List expressions, +) { + assert(fileOffset != TreeNode.noOffset); + return new StringConcatenation(expressions)..fileOffset = fileOffset; +} + +/// The given [statement] is being used as the target of either a break or +/// continue statement. Return the statement that should be used as the actual +/// target. +LabeledStatement createLabeledStatement(Statement statement) { + return new LabeledStatement(statement)..fileOffset = statement.fileOffset; +} + +Expression createThisExpression(int fileOffset) { + return new ThisExpression()..fileOffset = fileOffset; +} + +/// Return a representation of a throw expression at the given [fileOffset]. +Expression createThrow(int fileOffset, Expression expression) { + return new Throw(expression)..fileOffset = fileOffset; +} + +Statement createTryStatement( + int fileOffset, + Statement tryBlock, + List? catchBlocks, + Statement? finallyBlock, +) { + return new TryStatement(tryBlock, catchBlocks ?? [], finallyBlock) + ..fileOffset = fileOffset; +} + +_VariablesDeclaration variablesDeclaration( + List declarations, + Uri uri, +) { + return new _VariablesDeclaration(declarations, uri); +} + +List variablesDeclarationExtractDeclarations( + Object? variablesDeclaration, +) { + return (variablesDeclaration as _VariablesDeclaration).declarations; +} + +Statement wrapVariables(Statement statement) { + if (statement is _VariablesDeclaration) { + return new Block( + new List.of(statement.declarations, growable: true), + )..fileOffset = statement.fileOffset; + } else if (statement is VariableDeclaration) { + return new Block([statement])..fileOffset = statement.fileOffset; + } else { + return statement; } +} - bool isErroneousNode(Object? node) { - if (node is ExpressionStatement) { - // Coverage-ignore-block(suite): Not run. - ExpressionStatement statement = node; - node = statement.expression; - } - if (node is VariableDeclaration) { - // Coverage-ignore-block(suite): Not run. - VariableDeclaration variable = node; - node = variable.initializer; - } - if (node is Let) { - // Coverage-ignore-block(suite): Not run. - Let let = node; - node = let.variable.initializer; - } - return node is InvalidExpression; +/// Return a representation of a while statement at the given [fileOffset] +/// consisting of the given [condition] and [body]. +Statement createWhileStatement( + int fileOffset, + Expression condition, + Statement body, +) { + return new WhileStatement(condition, body)..fileOffset = fileOffset; +} + +/// Return a representation of a yield statement at the given [fileOffset] +/// of the given [expression]. If [isYieldStar] is `true` the created +/// statement is a yield* statement. +Statement createYieldStatement( + int fileOffset, + Expression expression, { + required bool isYieldStar, +}) { + return new YieldStatement(expression, isYieldStar: isYieldStar) + ..fileOffset = fileOffset; +} + +bool isErroneousNode(Object? node) { + if (node is ExpressionStatement) { + // Coverage-ignore-block(suite): Not run. + ExpressionStatement statement = node; + node = statement.expression; } - - bool isThisExpression(Object node) => node is ThisExpression; - - bool isVariablesDeclaration(Object? node) => node is _VariablesDeclaration; - - /// Creates [VariableDeclaration] for a variable named [name] at the given - /// [functionNestingLevel]. - VariableDeclaration createVariableDeclaration( - int fileOffset, - String? name, { - Expression? initializer, - DartType? type, - bool isFinal = false, - bool isConst = false, - bool isInitializingFormal = false, - bool isSuperInitializingFormal = false, - bool isCovariantByDeclaration = false, - bool isLocalFunction = false, - bool isSynthesized = false, - }) { - return new VariableDeclarationImpl( - name, - type: type, - initializer: initializer, - isFinal: isFinal, - isConst: isConst, - isInitializingFormal: isInitializingFormal, - isSuperInitializingFormal: isSuperInitializingFormal, - isCovariantByDeclaration: isCovariantByDeclaration, - isLocalFunction: isLocalFunction, - isSynthesized: isSynthesized, - hasDeclaredInitializer: initializer != null, - )..fileOffset = fileOffset; + if (node is VariableDeclaration) { + // Coverage-ignore-block(suite): Not run. + VariableDeclaration variable = node; + node = variable.initializer; } - - VariableDeclarationImpl createVariableDeclarationForValue( - Expression initializer, { - DartType type = const DynamicType(), - }) { - return new VariableDeclarationImpl.forValue(initializer) - ..type = type - ..fileOffset = initializer.fileOffset; + if (node is Let) { + // Coverage-ignore-block(suite): Not run. + Let let = node; + node = let.variable.initializer; } + return node is InvalidExpression; +} - TypeParameterType createTypeParameterTypeWithDefaultNullabilityForLibrary( - TypeParameter typeParameter, - Library library, - ) { - return new TypeParameterType.withDefaultNullability(typeParameter); - } +bool isThisExpression(Object node) => node is ThisExpression; - Expression createExpressionInvocation( - int fileOffset, - Expression expression, - TypeArguments? typeArguments, - ActualArguments arguments, - ) { - return new ExpressionInvocation(expression, typeArguments, arguments) - ..fileOffset = fileOffset; - } +bool isVariablesDeclaration(Object? node) => node is _VariablesDeclaration; - Expression createMethodInvocation( - int fileOffset, - Expression expression, - Name name, - TypeArguments? typeArguments, - ActualArguments arguments, { - required bool isNullAware, - }) { - return new MethodInvocation( - expression, - name, - typeArguments, - arguments, - isNullAware: isNullAware, - )..fileOffset = fileOffset; - } +/// Creates [VariableDeclaration] for a variable named [name] at the given +/// [functionNestingLevel]. +VariableDeclaration createVariableDeclaration( + int fileOffset, + String? name, { + Expression? initializer, + DartType? type, + bool isFinal = false, + bool isConst = false, + bool isInitializingFormal = false, + bool isSuperInitializingFormal = false, + bool isCovariantByDeclaration = false, + bool isLocalFunction = false, + bool isSynthesized = false, +}) { + return new VariableDeclarationImpl( + name, + type: type, + initializer: initializer, + isFinal: isFinal, + isConst: isConst, + isInitializingFormal: isInitializingFormal, + isSuperInitializingFormal: isSuperInitializingFormal, + isCovariantByDeclaration: isCovariantByDeclaration, + isLocalFunction: isLocalFunction, + isSynthesized: isSynthesized, + hasDeclaredInitializer: initializer != null, + )..fileOffset = fileOffset; +} - Expression createSuperMethodInvocation( - int fileOffset, - Name name, - Procedure procedure, - TypeArguments? typeArguments, - ActualArguments arguments, - ) { - return new InternalSuperMethodInvocation( - name, - typeArguments, - arguments, - procedure, - )..fileOffset = fileOffset; - } +VariableDeclarationImpl createVariableDeclarationForValue( + Expression initializer, { + DartType type = const DynamicType(), +}) { + return new VariableDeclarationImpl.forValue(initializer) + ..type = type + ..fileOffset = initializer.fileOffset; +} - NullCheck createNullCheck(int fileOffset, Expression expression) { - return new NullCheck(expression)..fileOffset = fileOffset; - } +TypeParameterType createTypeParameterTypeWithDefaultNullabilityForLibrary( + TypeParameter typeParameter, + Library library, +) { + return new TypeParameterType.withDefaultNullability(typeParameter); +} - Expression createPropertyGet( - int fileOffset, - Expression receiver, - Name name, { - required bool isNullAware, - }) { - return new PropertyGet(receiver, name, isNullAware: isNullAware) - ..fileOffset = fileOffset; - } +Expression createExpressionInvocation( + int fileOffset, + Expression expression, + TypeArguments? typeArguments, + ActualArguments arguments, +) { + return new ExpressionInvocation(expression, typeArguments, arguments) + ..fileOffset = fileOffset; +} - Expression createPropertySet( - int fileOffset, - Expression receiver, - Name name, - Expression value, { - required bool forEffect, - bool readOnlyReceiver = false, - required bool isNullAware, - }) { - return new PropertySet( - receiver, - name, - value, - forEffect: forEffect, - readOnlyReceiver: readOnlyReceiver, - isNullAware: isNullAware, - )..fileOffset = fileOffset; - } +Expression createMethodInvocation( + int fileOffset, + Expression expression, + Name name, + TypeArguments? typeArguments, + ActualArguments arguments, { + required bool isNullAware, +}) { + return new MethodInvocation( + expression, + name, + typeArguments, + arguments, + isNullAware: isNullAware, + )..fileOffset = fileOffset; +} - IndexGet createIndexGet( - int fileOffset, - Expression receiver, - Expression index, { - required bool isNullAware, - }) { - return new IndexGet(receiver, index, isNullAware: isNullAware) - ..fileOffset = fileOffset; - } +Expression createSuperMethodInvocation( + int fileOffset, + Name name, + Procedure procedure, + TypeArguments? typeArguments, + ActualArguments arguments, +) { + return new InternalSuperMethodInvocation( + name, + typeArguments, + arguments, + procedure, + )..fileOffset = fileOffset; +} - IndexSet createIndexSet( - int fileOffset, - Expression receiver, - Expression index, - Expression value, { - required bool forEffect, - required bool isNullAware, - }) { - return new IndexSet( - receiver, - index, - value, - forEffect: forEffect, - isNullAware: isNullAware, - )..fileOffset = fileOffset; - } +NullCheck createNullCheck(int fileOffset, Expression expression) { + return new NullCheck(expression)..fileOffset = fileOffset; +} - VariableGet createVariableGet(int fileOffset, VariableDeclaration variable) { - return new VariableGet(variable)..fileOffset = fileOffset; - } +Expression createPropertyGet( + int fileOffset, + Expression receiver, + Name name, { + required bool isNullAware, +}) { + return new PropertyGet(receiver, name, isNullAware: isNullAware) + ..fileOffset = fileOffset; +} - EqualsExpression createEquals( - int fileOffset, - Expression left, - Expression right, { - required bool isNot, - }) { - return new EqualsExpression(left, right, isNot: isNot) - ..fileOffset = fileOffset; - } +Expression createPropertySet( + int fileOffset, + Expression receiver, + Name name, + Expression value, { + required bool forEffect, + bool readOnlyReceiver = false, + required bool isNullAware, +}) { + return new PropertySet( + receiver, + name, + value, + forEffect: forEffect, + readOnlyReceiver: readOnlyReceiver, + isNullAware: isNullAware, + )..fileOffset = fileOffset; +} - BinaryExpression createBinary( - int fileOffset, - Expression left, - Name binaryName, - Expression right, - ) { - return new BinaryExpression(left, binaryName, right) - ..fileOffset = fileOffset; - } +IndexGet createIndexGet( + int fileOffset, + Expression receiver, + Expression index, { + required bool isNullAware, +}) { + return new IndexGet(receiver, index, isNullAware: isNullAware) + ..fileOffset = fileOffset; +} - UnaryExpression createUnary( - int fileOffset, - Name unaryName, - Expression expression, - ) { - return new UnaryExpression(unaryName, expression)..fileOffset = fileOffset; - } +IndexSet createIndexSet( + int fileOffset, + Expression receiver, + Expression index, + Expression value, { + required bool forEffect, + required bool isNullAware, +}) { + return new IndexSet( + receiver, + index, + value, + forEffect: forEffect, + isNullAware: isNullAware, + )..fileOffset = fileOffset; +} - ParenthesizedExpression createParenthesized( - int fileOffset, - Expression expression, - ) { - return new ParenthesizedExpression(expression)..fileOffset = fileOffset; - } +VariableGet createVariableGet(int fileOffset, VariableDeclaration variable) { + return new VariableGet(variable)..fileOffset = fileOffset; +} - ConstructorTearOff createConstructorTearOff(int fileOffset, Member target) { - assert( - target is Constructor || (target is Procedure && target.isFactory), - "Unexpected constructor tear off target: $target", - ); - return new ConstructorTearOff(target)..fileOffset = fileOffset; - } +EqualsExpression createEquals( + int fileOffset, + Expression left, + Expression right, { + required bool isNot, +}) { + return new EqualsExpression(left, right, isNot: isNot) + ..fileOffset = fileOffset; +} - StaticTearOff createStaticTearOff(int fileOffset, Procedure procedure) { - assert( - procedure.kind == ProcedureKind.Method, - "Unexpected static tear off target: $procedure", - ); - assert( - !procedure.isRedirectingFactory, - "Unexpected static tear off target: $procedure", - ); - return new StaticTearOff(procedure)..fileOffset = fileOffset; - } +BinaryExpression createBinary( + int fileOffset, + Expression left, + Name binaryName, + Expression right, +) { + return new BinaryExpression(left, binaryName, right)..fileOffset = fileOffset; +} - StaticGet createStaticGet(int fileOffset, Member target) { - assert(target is Field || (target is Procedure && target.isGetter)); - return new StaticGet(target)..fileOffset = fileOffset; - } +UnaryExpression createUnary( + int fileOffset, + Name unaryName, + Expression expression, +) { + return new UnaryExpression(unaryName, expression)..fileOffset = fileOffset; +} - RedirectingFactoryTearOff createRedirectingFactoryTearOff( - int fileOffset, - Procedure procedure, - ) { - assert(procedure.isRedirectingFactory); - return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset; - } +ParenthesizedExpression createParenthesized( + int fileOffset, + Expression expression, +) { + return new ParenthesizedExpression(expression)..fileOffset = fileOffset; +} - Instantiation createInstantiation( - int fileOffset, - Expression expression, - List typeArguments, - ) { - return new Instantiation(expression, typeArguments) - ..fileOffset = fileOffset; - } +ConstructorTearOff createConstructorTearOff(int fileOffset, Member target) { + assert( + target is Constructor || (target is Procedure && target.isFactory), + "Unexpected constructor tear off target: $target", + ); + return new ConstructorTearOff(target)..fileOffset = fileOffset; +} - TypedefTearOff createTypedefTearOff( - int fileOffset, - List typeParameters, - Expression expression, - List typeArguments, - ) { - return new TypedefTearOff(typeParameters, expression, typeArguments) - ..fileOffset = fileOffset; - } +StaticTearOff createStaticTearOff(int fileOffset, Procedure procedure) { + assert( + procedure.kind == ProcedureKind.Method, + "Unexpected static tear off target: $procedure", + ); + assert( + !procedure.isRedirectingFactory, + "Unexpected static tear off target: $procedure", + ); + return new StaticTearOff(procedure)..fileOffset = fileOffset; +} - AndPattern createAndPattern(int fileOffset, Pattern left, Pattern right) { - return new AndPattern(left, right)..fileOffset = fileOffset; - } +StaticGet createStaticGet(int fileOffset, Member target) { + assert(target is Field || (target is Procedure && target.isGetter)); + return new StaticGet(target)..fileOffset = fileOffset; +} - AssignedVariablePattern createAssignedVariablePattern( - int fileOffset, - Variable variable, - ) { - return new AssignedVariablePattern(variable)..fileOffset = fileOffset; - } +RedirectingFactoryTearOff createRedirectingFactoryTearOff( + int fileOffset, + Procedure procedure, +) { + assert(procedure.isRedirectingFactory); + return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset; +} - CastPattern createCastPattern( - int fileOffset, - Pattern pattern, - DartType type, - ) { - return new CastPattern(pattern, type)..fileOffset = fileOffset; - } +Instantiation createInstantiation( + int fileOffset, + Expression expression, + List typeArguments, +) { + return new Instantiation(expression, typeArguments)..fileOffset = fileOffset; +} - ConstantPattern createConstantPattern(Expression expression) { - return new ConstantPattern(expression)..fileOffset = expression.fileOffset; - } +TypedefTearOff createTypedefTearOff( + int fileOffset, + List typeParameters, + Expression expression, + List typeArguments, +) { + return new TypedefTearOff(typeParameters, expression, typeArguments) + ..fileOffset = fileOffset; +} - InvalidPattern createInvalidPattern( - Expression expression, { - required List declaredVariables, - }) { - return new InvalidPattern(expression, declaredVariables: declaredVariables) - ..fileOffset = expression.fileOffset; - } +AndPattern createAndPattern(int fileOffset, Pattern left, Pattern right) { + return new AndPattern(left, right)..fileOffset = fileOffset; +} - ListPattern createListPattern( - int fileOffset, - DartType? typeArgument, - List patterns, - ) { - return new ListPattern(typeArgument, patterns)..fileOffset = fileOffset; - } +AssignedVariablePattern createAssignedVariablePattern( + int fileOffset, + Variable variable, +) { + return new AssignedVariablePattern(variable)..fileOffset = fileOffset; +} - MapPattern createMapPattern( - int fileOffset, - DartType? keyType, - DartType? valueType, - List entries, - ) { - return new MapPattern(keyType, valueType, entries)..fileOffset = fileOffset; - } +CastPattern createCastPattern(int fileOffset, Pattern pattern, DartType type) { + return new CastPattern(pattern, type)..fileOffset = fileOffset; +} - MapPatternEntry createMapPatternEntry( - int fileOffset, - Expression key, - Pattern value, - ) { - return new MapPatternEntry(key, value)..fileOffset = fileOffset; - } +ConstantPattern createConstantPattern(Expression expression) { + return new ConstantPattern(expression)..fileOffset = expression.fileOffset; +} - MapPatternRestEntry createMapPatternRestEntry(int fileOffset) { - return new MapPatternRestEntry()..fileOffset = fileOffset; - } +InvalidPattern createInvalidPattern( + Expression expression, { + required List declaredVariables, +}) { + return new InvalidPattern(expression, declaredVariables: declaredVariables) + ..fileOffset = expression.fileOffset; +} - NamedPattern createNamedPattern( - int fileOffset, - String name, - Pattern pattern, - ) { - return new NamedPattern(name, pattern)..fileOffset = fileOffset; - } +ListPattern createListPattern( + int fileOffset, + DartType? typeArgument, + List patterns, +) { + return new ListPattern(typeArgument, patterns)..fileOffset = fileOffset; +} - NullAssertPattern createNullAssertPattern(int fileOffset, Pattern pattern) { - return new NullAssertPattern(pattern)..fileOffset = fileOffset; - } +MapPattern createMapPattern( + int fileOffset, + DartType? keyType, + DartType? valueType, + List entries, +) { + return new MapPattern(keyType, valueType, entries)..fileOffset = fileOffset; +} - NullCheckPattern createNullCheckPattern(int fileOffset, Pattern pattern) { - return new NullCheckPattern(pattern)..fileOffset = fileOffset; - } +MapPatternEntry createMapPatternEntry( + int fileOffset, + Expression key, + Pattern value, +) { + return new MapPatternEntry(key, value)..fileOffset = fileOffset; +} - OrPattern createOrPattern( - int fileOffset, - Pattern left, - Pattern right, { - required List orPatternJointVariables, - }) { - return new OrPattern( - left, - right, - orPatternJointVariables: orPatternJointVariables, - )..fileOffset = fileOffset; - } +MapPatternRestEntry createMapPatternRestEntry(int fileOffset) { + return new MapPatternRestEntry()..fileOffset = fileOffset; +} - RecordPattern createRecordPattern(int fileOffset, List patterns) { - return new RecordPattern(patterns)..fileOffset = fileOffset; - } +NamedPattern createNamedPattern(int fileOffset, String name, Pattern pattern) { + return new NamedPattern(name, pattern)..fileOffset = fileOffset; +} - RelationalPattern createRelationalPattern( - int fileOffset, - RelationalPatternKind kind, - Expression expression, - ) { - return new RelationalPattern(kind, expression)..fileOffset = fileOffset; - } +NullAssertPattern createNullAssertPattern(int fileOffset, Pattern pattern) { + return new NullAssertPattern(pattern)..fileOffset = fileOffset; +} - RestPattern createRestPattern(int fileOffset, Pattern? subPattern) { - return new RestPattern(subPattern)..fileOffset = fileOffset; - } +NullCheckPattern createNullCheckPattern(int fileOffset, Pattern pattern) { + return new NullCheckPattern(pattern)..fileOffset = fileOffset; +} - VariablePattern createVariablePattern( - int fileOffset, - DartType? type, - VariableDeclaration variable, - ) { - return new VariablePattern(type, variable)..fileOffset = fileOffset; - } +OrPattern createOrPattern( + int fileOffset, + Pattern left, + Pattern right, { + required List orPatternJointVariables, +}) { + return new OrPattern( + left, + right, + orPatternJointVariables: orPatternJointVariables, + )..fileOffset = fileOffset; +} - WildcardPattern createWildcardPattern(int fileOffset, DartType? type) { - return new WildcardPattern(type)..fileOffset = fileOffset; - } +RecordPattern createRecordPattern(int fileOffset, List patterns) { + return new RecordPattern(patterns)..fileOffset = fileOffset; +} - PatternGuard createPatternGuard( - int fileOffset, - Pattern pattern, [ - Expression? guard, - ]) { - return new PatternGuard(pattern, guard)..fileOffset = fileOffset; - } +RelationalPattern createRelationalPattern( + int fileOffset, + RelationalPatternKind kind, + Expression expression, +) { + return new RelationalPattern(kind, expression)..fileOffset = fileOffset; +} - PatternSwitchCase createPatternSwitchCase( - int fileOffset, - List caseOffsets, - List patternGuards, - Statement body, { - required bool isDefault, - required bool hasLabel, - required List jointVariables, - required List? jointVariableFirstUseOffsets, - }) { - return new PatternSwitchCase( - caseOffsets, - patternGuards, - body, - isDefault: isDefault, - hasLabel: hasLabel, - jointVariables: jointVariables, - jointVariableFirstUseOffsets: jointVariableFirstUseOffsets, - )..fileOffset = fileOffset; - } +RestPattern createRestPattern(int fileOffset, Pattern? subPattern) { + return new RestPattern(subPattern)..fileOffset = fileOffset; +} - PatternSwitchStatement createPatternSwitchStatement( - int fileOffset, - Expression expression, - List cases, - ) { - return new PatternSwitchStatement(expression, cases) - ..fileOffset = fileOffset; - } +VariablePattern createVariablePattern( + int fileOffset, + DartType? type, + VariableDeclaration variable, +) { + return new VariablePattern(type, variable)..fileOffset = fileOffset; +} - SwitchExpressionCase createSwitchExpressionCase( - int fileOffset, - PatternGuard patternGuard, - Expression expression, - ) { - return new SwitchExpressionCase(patternGuard, expression) - ..fileOffset = fileOffset; - } +WildcardPattern createWildcardPattern(int fileOffset, DartType? type) { + return new WildcardPattern(type)..fileOffset = fileOffset; +} - SwitchExpression createSwitchExpression( - int fileOffset, - Expression expression, - List cases, - ) { - return new SwitchExpression(expression, cases)..fileOffset = fileOffset; - } +PatternGuard createPatternGuard( + int fileOffset, + Pattern pattern, [ + Expression? guard, +]) { + return new PatternGuard(pattern, guard)..fileOffset = fileOffset; +} - PatternVariableDeclaration createPatternVariableDeclaration( - int fileOffset, - Pattern pattern, - Expression initializer, { - required bool isFinal, - }) { - return new PatternVariableDeclaration( - pattern, - initializer, - isFinal: isFinal, - )..fileOffset = fileOffset; - } +PatternSwitchCase createPatternSwitchCase( + int fileOffset, + List caseOffsets, + List patternGuards, + Statement body, { + required bool isDefault, + required bool hasLabel, + required List jointVariables, + required List? jointVariableFirstUseOffsets, +}) { + return new PatternSwitchCase( + caseOffsets, + patternGuards, + body, + isDefault: isDefault, + hasLabel: hasLabel, + jointVariables: jointVariables, + jointVariableFirstUseOffsets: jointVariableFirstUseOffsets, + )..fileOffset = fileOffset; +} - PatternAssignment createPatternAssignment( - int fileOffset, - Pattern pattern, - Expression expression, - ) { - return new PatternAssignment(pattern, expression)..fileOffset = fileOffset; - } +PatternSwitchStatement createPatternSwitchStatement( + int fileOffset, + Expression expression, + List cases, +) { + return new PatternSwitchStatement(expression, cases)..fileOffset = fileOffset; +} - IfCaseStatement createIfCaseStatement( - int fileOffset, - Expression expression, - PatternGuard patternGuard, - Statement then, - Statement? otherwise, - ) { - return new IfCaseStatement(expression, patternGuard, then, otherwise) - ..fileOffset = fileOffset; - } +SwitchExpressionCase createSwitchExpressionCase( + int fileOffset, + PatternGuard patternGuard, + Expression expression, +) { + return new SwitchExpressionCase(patternGuard, expression) + ..fileOffset = fileOffset; +} - DotShorthand createDotShorthandContext( - int fileOffset, - Expression innerExpression, - ) { - return new DotShorthand(innerExpression)..fileOffset = fileOffset; - } +SwitchExpression createSwitchExpression( + int fileOffset, + Expression expression, + List cases, +) { + return new SwitchExpression(expression, cases)..fileOffset = fileOffset; +} - DotShorthandInvocation createDotShorthandInvocation( - int fileOffset, - Name name, - TypeArguments? typeArguments, - ActualArguments arguments, { - required int nameOffset, - required bool isConst, - }) { - return new DotShorthandInvocation( - name, - typeArguments, - arguments, - nameOffset: nameOffset, - isConst: isConst, - )..fileOffset = fileOffset; - } +PatternVariableDeclaration createPatternVariableDeclaration( + int fileOffset, + Pattern pattern, + Expression initializer, { + required bool isFinal, +}) { + return new PatternVariableDeclaration(pattern, initializer, isFinal: isFinal) + ..fileOffset = fileOffset; +} - DotShorthandPropertyGet createDotShorthandPropertyGet( - int fileOffset, - Name name, { - required int nameOffset, - }) { - return new DotShorthandPropertyGet(name, nameOffset: nameOffset) - ..fileOffset = fileOffset; - } +PatternAssignment createPatternAssignment( + int fileOffset, + Pattern pattern, + Expression expression, +) { + return new PatternAssignment(pattern, expression)..fileOffset = fileOffset; +} + +IfCaseStatement createIfCaseStatement( + int fileOffset, + Expression expression, + PatternGuard patternGuard, + Statement then, + Statement? otherwise, +) { + return new IfCaseStatement(expression, patternGuard, then, otherwise) + ..fileOffset = fileOffset; +} + +DotShorthand createDotShorthandContext( + int fileOffset, + Expression innerExpression, +) { + return new DotShorthand(innerExpression)..fileOffset = fileOffset; +} + +DotShorthandInvocation createDotShorthandInvocation( + int fileOffset, + Name name, + TypeArguments? typeArguments, + ActualArguments arguments, { + required int nameOffset, + required bool isConst, +}) { + return new DotShorthandInvocation( + name, + typeArguments, + arguments, + nameOffset: nameOffset, + isConst: isConst, + )..fileOffset = fileOffset; +} + +DotShorthandPropertyGet createDotShorthandPropertyGet( + int fileOffset, + Name name, { + required int nameOffset, +}) { + return new DotShorthandPropertyGet(name, nameOffset: nameOffset) + ..fileOffset = fileOffset; } class _VariablesDeclaration extends AuxiliaryStatement { diff --git a/pkg/front_end/lib/src/kernel/load_library_builder.dart b/pkg/front_end/lib/src/kernel/load_library_builder.dart index 49959cb6209..147d32852db 100644 --- a/pkg/front_end/lib/src/kernel/load_library_builder.dart +++ b/pkg/front_end/lib/src/kernel/load_library_builder.dart @@ -22,7 +22,7 @@ import '../builder/builder.dart'; import '../builder/compilation_unit.dart'; import '../source/source_library_builder.dart' show SourceLibraryBuilder; import 'internal_ast.dart'; -import 'internal_ast_helper.dart'; +import 'internal_ast_helper.dart' as forest; /// Builder to represent the `deferLibrary.loadLibrary` calls and tear-offs. class LoadLibraryBuilder extends NamedBuilderImpl { @@ -68,20 +68,16 @@ class LoadLibraryBuilder extends NamedBuilderImpl { // Coverage-ignore(suite): Not run. Uri get fileUri => parent.fileUri; - LoadLibrary createLoadLibrary( - int charOffset, - Forest forest, - ActualArguments? arguments, - ) { + LoadLibrary createLoadLibrary(int charOffset, ActualArguments? arguments) { return forest.createLoadLibrary(charOffset, importDependency, arguments); } - Procedure createTearoffMethod(Forest forest) { + Procedure createTearoffMethod() { if (tearoff != null) { // Coverage-ignore-block(suite): Not run. return tearoff!; } - LoadLibrary expression = createLoadLibrary(fileOffset, forest, null); + LoadLibrary expression = createLoadLibrary(fileOffset, null); String prefix = expression.import.name!; Name name = new Name('_#loadLibrary_$prefix', parent.library); Reference? reference = parent.indexedLibrary?.lookupGetterReference(name); diff --git a/pkg/front_end/lib/src/kernel/resolver.dart b/pkg/front_end/lib/src/kernel/resolver.dart index b9cda2c5cb7..ec4e9a582fc 100644 --- a/pkg/front_end/lib/src/kernel/resolver.dart +++ b/pkg/front_end/lib/src/kernel/resolver.dart @@ -52,7 +52,7 @@ import 'body_builder.dart'; import 'body_builder_context.dart'; import 'external_ast_helper.dart'; import 'internal_ast.dart'; -import 'internal_ast_helper.dart'; +import 'internal_ast_helper.dart' as forest; part 'resolver_helpers.dart'; @@ -1304,7 +1304,6 @@ class Resolver { required ConstantContext constantContext, required ThisVariable? internalThisVariable, }) { - const Forest forest = const Forest(); AssignedVariables assignedVariables = context.assignedVariables; // Create variable get expressions for super parameters before finishing diff --git a/pkg/front_end/lib/src/kernel/resolver_helpers.dart b/pkg/front_end/lib/src/kernel/resolver_helpers.dart index e92adae845a..8b969dd9096 100644 --- a/pkg/front_end/lib/src/kernel/resolver_helpers.dart +++ b/pkg/front_end/lib/src/kernel/resolver_helpers.dart @@ -590,7 +590,6 @@ class _InitializerBuilder { argumentsOffset = _bodyBuilderContext.memberNameOffset; } - const Forest forest = const Forest(); if (argumentsOriginalOrder != null) { arguments = forest.createArguments( argumentsOffset, diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart index 2dfe961d995..f0970f1288b 100644 --- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart +++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart @@ -15,7 +15,7 @@ import 'package:front_end/src/dill/dill_target.dart'; import 'package:front_end/src/dill/dill_type_alias_builder.dart'; import 'package:front_end/src/kernel/collections.dart'; import 'package:front_end/src/kernel/internal_ast.dart'; -import 'package:front_end/src/kernel/internal_ast_helper.dart'; +import 'package:front_end/src/kernel/internal_ast_helper.dart' as forest; import 'package:kernel/ast.dart'; import 'package:kernel/names.dart'; import 'package:kernel/target/targets.dart'; @@ -200,7 +200,7 @@ void main() { void _testVariableDeclarations() { testStatement( - const Forest().variablesDeclaration([ + forest.variablesDeclaration([ new VariableDeclaration('a'), new VariableDeclaration('b'), ], dummyUri), @@ -208,7 +208,7 @@ void _testVariableDeclarations() { dynamic a, b;''', ); testStatement( - const Forest().variablesDeclaration([ + forest.variablesDeclaration([ new VariableDeclaration('a', type: const VoidType()), new VariableDeclaration('b', initializer: new NullLiteral()), ], dummyUri),