blob: 9fbfc65483740f86729fb3cbab52daff92b1c53d [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.
import 'package:kernel/ast.dart';
import 'package:kernel/names.dart';
import '../base/uri_offset.dart';
import '../builder/method_builder.dart';
import '../builder/property_builder.dart';
import 'dill_builder_mixins.dart';
import 'dill_extension_builder.dart';
import 'dill_member_builder.dart';
abstract class DillExtensionMemberBuilder extends DillMemberBuilder {
final ExtensionMemberDescriptor _descriptor;
DillExtensionMemberBuilder(
this._descriptor,
super.libraryBuilder,
DillExtensionBuilder super.declarationBuilder,
);
@override
bool get isStatic => _descriptor.isStatic;
@override
// Coverage-ignore(suite): Not run.
String get name => _descriptor.name.text;
}
class DillExtensionFieldBuilder extends DillExtensionMemberBuilder
with DillFieldBuilderMixin
implements PropertyBuilder {
final Field _field;
DillExtensionFieldBuilder(
this._field,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
);
@override
// Coverage-ignore(suite): Not run.
Member get member => _field;
@override
Member get readTarget => _field;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _field.getterReference;
@override
Member? get writeTarget => _field.hasSetter ? _field : null;
@override
// Coverage-ignore(suite): Not run.
Reference? get writeTargetReference => _field.setterReference;
@override
Member get invokeTarget => _field;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _field.getterReference;
@override
// Coverage-ignore(suite): Not run.
bool get isEnumElement => _field.isEnumElement;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [
_field.getterReference,
if (_field.hasSetter) _field.setterReference!,
];
@override
// Coverage-ignore(suite): Not run.
FieldQuality get fieldQuality => FieldQuality.Concrete;
@override
// Coverage-ignore(suite): Not run.
GetterQuality get getterQuality => GetterQuality.Implicit;
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get getterUriOffset =>
new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length);
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength? get setterUriOffset => hasSetter
? new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length)
: null;
@override
// Coverage-ignore(suite): Not run.
bool get hasConstField => _field.isConst;
@override
SetterQuality get setterQuality =>
_field.hasSetter ? SetterQuality.Implicit : SetterQuality.Absent;
}
class DillExtensionSetterBuilder extends DillExtensionMemberBuilder
with DillSetterBuilderMixin
implements PropertyBuilder {
final Procedure procedure;
DillExtensionSetterBuilder(
this.procedure,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
) : assert(descriptor.kind == ExtensionMemberKind.Setter);
@override
// Coverage-ignore(suite): Not run.
Member get member => procedure;
@override
Member get writeTarget => procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get writeTargetReference => procedure.reference;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [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 : SetterQuality.Concrete;
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get setterUriOffset =>
new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length);
}
class DillExtensionGetterBuilder extends DillExtensionMemberBuilder
with DillGetterBuilderMixin
implements PropertyBuilder {
final Procedure _procedure;
DillExtensionGetterBuilder(
this._procedure,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
) : assert(descriptor.kind == ExtensionMemberKind.Getter);
@override
// Coverage-ignore(suite): Not run.
Member get member => _procedure;
@override
Member get readTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _procedure.reference;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
@override
FieldQuality get fieldQuality => FieldQuality.Absent;
@override
// Coverage-ignore(suite): Not run.
GetterQuality get getterQuality =>
_procedure.isExternal ? GetterQuality.External : GetterQuality.Concrete;
@override
SetterQuality get setterQuality => SetterQuality.Absent;
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get getterUriOffset =>
new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length);
}
class DillExtensionOperatorBuilder extends DillExtensionMemberBuilder
with DillOperatorBuilderMixin
implements MethodBuilder {
final Procedure _procedure;
DillExtensionOperatorBuilder(
this._procedure,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
) : assert(descriptor.kind == ExtensionMemberKind.Operator);
@override
// Coverage-ignore(suite): Not run.
bool get isAbstract => _procedure.isAbstract;
@override
// Coverage-ignore(suite): Not run.
Member get member => _procedure;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get uriOffset => new UriOffsetLength(
fileUri,
fileOffset,
_descriptor.name == unaryMinusName ? 1 : _descriptor.name.text.length,
);
}
class DillExtensionStaticMethodBuilder extends DillExtensionMemberBuilder
with DillMethodBuilderMixin
implements MethodBuilder {
final Procedure _procedure;
DillExtensionStaticMethodBuilder(
this._procedure,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
) : assert(descriptor.kind == ExtensionMemberKind.Method),
assert(descriptor.isStatic);
@override
// Coverage-ignore(suite): Not run.
bool get isAbstract => _procedure.isAbstract;
@override
// Coverage-ignore(suite): Not run.
Member get member => _procedure;
@override
Member get readTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _procedure.reference;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get uriOffset =>
new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length);
}
class DillExtensionInstanceMethodBuilder extends DillExtensionMemberBuilder
with DillMethodBuilderMixin
implements MethodBuilder {
final Procedure _procedure;
final Procedure _extensionTearOff;
DillExtensionInstanceMethodBuilder(
this._procedure,
super.descriptor,
super.libraryBuilder,
super.declarationBuilder,
this._extensionTearOff,
) : assert(descriptor.kind == ExtensionMemberKind.Method),
assert(!descriptor.isStatic);
@override
// Coverage-ignore(suite): Not run.
bool get isAbstract => _procedure.isAbstract;
@override
// Coverage-ignore(suite): Not run.
Member get member => _procedure;
@override
// Coverage-ignore(suite): Not run.
Iterable<Reference> get exportedMemberReferences => [
_procedure.reference,
_extensionTearOff.reference,
];
@override
Member get readTarget => _extensionTearOff;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _extensionTearOff.reference;
@override
Member get invokeTarget => _procedure;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _procedure.reference;
@override
// Coverage-ignore(suite): Not run.
UriOffsetLength get uriOffset =>
new UriOffsetLength(fileUri, fileOffset, _descriptor.name.text.length);
}