blob: ca21a4d5e9326cbc5fa8503bf199b85be69430bd [file] [log] [blame]
// 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.
import 'package:kernel/ast.dart'
show
Constructor,
Field,
FunctionNode,
Member,
Name,
Procedure,
ProcedureKind,
ProcedureStubKind;
import 'package:kernel/canonical_name.dart';
import '../builder/builder.dart';
import '../builder/constructor_builder.dart';
import '../builder/declaration_builders.dart';
import '../builder/factory_builder.dart';
import '../builder/member_builder.dart';
import '../builder/method_builder.dart';
import '../builder/property_builder.dart';
import '../kernel/hierarchy/class_member.dart';
import '../kernel/hierarchy/members_builder.dart' show ClassMembersBuilder;
import '../kernel/member_covariance.dart';
import 'dill_builder_mixins.dart';
import 'dill_class_builder.dart';
import 'dill_library_builder.dart';
abstract class DillMemberBuilder extends MemberBuilderImpl {
@override
final DillLibraryBuilder libraryBuilder;
@override
final DeclarationBuilder? declarationBuilder;
DillMemberBuilder(this.libraryBuilder, this.declarationBuilder);
Member get member;
@override
int get fileOffset => member.fileOffset;
@override
Uri get fileUri => member.fileUri;
@override
Builder get parent => declarationBuilder ?? libraryBuilder;
@override
String get name => member.name.text;
@override
Name get memberName => member.name;
@override
bool get isSynthetic {
final Member member = this.member;
return member is Constructor && member.isSynthetic;
}
}
class DillFieldBuilder extends DillMemberBuilder
with DillFieldBuilderMixin
implements PropertyBuilder {
final Field field;
DillFieldBuilder(this.field, super.libraryBuilder,
[super.declarationBuilder]);
@override
Member get member => field;
@override
Member? get readTarget => field;
@override
Reference get readTargetReference => field.getterReference;
@override
Member? get writeTarget => field.hasSetter ? field : null;
@override
Reference? get writeTargetReference => field.setterReference;
@override
bool get hasConstField => field.isConst;
@override
bool get isStatic => field.isStatic;
@override
Iterable<Reference> get exportedMemberReferences =>
[field.getterReference, if (field.hasSetter) field.setterReference!];
@override
// Coverage-ignore(suite): Not run.
bool get isEnumElement => field.isEnumElement;
@override
FieldQuality get fieldQuality => FieldQuality.Concrete;
@override
GetterQuality get getterQuality => GetterQuality.Implicit;
@override
SetterQuality get setterQuality =>
field.hasSetter ? SetterQuality.Implicit : SetterQuality.Absent;
}
abstract class _DillProcedureBuilder extends DillMemberBuilder {
final Procedure _procedure;
_DillProcedureBuilder(this._procedure, super.libraryBuilder,
[super.declarationBuilder]);
@override
bool get isStatic => _procedure.isStatic;
@override
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
}
class DillGetterBuilder extends _DillProcedureBuilder
with DillGetterBuilderMixin
implements PropertyBuilder {
DillGetterBuilder(super.procedure, super.libraryBuilder,
[super.declarationBuilder])
: assert(procedure.kind == ProcedureKind.Getter);
@override
Member get member => _procedure;
@override
Member get readTarget => _procedure;
@override
Reference get readTargetReference => _procedure.reference;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
FieldQuality get fieldQuality => FieldQuality.Absent;
@override
GetterQuality get getterQuality => _procedure.isExternal
? GetterQuality.External
: _procedure.isAbstract
? GetterQuality.Abstract
: GetterQuality.Concrete;
@override
SetterQuality get setterQuality => SetterQuality.Absent;
}
class DillSetterBuilder extends _DillProcedureBuilder
with DillSetterBuilderMixin
implements PropertyBuilder {
DillSetterBuilder(super.procedure, super.libraryBuilder,
[super.declarationBuilder])
: assert(procedure.kind == ProcedureKind.Setter);
@override
Member get member => _procedure;
@override
Member get writeTarget => _procedure;
@override
Reference get writeTargetReference => _procedure.reference;
@override
FieldQuality get fieldQuality => FieldQuality.Absent;
@override
// Coverage-ignore(suite): Not run.
GetterQuality get getterQuality => GetterQuality.Absent;
@override
SetterQuality get setterQuality => _procedure.isExternal
? SetterQuality.External
: _procedure.isAbstract
? SetterQuality.Abstract
: SetterQuality.Concrete;
}
class DillMethodBuilder extends _DillProcedureBuilder
with DillMethodBuilderMixin
implements MethodBuilder {
DillMethodBuilder(super.procedure, super.libraryBuilder,
[super.declarationBuilder])
: assert(procedure.kind == ProcedureKind.Method);
@override
// Coverage-ignore(suite): Not run.
bool get isAbstract => _procedure.isAbstract;
@override
Member get member => _procedure;
@override
Member get readTarget => _procedure;
@override
Reference get readTargetReference => _procedure.reference;
@override
Member get invokeTarget => _procedure;
@override
Reference get invokeTargetReference => _procedure.reference;
}
class DillOperatorBuilder extends _DillProcedureBuilder
with DillOperatorBuilderMixin
implements MethodBuilder {
DillOperatorBuilder(super.procedure, super.libraryBuilder,
[super.declarationBuilder])
: assert(procedure.kind == ProcedureKind.Operator);
@override
bool get isAbstract => _procedure.isAbstract;
@override
Member get member => _procedure;
@override
// Coverage-ignore(suite): Not run.
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
}
class DillFactoryBuilder extends _DillProcedureBuilder
with DillFactoryBuilderMixin
implements FactoryBuilder {
final Procedure? _factoryTearOff;
DillFactoryBuilder(super.procedure, this._factoryTearOff,
super.libraryBuilder, DillClassBuilder super.declarationBuilder);
@override
// Coverage-ignore(suite): Not run.
Member get member => _procedure;
@override
Member? get readTarget => _factoryTearOff ?? _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference =>
(_factoryTearOff ?? _procedure).reference;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
FunctionNode get function => _procedure.function;
@override
// Coverage-ignore(suite): Not run.
bool get isConst => _procedure.isConst;
}
class DillConstructorBuilder extends DillMemberBuilder
with DillConstructorBuilderMixin
implements ConstructorBuilder {
final Constructor constructor;
final Procedure? _constructorTearOff;
DillConstructorBuilder(this.constructor, this._constructorTearOff,
super.libraryBuilder, ClassBuilder super.declarationBuilder);
@override
FunctionNode get function => constructor.function;
@override
Constructor get member => constructor;
@override
Member get readTarget => _constructorTearOff ?? constructor;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference =>
(_constructorTearOff ?? constructor).reference;
@override
Constructor get invokeTarget => constructor;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => constructor.reference;
@override
// Coverage-ignore(suite): Not run.
bool get isConst => constructor.isConst;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [constructor.reference];
}
class DillClassMember extends BuilderClassMember {
@override
final DillMemberBuilder memberBuilder;
Covariance? _covariance;
@override
final ClassMemberKind memberKind;
DillClassMember(this.memberBuilder, this.memberKind)
: assert(
!memberBuilder.member.isInternalImplementation,
"ClassMember should not be created for internal implementation "
"member $memberBuilder.");
@override
bool get isSourceDeclaration => false;
@override
bool get isExtensionTypeMember {
Member member = memberBuilder.member;
return member.isExtensionTypeMember;
}
@override
bool get isNoSuchMethodForwarder {
Member member = memberBuilder.member;
return member is Procedure &&
member.stubKind == ProcedureStubKind.NoSuchMethodForwarder;
}
@override
bool get isSynthesized {
Member member = memberBuilder.member;
return member is Procedure && member.isSynthetic;
}
@override
bool get isAbstract {
Member member = memberBuilder.member;
return member is Procedure && member.isAbstract;
}
@override
Member getMember(ClassMembersBuilder membersBuilder) => memberBuilder.member;
@override
Member? getTearOff(ClassMembersBuilder membersBuilder) {
Member? readTarget = memberBuilder.readTarget;
return readTarget != memberBuilder.invokeTarget ? readTarget : null;
}
@override
Covariance getCovariance(ClassMembersBuilder membersBuilder) {
return _covariance ??=
new Covariance.fromMember(memberBuilder.member, forSetter: forSetter);
}
@override
// Coverage-ignore(suite): Not run.
void inferType(ClassMembersBuilder hierarchy) {
// Do nothing; this is only for source members.
}
@override
// Coverage-ignore(suite): Not run.
void registerOverrideDependency(
ClassMembersBuilder membersBuilder, Set<ClassMember> overriddenMembers) {
// Do nothing; this is only for source members.
}
@override
bool isSameDeclaration(ClassMember other) {
return other is DillClassMember && memberBuilder == other.memberBuilder;
}
@override
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
Member member = getMember(membersBuilder);
if (member is Procedure &&
member.stubKind == ProcedureStubKind.RepresentationField) {
return new TypeDeclarationInstanceMemberResult(
getMember(membersBuilder), memberKind,
isDeclaredAsField: true);
}
return super.getMemberResult(membersBuilder);
}
@override
String toString() => 'DillClassMember($memberBuilder,forSetter=${forSetter})';
}