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:
Brian Wilkerson 2018-05-18 18:49:58 +00:00 committed by commit-bot@chromium.org
parent 029e1394f7
commit 7ac05a120a
5 changed files with 60 additions and 37 deletions

View file

@ -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,

View file

@ -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

View file

@ -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);
}

View file

@ -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);

View file

@ -72,7 +72,6 @@ export 'kernel_shadow_ast.dart'
ShadowConstructorInvocation,
ShadowContinueSwitchStatement,
ShadowDeferredCheck,
ShadowDoStatement,
ShadowExpressionStatement,
ShadowFactoryConstructorInvocation,
ShadowFieldInitializer,