| Index: pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart b/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart
|
| deleted file mode 100644
|
| index 37dcb05cd781f51c2254f102c8500f9c6295b9cd..0000000000000000000000000000000000000000
|
| --- a/pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart
|
| +++ /dev/null
|
| @@ -1,799 +0,0 @@
|
| -// Copyright (c) 2016, 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.
|
| -
|
| -library fasta.builder_accessors;
|
| -
|
| -export 'package:kernel/frontend/accessors.dart' show wrapInvalid;
|
| -
|
| -import 'package:kernel/frontend/accessors.dart'
|
| - show Accessor, buildIsNull, makeLet;
|
| -
|
| -import 'package:kernel/ast.dart';
|
| -
|
| -import '../errors.dart' show internalError;
|
| -
|
| -import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder;
|
| -
|
| -import 'package:kernel/frontend/accessors.dart' as kernel
|
| - show
|
| - IndexAccessor,
|
| - NullAwarePropertyAccessor,
|
| - PropertyAccessor,
|
| - StaticAccessor,
|
| - SuperIndexAccessor,
|
| - SuperPropertyAccessor,
|
| - ThisIndexAccessor,
|
| - ThisPropertyAccessor,
|
| - VariableAccessor;
|
| -
|
| -import 'kernel_builder.dart'
|
| - show Builder, KernelClassBuilder, PrefixBuilder, TypeDeclarationBuilder;
|
| -
|
| -import '../names.dart' show callName;
|
| -
|
| -abstract class BuilderHelper {
|
| - Uri get uri;
|
| -
|
| - Constructor lookupConstructor(Name name, {bool isSuper});
|
| -
|
| - Expression toSuperMethodInvocation(MethodInvocation node);
|
| -
|
| - Expression toValue(node);
|
| -
|
| - Member lookupSuperMember(Name name, {bool isSetter: false});
|
| -
|
| - builderToFirstExpression(Builder builder, String name, int offset);
|
| -
|
| - finishSend(Object receiver, Arguments arguments, int offset);
|
| -
|
| - Expression buildCompileTimeError(error, [int offset]);
|
| -
|
| - Initializer buildCompileTimeErrorIntializer(error, [int offset]);
|
| -
|
| - Expression buildStaticInvocation(Procedure target, Arguments arguments);
|
| -
|
| - Expression buildProblemExpression(ProblemBuilder builder, int offset);
|
| -
|
| - Expression throwNoSuchMethodError(
|
| - String name, Arguments arguments, int offset,
|
| - {bool isSuper: false, isGetter: false, isSetter: false});
|
| -}
|
| -
|
| -abstract class BuilderAccessor implements Accessor {
|
| - BuilderHelper get helper;
|
| -
|
| - String get plainNameForRead;
|
| -
|
| - Uri get uri => helper.uri;
|
| -
|
| - String get plainNameForWrite => plainNameForRead;
|
| -
|
| - Expression buildForEffect() => buildSimpleRead();
|
| -
|
| - Initializer buildFieldInitializer(
|
| - Map<String, FieldInitializer> initializers) {
|
| - // TODO(ahe): This error message is really bad.
|
| - return helper.buildCompileTimeErrorIntializer(
|
| - "Can't use $plainNameForRead here.", offset);
|
| - }
|
| -
|
| - Expression makeInvalidRead() {
|
| - return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true);
|
| - }
|
| -
|
| - Expression makeInvalidWrite(Expression value) {
|
| - return buildThrowNoSuchMethodError(new Arguments(<Expression>[value]),
|
| - isSetter: true);
|
| - }
|
| -
|
| - /* Expression | BuilderAccessor */ doInvocation(
|
| - int offset, Arguments arguments);
|
| -
|
| - /* Expression | BuilderAccessor */ buildPropertyAccess(
|
| - IncompleteSend send, bool isNullAware) {
|
| - if (send is SendAccessor) {
|
| - return buildMethodInvocation(
|
| - buildSimpleRead(), send.name, send.arguments, send.offset,
|
| - isNullAware: isNullAware);
|
| - } else {
|
| - return PropertyAccessor.make(helper, send.offset, buildSimpleRead(),
|
| - send.name, null, null, isNullAware);
|
| - }
|
| - }
|
| -
|
| - /* Expression | BuilderAccessor */ buildThrowNoSuchMethodError(
|
| - Arguments arguments,
|
| - {bool isSuper: false,
|
| - isGetter: false,
|
| - isSetter: false,
|
| - String name,
|
| - int offset}) {
|
| - return helper.throwNoSuchMethodError(
|
| - name ?? plainNameForWrite, arguments, offset ?? this.offset,
|
| - isGetter: isGetter, isSetter: isSetter, isSuper: isSuper);
|
| - }
|
| -
|
| - bool get isThisPropertyAccessor => false;
|
| -}
|
| -
|
| -abstract class CompileTimeErrorAccessor implements BuilderAccessor {
|
| - @override
|
| - Expression get builtBinary => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtBinary(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - @override
|
| - Expression get builtGetter => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtGetter(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - Expression buildError();
|
| -
|
| - Name get name => internalError("Unsupported operation.");
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - withReceiver(Object receiver, {bool isNullAware}) => this;
|
| -
|
| - Initializer buildFieldInitializer(
|
| - Map<String, FieldInitializer> initializers) {
|
| - return new LocalInitializer(new VariableDeclaration.forValue(buildError()));
|
| - }
|
| -
|
| - doInvocation(int offset, Arguments arguments) => this;
|
| -
|
| - buildPropertyAccess(IncompleteSend send, bool isNullAware) => this;
|
| -
|
| - buildThrowNoSuchMethodError(Arguments arguments,
|
| - {bool isSuper: false,
|
| - isGetter: false,
|
| - isSetter: false,
|
| - String name,
|
| - int offset}) {
|
| - return this;
|
| - }
|
| -
|
| - Expression buildAssignment(Expression value, {bool voidContext: false}) {
|
| - return buildError();
|
| - }
|
| -
|
| - Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildError();
|
| - }
|
| -
|
| - Expression buildPrefixIncrement(Name binaryOperator,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildError();
|
| - }
|
| -
|
| - Expression buildPostfixIncrement(Name binaryOperator,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildError();
|
| - }
|
| -
|
| - Expression buildNullAwareAssignment(Expression value, DartType type,
|
| - {bool voidContext: false}) {
|
| - return buildError();
|
| - }
|
| -
|
| - Expression buildSimpleRead() => buildError();
|
| -
|
| - Expression makeInvalidRead() => buildError();
|
| -
|
| - Expression makeInvalidWrite(Expression value) => buildError();
|
| -}
|
| -
|
| -class ThisAccessor extends BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - final int offset;
|
| -
|
| - final bool isInitializer;
|
| -
|
| - final bool isSuper;
|
| -
|
| - ThisAccessor(this.helper, this.offset, this.isInitializer,
|
| - {this.isSuper: false});
|
| -
|
| - @override
|
| - Expression get builtBinary => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtBinary(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - @override
|
| - Expression get builtGetter => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtGetter(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - String get plainNameForRead => internalError(isSuper ? "super" : "this");
|
| -
|
| - Expression buildSimpleRead() {
|
| - if (!isSuper) {
|
| - return new ThisExpression();
|
| - } else {
|
| - return helper.buildCompileTimeError(
|
| - "Can't use `super` as an expression.", offset);
|
| - }
|
| - }
|
| -
|
| - Initializer buildFieldInitializer(
|
| - Map<String, FieldInitializer> initializers) {
|
| - String keyword = isSuper ? "super" : "this";
|
| - return helper.buildCompileTimeErrorIntializer(
|
| - "Can't use '$keyword' here, did you mean '$keyword()'?", offset);
|
| - }
|
| -
|
| - buildPropertyAccess(IncompleteSend send, bool isNullAware) {
|
| - if (isInitializer && send is SendAccessor) {
|
| - return buildConstructorInitializer(
|
| - send.offset, send.name, send.arguments);
|
| - }
|
| - if (send is SendAccessor) {
|
| - // Notice that 'this' or 'super' can't be null. So we can ignore the
|
| - // value of [isNullAware].
|
| - MethodInvocation result = buildMethodInvocation(
|
| - new ThisExpression(), send.name, send.arguments, offset);
|
| - return isSuper ? helper.toSuperMethodInvocation(result) : result;
|
| - } else {
|
| - if (isSuper) {
|
| - Member getter = helper.lookupSuperMember(send.name);
|
| - Member setter = helper.lookupSuperMember(send.name, isSetter: true);
|
| - return new SuperPropertyAccessor(
|
| - helper, send.offset, send.name, getter, setter);
|
| - } else {
|
| - return new ThisPropertyAccessor(
|
| - helper, send.offset, send.name, null, null);
|
| - }
|
| - }
|
| - }
|
| -
|
| - doInvocation(int offset, Arguments arguments) {
|
| - if (isInitializer) {
|
| - return buildConstructorInitializer(offset, new Name(""), arguments);
|
| - } else {
|
| - return buildMethodInvocation(
|
| - new ThisExpression(), callName, arguments, offset);
|
| - }
|
| - }
|
| -
|
| - Initializer buildConstructorInitializer(
|
| - int offset, Name name, Arguments arguments) {
|
| - Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
|
| - Initializer result;
|
| - if (constructor == null) {
|
| - result = new LocalInitializer(new VariableDeclaration.forValue(
|
| - buildThrowNoSuchMethodError(arguments,
|
| - isSuper: isSuper, name: name.name, offset: offset)));
|
| - } else if (isSuper) {
|
| - result = new SuperInitializer(constructor, arguments);
|
| - } else {
|
| - result = new RedirectingInitializer(constructor, arguments);
|
| - }
|
| - return result..fileOffset = offset;
|
| - }
|
| -
|
| - Expression buildAssignment(Expression value, {bool voidContext: false}) {
|
| - return buildAssignmentError();
|
| - }
|
| -
|
| - Expression buildNullAwareAssignment(Expression value, DartType type,
|
| - {bool voidContext: false}) {
|
| - return buildAssignmentError();
|
| - }
|
| -
|
| - Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildAssignmentError();
|
| - }
|
| -
|
| - Expression buildPrefixIncrement(Name binaryOperator,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildAssignmentError();
|
| - }
|
| -
|
| - Expression buildPostfixIncrement(Name binaryOperator,
|
| - {int offset: TreeNode.noOffset,
|
| - bool voidContext: false,
|
| - Procedure interfaceTarget}) {
|
| - return buildAssignmentError();
|
| - }
|
| -
|
| - Expression buildAssignmentError() {
|
| - String message =
|
| - isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'.";
|
| - return helper.buildCompileTimeError(message, offset);
|
| - }
|
| -
|
| - toString() => "ThisAccessor($offset${isSuper ? ', super' : ''})";
|
| -}
|
| -
|
| -abstract class IncompleteSend extends BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - @override
|
| - final int offset;
|
| -
|
| - final Name name;
|
| -
|
| - IncompleteSend(this.helper, this.offset, this.name);
|
| -
|
| - @override
|
| - Expression get builtBinary => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtBinary(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - @override
|
| - Expression get builtGetter => internalError("Unsupported operation.");
|
| -
|
| - @override
|
| - void set builtGetter(Expression expression) {
|
| - internalError("Unsupported operation.");
|
| - }
|
| -
|
| - withReceiver(Object receiver, {bool isNullAware});
|
| -}
|
| -
|
| -class IncompleteError extends IncompleteSend with CompileTimeErrorAccessor {
|
| - final Object error;
|
| -
|
| - IncompleteError(BuilderHelper helper, int offset, this.error)
|
| - : super(helper, offset, null);
|
| -
|
| - Expression buildError() {
|
| - return helper.buildCompileTimeError(error, offset);
|
| - }
|
| -}
|
| -
|
| -class SendAccessor extends IncompleteSend {
|
| - final Arguments arguments;
|
| -
|
| - SendAccessor(BuilderHelper helper, int offset, Name name, this.arguments)
|
| - : super(helper, offset, name) {
|
| - assert(arguments != null);
|
| - }
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - Expression buildSimpleRead() {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildAssignment(Expression value, {bool voidContext: false}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - withReceiver(Object receiver, {bool isNullAware: false}) {
|
| - if (receiver is TypeDeclarationBuilder) {
|
| - /// `SomeType?.toString` is the same as `SomeType.toString`, not
|
| - /// `(SomeType).toString`.
|
| - isNullAware = false;
|
| - }
|
| - if (receiver is BuilderAccessor) {
|
| - return receiver.buildPropertyAccess(this, isNullAware);
|
| - }
|
| - if (receiver is PrefixBuilder) {
|
| - PrefixBuilder prefix = receiver;
|
| - receiver = helper.builderToFirstExpression(
|
| - prefix.exports[name.name], "${prefix.name}.${name.name}", offset);
|
| - return helper.finishSend(receiver, arguments, offset);
|
| - }
|
| - Expression result;
|
| - if (receiver is KernelClassBuilder) {
|
| - Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
|
| - if (builder == null) {
|
| - return buildThrowNoSuchMethodError(arguments);
|
| - }
|
| - if (builder.hasProblem) {
|
| - result = helper.buildProblemExpression(builder, offset);
|
| - } else {
|
| - Member target = builder.target;
|
| - if (target != null) {
|
| - if (target is Field) {
|
| - result = buildMethodInvocation(new StaticGet(target), callName,
|
| - arguments, offset + (target.name?.name?.length ?? 0),
|
| - isNullAware: isNullAware);
|
| - } else {
|
| - result = helper.buildStaticInvocation(target, arguments)
|
| - ..fileOffset = offset;
|
| - }
|
| - } else {
|
| - result = buildThrowNoSuchMethodError(arguments)..fileOffset = offset;
|
| - }
|
| - }
|
| - } else {
|
| - result = buildMethodInvocation(
|
| - helper.toValue(receiver), name, arguments, offset,
|
| - isNullAware: isNullAware);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - Expression buildNullAwareAssignment(Expression value, DartType type,
|
| - {bool voidContext: false}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildPrefixIncrement(Name binaryOperator,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildPostfixIncrement(Name binaryOperator,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - toString() => "SendAccessor($offset, $name, $arguments)";
|
| -}
|
| -
|
| -class IncompletePropertyAccessor extends IncompleteSend {
|
| - IncompletePropertyAccessor(BuilderHelper helper, int offset, Name name)
|
| - : super(helper, offset, name);
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - Expression buildSimpleRead() => internalError("Unhandled");
|
| -
|
| - Expression buildAssignment(Expression value, {bool voidContext: false}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - withReceiver(Object receiver, {bool isNullAware: false}) {
|
| - if (receiver is TypeDeclarationBuilder) {
|
| - /// For reasons beyond comprehension, `SomeType?.toString` is the same as
|
| - /// `SomeType.toString`, not `(SomeType).toString`. WTAF!?!
|
| - //
|
| - isNullAware = false;
|
| - }
|
| - if (receiver is BuilderAccessor) {
|
| - return receiver.buildPropertyAccess(this, isNullAware);
|
| - }
|
| - if (receiver is PrefixBuilder) {
|
| - PrefixBuilder prefix = receiver;
|
| - return helper.builderToFirstExpression(
|
| - prefix.exports[name.name], name.name, offset);
|
| - }
|
| - if (receiver is KernelClassBuilder) {
|
| - Builder builder = receiver.findStaticBuilder(name.name, offset, uri);
|
| - if (builder == null) {
|
| - // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
|
| - return buildThrowNoSuchMethodError(new Arguments.empty(),
|
| - isGetter: true);
|
| - }
|
| - Builder setter;
|
| - if (builder.isSetter) {
|
| - setter = builder;
|
| - } else if (builder.isGetter) {
|
| - setter =
|
| - receiver.findStaticBuilder(name.name, offset, uri, isSetter: true);
|
| - } else if (builder.isField && !builder.isFinal) {
|
| - setter = builder;
|
| - }
|
| - return new StaticAccessor.fromBuilder(helper, builder, offset, setter);
|
| - }
|
| - return PropertyAccessor.make(helper, offset, helper.toValue(receiver), name,
|
| - null, null, isNullAware);
|
| - }
|
| -
|
| - Expression buildNullAwareAssignment(Expression value, DartType type,
|
| - {bool voidContext: false}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildPrefixIncrement(Name binaryOperator,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression buildPostfixIncrement(Name binaryOperator,
|
| - {int offset, bool voidContext: false, Procedure interfaceTarget}) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return internalError("Unhandled");
|
| - }
|
| -
|
| - toString() => "IncompletePropertyAccessor($offset, $name)";
|
| -}
|
| -
|
| -class IndexAccessor extends kernel.IndexAccessor with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - IndexAccessor.internal(this.helper, int offset, Expression receiver,
|
| - Expression index, Procedure getter, Procedure setter)
|
| - : super.internal(receiver, index, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => "[]";
|
| -
|
| - String get plainNameForWrite => "[]=";
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return buildMethodInvocation(
|
| - buildSimpleRead(), callName, arguments, offset);
|
| - }
|
| -
|
| - toString() => "IndexAccessor()";
|
| -
|
| - static BuilderAccessor make(
|
| - BuilderHelper helper,
|
| - int offset,
|
| - Expression receiver,
|
| - Expression index,
|
| - Procedure getter,
|
| - Procedure setter) {
|
| - if (receiver is ThisExpression) {
|
| - return new ThisIndexAccessor(helper, offset, index, getter, setter);
|
| - } else {
|
| - return new IndexAccessor.internal(
|
| - helper, offset, receiver, index, getter, setter);
|
| - }
|
| - }
|
| -}
|
| -
|
| -class PropertyAccessor extends kernel.PropertyAccessor with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - PropertyAccessor.internal(this.helper, int offset, Expression receiver,
|
| - Name name, Member getter, Member setter)
|
| - : super.internal(receiver, name, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - bool get isThisPropertyAccessor => receiver is ThisExpression;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return buildMethodInvocation(receiver, name, arguments, offset);
|
| - }
|
| -
|
| - toString() => "PropertyAccessor()";
|
| -
|
| - static BuilderAccessor make(
|
| - BuilderHelper helper,
|
| - int offset,
|
| - Expression receiver,
|
| - Name name,
|
| - Member getter,
|
| - Member setter,
|
| - bool isNullAware) {
|
| - if (receiver is ThisExpression) {
|
| - return new ThisPropertyAccessor(helper, offset, name, getter, setter);
|
| - } else {
|
| - return isNullAware
|
| - ? new NullAwarePropertyAccessor(
|
| - helper, offset, receiver, name, getter, setter, null)
|
| - : new PropertyAccessor.internal(
|
| - helper, offset, receiver, name, getter, setter);
|
| - }
|
| - }
|
| -}
|
| -
|
| -class StaticAccessor extends kernel.StaticAccessor with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - StaticAccessor(this.helper, int offset, Member readTarget, Member writeTarget)
|
| - : super(readTarget, writeTarget, offset) {
|
| - assert(readTarget != null || writeTarget != null);
|
| - }
|
| -
|
| - factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder,
|
| - int offset, Builder builderSetter) {
|
| - if (builder is AccessErrorBuilder) {
|
| - AccessErrorBuilder error = builder;
|
| - builder = error.builder;
|
| - // We should only see an access error here if we've looked up a setter
|
| - // when not explicitly looking for a setter.
|
| - assert(builder.isSetter);
|
| - } else if (builder.target == null) {
|
| - return internalError("Unhandled: ${builder}");
|
| - }
|
| - Member getter = builder.target.hasGetter ? builder.target : null;
|
| - Member setter = builder.target.hasSetter ? builder.target : null;
|
| - if (setter == null) {
|
| - if (builderSetter?.target?.hasSetter ?? false) {
|
| - setter = builderSetter.target;
|
| - }
|
| - }
|
| - return new StaticAccessor(helper, offset, getter, setter);
|
| - }
|
| -
|
| - String get plainNameForRead => (readTarget ?? writeTarget).name.name;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - if (readTarget == null || isFieldOrGetter(readTarget)) {
|
| - return buildMethodInvocation(buildSimpleRead(), callName, arguments,
|
| - offset + (readTarget?.name?.name?.length ?? 0));
|
| - } else {
|
| - return helper.buildStaticInvocation(readTarget, arguments)
|
| - ..fileOffset = offset;
|
| - }
|
| - }
|
| -
|
| - toString() => "StaticAccessor()";
|
| -}
|
| -
|
| -class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
|
| - with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - SuperPropertyAccessor(
|
| - this.helper, int offset, Name name, Member getter, Member setter)
|
| - : super(name, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - if (getter == null || isFieldOrGetter(getter)) {
|
| - return buildMethodInvocation(
|
| - buildSimpleRead(), callName, arguments, offset);
|
| - } else {
|
| - return new DirectMethodInvocation(new ThisExpression(), getter, arguments)
|
| - ..fileOffset = offset;
|
| - }
|
| - }
|
| -
|
| - toString() => "SuperPropertyAccessor()";
|
| -}
|
| -
|
| -class ThisIndexAccessor extends kernel.ThisIndexAccessor with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - ThisIndexAccessor(this.helper, int offset, Expression index, Procedure getter,
|
| - Procedure setter)
|
| - : super(index, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => "[]";
|
| -
|
| - String get plainNameForWrite => "[]=";
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return buildMethodInvocation(
|
| - buildSimpleRead(), callName, arguments, offset);
|
| - }
|
| -
|
| - toString() => "ThisIndexAccessor()";
|
| -}
|
| -
|
| -class SuperIndexAccessor extends kernel.SuperIndexAccessor
|
| - with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - SuperIndexAccessor(
|
| - this.helper, int offset, Expression index, Member getter, Member setter)
|
| - : super(index, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => "[]";
|
| -
|
| - String get plainNameForWrite => "[]=";
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return buildMethodInvocation(
|
| - buildSimpleRead(), callName, arguments, offset);
|
| - }
|
| -
|
| - toString() => "SuperIndexAccessor()";
|
| -}
|
| -
|
| -class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
|
| - with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - ThisPropertyAccessor(
|
| - this.helper, int offset, Name name, Member getter, Member setter)
|
| - : super(name, getter, setter, offset);
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - bool get isThisPropertyAccessor => true;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - Member interfaceTarget = getter;
|
| - if (interfaceTarget is Field) {
|
| - // TODO(ahe): In strong mode we should probably rewrite this to
|
| - // `this.name.call(arguments)`.
|
| - interfaceTarget = null;
|
| - }
|
| - return buildMethodInvocation(new ThisExpression(), name, arguments, offset);
|
| - }
|
| -
|
| - toString() => "ThisPropertyAccessor()";
|
| -}
|
| -
|
| -class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
|
| - with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - NullAwarePropertyAccessor(this.helper, int offset, Expression receiver,
|
| - Name name, Member getter, Member setter, DartType type)
|
| - : super(receiver, name, getter, setter, type, offset);
|
| -
|
| - String get plainNameForRead => name.name;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - return internalError("Not implemented yet.");
|
| - }
|
| -
|
| - toString() => "NullAwarePropertyAccessor()";
|
| -}
|
| -
|
| -class VariableAccessor extends kernel.VariableAccessor with BuilderAccessor {
|
| - final BuilderHelper helper;
|
| -
|
| - VariableAccessor(this.helper, int offset, VariableDeclaration variable,
|
| - [DartType promotedType])
|
| - : super(variable, promotedType, offset);
|
| -
|
| - String get plainNameForRead => variable.name;
|
| -
|
| - Expression doInvocation(int offset, Arguments arguments) {
|
| - // Normally the offset is at the start of the token, but in this case,
|
| - // because we insert a '.call', we want it at the end instead.
|
| - return buildMethodInvocation(buildSimpleRead(), callName, arguments,
|
| - offset + (variable.name?.length ?? 0));
|
| - }
|
| -
|
| - toString() => "VariableAccessor()";
|
| -}
|
| -
|
| -bool isFieldOrGetter(Member member) {
|
| - return member is Field || (member is Procedure && member.isGetter);
|
| -}
|
| -
|
| -Expression buildMethodInvocation(
|
| - Expression receiver, Name name, Arguments arguments, int offset,
|
| - {bool isNullAware: false}) {
|
| - if (isNullAware) {
|
| - VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
|
| - return makeLet(
|
| - variable,
|
| - new ConditionalExpression(
|
| - buildIsNull(new VariableGet(variable)),
|
| - new NullLiteral(),
|
| - new MethodInvocation(new VariableGet(variable), name, arguments)
|
| - ..fileOffset = offset,
|
| - const DynamicType()));
|
| - } else {
|
| - return new MethodInvocation(receiver, name, arguments)..fileOffset = offset;
|
| - }
|
| -}
|
|
|