blob: 07a6d6aaf6e4754159bf0ba41e80157fbd08dd07 [file] [log] [blame]
// Copyright (c) 2019, 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.
// @dart = 2.9
import 'package:kernel/ast.dart';
import '../builder/builder.dart';
import 'dill_member_builder.dart';
abstract class DillExtensionMemberBuilder extends DillMemberBuilder {
final ExtensionMemberDescriptor _descriptor;
DillExtensionMemberBuilder(Member member, this._descriptor, Builder parent)
: super(member, parent);
@override
bool get isStatic => _descriptor.isStatic;
bool get isExternal => member.isExternal;
@override
String get name => _descriptor.name.text;
@override
ProcedureKind get kind {
switch (_descriptor.kind) {
case ExtensionMemberKind.Method:
return ProcedureKind.Method;
case ExtensionMemberKind.Getter:
return ProcedureKind.Getter;
case ExtensionMemberKind.Operator:
return ProcedureKind.Operator;
case ExtensionMemberKind.Setter:
return ProcedureKind.Setter;
case ExtensionMemberKind.TearOff:
case ExtensionMemberKind.Field:
}
return null;
}
}
class DillExtensionFieldBuilder extends DillExtensionMemberBuilder {
final Field field;
DillExtensionFieldBuilder(
this.field, ExtensionMemberDescriptor descriptor, Builder parent)
: super(field, descriptor, parent);
Member get member => field;
@override
Member get readTarget => field;
@override
Member get writeTarget => isAssignable ? field : null;
@override
Member get invokeTarget => field;
@override
bool get isField => true;
@override
bool get isAssignable => field.hasSetter;
}
class DillExtensionSetterBuilder extends DillExtensionMemberBuilder {
final Procedure procedure;
DillExtensionSetterBuilder(
this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
: assert(descriptor.kind == ExtensionMemberKind.Setter),
super(procedure, descriptor, parent);
Member get member => procedure;
@override
Member get readTarget => null;
@override
Member get writeTarget => procedure;
@override
Member get invokeTarget => null;
}
class DillExtensionGetterBuilder extends DillExtensionMemberBuilder {
final Procedure procedure;
DillExtensionGetterBuilder(
this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
: assert(descriptor.kind == ExtensionMemberKind.Getter),
super(procedure, descriptor, parent);
Member get member => procedure;
@override
Member get readTarget => procedure;
@override
Member get writeTarget => null;
@override
Member get invokeTarget => procedure;
}
class DillExtensionOperatorBuilder extends DillExtensionMemberBuilder {
final Procedure procedure;
DillExtensionOperatorBuilder(
this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
: assert(descriptor.kind == ExtensionMemberKind.Operator),
super(procedure, descriptor, parent);
Member get member => procedure;
@override
Member get readTarget => null;
@override
Member get writeTarget => null;
@override
Member get invokeTarget => procedure;
}
class DillExtensionStaticMethodBuilder extends DillExtensionMemberBuilder {
final Procedure procedure;
DillExtensionStaticMethodBuilder(
this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
: assert(descriptor.kind == ExtensionMemberKind.Method),
assert(descriptor.isStatic),
super(procedure, descriptor, parent);
@override
Member get member => procedure;
@override
Member get readTarget => procedure;
@override
Member get writeTarget => null;
@override
Member get invokeTarget => procedure;
}
class DillExtensionInstanceMethodBuilder extends DillExtensionMemberBuilder {
final Procedure procedure;
final Procedure _extensionTearOff;
DillExtensionInstanceMethodBuilder(
this.procedure,
ExtensionMemberDescriptor descriptor,
Builder parent,
this._extensionTearOff)
: assert(descriptor.kind == ExtensionMemberKind.Method),
assert(!descriptor.isStatic),
super(procedure, descriptor, parent);
@override
Member get member => procedure;
@override
Iterable<Member> get exportedMembers => [procedure, _extensionTearOff];
@override
Member get readTarget => _extensionTearOff;
@override
Member get writeTarget => null;
@override
Member get invokeTarget => procedure;
}