From ae9f5d2a1b1de86250c64bf642885408ae7b3fe5 Mon Sep 17 00:00:00 2001 From: Brian Wilkerson Date: Wed, 30 May 2018 13:20:10 +0000 Subject: [PATCH] Add Forest API for logical expressions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib9efeb06d1c6857b07f3c42724310621416a0fc8 Reviewed-on: https://dart-review.googlesource.com/57080 Reviewed-by: Dan Rubel Reviewed-by: Peter von der Ahé Commit-Queue: Brian Wilkerson --- pkg/analyzer/lib/src/fasta/ast_building_factory.dart | 5 +++++ pkg/front_end/lib/src/fasta/kernel/body_builder.dart | 9 +++------ pkg/front_end/lib/src/fasta/kernel/fangorn.dart | 9 +++++++++ pkg/front_end/lib/src/fasta/kernel/forest.dart | 5 +++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart index 94cbe9788c1..1279ad1cd3d 100644 --- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart +++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart @@ -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); diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index b0297d00283..86a9cf34ad5 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -1037,13 +1037,10 @@ abstract class BodyBuilder 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); } diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart index 3acd9dffdcc..a5f104166d0 100644 --- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart +++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart @@ -83,6 +83,7 @@ import 'kernel_shadow_ast.dart' ShadowLabeledStatement, ShadowListLiteral, ShadowLoadLibrary, + ShadowLogicalExpression, ShadowMapLiteral, ShadowNot, ShadowNullLiteral, @@ -426,6 +427,14 @@ class Fangorn extends Forest { LabelTarget 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); diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart index 8509c3082c5..b8b3ab39dac 100644 --- a/pkg/front_end/lib/src/fasta/kernel/forest.dart +++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart @@ -250,6 +250,11 @@ abstract class Forest { Statement labeledStatement( LabelTarget 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