blob: 2a611892f13c543a4fc2a389dacb049d1ab43bde [file]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import '../builder/declaration_builders.dart';
import '../source/check_helper.dart';
import 'body_builder.dart';
import 'external_ast_helper.dart' as extern;
import 'internal_ast.dart';
InternalPattern createAndPattern(
int fileOffset,
InternalPattern left,
InternalPattern right,
) {
return new InternalAndPattern(left, right, fileOffset: fileOffset);
}
AnonymousMethodBlock createAnonymousMethodBlock({
required InternalAnonymousMethodParameter variable,
required InternalExpression receiver,
required InternalStatement body,
required bool isImplicitlyTyped,
required bool isNullAware,
required bool isCascade,
required int typeOffset,
required int fileOffset,
}) {
return new AnonymousMethodBlock(
variable: variable,
receiver: receiver,
body: body,
isImplicitlyTyped: isImplicitlyTyped,
isNullAware: isNullAware,
isCascade: isCascade,
typeOffset: typeOffset,
fileOffset: fileOffset,
);
}
AnonymousMethodExpression createAnonymousMethodExpression({
required InternalAnonymousMethodParameter variable,
required InternalExpression receiver,
required InternalExpression body,
required bool isImplicitlyTyped,
required bool isNullAware,
required bool isCascade,
required int typeOffset,
required int fileOffset,
}) {
return new AnonymousMethodExpression(
variable: variable,
receiver: receiver,
body: body,
isImplicitlyTyped: isImplicitlyTyped,
isNullAware: isNullAware,
isCascade: isCascade,
typeOffset: typeOffset,
fileOffset: fileOffset,
);
}
InternalAnonymousMethodParameter createAnonymousMethodParameter({
required String name,
required DartType type,
required int fileOffset,
required bool isImplicitlyTyped,
required bool isWildcard,
required bool isFinal,
required bool isSynthesized,
}) {
return new InternalAnonymousMethodParameter(
name: name,
type: type,
isSynthesized: isSynthesized,
isFinal: isFinal,
isImplicitlyTyped: isImplicitlyTyped,
isWildcard: isWildcard,
fileOffset: fileOffset,
);
}
ActualArguments createArguments(
int fileOffset, {
required List<Argument> 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,
);
}
InternalExpression createAsExpression(
int fileOffset,
InternalExpression expression,
DartType type,
) {
return new InternalAsExpression(expression, type, fileOffset: fileOffset);
}
/// Return a representation of an assert that appears in a constructor's
/// initializer list.
InternalAssertInitializer createAssertInitializer(
InternalAssertStatement assertStatement, {
required int fileOffset,
}) {
return new InternalAssertInitializer(assertStatement, fileOffset: fileOffset);
}
/// Return a representation of an assert that appears as a statement.
InternalAssertStatement createAssertStatement(
int fileOffset,
InternalExpression condition,
InternalExpression? message,
int conditionStartOffset,
int conditionEndOffset,
) {
return new InternalAssertStatement(
condition,
conditionStartOffset: conditionStartOffset,
conditionEndOffset: conditionEndOffset,
message: message,
fileOffset: fileOffset,
);
}
InternalPattern createAssignedVariablePattern(
int fileOffset,
InternalVariable variable,
) {
return new InternalAssignedVariablePattern(variable, fileOffset: fileOffset);
}
InternalExpression createAwaitExpression(
int fileOffset,
InternalExpression operand,
) {
return new InternalAwaitExpression(operand, fileOffset: fileOffset);
}
BinaryExpression createBinary(
int fileOffset,
InternalExpression left,
Name binaryName,
InternalExpression right,
) {
return new BinaryExpression(left, binaryName, right, fileOffset: fileOffset);
}
/// Return a representation of a block of [statements] at the given
/// [fileOffset].
InternalBlock createBlock(
List<InternalStatement> statements, {
required int fileOffset,
required int fileEndOffset,
}) {
List<InternalStatement>? copy;
for (int i = 0; i < statements.length; i++) {
InternalStatement statement = statements[i];
if (statement is MultiVariableDeclaration) {
copy ??= new List<InternalStatement>.of(statements.getRange(0, i));
for (InternalVariableDeclaration declaration in statement.declarations) {
copy.add(createVariableStatement(declaration));
}
} else if (copy != null) {
copy.add(statement);
}
}
return new InternalBlock(
copy ?? statements,
fileOffset: fileOffset,
fileEndOffset: fileEndOffset,
);
}
InternalBlockExpression createBlockExpression(
InternalBlock body,
InternalExpression value, {
required int fileOffset,
}) {
return new InternalBlockExpression(body, value, fileOffset: fileOffset);
}
/// Return a representation of a boolean literal at the given [fileOffset].
/// The literal has the given [value].
InternalExpression createBoolLiteral(bool value, {required int fileOffset}) {
return new InternalBoolLiteral(value, fileOffset: fileOffset);
}
/// Return a representation of a break statement.
InternalBreakStatement createBreakStatement(int fileOffset, String? label) {
return new InternalBreakStatement(label: label, fileOffset: fileOffset);
}
InternalPattern createCastPattern(
int fileOffset,
InternalPattern pattern,
DartType type,
) {
return new InternalCastPattern(pattern, type, fileOffset: fileOffset);
}
/// Return a representation of a catch clause.
InternalCatch createCatch(
int fileOffset,
DartType exceptionType,
InternalCatchVariable? exceptionParameter,
InternalCatchVariable? stackTraceParameter,
DartType stackTraceType,
InternalStatement body,
) {
return new InternalCatch(
exception: exceptionParameter,
body: body,
guard: exceptionType,
stackTrace: stackTraceParameter,
fileOffset: fileOffset,
);
}
InternalCatchVariable createCatchVariable({
required String name,
required DartType type,
required bool isImplicitlyTyped,
required bool isWildcard,
required bool isFinal,
required int fileOffset,
}) {
return new InternalCatchVariable(
name: name,
type: type,
isWildcard: isWildcard,
isFinal: isFinal,
isImplicitlyTyped: isImplicitlyTyped,
fileOffset: fileOffset,
);
}
InternalExpression createCompoundIndexSet({
required InternalExpression receiver,
required InternalExpression index,
required Name binaryName,
required InternalExpression value,
required int readOffset,
required int binaryOffset,
required int writeOffset,
required bool forEffect,
required bool forPostIncDec,
required bool isNullAware,
}) {
return new CompoundIndexSet(
receiver: receiver,
index: index,
binaryName: binaryName,
value: value,
readOffset: readOffset,
binaryOffset: binaryOffset,
writeOffset: writeOffset,
forEffect: forEffect,
forPostIncDec: forPostIncDec,
isNullAware: isNullAware,
);
}
InternalExpression createCompoundPropertySet({
required InternalExpression receiver,
required Name propertyName,
required Name binaryName,
required InternalExpression value,
required bool forEffect,
required int readOffset,
required int binaryOffset,
required int writeOffset,
required bool isNullAware,
}) {
return new CompoundPropertySet(
receiver: receiver,
propertyName: propertyName,
binaryName: binaryName,
value: value,
forEffect: forEffect,
readOffset: readOffset,
binaryOffset: binaryOffset,
writeOffset: writeOffset,
isNullAware: isNullAware,
);
}
/// 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.
InternalExpression createConditionalExpression(
int fileOffset,
InternalExpression condition,
InternalExpression thenExpression,
InternalExpression elseExpression,
) {
return new InternalConditionalExpression(
condition,
thenExpression,
elseExpression,
fileOffset: fileOffset,
);
}
InternalPattern createConstantPattern(InternalExpression expression) {
return new InternalConstantPattern(
expression: expression,
fileOffset: expression.fileOffset,
);
}
InternalExpression createConstructorInvocation({
required Constructor target,
required TypeArguments? typeArguments,
required ActualArguments arguments,
required bool isConst,
required int fileOffset,
}) {
return new InternalConstructorInvocation(
target: target,
typeArguments: typeArguments,
arguments: arguments,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalExpression createConstructorTearOff(int fileOffset, Member target) {
assert(
target is Constructor || (target is Procedure && target.isFactory),
"Unexpected constructor tear off target: $target",
);
return new InternalConstructorTearOff(target, fileOffset: fileOffset);
}
InternalConstVariable createConstVariable({
required String name,
required DartType? type,
bool isFinal = false,
bool isWildcard = false,
required int fileOffset,
bool hasDeclaredInitializer = false,
bool forSyntheticToken = false,
bool isImplicitlyTyped = false,
int fileEqualsOffset = TreeNode.noOffset,
}) {
return new InternalConstVariable(
name: name,
type: type,
isFinal: isFinal,
isWildcard: isWildcard,
hasDeclaredInitializer: hasDeclaredInitializer,
fileOffset: fileOffset,
fileEqualsOffset: fileEqualsOffset,
forSyntheticToken: forSyntheticToken,
isImplicitlyTyped: isImplicitlyTyped,
);
}
/// Return a representation of a continue statement.
InternalContinueStatement createContinueStatement(
int fileOffset,
String? label,
) {
return new InternalContinueStatement(label: label, fileOffset: fileOffset);
}
InternalContinueSwitchStatement createContinueSwitchStatement({
required int fileOffset,
}) {
return new InternalContinueSwitchStatement(fileOffset: fileOffset);
}
/// Return a representation of a do statement.
InternalLoopStatement createDoStatement(
int fileOffset,
InternalStatement body,
InternalExpression condition,
) {
return new InternalDoStatement(body, condition, fileOffset: fileOffset);
}
DotShorthand createDotShorthandContext(
int fileOffset,
InternalExpression 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,
);
}
/// Return a representation of a double literal at the given [fileOffset]. The
/// literal has the given [value].
InternalExpression createDoubleLiteral(int fileOffset, double value) {
return new InternalDoubleLiteral(value, fileOffset: fileOffset);
}
/// Return a representation of an empty statement at the given [fileOffset].
InternalStatement createEmptyStatement(int fileOffset) {
return new InternalEmptyStatement(fileOffset: fileOffset);
}
EqualsExpression createEquals(
int fileOffset,
InternalExpression left,
InternalExpression right, {
required bool isNot,
}) {
return new EqualsExpression(
left,
right,
isNot: isNot,
fileOffset: fileOffset,
);
}
InternalExpression createExpressionInvocation(
int fileOffset,
InternalExpression expression,
TypeArguments? typeArguments,
ActualArguments arguments,
) {
return new ExpressionInvocation(
expression,
typeArguments,
arguments,
fileOffset: fileOffset,
);
}
/// Return a representation of an expression statement at the given
/// [fileOffset] containing the [expression].
InternalStatement createExpressionStatement(
InternalExpression expression, {
required int fileOffset,
}) {
return new InternalExpressionStatement(expression, fileOffset: fileOffset);
}
ExtensionTypeRedirectingInitializer createExtensionTypeRedirectingInitializer({
required Procedure target,
required ActualArguments arguments,
required int fileOffset,
}) {
return new ExtensionTypeRedirectingInitializer(
target,
arguments,
fileOffset: fileOffset,
);
}
// Coverage-ignore(suite): Not run.
InternalExpression createFactoryConstructorInvocation({
required Procedure target,
required TypeArguments? typeArguments,
required ActualArguments arguments,
required bool isConst,
required int fileOffset,
}) {
return new FactoryConstructorInvocation(
target: target,
typeArguments: typeArguments,
arguments: arguments,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalFieldInitializer createFieldInitializer(
Field field,
InternalExpression value, {
required int fileOffset,
required bool isSynthetic,
}) {
return new InternalFieldInitializer(
field,
value,
isSynthetic: isSynthetic,
fileOffset: fileOffset,
);
}
InternalExpression createFileUriExpression({
required InternalExpression expression,
required Uri fileUri,
required int fileOffset,
}) {
return new InternalFileUriExpression(
expression: expression,
fileUri: fileUri,
fileOffset: fileOffset,
);
}
InternalElement createForElement({
required List<InternalVariableDeclaration> variables,
required InternalExpression? condition,
required List<InternalExpression> updates,
required InternalElement body,
required int fileOffset,
}) {
return new ForElement(
variables: variables,
condition: condition,
updates: updates,
body: body,
fileOffset: fileOffset,
);
}
ForInElement createForInElement({
required InternalForInElement element,
required InternalExpression iterable,
required InternalElement body,
required bool isAsync,
required int forOffset,
required int fileOffset,
}) {
return new ForInElement(
element: element,
iterable: iterable,
body: body,
isAsync: isAsync,
forOffset: forOffset,
fileOffset: fileOffset,
);
}
/// Return a representation of a for statement.
InternalLoopStatement createForStatement(
int fileOffset,
List<InternalVariableDeclaration>? variables,
InternalExpression? condition,
List<InternalExpression> updaters,
InternalStatement body,
) {
return new InternalForStatement(
variables ?? // Coverage-ignore(suite): Not run.
[],
condition,
updaters,
body,
fileOffset: fileOffset,
);
}
InternalStatement createFunctionDeclaration({
required InternalLocalFunctionVariable variable,
required int fileOffset,
}) {
return new InternalFunctionDeclaration(
variable: variable,
fileOffset: fileOffset,
);
}
InternalExpression createFunctionExpression({
required InternalFunctionNode function,
required int fileOffset,
}) {
return new InternalFunctionExpression(
function: function,
fileOffset: fileOffset,
);
}
InternalFunctionNode createFunctionNode({
required InternalStatement? body,
required List<TypeParameter>? typeParameters,
required List<InternalPositionalParameter> positionalParameters,
required List<InternalNamedParameter> namedParameters,
required int? requiredParameterCount,
required DartType? returnType,
required int fileOffset,
required int? fileEndOffset,
required AsyncMarker asyncMarker,
}) {
return new InternalFunctionNode(
returnType: returnType,
typeParameters: typeParameters ?? [],
positionalParameters: positionalParameters,
namedParameters: namedParameters,
requiredParameterCount: requiredParameterCount ?? 0,
asyncMarker: asyncMarker,
body: body,
fileOffset: fileOffset,
fileEndOffset: fileEndOffset ?? TreeNode.noOffset,
);
}
InternalElement createIfCaseElement({
required InternalExpression expression,
required InternalPatternGuard patternGuard,
required InternalElement then,
required InternalElement? otherwise,
required int fileOffset,
}) {
return new IfCaseElement(
expression: expression,
patternGuard: patternGuard,
then: then,
otherwise: otherwise,
fileOffset: fileOffset,
);
}
InternalStatement createIfCaseStatement(
int fileOffset,
InternalExpression expression,
InternalPatternGuard patternGuard,
InternalStatement then,
InternalStatement? otherwise,
) {
return new InternalIfCaseStatement(
expression: expression,
patternGuard: patternGuard,
then: then,
otherwise: otherwise,
fileOffset: fileOffset,
);
}
InternalElement createIfElement({
required InternalExpression condition,
required InternalElement then,
required InternalElement? otherwise,
required int fileOffset,
}) {
return new IfElement(
condition: condition,
then: then,
otherwise: otherwise,
fileOffset: fileOffset,
);
}
InternalElement createExpressionElement(InternalExpression expression) {
return new ExpressionElement(
expression: expression,
fileOffset: expression.fileOffset,
);
}
InternalExpression createIfNullExpression({
required InternalExpression left,
required InternalExpression right,
required int fileOffset,
}) {
return new IfNullExpression(left, right, fileOffset: fileOffset);
}
InternalExpression createIfNullIndexSet({
required InternalExpression receiver,
required InternalExpression index,
required InternalExpression value,
required int readOffset,
required int testOffset,
required int writeOffset,
required bool forEffect,
required bool isNullAware,
}) {
return new IfNullIndexSet(
receiver: receiver,
index: index,
value: value,
readOffset: readOffset,
testOffset: testOffset,
writeOffset: writeOffset,
forEffect: forEffect,
isNullAware: isNullAware,
);
}
InternalExpression createIfNullPropertySet({
required InternalExpression receiver,
required Name propertyName,
required InternalExpression rhs,
required bool forEffect,
required int readOffset,
required int writeOffset,
required bool isNullAware,
required int fileOffset,
}) {
return new IfNullPropertySet(
receiver: receiver,
propertyName: propertyName,
rhs: rhs,
forEffect: forEffect,
readOffset: readOffset,
writeOffset: writeOffset,
isNullAware: isNullAware,
fileOffset: fileOffset,
);
}
InternalExpression createIfNullSet({
required InternalExpression read,
required InternalExpression write,
required bool forEffect,
required int fileOffset,
}) {
return new IfNullSet(
read: read,
write: write,
forEffect: forEffect,
fileOffset: fileOffset,
);
}
/// Return a representation of an `if` statement.
InternalStatement createIfStatement(
int fileOffset,
InternalExpression condition,
InternalStatement thenStatement,
InternalStatement? elseStatement,
) {
return new InternalIfStatement(
condition,
thenStatement,
elseStatement,
fileOffset: fileOffset,
);
}
IndexGet createIndexGet(
int fileOffset,
InternalExpression receiver,
InternalExpression index, {
required bool isNullAware,
}) {
return new IndexGet(
receiver,
index,
isNullAware: isNullAware,
fileOffset: fileOffset,
);
}
IndexSet createIndexSet(
int fileOffset,
InternalExpression receiver,
InternalExpression index,
InternalExpression value, {
required bool forEffect,
required bool isNullAware,
}) {
return new IndexSet(
receiver,
index,
value,
forEffect: forEffect,
isNullAware: isNullAware,
fileOffset: fileOffset,
);
}
InternalExpression createInstantiation(
InternalExpression expression,
List<DartType> typeArguments, {
required int fileOffset,
}) {
return new InternalInstantiation(
expression,
typeArguments,
fileOffset: fileOffset,
);
}
/// Return a representation of an integer literal at the given [fileOffset].
/// The literal has the given [value].
InternalExpression createIntLiteral({
required int fileOffset,
required int value,
String? literal,
}) {
return new InternalIntLiteral(value, literal, fileOffset: fileOffset);
}
InternalExpression createIntLiteralLarge(
int fileOffset,
String strippedLiteral,
String literal,
) {
return new LargeIntLiteral(strippedLiteral, literal, fileOffset: fileOffset);
}
InternalInvalidExpression createInvalidExpression(
String message, {
InternalExpression? expression,
required int fileOffset,
}) {
return new InternalInvalidExpression(
message,
expression: expression,
fileOffset: fileOffset,
);
}
InternalInvalidExpression createInvalidExpressionFromErrorText(
ErrorText errorText, {
InternalExpression? expression,
}) {
return new InternalInvalidExpression(
errorText.message,
expression: expression,
fileOffset: errorText.fileOffset,
);
}
InternalInvalidInitializer createInvalidInitializer(
InternalInvalidExpression expression, {
bool isSuperInitializer = false,
bool isRedirectingInitializer = false,
}) {
return new InternalInvalidInitializer(
expression.message,
fileOffset: expression.fileOffset,
isSuperInitializer: isSuperInitializer,
isRedirectingInitializer: isRedirectingInitializer,
);
}
InternalInvalidInitializer createInvalidInitializerFromErrorText(
ErrorText errorText, {
bool isSuperInitializer = false,
bool isRedirectingInitializer = false,
}) {
return new InternalInvalidInitializer(
errorText.message,
fileOffset: errorText.fileOffset,
isSuperInitializer: isSuperInitializer,
isRedirectingInitializer: isRedirectingInitializer,
);
}
InternalPattern createInvalidPattern(
InternalInvalidExpression expression, {
required List<InternalDeclaredVariable> declaredVariables,
}) {
return new InternalInvalidPattern(
invalidExpression: expression,
declaredVariables: declaredVariables,
fileOffset: expression.fileOffset,
);
}
// Coverage-ignore(suite): Not run.
InternalPattern createInvalidPatternFromErrorText(
ErrorText errorText, {
required List<InternalDeclaredVariable> declaredVariables,
}) {
return new InternalInvalidPattern(
invalidExpression: createInvalidExpressionFromErrorText(errorText),
declaredVariables: declaredVariables,
fileOffset: errorText.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.
InternalExpression createIsExpression(
int fileOffset,
InternalExpression operand,
DartType type, {
int? notFileOffset,
}) {
return new InternalIsExpression(
operand,
type,
notFileOffset: notFileOffset,
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.
InternalLabeledStatement createLabeledStatement(InternalStatement statement) {
return new InternalLabeledStatement(
statement,
fileOffset: statement.fileOffset,
);
}
InternalLateVariable createLateVariable({
required String name,
required DartType? type,
bool isFinal = false,
bool isWildcard = false,
required int fileOffset,
bool hasDeclaredInitializer = false,
bool forSyntheticToken = false,
bool isImplicitlyTyped = false,
bool isStaticLate = false,
int fileEqualsOffset = TreeNode.noOffset,
}) {
return new InternalLateVariable(
name: name,
type: type,
isFinal: isFinal,
isWildcard: isWildcard,
hasDeclaredInitializer: hasDeclaredInitializer,
fileOffset: fileOffset,
fileEqualsOffset: fileEqualsOffset,
forSyntheticToken: forSyntheticToken,
isImplicitlyTyped: isImplicitlyTyped,
isStaticLate: isStaticLate,
);
}
InternalLet createLetForEffect({
required InternalExpression effect,
required DartType effectType,
required InternalExpression expression,
}) {
return new InternalLet(
valueType: effectType,
value: effect,
body: expression,
fileOffset: effect.fileOffset,
);
}
InternalExpression createListLiteral({
required DartType? typeArgument,
required List<InternalElement> elements,
required bool isConst,
required int fileOffset,
}) {
return new InternalListLiteral(
elements: elements,
typeArgument: typeArgument,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalElement createMapEntryElement({
required bool isKeyNullAware,
required InternalExpression key,
required bool isValueNullAware,
required InternalExpression value,
required int fileOffset,
}) {
return new MapEntryElement(
isKeyNullAware: isKeyNullAware,
key: key,
isValueNullAware: isValueNullAware,
value: value,
fileOffset: fileOffset,
);
}
InternalPattern createListPattern(
int fileOffset,
DartType? typeArgument,
List<InternalPattern> patterns,
) {
return new InternalListPattern(
typeArgument: typeArgument,
patterns: patterns,
fileOffset: fileOffset,
);
}
InternalLoadLibrary createLoadLibrary({
required LibraryDependency import,
required ActualArguments? arguments,
required int fileOffset,
}) {
return new InternalLoadLibrary(import, arguments, fileOffset: fileOffset);
}
InternalLocalFunctionVariable createLocalFunctionVariable({
required String name,
required DartType? type,
bool isWildcard = false,
required int fileOffset,
bool forSyntheticToken = false,
bool isImplicitlyTyped = false,
bool isStaticLate = false,
int fileEqualsOffset = TreeNode.noOffset,
}) {
return new InternalLocalFunctionVariable(
name: name,
type: type,
isWildcard: isWildcard,
forSyntheticToken: forSyntheticToken,
isImplicitlyTyped: isImplicitlyTyped,
fileOffset: fileOffset,
fileEqualsOffset: fileEqualsOffset,
);
}
InternalExpression createLocalIncDec({
required InternalVariable variable,
required bool forEffect,
required bool isPost,
required bool isInc,
required int nameOffset,
required int operatorOffset,
}) {
return new LocalIncDec(
variable: variable,
forEffect: forEffect,
isPost: isPost,
isInc: isInc,
nameOffset: nameOffset,
operatorOffset: operatorOffset,
);
}
InternalLocalVariable createLocalVariable({
required String name,
required DartType? type,
bool isFinal = false,
bool isWildcard = false,
required int fileOffset,
bool hasDeclaredInitializer = false,
bool forSyntheticToken = false,
bool isImplicitlyTyped = false,
bool isStaticLate = false,
int fileEqualsOffset = TreeNode.noOffset,
}) {
return new InternalLocalVariable(
name: name,
type: type,
isFinal: isFinal,
isWildcard: isWildcard,
hasDeclaredInitializer: hasDeclaredInitializer,
forSyntheticToken: forSyntheticToken,
isImplicitlyTyped: isImplicitlyTyped,
fileOffset: fileOffset,
isStaticLate: isStaticLate,
fileEqualsOffset: fileEqualsOffset,
);
}
/// Return a representation of a logical expression at the given [fileOffset]
/// having the [leftOperand], [rightOperand] and the [operatorString]
/// (either `&&` or `||`).
InternalExpression createLogicalExpression(
int fileOffset,
InternalExpression leftOperand,
String operatorString,
InternalExpression rightOperand,
) {
LogicalExpressionOperator operator;
if (operatorString == '&&') {
operator = LogicalExpressionOperator.AND;
} else if (operatorString == '||') {
operator = LogicalExpressionOperator.OR;
} else {
throw new UnsupportedError("Unhandled logical operator '$operatorString'");
}
return new InternalLogicalExpression(
leftOperand,
operator,
rightOperand,
fileOffset: fileOffset,
);
}
InternalExpression createMapOrSetLiteral({
required List<DartType>? typeArguments,
required List<InternalElement> elements,
required bool isConst,
required int fileOffset,
}) {
return new MapOrSetLiteral(
elements: elements,
typeArguments: typeArguments,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalPattern createMapPattern(
int fileOffset,
DartType? keyType,
DartType? valueType,
List<InternalMapPatternEntry> entries,
) {
return new InternalMapPattern(
keyType: keyType,
valueType: valueType,
entries: entries,
fileOffset: fileOffset,
);
}
InternalMapPatternEntry createMapPatternEntry(
int fileOffset,
InternalExpression key,
InternalPattern value,
) {
return new InternalMapPatternEntry(
key: key,
value: value,
fileOffset: fileOffset,
);
}
InternalMapPatternRestEntry createMapPatternRestEntry(int fileOffset) {
return new InternalMapPatternRestEntry(fileOffset: fileOffset);
}
InternalExpression createMethodInvocation(
int fileOffset,
InternalExpression expression,
Name name,
TypeArguments? typeArguments,
ActualArguments arguments, {
required bool isNullAware,
required bool isImplicitThis,
}) {
return new MethodInvocation(
expression,
name,
typeArguments,
arguments,
isNullAware: isNullAware,
isImplicitThis: isImplicitThis,
fileOffset: fileOffset,
);
}
InternalNamedExpression createNamedExpression(
String name,
InternalExpression value, {
required int fileOffset,
}) {
return new InternalNamedExpression(
name: name,
value: value,
fileOffset: fileOffset,
);
}
InternalNamedParameter createNamedParameter({
required String parameterName,
required DartType type,
InternalExpression? defaultValue,
bool isCovariantByDeclaration = false,
bool isRequired = false,
bool isInitializingFormal = false,
bool isSuperInitializingFormal = false,
bool isFinal = false,
bool hasDeclaredDefaultValue = false,
bool isLowered = false,
bool isSynthesized = false,
bool isWildcard = false,
bool isRenamedPrivateNamedParameter = false,
required int fileOffset,
bool isImplicitlyTyped = false,
bool forSyntheticToken = false,
}) {
return new InternalNamedParameter(
defaultValue: defaultValue,
astVariable: extern.createNamedParameter(
parameterName: parameterName,
type: type,
isCovariantByDeclaration: isCovariantByDeclaration,
isRequired: isRequired,
isInitializingFormal: isInitializingFormal,
isSuperInitializingFormal: isSuperInitializingFormal,
isFinal: isFinal,
hasDeclaredDefaultValue: hasDeclaredDefaultValue,
isSynthesized: isSynthesized,
isWildcard: isWildcard,
isRenamedPrivateNamedParameter: isRenamedPrivateNamedParameter,
fileOffset: fileOffset,
),
isImplicitlyTyped: isImplicitlyTyped,
forSyntheticToken: forSyntheticToken,
fileOffset: fileOffset,
);
}
InternalPattern createNamedPattern(
int fileOffset,
String name,
InternalPattern pattern,
) {
return new InternalNamedPattern(
name: name,
pattern: pattern,
fileOffset: fileOffset,
);
}
InternalExpression createNot(int fileOffset, InternalExpression operand) {
return new InternalNot(operand, fileOffset: fileOffset);
}
InternalPattern createNullAssertPattern(
int fileOffset,
InternalPattern pattern,
) {
return new InternalNullAssertPattern(
pattern: pattern,
fileOffset: fileOffset,
);
}
InternalElement createNullAwareElement({
required InternalExpression expression,
required int fileOffset,
}) {
return new NullAwareElement(expression: expression, fileOffset: fileOffset);
}
InternalExpression createNullCheck(
int fileOffset,
InternalExpression expression,
) {
return new InternalNullCheck(expression, fileOffset: fileOffset);
}
InternalPattern createNullCheckPattern(
int fileOffset,
InternalPattern pattern,
) {
return new InternalNullCheckPattern(pattern: pattern, fileOffset: fileOffset);
}
/// Return a representation of a null literal at the given [fileOffset].
InternalExpression createNullLiteral(int fileOffset) {
return new InternalNullLiteral(fileOffset: fileOffset);
}
InternalPattern createObjectPattern({
required DartType requiredType,
required List<InternalNamedPattern> fields,
required Typedef? typedef,
required bool hasExplicitTypeArguments,
required int fileOffset,
}) {
return new InternalObjectPattern(
requiredType: requiredType,
fields: fields,
typedef: typedef,
hasExplicitTypeArguments: hasExplicitTypeArguments,
fileOffset: fileOffset,
);
}
InternalPattern createOrPattern(
int fileOffset,
InternalPattern left,
InternalPattern right, {
required List<InternalDeclaredVariable> orPatternJointVariables,
}) {
return new InternalOrPattern(
left,
right,
orPatternJointVariables: orPatternJointVariables,
fileOffset: fileOffset,
);
}
ParenthesizedExpression createParenthesized(
int fileOffset,
InternalExpression expression,
) {
return new ParenthesizedExpression(expression, fileOffset: fileOffset);
}
InternalExpression createPatternAssignment(
int fileOffset,
InternalPattern pattern,
InternalExpression expression,
) {
return new InternalPatternAssignment(
pattern: pattern,
expression: expression,
fileOffset: fileOffset,
);
}
InternalElement createPatternForElement({
required InternalPatternVariableDeclaration patternVariableDeclaration,
required List<InternalVariableDeclaration> intermediateVariables,
required List<InternalVariableDeclaration> variables,
required InternalExpression? condition,
required List<InternalExpression> updates,
required InternalElement body,
required int fileOffset,
}) {
return new PatternForElement(
patternVariableDeclaration: patternVariableDeclaration,
intermediateVariables: intermediateVariables,
variables: variables,
condition: condition,
updates: updates,
body: body,
fileOffset: fileOffset,
);
}
InternalPatternGuard createPatternGuard(
int fileOffset,
InternalPattern pattern, [
InternalExpression? guard,
]) {
return new InternalPatternGuard(
pattern: pattern,
guard: guard,
fileOffset: fileOffset,
);
}
InternalPatternSwitchCase createPatternSwitchCase(
int fileOffset,
List<int> caseOffsets,
List<InternalPatternGuard> patternGuards,
InternalStatement body, {
required bool isDefault,
required List<Label>? labels,
required List<InternalDeclaredVariable>? jointVariables,
required List<int>? jointVariableFirstUseOffsets,
}) {
return new InternalPatternSwitchCase(
caseOffsets: caseOffsets,
patternGuards: patternGuards,
body: body,
isDefault: isDefault,
labels: labels,
jointVariables: jointVariables ?? [],
jointVariableFirstUseOffsets: jointVariableFirstUseOffsets,
fileOffset: fileOffset,
);
}
InternalSwitchStatement createPatternSwitchStatement(
int fileOffset,
InternalExpression expression,
List<InternalPatternSwitchCase> cases,
) {
return new InternalPatternSwitchStatement(
expression: expression,
cases: cases,
fileOffset: fileOffset,
);
}
InternalPatternVariableDeclaration createPatternVariableDeclaration(
int fileOffset,
InternalPattern pattern,
InternalExpression initializer, {
required bool isFinal,
}) {
return new InternalPatternVariableDeclaration(
pattern: pattern,
initializer: initializer,
isFinal: isFinal,
fileOffset: fileOffset,
);
}
InternalPositionalParameter createPositionalParameter({
String? cosmeticName,
required DartType type,
bool isImplicitlyTyped = false,
InternalExpression? defaultValue,
bool hasDeclaredDefaultValue = false,
bool isCovariantByDeclaration = false,
bool isRequired = false,
bool isInitializingFormal = false,
bool isSuperInitializingFormal = false,
bool isFinal = false,
bool isLowered = false,
bool isSynthesized = false,
bool isWildcard = false,
required int fileOffset,
bool forSyntheticToken = false,
}) {
return new InternalPositionalParameter(
defaultValue: defaultValue,
astVariable: extern.createPositionalParameter(
cosmeticName: cosmeticName,
type: type,
isCovariantByDeclaration: isCovariantByDeclaration,
isInitializingFormal: isInitializingFormal,
isSuperInitializingFormal: isSuperInitializingFormal,
isFinal: isFinal,
hasDeclaredDefaultValue: hasDeclaredDefaultValue,
isLowered: isLowered,
isSynthesized: isSynthesized,
isWildcard: isWildcard,
fileOffset: fileOffset,
),
forSyntheticToken: forSyntheticToken,
isImplicitlyTyped: isImplicitlyTyped,
fileOffset: fileOffset,
);
}
InternalExpression createPropertyGet(
int fileOffset,
InternalExpression receiver,
Name name, {
required bool isNullAware,
required bool isImplicitThis,
}) {
return new PropertyGet(
receiver,
name,
isNullAware: isNullAware,
isImplicitThis: isImplicitThis,
fileOffset: fileOffset,
);
}
InternalExpression createPropertyIncDec({
required InternalExpression receiver,
required Name name,
required bool forEffect,
required bool isPost,
required bool isInc,
required bool isNullAware,
required int nameOffset,
required int operatorOffset,
required bool isImplicitThis,
}) {
return new PropertyIncDec(
receiver: receiver,
name: name,
forEffect: forEffect,
isPost: isPost,
isInc: isInc,
isNullAware: isNullAware,
nameOffset: nameOffset,
operatorOffset: operatorOffset,
isImplicitThis: isImplicitThis,
);
}
InternalExpression createPropertySet(
int fileOffset,
InternalExpression receiver,
Name name,
InternalExpression value, {
required bool forEffect,
bool readOnlyReceiver = false,
required bool isNullAware,
required isImplicitThis,
}) {
return new PropertySet(
receiver,
name,
value,
forEffect: forEffect,
readOnlyReceiver: readOnlyReceiver,
isNullAware: isNullAware,
isImplicitThis: isImplicitThis,
fileOffset: fileOffset,
);
}
// Coverage-ignore(suite): Not run.
InternalExpression createRecordLiteral({
required List<PositionalRecordField> fields,
required Map<String, NamedRecordField>? namedFields,
required bool isConst,
required int fileOffset,
}) {
return new InternalRecordLiteral(
fields: fields,
namedFields: namedFields,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalPattern createRecordPattern(
int fileOffset,
List<InternalPattern> patterns,
) {
return new InternalRecordPattern(patterns: patterns, fileOffset: fileOffset);
}
InternalExpression createRedirectingFactoryTearOff(
int fileOffset,
Procedure procedure,
) {
assert(procedure.isRedirectingFactory);
return new InternalRedirectingFactoryTearOff(
procedure,
fileOffset: fileOffset,
);
}
InternalRedirectingInitializer createRedirectingInitializer({
required Constructor target,
required ActualArguments arguments,
required int fileOffset,
}) {
return new InternalRedirectingInitializer(
target,
arguments,
fileOffset: fileOffset,
);
}
InternalPattern createRelationalPattern(
int fileOffset,
RelationalPatternKind kind,
InternalExpression expression,
) {
return new InternalRelationalPattern(
kind: kind,
expression: expression,
fileOffset: fileOffset,
);
}
InternalPattern createRestPattern(int fileOffset, InternalPattern? subPattern) {
return new InternalRestPattern(
subPattern: subPattern,
fileOffset: fileOffset,
);
}
InternalExpression createRethrow({required int fileOffset}) {
return new InternalRethrow(fileOffset: fileOffset);
}
/// Return a representation of a rethrow statement consisting of the
/// rethrow at [rethrowFileOffset] and the statement at [statementFileOffset].
InternalStatement createRethrowStatement(
int rethrowFileOffset,
int statementFileOffset,
) {
return new InternalExpressionStatement(
createRethrow(fileOffset: rethrowFileOffset),
fileOffset: statementFileOffset,
);
}
/// Return a representation of a return statement.
InternalReturnStatement createReturnStatement({
InternalExpression? expression,
bool isArrow = true,
required int fileOffset,
}) {
return new InternalReturnStatement(
expression: expression,
isArrow: isArrow,
fileOffset: fileOffset,
);
}
InternalElement createSpreadElement({
required InternalExpression expression,
required bool isNullAware,
required int fileOffset,
}) {
return new SpreadElement(
expression: expression,
isNullAware: isNullAware,
fileOffset: fileOffset,
);
}
InternalExpression createStaticGet(int fileOffset, Member target) {
assert(target is Field || (target is Procedure && target.isGetter));
return new InternalStaticGet(target, fileOffset: fileOffset);
}
InternalExpression createStaticSet(
Member target,
InternalExpression value, {
required int fileOffset,
}) {
assert(
target is Field || (target is Procedure && target.isSetter),
"Unexpected static set target $target",
);
return new InternalStaticSet(target, value, fileOffset: fileOffset);
}
InternalExpression 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 InternalStaticTearOff(procedure, fileOffset: fileOffset);
}
InternalExpression createStringConcatenation(
int fileOffset,
List<InternalExpression> expressions,
) {
assert(fileOffset != TreeNode.noOffset);
return new InternalStringConcatenation(expressions, 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.
InternalExpression createStringLiteral(int fileOffset, String value) {
return new InternalStringLiteral(value, fileOffset: fileOffset);
}
InternalExpression createSuperIncDec({
required InternalThisExpression receiver,
required Member getter,
required Member setter,
required Name name,
required bool forEffect,
required bool isPost,
required bool isInc,
required int nameOffset,
required int operatorOffset,
}) {
return new SuperIncDec(
receiver: receiver,
getter: getter,
setter: setter,
name: name,
forEffect: forEffect,
isPost: isPost,
isInc: isInc,
nameOffset: nameOffset,
operatorOffset: operatorOffset,
);
}
InternalSuperInitializer createSuperInitializer({
required Constructor target,
required ActualArguments arguments,
required bool isSynthetic,
required int fileOffset,
}) {
return new InternalSuperInitializer(
target,
arguments,
isSynthetic: isSynthetic,
fileOffset: fileOffset,
);
}
InternalExpression createStaticIncDec({
required Member getter,
required Member setter,
required Name name,
required bool forEffect,
required bool isPost,
required bool isInc,
required int nameOffset,
required int operatorOffset,
}) {
return new StaticIncDec(
getter: getter,
setter: setter,
name: name,
forEffect: forEffect,
isPost: isPost,
isInc: isInc,
nameOffset: nameOffset,
operatorOffset: operatorOffset,
);
}
InternalExpression createIfNullSuperIndexSet({
required Member? getter,
required Member? setter,
required InternalExpression index,
required InternalExpression value,
required int readOffset,
required int testOffset,
required int writeOffset,
required bool forEffect,
}) {
return new IfNullSuperIndexSet(
getter: getter,
setter: setter,
index: index,
value: value,
readOffset: readOffset,
testOffset: testOffset,
writeOffset: writeOffset,
forEffect: forEffect,
);
}
InternalExpression createSuperIndexSet({
required Member setter,
required InternalExpression index,
required InternalExpression value,
required int fileOffset,
}) {
return new SuperIndexSet(
setter: setter,
index: index,
value: value,
fileOffset: fileOffset,
);
}
InternalExpression createSuperMethodInvocation({
required Name name,
required Procedure procedure,
required TypeArguments? typeArguments,
required ActualArguments arguments,
required int fileOffset,
}) {
return new InternalSuperMethodInvocation(
name,
typeArguments,
arguments,
procedure,
fileOffset: fileOffset,
);
}
InternalExpression createSuperPropertyGet(
InternalThisExpression receiver,
Name name,
Member target, {
required int fileOffset,
}) {
return new InternalSuperPropertyGet(
receiver: receiver,
name: name,
interfaceTarget: target,
fileOffset: fileOffset,
);
}
InternalExpression createSuperPropertySet(
InternalThisExpression receiver,
Name name,
Member target,
InternalExpression value, {
required int fileOffset,
}) {
return new InternalSuperPropertySet(
receiver: receiver,
name: name,
value: value,
interfaceTarget: target,
fileOffset: fileOffset,
);
}
InternalExpression createSwitchExpression(
int fileOffset,
InternalExpression expression,
List<InternalSwitchExpressionCase> cases,
) {
return new InternalSwitchExpression(
expression: expression,
cases: cases,
fileOffset: fileOffset,
);
}
InternalSwitchExpressionCase createSwitchExpressionCase(
int fileOffset,
InternalPatternGuard patternGuard,
InternalExpression expression,
) {
return new InternalSwitchExpressionCase(
patternGuard: patternGuard,
expression: expression,
fileOffset: fileOffset,
);
}
InternalSwitchStatement createSwitchStatement(
InternalExpression expression,
List<InternalSwitchStatementCase> cases, {
required int fileOffset,
}) {
return new InternalRegularSwitchStatement(
expression: expression,
cases: cases,
fileOffset: fileOffset,
);
}
InternalSwitchStatementCase createSwitchStatementCase({
required List<InternalExpression> expressions,
required List<int> expressionOffsets,
required InternalStatement body,
required bool isDefault,
required List<int> caseOffsets,
required List<Label>? labels,
required int fileOffset,
}) {
return new InternalSwitchStatementCase(
caseOffsets: caseOffsets,
expressions: expressions,
expressionOffsets: expressionOffsets,
body: body,
isDefault: isDefault,
labels: labels,
fileOffset: fileOffset,
);
}
/// Return a representation of a symbol literal defined by [value] at the
/// given [fileOffset].
InternalExpression createSymbolLiteral(int fileOffset, String value) {
return new InternalSymbolLiteral(value, fileOffset: fileOffset);
}
InternalSyntheticVariable createSyntheticVariable({
String? name,
DartType? type,
required int fileOffset,
bool isFinal = false,
bool isLowered = false,
bool isSynthesized = true,
}) {
return new InternalSyntheticVariable(
name: name,
type: type ?? const DynamicType(),
isFinal: isFinal,
isLowered: isLowered,
isSynthesized: isSynthesized,
isImplicitlyTyped: type == null,
fileOffset: fileOffset,
);
}
InternalThisExpression createThisExpression({required int fileOffset}) {
return new InternalThisExpression(fileOffset: fileOffset);
}
InternalThisVariable createThisVariable({
required DartType type,
required int fileOffset,
}) {
return new InternalThisVariable(type: type, fileOffset: fileOffset);
}
/// Return a representation of a throw expression at the given [fileOffset].
InternalExpression createThrow(int fileOffset, InternalExpression expression) {
return new InternalThrow(expression, fileOffset: fileOffset);
}
InternalStatement createTryStatement(
int fileOffset,
InternalStatement tryBlock,
List<InternalCatch>? catchBlocks,
InternalStatement? finallyBlock,
) {
return new TryStatement(
tryBlock,
catchBlocks ?? [],
finallyBlock,
fileOffset: fileOffset,
);
}
InternalExpression createTypeAliasedConstructorInvocation({
required TypeAliasBuilder typeAliasBuilder,
required Constructor target,
required TypeArguments? typeArguments,
required ActualArguments arguments,
required bool isConst,
required int fileOffset,
}) {
return new TypeAliasedConstructorInvocation(
typeAliasBuilder: typeAliasBuilder,
target: target,
typeArguments: typeArguments,
arguments: arguments,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalExpression createTypeAliasedFactoryInvocation({
required TypeAliasBuilder typeAliasBuilder,
required Procedure target,
required TypeArguments? typeArguments,
required ActualArguments arguments,
required bool isConst,
required int fileOffset,
}) {
return new TypeAliasedFactoryInvocation(
typeAliasBuilder: typeAliasBuilder,
target: target,
typeArguments: typeArguments,
arguments: arguments,
isConst: isConst,
fileOffset: fileOffset,
);
}
InternalExpression createTypedefTearOff(
int fileOffset,
List<StructuralParameter> structuralParameters,
InternalExpression expression,
List<DartType> typeArguments,
) {
return new InternalTypedefTearOff(
structuralParameters: structuralParameters,
expression: expression,
typeArguments: typeArguments,
fileOffset: fileOffset,
);
}
InternalExpression createTypeLiteral(int fileOffset, DartType type) {
return new InternalTypeLiteral(type, fileOffset: fileOffset);
}
TypeParameterType createTypeParameterTypeWithDefaultNullabilityForLibrary(
TypeParameter typeParameter,
Library library,
) {
return new TypeParameterType.withDefaultNullability(typeParameter);
}
UnaryExpression createUnary(
int fileOffset,
Name unaryName,
InternalExpression expression,
) {
return new UnaryExpression(unaryName, expression, fileOffset: fileOffset);
}
InternalVariableDeclaration createVariableDeclaration(
InternalDeclaredVariable variable, {
required InternalExpression? initializer,
int? fileOffset,
}) {
return new InternalVariableDeclaration(
variable,
initializer: initializer,
fileOffset: fileOffset ?? variable.fileOffset,
);
}
InternalVariableGet createVariableGet(
InternalVariable variable, {
required int fileOffset,
}) {
return new InternalVariableGet(variable, fileOffset: fileOffset);
}
InternalPattern createVariablePattern(
int fileOffset,
DartType? type,
InternalDeclaredVariable variable,
) {
return new InternalVariablePattern(
type: type,
variable: variable,
fileOffset: fileOffset,
);
}
InternalVariableSet createVariableSet(
InternalVariable variable,
InternalExpression value, {
required int fileOffset,
}) {
return new InternalVariableSet(variable, value, fileOffset: fileOffset);
}
InternalVariableStatement createVariableStatement(
InternalVariableDeclaration declaration, {
int? fileOffset,
}) {
return new InternalVariableStatement(
declaration,
fileOffset: fileOffset ?? declaration.fileOffset,
);
}
/// Return a representation of a while statement at the given [fileOffset]
/// consisting of the given [condition] and [body].
InternalLoopStatement createWhileStatement(
int fileOffset,
InternalExpression condition,
InternalStatement body,
) {
return new InternalWhileStatement(condition, body, fileOffset: fileOffset);
}
InternalPattern createWildcardPattern(int fileOffset, DartType? type) {
return new InternalWildcardPattern(type: type, 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.
InternalStatement createYieldStatement(
int fileOffset,
InternalExpression expression, {
required bool isYieldStar,
}) {
return new InternalYieldStatement(
expression,
isYieldStar: isYieldStar,
fileOffset: fileOffset,
);
}
// TODO(johnniwinther): This has been broken for some time. Do we need it?
bool isThisExpression(Object node) => false;
bool isVariablesDeclaration(Object? node) => node is MultiVariableDeclaration;
MultiVariableDeclaration variablesDeclaration(
List<InternalVariableDeclaration> declarations, {
required int fileOffset,
}) {
return new MultiVariableDeclaration(declarations, fileOffset: fileOffset);
}
List<InternalVariableDeclaration> variablesDeclarationExtractDeclarations(
Object? variablesDeclaration,
) {
return (variablesDeclaration as MultiVariableDeclaration).declarations;
}
InternalStatement wrapVariables(InternalStatement statement) {
if (statement is MultiVariableDeclaration) {
return createBlock(
new List<InternalStatement>.generate(
statement.declarations.length,
(int index) => createVariableStatement(statement.declarations[index]),
growable: true,
),
fileOffset: statement.fileOffset,
fileEndOffset: TreeNode.noOffset,
);
} else if (statement is InternalVariableStatement) {
return createBlock(
<InternalStatement>[statement],
fileOffset: statement.fileOffset,
fileEndOffset: TreeNode.noOffset,
);
} else {
return statement;
}
}