mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 21:33:03 +00:00
Add Forest support for do statements
Change-Id: Iefa5f5bda3f7b47cc230f4ae8da93fbe3897961f Reviewed-on: https://dart-review.googlesource.com/55912 Reviewed-by: Dan Rubel <danrubel@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
parent
029e1394f7
commit
7ac05a120a
|
@ -63,14 +63,12 @@ class AstBuildingForest
|
|||
Expression asLiteralString(Expression value) => value;
|
||||
|
||||
@override
|
||||
Expression awaitExpression(Expression operand, Token awaitKeyword) {
|
||||
return astFactory.awaitExpression(awaitKeyword, operand);
|
||||
}
|
||||
Expression awaitExpression(Expression operand, Token awaitKeyword) =>
|
||||
astFactory.awaitExpression(awaitKeyword, operand);
|
||||
|
||||
@override
|
||||
Block block(Token openBrace, List<Statement> statements, Token closeBrace) {
|
||||
return astFactory.block(openBrace, statements, closeBrace);
|
||||
}
|
||||
Block block(Token openBrace, List<Statement> statements, Token closeBrace) =>
|
||||
astFactory.block(openBrace, statements, closeBrace);
|
||||
|
||||
@override
|
||||
kernel.Arguments castArguments(_Arguments arguments) {
|
||||
|
@ -90,6 +88,18 @@ class AstBuildingForest
|
|||
astFactory.conditionalExpression(
|
||||
condition, question, thenExpression, colon, elseExpression);
|
||||
|
||||
@override
|
||||
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
|
||||
ParenthesizedExpression condition, Token semicolon) =>
|
||||
astFactory.doStatement(
|
||||
doKeyword,
|
||||
body,
|
||||
whileKeyword,
|
||||
condition.leftParenthesis,
|
||||
condition.expression,
|
||||
condition.rightParenthesis,
|
||||
semicolon);
|
||||
|
||||
@override
|
||||
Statement emptyStatement(Token semicolon) =>
|
||||
astFactory.emptyStatement(semicolon);
|
||||
|
@ -107,17 +117,20 @@ class AstBuildingForest
|
|||
typeArguments.arguments.length;
|
||||
|
||||
@override
|
||||
Statement ifStatement(Token ifKeyword, ParenthesizedExpression condition,
|
||||
Statement thenStatement, Token elseKeyword, Statement elseStatement) {
|
||||
return astFactory.ifStatement(
|
||||
ifKeyword,
|
||||
condition.leftParenthesis,
|
||||
condition.expression,
|
||||
condition.rightParenthesis,
|
||||
thenStatement,
|
||||
elseKeyword,
|
||||
elseStatement);
|
||||
}
|
||||
Statement ifStatement(
|
||||
Token ifKeyword,
|
||||
ParenthesizedExpression condition,
|
||||
Statement thenStatement,
|
||||
Token elseKeyword,
|
||||
Statement elseStatement) =>
|
||||
astFactory.ifStatement(
|
||||
ifKeyword,
|
||||
condition.leftParenthesis,
|
||||
condition.expression,
|
||||
condition.rightParenthesis,
|
||||
thenStatement,
|
||||
elseKeyword,
|
||||
elseStatement);
|
||||
|
||||
@override
|
||||
bool isBlock(Object node) => node is Block;
|
||||
|
@ -134,9 +147,8 @@ class AstBuildingForest
|
|||
bool isThisExpression(Object node) => node is ThisExpression;
|
||||
|
||||
@override
|
||||
bool isVariablesDeclaration(Object node) {
|
||||
return node is VariableDeclarationStatement && node.variables != 1;
|
||||
}
|
||||
bool isVariablesDeclaration(Object node) =>
|
||||
node is VariableDeclarationStatement && node.variables != 1;
|
||||
|
||||
@override
|
||||
Expression literalBool(bool value, Token location) =>
|
||||
|
@ -189,11 +201,10 @@ class AstBuildingForest
|
|||
|
||||
@override
|
||||
Expression literalSymbolMultiple(
|
||||
String value, Token hash, List<Identifier> components) {
|
||||
return astFactory.symbolLiteral(
|
||||
hash, components.map((identifier) => identifier.token).toList())
|
||||
..staticType = _typeProvider?.symbolType;
|
||||
}
|
||||
String value, Token hash, List<Identifier> components) =>
|
||||
astFactory.symbolLiteral(
|
||||
hash, components.map((identifier) => identifier.token).toList())
|
||||
..staticType = _typeProvider?.symbolType;
|
||||
|
||||
@override
|
||||
Expression literalSymbolSingluar(String value, Token hash, Object component) {
|
||||
|
@ -299,9 +310,8 @@ class AstBuildingForest
|
|||
|
||||
@override
|
||||
NodeList<VariableDeclaration> variablesDeclarationExtractDeclarations(
|
||||
VariableDeclarationStatement variablesDeclaration) {
|
||||
return variablesDeclaration.variables.variables;
|
||||
}
|
||||
VariableDeclarationStatement variablesDeclaration) =>
|
||||
variablesDeclaration.variables.variables;
|
||||
|
||||
@override
|
||||
Statement whileStatement(Token whileKeyword,
|
||||
|
|
|
@ -3151,19 +3151,17 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
|
|||
Statement body = popStatement();
|
||||
JumpTarget continueTarget = exitContinueTarget();
|
||||
JumpTarget breakTarget = exitBreakTarget();
|
||||
kernel.Statement kernelBody = toKernelStatement(body);
|
||||
if (continueTarget.hasUsers) {
|
||||
kernelBody = new ShadowLabeledStatement(kernelBody);
|
||||
continueTarget.resolveContinues(forest, kernelBody);
|
||||
body = forest.syntheticLabeledStatement(body);
|
||||
continueTarget.resolveContinues(forest, body);
|
||||
}
|
||||
kernel.Statement result =
|
||||
new ShadowDoStatement(kernelBody, toKernelExpression(condition))
|
||||
..fileOffset = doKeyword.charOffset;
|
||||
Statement result =
|
||||
forest.doStatement(doKeyword, body, whileKeyword, condition, endToken);
|
||||
if (breakTarget.hasUsers) {
|
||||
result = new ShadowLabeledStatement(result);
|
||||
result = forest.syntheticLabeledStatement(result);
|
||||
breakTarget.resolveBreaks(forest, result);
|
||||
}
|
||||
exitLoopOrSwitch(toStatement(result));
|
||||
exitLoopOrSwitch(result);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -45,6 +45,7 @@ import 'kernel_shadow_ast.dart'
|
|||
ShadowBoolLiteral,
|
||||
ShadowCheckLibraryIsLoaded,
|
||||
ShadowConditionalExpression,
|
||||
ShadowDoStatement,
|
||||
ShadowDoubleLiteral,
|
||||
ShadowExpressionStatement,
|
||||
ShadowIfStatement,
|
||||
|
@ -250,6 +251,13 @@ class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
|
|||
..fileOffset = offsetForToken(question);
|
||||
}
|
||||
|
||||
@override
|
||||
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
|
||||
Expression condition, Token semicolon) {
|
||||
return new ShadowDoStatement(body, condition)
|
||||
..fileOffset = doKeyword.charOffset;
|
||||
}
|
||||
|
||||
Statement expressionStatement(Expression expression, Token semicolon) {
|
||||
return new ShadowExpressionStatement(expression);
|
||||
}
|
||||
|
|
|
@ -148,6 +148,14 @@ abstract class Forest<Expression, Statement, Location, Arguments> {
|
|||
Expression conditionalExpression(Expression condition, Location question,
|
||||
Expression thenExpression, Location colon, Expression elseExpression);
|
||||
|
||||
/// Return a representation of a do statement.
|
||||
Statement doStatement(
|
||||
Location doKeyword,
|
||||
Statement body,
|
||||
Location whileKeyword,
|
||||
covariant Expression condition,
|
||||
Location semicolon);
|
||||
|
||||
/// Return a representation of an expression statement composed from the
|
||||
/// [expression] and [semicolon].
|
||||
Statement expressionStatement(Expression expression, Location semicolon);
|
||||
|
|
|
@ -72,7 +72,6 @@ export 'kernel_shadow_ast.dart'
|
|||
ShadowConstructorInvocation,
|
||||
ShadowContinueSwitchStatement,
|
||||
ShadowDeferredCheck,
|
||||
ShadowDoStatement,
|
||||
ShadowExpressionStatement,
|
||||
ShadowFactoryConstructorInvocation,
|
||||
ShadowFieldInitializer,
|
||||
|
|
Loading…
Reference in a new issue