Add Forest API for logical expressions

Change-Id: Ib9efeb06d1c6857b07f3c42724310621416a0fc8
Reviewed-on: https://dart-review.googlesource.com/57080
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2018-05-30 13:20:10 +00:00 committed by commit-bot@chromium.org
parent 66c590d3ad
commit ae9f5d2a1b
4 changed files with 22 additions and 6 deletions

View file

@ -413,6 +413,11 @@ class AstBuildingForest
throw new UnimplementedError();
}
@override
Expression logicalExpression(
Expression leftOperand, Token operator, Expression rightOperand) =>
astFactory.binaryExpression(leftOperand, operator, rightOperand);
@override
Object mapEntry(Expression key, Token colon, Expression value) =>
astFactory.mapLiteralEntry(key, colon, value);

View file

@ -1037,13 +1037,10 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
void doLogicalExpression(Token token) {
Expression argument = popForValue();
Expression receiver = pop();
var logicalExpression = new ShadowLogicalExpression(
toKernelExpression(receiver),
token.stringValue,
toKernelExpression(argument))
..fileOffset = offsetForToken(token);
Expression logicalExpression =
forest.logicalExpression(receiver, token, argument);
typePromoter.exitLogicalExpression(
toKernelExpression(argument), logicalExpression);
toKernelExpression(argument), toKernelExpression(logicalExpression));
push(logicalExpression);
}

View file

@ -83,6 +83,7 @@ import 'kernel_shadow_ast.dart'
ShadowLabeledStatement,
ShadowListLiteral,
ShadowLoadLibrary,
ShadowLogicalExpression,
ShadowMapLiteral,
ShadowNot,
ShadowNullLiteral,
@ -426,6 +427,14 @@ class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
LabelTarget<Statement> target, Statement statement) =>
statement;
@override
Expression logicalExpression(
Expression leftOperand, Token operator, Expression rightOperand) {
return new ShadowLogicalExpression(
leftOperand, operator.stringValue, rightOperand)
..fileOffset = offsetForToken(operator);
}
@override
Expression notExpression(Expression operand, Token token) {
return new ShadowNot(operand)..fileOffset = offsetForToken(token);

View file

@ -250,6 +250,11 @@ abstract class Forest<Expression, Statement, Location, Arguments> {
Statement labeledStatement(
LabelTarget<Statement> target, Statement statement);
/// Return a representation of a logical expression having the [leftOperand],
/// [rightOperand] and the [operator] (either `&&` or `||`).
Expression logicalExpression(
Expression leftOperand, Location operator, Expression rightOperand);
Expression notExpression(Expression operand, Location location);
/// Return a representation of a parenthesized condition consisting of the