Split UnresolvedNameGenerator

This prepares the generator to be implemented by the analyzer.

Change-Id: I487a1704943fbe40ca20031372a436f74ef32752
Reviewed-on: https://dart-review.googlesource.com/57320
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Peter von der Ahé 2018-05-30 15:17:40 +00:00 committed by commit-bot@chromium.org
parent f50873d345
commit 3b6caa3517
7 changed files with 100 additions and 65 deletions

View file

@ -601,6 +601,15 @@ class AstBuildingForest
throw new UnimplementedError();
}
@override
Generator<Expression, Statement, _Arguments> unresolvedNameGenerator(
ExpressionGeneratorHelper<Expression, Statement, _Arguments> helper,
Token token,
kernel.Name name) {
// TODO(brianwilkerson) Implement this.
throw new UnimplementedError();
}
@override
VariableDeclarationStatement variablesDeclaration(
List<VariableDeclaration> declarations, Uri uri) {

View file

@ -15,11 +15,12 @@ import '../fasta_codes.dart'
messageInvalidInitializer,
templateDeferredTypeAnnotation,
templateIntegerLiteralIsOutOfRange,
templateNotAType;
templateNotAType,
templateUnresolvedPrefixInTypeAnnotation;
import '../names.dart' show lengthName;
import '../parser.dart' show lengthForToken, offsetForToken;
import '../parser.dart' show lengthForToken, lengthOfSpan, offsetForToken;
import '../problems.dart' show unhandled, unsupported;
@ -67,7 +68,6 @@ export 'kernel_expression_generator.dart'
ParenthesizedExpressionGenerator,
SendAccessGenerator,
ThisAccessGenerator,
UnresolvedNameGenerator,
buildIsNull;
abstract class ExpressionGenerator<Expression, Statement, Arguments> {
@ -797,3 +797,42 @@ abstract class ErroneousExpressionGenerator<Expression, Statement, Arguments>
isSetter: true);
}
}
abstract class UnresolvedNameGenerator<Expression, Statement, Arguments>
implements ErroneousExpressionGenerator<Expression, Statement, Arguments> {
factory UnresolvedNameGenerator(
ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Name name) {
return helper.forest.unresolvedNameGenerator(helper, token, name);
}
String get debugName => "UnresolvedNameGenerator";
Expression doInvocation(int charOffset, Arguments arguments) {
return buildError(arguments, offset: charOffset);
}
@override
DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
helper.addProblem(
templateUnresolvedPrefixInTypeAnnotation.withArguments(
name.name, suffix.name),
offsetForToken(token),
lengthOfSpan(token, suffix.token));
return const InvalidType();
}
@override
Expression buildError(Arguments arguments,
{bool isGetter: false, bool isSetter: false, int offset}) {
offset ??= offsetForToken(this.token);
return helper.throwNoSuchMethodError(
storeOffset(forest.literalNull(null), offset),
plainNameForRead,
arguments,
offset,
isGetter: isGetter,
isSetter: isSetter);
}
}

View file

@ -58,6 +58,7 @@ import 'kernel_expression_generator.dart'
KernelThisIndexedAccessGenerator,
KernelThisPropertyAccessGenerator,
KernelTypeUseGenerator,
KernelUnresolvedNameGenerator,
KernelVariableUseGenerator;
import 'kernel_shadow_ast.dart'
@ -756,6 +757,14 @@ class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
Token token) {
return new KernelLargeIntAccessGenerator(helper, token);
}
@override
KernelUnresolvedNameGenerator unresolvedNameGenerator(
ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Token token,
Name name) {
return new KernelUnresolvedNameGenerator(helper, token, name);
}
}
class _VariablesDeclaration extends Statement {

View file

@ -454,6 +454,11 @@ abstract class Forest<Expression, Statement, Location, Arguments> {
ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Location location);
Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
Location location,
kernel.Name name);
// TODO(ahe): Remove this method when all users are moved here.
kernel.Arguments castArguments(Arguments arguments) {
dynamic a = arguments;

View file

@ -13,8 +13,7 @@ import '../fasta_codes.dart'
LocatedMessage,
messageLoadLibraryTakesNoArguments,
messageSuperAsExpression,
templateNotAPrefixInTypeAnnotation,
templateUnresolvedPrefixInTypeAnnotation;
templateNotAPrefixInTypeAnnotation;
import '../messages.dart' show Message, noLength;
@ -62,6 +61,7 @@ import 'expression_generator.dart'
ThisIndexedAccessGenerator,
ThisPropertyAccessGenerator,
TypeUseGenerator,
UnresolvedNameGenerator,
VariableUseGenerator;
import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
@ -1431,6 +1431,37 @@ class KernelLargeIntAccessGenerator extends KernelGenerator
}
}
class KernelUnresolvedNameGenerator extends KernelGenerator
with
ErroneousExpressionGenerator<Expression, Statement, Arguments>,
UnresolvedNameGenerator<Expression, Statement, Arguments> {
@override
final Name name;
KernelUnresolvedNameGenerator(
ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
Token token,
this.name)
: super(helper, token);
@override
Expression _makeRead(ShadowComplexAssignment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
ShadowComplexAssignment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@override
void printOn(StringSink sink) {
sink.write(", name: ");
sink.write(name.name);
}
}
Expression makeLet(VariableDeclaration variable, Expression body) {
if (variable == null) return body;
return new Let(variable, body);

View file

@ -217,64 +217,6 @@ abstract class IncompleteSendGenerator extends KernelGenerator {
}
}
class UnresolvedNameGenerator extends KernelGenerator
with ErroneousExpressionGenerator<Expression, Statement, Arguments> {
@override
final Name name;
UnresolvedNameGenerator(
ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
Token token,
this.name)
: super(helper, token);
String get debugName => "UnresolvedNameGenerator";
Expression doInvocation(int charOffset, Arguments arguments) {
return buildError(arguments, offset: charOffset);
}
@override
DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
helper.addProblem(
templateUnresolvedPrefixInTypeAnnotation.withArguments(
name.name, suffix.name),
offsetForToken(token),
lengthOfSpan(token, suffix.token));
return const InvalidType();
}
@override
Expression buildError(Arguments arguments,
{bool isGetter: false, bool isSetter: false, int offset}) {
offset ??= offsetForToken(this.token);
return helper.throwNoSuchMethodError(
storeOffset(forest.literalNull(null), offset),
plainNameForRead,
arguments,
offset,
isGetter: isGetter,
isSetter: isSetter);
}
@override
Expression _makeRead(ShadowComplexAssignment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
ShadowComplexAssignment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@override
void printOn(StringSink sink) {
sink.write(", name: ");
sink.write(name.name);
}
}
class IncompleteErrorGenerator extends IncompleteSendGenerator
with ErroneousExpressionGenerator<Expression, Statement, Arguments> {
final Message message;

View file

@ -74,7 +74,7 @@ import 'package:front_end/src/fasta/kernel/kernel_expression_generator.dart'
ParenthesizedExpressionGenerator,
SendAccessGenerator,
ThisAccessGenerator,
UnresolvedNameGenerator;
KernelUnresolvedNameGenerator;
import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
@ -228,6 +228,6 @@ main() {
new KernelTypeUseGenerator(
helper, token, prefixBuilder, -1, declaration, "foo"));
check("UnresolvedNameGenerator(offset: 4, name: bar)",
new UnresolvedNameGenerator(helper, token, name));
new KernelUnresolvedNameGenerator(helper, token, name));
});
}