Add an implementation of the UnresolvedNameGenerator for analyzer
Change-Id: I685dc6071980c2df4adb755d6e5e8daf9ecc211b
Reviewed-on: https://dart-review.googlesource.com/57420
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
new file mode 100644
index 0000000..54af172
--- /dev/null
+++ b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
@@ -0,0 +1,174 @@
+// 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/fasta/ast_building_factory.dart';
+import 'package:front_end/src/fasta/kernel/expression_generator.dart' as fasta;
+import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/scanner/token.dart';
+import 'package:kernel/ast.dart' show DartType, Initializer, Name, Procedure;
+
+abstract class AnalyzerExpressionGenerator
+ implements Generator<Expression, Statement, Arguments> {
+ final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
+
+ final AstFactory astFactory;
+
+ AnalyzerExpressionGenerator(this.helper, this.astFactory);
+
+ Forest<Expression, Statement, Token, Arguments> get forest => helper.forest;
+
+ @override
+// TODO: implement isInitializer
+ bool get isInitializer => throw new UnimplementedError();
+ @override
+// TODO: implement isThisPropertyAccess
+ bool get isThisPropertyAccess => throw new UnimplementedError();
+
+ @override
+// TODO: implement plainNameForRead
+ String get plainNameForRead => throw new UnimplementedError();
+
+ @override
+// TODO: implement plainNameForWrite
+ String get plainNameForWrite => throw new UnimplementedError();
+
+ @override
+// TODO: implement uri
+ Uri get uri => throw new UnimplementedError();
+
+ @override
+ Expression buildAssignment(Expression value, {bool voidContext}) {
+ // TODO: implement buildAssignment
+ throw new UnimplementedError();
+ }
+
+ @override
+ Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+ {int offset,
+ bool voidContext,
+ Procedure interfaceTarget,
+ bool isPreIncDec}) {
+ // TODO: implement buildCompoundAssignment
+ throw new UnimplementedError();
+ }
+
+ @override
+ Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+ // TODO: implement buildFieldInitializer
+ throw new UnimplementedError();
+ }
+
+ /// For most accessors, the AST structure will be the same whether the result
+ /// is being used for access or modification.
+ Expression buildForEffect() => buildSimpleRead();
+
+ @override
+ Expression buildNullAwareAssignment(
+ Expression value, DartType type, int offset,
+ {bool voidContext}) {
+ // TODO: implement buildNullAwareAssignment
+ throw new UnimplementedError();
+ }
+
+ @override
+ Expression buildPostfixIncrement(Name binaryOperator,
+ {int offset, bool voidContext, Procedure interfaceTarget}) {
+ // TODO: implement buildPostfixIncrement
+ throw new UnimplementedError();
+ }
+
+ @override
+ Expression buildPrefixIncrement(Name binaryOperator,
+ {int offset, bool voidContext, Procedure interfaceTarget}) {
+ // TODO: implement buildPrefixIncrement
+ throw new UnimplementedError();
+ }
+
+ @override
+ buildPropertyAccess(fasta.IncompleteSendGenerator send, int operatorOffset,
+ bool isNullAware) {
+ // TODO: implement buildPropertyAccess
+ throw new UnimplementedError();
+ }
+
+ @override
+ buildThrowNoSuchMethodError(Expression receiver, Arguments arguments,
+ {bool isSuper,
+ bool isGetter,
+ bool isSetter,
+ bool isStatic,
+ String name,
+ int offset,
+ /*LocatedMessage*/ argMessage}) {
+ // TODO: implement buildThrowNoSuchMethodError
+ throw new UnimplementedError();
+ }
+
+ @override
+ DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+ {bool nonInstanceAccessIsError: false}) {
+ // TODO: implement buildTypeWithBuiltArguments
+ throw new UnimplementedError();
+ }
+
+ @override
+ doInvocation(int offset, Arguments arguments) {
+ // TODO: implement doInvocation
+ throw new UnimplementedError();
+ }
+
+ @override
+ Expression makeInvalidRead() {
+ // TODO: implement makeInvalidRead
+ throw new UnimplementedError();
+ }
+
+ @override
+ Expression makeInvalidWrite(Expression value) {
+ // TODO: implement makeInvalidWrite
+ throw new UnimplementedError();
+ }
+
+ @override
+ void printOn(StringSink sink) {
+ // TODO: implement printOn
+ throw new UnimplementedError();
+ }
+
+ @override
+ T storeOffset<T>(T node, int offset) {
+ // TODO: implement storeOffset
+ throw new UnimplementedError();
+ }
+}
+
+class AnalyzerUnresolvedNameGenerator extends AnalyzerExpressionGenerator
+ with
+ fasta.ErroneousExpressionGenerator<Expression, Statement, Arguments>,
+ fasta.UnresolvedNameGenerator<Expression, Statement, Arguments> {
+ @override
+ final Token token;
+
+ @override
+ final Name name;
+
+ AnalyzerUnresolvedNameGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
+ AstFactory astFactory,
+ this.token,
+ this.name)
+ : super(helper, astFactory);
+
+ @override
+ Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
+
+ @override
+ void printOn(StringSink sink) {
+ sink.write(", name: ");
+ sink.write(name.name);
+ }
+}
diff --git a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart b/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
index 92c95b7..f79a164 100644
--- a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
@@ -4,7 +4,7 @@
import 'package:analyzer/dart/ast/ast.dart' show Expression, Statement;
import 'package:analyzer/src/fasta/ast_building_factory.dart'
- show AstBuildingForest;
+ show Arguments, AstBuildingForest;
import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
@@ -17,7 +17,7 @@
export 'package:front_end/src/fasta/kernel/unlinked_scope.dart'
show UnlinkedScope;
-class AstBodyBuilder extends BodyBuilder<Expression, Statement, dynamic> {
+class AstBodyBuilder extends BodyBuilder<Expression, Statement, Arguments> {
@override
final AstBuildingForest forest;
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index d794f10..9ffd99a 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -5,14 +5,22 @@
import 'package:analyzer/dart/ast/ast.dart' hide Identifier;
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/fasta/analyzer_expression_generator.dart';
import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
import 'package:front_end/src/fasta/kernel/body_builder.dart' show LabelTarget;
import 'package:front_end/src/fasta/kernel/forest.dart';
import 'package:kernel/ast.dart' as kernel;
+/// A data holder used to conform to the [Forest] API.
+class Arguments {
+ List<TypeAnnotation> typeArguments = <TypeAnnotation>[];
+ List<Expression> positionalArguments = <Expression>[];
+ List<Expression> namedArguments = <Expression>[];
+}
+
/// An implementation of a [Forest] that can be used to build an AST structure.
class AstBuildingForest
- implements Forest<Expression, Statement, Token, _Arguments> {
+ implements Forest<Expression, Statement, Token, Arguments> {
/// The type provider used to resolve the types of literal nodes, or `null` if
/// type resolution is not being performed.
final TypeProvider _typeProvider;
@@ -24,9 +32,9 @@
AstBuildingForest(this._typeProvider);
@override
- _Arguments arguments(List<Expression> positional, Token location,
+ Arguments arguments(List<Expression> positional, Token location,
{covariant List types, covariant List named}) {
- _Arguments arguments = new _Arguments();
+ Arguments arguments = new Arguments();
if (types != null) {
arguments.typeArguments = types.cast<TypeAnnotation>();
}
@@ -38,22 +46,22 @@
}
@override
- _Arguments argumentsEmpty(Token location) => new _Arguments();
+ Arguments argumentsEmpty(Token location) => new Arguments();
@override
- List argumentsNamed(_Arguments arguments) => arguments.namedArguments;
+ List argumentsNamed(Arguments arguments) => arguments.namedArguments;
@override
- List<Expression> argumentsPositional(_Arguments arguments) =>
+ List<Expression> argumentsPositional(Arguments arguments) =>
arguments.positionalArguments;
@override
- void argumentsSetTypeArguments(_Arguments arguments, covariant List types) {
+ void argumentsSetTypeArguments(Arguments arguments, covariant List types) {
arguments.typeArguments = types.cast<TypeAnnotation>();
}
@override
- List argumentsTypeArguments(_Arguments arguments) => arguments.typeArguments;
+ List argumentsTypeArguments(Arguments arguments) => arguments.typeArguments;
@override
Expression asExpression(Expression expression, type, Token location) =>
@@ -98,7 +106,7 @@
breakKeyword, astFactory.simpleIdentifier(label.token), semicolon);
@override
- kernel.Arguments castArguments(_Arguments arguments) {
+ kernel.Arguments castArguments(Arguments arguments) {
// TODO(brianwilkerson) Implement this or remove it from the API.
throw new UnimplementedError();
}
@@ -164,11 +172,11 @@
continueKeyword, astFactory.simpleIdentifier(label.token), semicolon);
@override
- Generator<Expression, Statement, _Arguments> deferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> deferredAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
PrefixBuilder builder,
- Generator<Expression, Statement, _Arguments> generator) {
+ Generator<Expression, Statement, Arguments> generator) {
// TODO(brianwilkerson) Implement this.
throw new UnimplementedError();
}
@@ -269,8 +277,8 @@
elseStatement);
@override
- Generator<Expression, Statement, _Arguments> indexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> indexedAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression receiver,
Expression index,
@@ -318,8 +326,8 @@
astFactory.labeledStatement(target.labels.cast<Label>(), statement);
@override
- Generator<Expression, Statement, _Arguments> largeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> largeIntAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token) {
// TODO(brianwilkerson) Implement this.
throw new UnimplementedError();
@@ -410,8 +418,8 @@
}
@override
- Generator<Expression, Statement, _Arguments> loadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> loadLibraryGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
LoadLibraryBuilder builder) {
// TODO(brianwilkerson) Implement this.
@@ -436,8 +444,8 @@
..staticType = _typeProvider?.boolType;
@override
- Generator<Expression, Statement, _Arguments> nullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> nullAwarePropertyAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression receiverExpression,
kernel.Name name,
@@ -455,8 +463,8 @@
leftParenthesis, expression, rightParenthesis);
@override
- Generator<Expression, Statement, _Arguments> propertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> propertyAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression receiver,
kernel.Name name,
@@ -470,8 +478,8 @@
int readOffset(AstNode node) => node.offset;
@override
- Generator<Expression, Statement, _Arguments> readOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> readOnlyAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression expression,
String plainNameForRead) {
@@ -510,8 +518,8 @@
}
@override
- Generator<Expression, Statement, _Arguments> staticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> staticAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
kernel.Member getter,
kernel.Member setter) {
@@ -525,8 +533,8 @@
astFactory.adjacentStrings(strings.cast<StringLiteral>());
@override
- Generator<Expression, Statement, _Arguments> superIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> superIndexedAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression index,
kernel.Member getter,
@@ -536,8 +544,8 @@
}
@override
- Generator<Expression, Statement, _Arguments> superPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> superPropertyAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
kernel.Name name,
kernel.Member getter,
@@ -554,8 +562,8 @@
astFactory.thisExpression(thisKeyword);
@override
- Generator<Expression, Statement, _Arguments> thisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> thisIndexedAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Expression index,
kernel.Procedure getter,
@@ -565,8 +573,8 @@
}
@override
- Generator<Expression, Statement, _Arguments> thisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> thisPropertyAccessGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token location,
kernel.Name name,
kernel.Member getter,
@@ -590,8 +598,8 @@
tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
@override
- Generator<Expression, Statement, _Arguments> typeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> typeUseGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
PrefixBuilder prefix,
int declarationReferenceOffset,
@@ -602,8 +610,8 @@
}
@override
- Generator<Expression, Statement, _Arguments> unlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> unlinkedGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
UnlinkedDeclaration declaration) {
// TODO(brianwilkerson) Implement this.
@@ -611,12 +619,11 @@
}
@override
- Generator<Expression, Statement, _Arguments> unresolvedNameGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
kernel.Name name) {
- // TODO(brianwilkerson) Implement this.
- throw new UnimplementedError();
+ return new AnalyzerUnresolvedNameGenerator(helper, astFactory, token, name);
}
@override
@@ -632,8 +639,8 @@
variablesDeclaration.variables.variables;
@override
- Generator<Expression, Statement, _Arguments> variableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
+ Generator<Expression, Statement, Arguments> variableUseGenerator(
+ ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
VariableDeclarationStatement variable,
kernel.DartType promotedType) {
@@ -654,10 +661,3 @@
Expression expression, Token semicolon) =>
astFactory.yieldStatement(yieldKeyword, star, expression, semicolon);
}
-
-/// A data holder used to conform to the [Forest] API.
-class _Arguments {
- List<TypeAnnotation> typeArguments = <TypeAnnotation>[];
- List<Expression> positionalArguments = <Expression>[];
- List<Expression> namedArguments = <Expression>[];
-}
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 5908df2..be1221a 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -627,6 +627,8 @@
@failingTest
void test_logicalAndExpression() {
super.test_logicalAndExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -647,16 +649,22 @@
@failingTest
void test_logicalOrExpression() {
super.test_logicalOrExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_precedence_logicalAnd_left() {
super.test_logicalOrExpression_precedence_logicalAnd_left();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_precedence_logicalAnd_right() {
super.test_logicalOrExpression_precedence_logicalAnd_right();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -677,6 +685,8 @@
@failingTest
void test_multipleLabels_statement() {
super.test_multipleLabels_statement();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -1769,6 +1779,8 @@
@failingTest
void test_missingAssignableSelector_identifiersAssigned() {
super.test_missingAssignableSelector_identifiersAssigned();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -1794,6 +1806,8 @@
@failingTest
void test_missingAssignableSelector_superPropertyAccessAssigned() {
super.test_missingAssignableSelector_superPropertyAccessAssigned();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -2819,6 +2833,8 @@
@failingTest
void test_parseConditionalExpression() {
super.test_parseConditionalExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -3070,11 +3086,15 @@
@failingTest
void test_parseLogicalAndExpression() {
super.test_parseLogicalAndExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_parseLogicalOrExpression() {
super.test_parseLogicalOrExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -4041,11 +4061,15 @@
@failingTest
void test_conditionalExpression_missingElse() {
super.test_conditionalExpression_missingElse();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_conditionalExpression_missingThen() {
super.test_conditionalExpression_missingThen();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -4136,6 +4160,8 @@
@failingTest
void test_incomplete_conditionalExpression() {
super.test_incomplete_conditionalExpression();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -4316,16 +4342,22 @@
@failingTest
void test_logicalAndExpression_missing_LHS() {
super.test_logicalAndExpression_missing_LHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalAndExpression_missing_LHS_RHS() {
super.test_logicalAndExpression_missing_LHS_RHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalAndExpression_missing_RHS() {
super.test_logicalAndExpression_missing_RHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -4341,26 +4373,36 @@
@failingTest
void test_logicalOrExpression_missing_LHS() {
super.test_logicalOrExpression_missing_LHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_missing_LHS_RHS() {
super.test_logicalOrExpression_missing_LHS_RHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_missing_RHS() {
super.test_logicalOrExpression_missing_RHS();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_precedence_logicalAnd_left() {
super.test_logicalOrExpression_precedence_logicalAnd_left();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
void test_logicalOrExpression_precedence_logicalAnd_right() {
super.test_logicalOrExpression_precedence_logicalAnd_right();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -5363,6 +5405,8 @@
@failingTest
void test_parseStatement_multipleLabels() {
super.test_parseStatement_multipleLabels();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest