Convert UnresolvedAccessor to UnresolvedNameGenerator

Change-Id: Ie28b5d963ab575383b36551657c0f0109b5de53d
Reviewed-on: https://dart-review.googlesource.com/55963
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
Peter von der Ahé 2018-05-22 09:23:21 +00:00 committed by commit-bot@chromium.org
parent b5c6143d74
commit bbdf560ee7
4 changed files with 65 additions and 58 deletions

View file

@ -105,7 +105,7 @@ import 'expression_generator.dart'
ThisAccessGenerator,
ThisPropertyAccessGenerator,
TypeDeclarationAccessor,
UnresolvedAccessor,
UnresolvedNameGenerator,
VariableUseGenerator,
buildIsNull;
@ -437,7 +437,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
var expression = pop();
if (expression is Identifier) {
Identifier identifier = expression;
expression = new UnresolvedAccessor(
expression = new UnresolvedNameGenerator(
this, identifier.token, new Name(identifier.name, library.library));
}
if (name?.isNotEmpty ?? false) {
@ -1378,7 +1378,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
if (!isQualified && isInstanceContext) {
assert(builder == null);
if (constantContext != ConstantContext.none || member.isField) {
return new UnresolvedAccessor(this, token, n);
return new UnresolvedNameGenerator(this, token, n);
}
return new ThisPropertyAccessGenerator(this, token, n,
lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
@ -1387,7 +1387,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
member?.name == "_getMainClosure") {
return storeOffset(forest.literalNull(null), charOffset);
} else {
return new UnresolvedAccessor(this, token, n);
return new UnresolvedNameGenerator(this, token, n);
}
} else if (builder.isTypeDeclaration) {
if (constantContext != ConstantContext.none &&
@ -2564,7 +2564,7 @@ abstract class BodyBuilder<Expression, Statement, Arguments>
String name = suffix == null
? "${prefix.plainNameForRead}.${identifier.name}"
: "${prefix.plainNameForRead}.${identifier.name}.$suffix";
type = new UnresolvedAccessor(
type = new UnresolvedNameGenerator(
this, prefix.token, new Name(name, library.library));
} else {
unhandled("${prefix.runtimeType}", "pushQualifiedReference",

View file

@ -1743,6 +1743,62 @@ abstract class IncompleteSendGenerator<Arguments> extends Generator<Arguments> {
}
}
class UnresolvedNameGenerator<Arguments> extends Generator<Arguments>
with ErroneousExpressionGenerator<Arguments> {
@override
final Name name;
UnresolvedNameGenerator(
BuilderHelper<dynamic, dynamic, Arguments> helper, Token token, this.name)
: super(helper, token);
String get debugName => "UnresolvedNameGenerator";
kernel.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
kernel.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
kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
ShadowComplexAssignment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@override
void printOn(StringSink sink) {
sink.write(", name: ");
sink.write(name.name);
}
}
kernel.Expression makeLet(
VariableDeclaration variable, kernel.Expression body) {
if (variable == null) return body;

View file

@ -568,7 +568,7 @@ class TypeDeclarationAccessor<Arguments>
if (builder == null) {
// If we find a setter, [builder] is an [AccessErrorBuilder], not null.
if (send is IncompletePropertyAccessor) {
accessor = new UnresolvedAccessor(helper, send.token, name);
accessor = new UnresolvedNameGenerator(helper, send.token, name);
} else {
return helper.buildConstructorInvocation(declaration, send.token,
arguments, name.name, null, token.charOffset, Constness.implicit);
@ -655,55 +655,6 @@ class TypeDeclarationAccessor<Arguments>
}
}
class UnresolvedAccessor<Arguments> extends FastaAccessor<Arguments>
with GeneratorImpl, ErroneousExpressionGenerator<Arguments> {
@override
final Token token;
@override
final BuilderHelper<dynamic, dynamic, Arguments> helper;
@override
final Name name;
UnresolvedAccessor(this.helper, this.token, this.name);
String get debugName => "UnresolvedAccessor";
kernel.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
kernel.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
void printOn(StringSink sink) {
sink.write(", name: ");
sink.write(name.name);
}
}
bool isFieldOrGetter(Member member) {
return member is Field || (member is Procedure && member.isGetter);
}

View file

@ -65,7 +65,7 @@ import 'package:front_end/src/fasta/kernel/expression_generator.dart'
ThisIndexedAccessGenerator,
ThisPropertyAccessGenerator,
TypeDeclarationAccessor,
UnresolvedAccessor,
UnresolvedNameGenerator,
VariableUseGenerator;
import 'package:front_end/src/fasta/kernel/body_builder.dart'
@ -226,7 +226,7 @@ main() {
" plainNameForRead: foo, value: null)",
new TypeDeclarationAccessor<Arguments>(
helper, token, prefixBuilder, -1, declaration, "foo"));
check("UnresolvedAccessor(offset: 4, name: bar)",
new UnresolvedAccessor<Arguments>(helper, token, name));
check("UnresolvedNameGenerator(offset: 4, name: bar)",
new UnresolvedNameGenerator<Arguments>(helper, token, name));
});
}