| Index: pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
|
| index 6bfae59e08c1d243a5ed6772550eb6f13861eb98..c6e7e93e69459914c5790eb982220dd67ee29d87 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart
|
| @@ -88,7 +88,7 @@ abstract class FastaAccessor implements Accessor {
|
| isSetter: true);
|
| }
|
|
|
| - /* Expression | FastaAccessor */ doInvocation(
|
| + /* Expression | FastaAccessor | Initializer */ doInvocation(
|
| int offset, Arguments arguments);
|
|
|
| /* Expression | FastaAccessor */ buildPropertyAccess(
|
| @@ -106,8 +106,8 @@ abstract class FastaAccessor implements Accessor {
|
| /* Expression | FastaAccessor */ buildThrowNoSuchMethodError(
|
| Arguments arguments,
|
| {bool isSuper: false,
|
| - isGetter: false,
|
| - isSetter: false,
|
| + bool isGetter: false,
|
| + bool isSetter: false,
|
| String name,
|
| int offset}) {
|
| return helper.throwNoSuchMethodError(
|
| @@ -118,7 +118,7 @@ abstract class FastaAccessor implements Accessor {
|
| bool get isThisPropertyAccessor => false;
|
| }
|
|
|
| -abstract class CompileTimeErrorAccessor implements FastaAccessor {
|
| +abstract class ErrorAccessor implements FastaAccessor {
|
| @override
|
| Expression get builtBinary => internalError("Unsupported operation.");
|
|
|
| @@ -135,23 +135,35 @@ abstract class CompileTimeErrorAccessor implements FastaAccessor {
|
| internalError("Unsupported operation.");
|
| }
|
|
|
| - Expression buildError();
|
| + /// Pass [arguments] that must be evaluated before throwing an error. At
|
| + /// most one of [isGetter] and [isSetter] should be true and they're passed
|
| + /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used.
|
| + Expression buildError(Arguments arguments,
|
| + {bool isGetter: false, bool isSetter: false, int offset});
|
|
|
| Name get name => internalError("Unsupported operation.");
|
|
|
| + @override
|
| String get plainNameForRead => name.name;
|
|
|
| withReceiver(Object receiver, {bool isNullAware}) => this;
|
|
|
| + @override
|
| Initializer buildFieldInitializer(
|
| Map<String, FieldInitializer> initializers) {
|
| - return new LocalInitializer(new VariableDeclaration.forValue(buildError()));
|
| + return new LocalInitializer(new VariableDeclaration.forValue(
|
| + buildError(new Arguments.empty(), isSetter: true)));
|
| }
|
|
|
| - doInvocation(int offset, Arguments arguments) => this;
|
| + @override
|
| + doInvocation(int offset, Arguments arguments) {
|
| + return buildError(arguments, offset: offset);
|
| + }
|
|
|
| + @override
|
| buildPropertyAccess(IncompleteSend send, bool isNullAware) => this;
|
|
|
| + @override
|
| buildThrowNoSuchMethodError(Arguments arguments,
|
| {bool isSuper: false,
|
| isGetter: false,
|
| @@ -161,41 +173,55 @@ abstract class CompileTimeErrorAccessor implements FastaAccessor {
|
| return this;
|
| }
|
|
|
| + @override
|
| Expression buildAssignment(Expression value, {bool voidContext: false}) {
|
| - return buildError();
|
| + return buildError(new Arguments(<Expression>[value]), isSetter: true);
|
| }
|
|
|
| + @override
|
| Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
| {int offset: TreeNode.noOffset,
|
| bool voidContext: false,
|
| Procedure interfaceTarget}) {
|
| - return buildError();
|
| + return buildError(new Arguments(<Expression>[value]), isGetter: true);
|
| }
|
|
|
| + @override
|
| Expression buildPrefixIncrement(Name binaryOperator,
|
| {int offset: TreeNode.noOffset,
|
| bool voidContext: false,
|
| Procedure interfaceTarget}) {
|
| - return buildError();
|
| + return buildError(new Arguments(<Expression>[new IntLiteral(1)]),
|
| + isGetter: true);
|
| }
|
|
|
| + @override
|
| Expression buildPostfixIncrement(Name binaryOperator,
|
| {int offset: TreeNode.noOffset,
|
| bool voidContext: false,
|
| Procedure interfaceTarget}) {
|
| - return buildError();
|
| + return buildError(new Arguments(<Expression>[new IntLiteral(1)]),
|
| + isGetter: true);
|
| }
|
|
|
| + @override
|
| Expression buildNullAwareAssignment(Expression value, DartType type,
|
| {bool voidContext: false}) {
|
| - return buildError();
|
| + return buildError(new Arguments(<Expression>[value]), isSetter: true);
|
| }
|
|
|
| - Expression buildSimpleRead() => buildError();
|
| + @override
|
| + Expression buildSimpleRead() =>
|
| + buildError(new Arguments.empty(), isGetter: true);
|
|
|
| - Expression makeInvalidRead() => buildError();
|
| + @override
|
| + Expression makeInvalidRead() =>
|
| + buildError(new Arguments.empty(), isGetter: true);
|
|
|
| - Expression makeInvalidWrite(Expression value) => buildError();
|
| + @override
|
| + Expression makeInvalidWrite(Expression value) {
|
| + return buildError(new Arguments(<Expression>[value]), isSetter: true);
|
| + }
|
| }
|
|
|
| class ThisAccessor extends FastaAccessor {
|
| @@ -361,15 +387,20 @@ abstract class IncompleteSend extends FastaAccessor {
|
| withReceiver(Object receiver, {bool isNullAware});
|
| }
|
|
|
| -class IncompleteError extends IncompleteSend with CompileTimeErrorAccessor {
|
| +class IncompleteError extends IncompleteSend with ErrorAccessor {
|
| final Object error;
|
|
|
| IncompleteError(BuilderHelper helper, int offset, this.error)
|
| : super(helper, offset, null);
|
|
|
| - Expression buildError() {
|
| - return helper.buildCompileTimeError(error, offset);
|
| + @override
|
| + Expression buildError(Arguments arguments,
|
| + {bool isGetter: false, bool isSetter: false, int offset}) {
|
| + return helper.buildCompileTimeError(error, offset ?? this.offset);
|
| }
|
| +
|
| + @override
|
| + doInvocation(int offset, Arguments arguments) => this;
|
| }
|
|
|
| class SendAccessor extends IncompleteSend {
|
| @@ -408,7 +439,7 @@ class SendAccessor extends IncompleteSend {
|
| Expression result;
|
| if (receiver is KernelClassBuilder) {
|
| Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
|
| - if (builder == null) {
|
| + if (builder == null || builder is AccessErrorBuilder) {
|
| return buildThrowNoSuchMethodError(arguments);
|
| }
|
| if (builder.hasProblem) {
|
| @@ -802,6 +833,31 @@ class ParenthesizedExpression extends ReadOnlyAccessor {
|
| }
|
| }
|
|
|
| +class UnresolvedAccessor extends FastaAccessor with ErrorAccessor {
|
| + @override
|
| + final int offset;
|
| +
|
| + @override
|
| + final BuilderHelper helper;
|
| +
|
| + @override
|
| + final Name name;
|
| +
|
| + UnresolvedAccessor(this.helper, this.name, this.offset);
|
| +
|
| + Expression doInvocation(int charOffset, Arguments arguments) {
|
| + return buildError(arguments, offset: charOffset);
|
| + }
|
| +
|
| + @override
|
| + Expression buildError(Arguments arguments,
|
| + {bool isGetter: false, bool isSetter: false, int offset}) {
|
| + return helper.throwNoSuchMethodError(
|
| + plainNameForRead, arguments, offset ?? this.offset,
|
| + isGetter: isGetter, isSetter: isSetter);
|
| + }
|
| +}
|
| +
|
| bool isFieldOrGetter(Member member) {
|
| return member is Field || (member is Procedure && member.isGetter);
|
| }
|
|
|