[cfe][InternalNodes] Remove Forest

This removes the Forest class, make all its methods top-level. For ease of diffing the imports are changed to use forest and _forest as prefixes.

This is done in preparation for using the internal/external_ast_helper.dart libraries exclusively for create AST nodes.

Change-Id: I53e03d9c98596558d1749330cbfba9d12764bbc9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/488463
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Johnni Winther
2026-03-18 02:14:02 -07:00
committed by Commit Queue
parent 808562c683
commit 0b9b62a7a6
9 changed files with 1109 additions and 1180 deletions
+13 -29
View File
@@ -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<BreakStatementImpl>? 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<BreakStatementImpl>? 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<BreakStatementImpl>? 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<BreakStatementImpl>? 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<BreakStatementImpl>? 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] ??= <Statement>[]).addAll(target.users);
target.resolveGotos(forest, current);
target.resolveGotos(current);
}
}
}
@@ -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<BreakStatementImpl>? resolveContinues(
Forest forest,
LabeledStatement target,
) {
List<BreakStatementImpl>? resolveContinues(LabeledStatement target) {
assert(isContinueTarget);
List<BreakStatementImpl> statements = <BreakStatementImpl>[];
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<BreakStatementImpl>? resolveContinues(
Forest forest,
LabeledStatement target,
) {
return continueTarget.resolveContinues(forest, target);
List<BreakStatementImpl>? 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);
}
}
@@ -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,
@@ -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;
File diff suppressed because it is too large Load Diff
@@ -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);
+1 -2
View File
@@ -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
@@ -590,7 +590,6 @@ class _InitializerBuilder {
argumentsOffset = _bodyBuilderContext.memberNameOffset;
}
const Forest forest = const Forest();
if (argumentsOriginalOrder != null) {
arguments = forest.createArguments(
argumentsOffset,
@@ -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),