blob: 07d703f42ad5d3b82816be328f5dd500294a5c91 [file] [log] [blame]
// Copyright (c) 2025, 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.
part of '../fragment.dart';
class _FieldClassMember implements ClassMember {
final SourcePropertyBuilder _builder;
final FieldFragment _fragment;
@override
final bool forSetter;
Covariance? _covariance;
_FieldClassMember(this._builder, this._fragment, {required this.forSetter});
@override
UriOffsetLength get uriOffset => _fragment.uriOffset;
@override
DeclarationBuilder get declarationBuilder => _builder.declarationBuilder!;
@override
// Coverage-ignore(suite): Not run.
List<ClassMember> get declarations =>
throw new UnsupportedError('$runtimeType.declarations');
@override
// Coverage-ignore(suite): Not run.
String get fullName {
String className = declarationBuilder.fullNameForErrors;
return "${className}.${fullNameForErrors}";
}
@override
String get fullNameForErrors => _builder.fullNameForErrors;
@override
Covariance getCovariance(ClassMembersBuilder membersBuilder) {
return _covariance ??= forSetter
? new Covariance.fromMember(
getMember(membersBuilder),
forSetter: forSetter,
)
: const Covariance.empty();
}
@override
Member getMember(ClassMembersBuilder membersBuilder) {
inferType(membersBuilder);
return forSetter ? _builder.writeTarget! : _builder.readTarget!;
}
@override
// Coverage-ignore(suite): Not run.
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
if (isStatic) {
return new StaticMemberResult(
getMember(membersBuilder),
memberKind,
isDeclaredAsField: true,
fullName: '${declarationBuilder.name}.${_builder.memberName.text}',
);
} else if (_builder.isExtensionTypeMember) {
ExtensionTypeDeclaration extensionTypeDeclaration =
(declarationBuilder as ExtensionTypeDeclarationBuilder)
.extensionTypeDeclaration;
Member member = getTearOff(membersBuilder) ?? getMember(membersBuilder);
return new ExtensionTypeMemberResult(
extensionTypeDeclaration,
member,
memberKind,
name,
isDeclaredAsField: true,
);
} else {
return new TypeDeclarationInstanceMemberResult(
getMember(membersBuilder),
memberKind,
isDeclaredAsField: true,
);
}
}
@override
// Coverage-ignore(suite): Not run.
Member? getTearOff(ClassMembersBuilder membersBuilder) => null;
@override
bool get hasDeclarations => false;
@override
void inferType(ClassMembersBuilder membersBuilder) {
_builder.inferFieldType(membersBuilder.hierarchyBuilder);
}
@override
ClassMember get interfaceMember => this;
@override
// TODO(johnniwinther): This should not be determined by the builder. A
// property can have a non-abstract getter and an abstract setter or the
// reverse. With augmentations, abstract introductory declarations might even
// be implemented by augmentations.
bool get isAbstract => _fragment.modifiers.isAbstract;
@override
bool get isDuplicate => _builder.isDuplicate;
@override
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
@override
bool get isNoSuchMethodForwarder => false;
@override
// Coverage-ignore(suite): Not run.
bool isObjectMember(ClassBuilder objectClass) {
return declarationBuilder == objectClass;
}
@override
bool get isProperty => true;
@override
bool isSameDeclaration(ClassMember other) {
return other is _FieldClassMember && _builder == other._builder;
}
@override
bool get isSetter => false;
@override
bool get isSourceDeclaration => true;
@override
bool get isStatic => _fragment.modifiers.isStatic;
@override
bool get isSynthesized => false;
@override
ClassMemberKind get memberKind =>
forSetter ? ClassMemberKind.Setter : ClassMemberKind.Getter;
@override
Name get name => _builder.memberName;
@override
void registerOverrideDependency(
ClassMembersBuilder membersBuilder,
Set<ClassMember> overriddenMembers,
) {
if (forSetter) {
_builder.registerSetterOverrideDependency(
membersBuilder,
overriddenMembers,
);
} else {
_builder.registerGetterOverrideDependency(
membersBuilder,
overriddenMembers,
);
}
}
@override
String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
}
class _SynthesizedFieldClassMember implements ClassMember {
final SourcePropertyBuilder _builder;
final _SynthesizedFieldMemberKind _kind;
final Member _member;
final Name _name;
Covariance? _covariance;
@override
final ClassMemberKind memberKind;
@override
final UriOffsetLength uriOffset;
_SynthesizedFieldClassMember(
this._builder,
this._member,
this._name,
this._kind,
this.memberKind,
this.uriOffset,
);
@override
Member getMember(ClassMembersBuilder membersBuilder) {
inferType(membersBuilder);
return _member;
}
@override
Member? getTearOff(ClassMembersBuilder membersBuilder) {
// Ensure field type is computed.
inferType(membersBuilder);
return null;
}
@override
Covariance getCovariance(ClassMembersBuilder membersBuilder) {
return _covariance ??= new Covariance.fromMember(
getMember(membersBuilder),
forSetter: forSetter,
);
}
@override
// Coverage-ignore(suite): Not run.
MemberResult getMemberResult(ClassMembersBuilder membersBuilder) {
return new TypeDeclarationInstanceMemberResult(
getMember(membersBuilder),
memberKind,
isDeclaredAsField: isDeclaredAsField(_builder, forSetter: forSetter),
);
}
@override
void inferType(ClassMembersBuilder membersBuilder) {
_builder.inferFieldType(membersBuilder.hierarchyBuilder);
}
@override
void registerOverrideDependency(
ClassMembersBuilder membersBuilder,
Set<ClassMember> overriddenMembers,
) {
if (forSetter) {
_builder.registerSetterOverrideDependency(
membersBuilder,
overriddenMembers,
);
} else {
_builder.registerGetterOverrideDependency(
membersBuilder,
overriddenMembers,
);
}
}
@override
bool get isSourceDeclaration => true;
@override
bool get forSetter => memberKind == ClassMemberKind.Setter;
@override
bool get isProperty => memberKind != ClassMemberKind.Method;
@override
DeclarationBuilder get declarationBuilder => _builder.declarationBuilder!;
@override
// Coverage-ignore(suite): Not run.
bool isObjectMember(ClassBuilder objectClass) {
return declarationBuilder == objectClass;
}
@override
bool get isDuplicate => _builder.isDuplicate;
@override
bool get isStatic => _builder.isStatic;
@override
bool get isSetter {
Member procedure = _member;
return procedure is Procedure && procedure.kind == ProcedureKind.Setter;
}
@override
Name get name => _name;
@override
// Coverage-ignore(suite): Not run.
String get fullName {
String suffix = isSetter ? "=" : "";
String className = declarationBuilder.fullNameForErrors;
return "${className}.${fullNameForErrors}$suffix";
}
@override
String get fullNameForErrors => _builder.fullNameForErrors;
@override
bool get isAbstract => _member.isAbstract;
@override
bool get isSynthesized => false;
@override
bool get hasDeclarations => false;
@override
// Coverage-ignore(suite): Not run.
List<ClassMember> get declarations =>
throw new UnsupportedError("$runtimeType.declarations");
@override
ClassMember get interfaceMember => this;
@override
bool isSameDeclaration(ClassMember other) {
if (identical(this, other)) return true;
return other is _SynthesizedFieldClassMember &&
_builder == other._builder &&
_kind == other._kind;
}
@override
bool get isNoSuchMethodForwarder => false;
@override
String toString() =>
'_SynthesizedFieldClassMember('
'$_builder,$_member,$_kind,forSetter=${forSetter})';
@override
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
}
enum _SynthesizedFieldMemberKind {
/// A getter or setter used for late lowering.
LateGetterSetter,
/// A getter or setter used for abstract or external fields.
AbstractExternalGetterSetter,
/// A getter for an extension type declaration representation field.
RepresentationField,
}