blob: d1d8fded694638d3589529c83ccc2605056d822f [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.
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_algebra.dart';
import '../../base/scope.dart';
import '../../builder/declaration_builders.dart';
import '../../builder/formal_parameter_builder.dart';
import '../../builder/metadata_builder.dart';
import '../../builder/type_builder.dart';
import '../../kernel/body_builder_context.dart';
import '../../kernel/internal_ast.dart';
import '../../kernel/kernel_helper.dart';
import '../../source/name_scheme.dart';
import '../../source/source_class_builder.dart';
import '../../source/source_constructor_builder.dart';
import '../../source/source_extension_type_declaration_builder.dart';
import '../../source/source_library_builder.dart';
import '../../source/source_member_builder.dart';
import '../fragment.dart';
import 'encoding.dart';
abstract class ConstructorDeclaration {
List<MetadataBuilder>? get metadata;
OmittedTypeBuilder get returnType;
List<NominalParameterBuilder>? get typeParameters;
List<FormalParameterBuilder>? get formals;
LookupScope get typeParameterScope;
Member get constructor;
Procedure? get tearOff;
FunctionNode get function;
Member get readTarget;
Reference get readTargetReference;
Member get invokeTarget;
Reference get invokeTargetReference;
void registerFunctionBody(Statement value);
void registerNoBodyConstructor();
VariableDeclaration? get thisVariable;
List<TypeParameter>? get thisTypeParameters;
List<Initializer> get initializers;
void createNode({
required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference,
});
void buildOutlineNodes(
BuildNodesCallback f, {
required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
});
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
});
void prepareInitializers();
void prependInitializer(Initializer initializer);
void becomeNative();
VariableDeclaration? getTearOffParameter(int index);
void finishAugmentation(SourceConstructorBuilder origin);
Substitution computeFieldTypeSubstitution(
DeclarationBuilder declarationBuilder);
void buildBody();
bool get isRedirecting;
bool get hasSuperInitializingFormals;
void addSuperParameterDefaultValueCloners(
{required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
required Member superTarget,
required List<int?>? positionalSuperParameters,
required List<String>? namedSuperParameters,
required SourceLibraryBuilder libraryBuilder});
}
mixin RegularConstructorDeclarationMixin implements ConstructorDeclaration {
RegularConstructorEncoding get _encoding;
@override
// Coverage-ignore(suite): Not run.
Member get constructor => _encoding.constructor;
@override
// Coverage-ignore(suite): Not run.
Procedure? get tearOff => _encoding.constructorTearOff;
@override
FunctionNode get function => _encoding.function;
@override
Member get readTarget => _encoding.readTarget;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _encoding.readTargetReference;
@override
Member get invokeTarget => _encoding.invokeTarget;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _encoding.invokeTargetReference;
@override
void registerFunctionBody(Statement value) {
_encoding.registerFunctionBody(value);
}
@override
void registerNoBodyConstructor() {
_encoding.registerNoBodyConstructor();
}
@override
VariableDeclaration? get thisVariable => null;
@override
List<TypeParameter>? get thisTypeParameters => null;
@override
List<Initializer> get initializers => _encoding.initializers;
@override
void prepareInitializers() {
_encoding.prepareInitializers();
}
@override
void prependInitializer(Initializer initializer) {
_encoding.prependInitializer(initializer);
}
@override
void becomeNative() {
_encoding.becomeNative();
}
@override
VariableDeclaration? getTearOffParameter(int index) {
return _encoding.getTearOffParameter(index);
}
@override
void finishAugmentation(SourceConstructorBuilder origin) {
_encoding.finishAugmentation(origin);
}
@override
Substitution computeFieldTypeSubstitution(
DeclarationBuilder declarationBuilder) {
// Nothing to substitute. Regular generative constructors don't have their
// own type parameters.
return Substitution.empty;
}
@override
void buildBody() {}
@override
bool get isRedirecting {
for (Initializer initializer in initializers) {
if (initializer is RedirectingInitializer) {
return true;
}
}
return false;
}
@override
late final bool hasSuperInitializingFormals =
formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
@override
void addSuperParameterDefaultValueCloners(
{required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
required Member superTarget,
required List<int?>? positionalSuperParameters,
required List<String>? namedSuperParameters,
required SourceLibraryBuilder libraryBuilder}) {
_encoding.addSuperParameterDefaultValueCloners(
delayedDefaultValueCloners: delayedDefaultValueCloners,
superTarget: superTarget,
positionalSuperParameters: positionalSuperParameters,
namedSuperParameters: namedSuperParameters,
libraryBuilder: libraryBuilder);
}
void _buildTypeParametersAndFormals({
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required LookupScope typeParameterScope,
}) {
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, typeParameterScope);
}
}
if (formals != null) {
// For const constructors we need to include default parameter values
// into the outline. For all other formals we need to call
// buildOutlineExpressions to clear initializerToken to prevent
// consuming too much memory.
for (FormalParameterBuilder formal in formals!) {
formal.buildOutlineExpressions(libraryBuilder, declarationBuilder,
scope: typeParameterScope, buildDefaultValue: true);
}
}
}
}
class RegularConstructorDeclaration
with RegularConstructorDeclarationMixin
implements ConstructorDeclaration {
final ConstructorFragment _fragment;
final List<FormalParameterBuilder>? _syntheticFormals;
@override
final RegularConstructorEncoding _encoding;
@override
final List<NominalParameterBuilder>? typeParameters;
RegularConstructorDeclaration(this._fragment,
{required List<FormalParameterBuilder>? syntheticFormals,
required this.typeParameters})
: _syntheticFormals = syntheticFormals,
_encoding = new RegularConstructorEncoding(
isExternal: _fragment.modifiers.isExternal);
@override
LookupScope get typeParameterScope => _fragment.typeParameterScope;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
OmittedTypeBuilder get returnType => _fragment.returnType;
@override
late final List<FormalParameterBuilder>? formals = _syntheticFormals != null
? [..._syntheticFormals, ...?_fragment.formals]
: _fragment.formals;
@override
void createNode(
{required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference}) {
_encoding.createNode(
name: name,
libraryBuilder: libraryBuilder,
nameScheme: nameScheme,
constructorReference: constructorReference,
tearOffReference: tearOffReference,
fileUri: _fragment.fileUri,
startOffset: _fragment.startOffset,
fileOffset: _fragment.fullNameOffset,
endOffset: _fragment.endOffset,
isSynthetic: false,
forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin);
}
@override
void buildOutlineNodes(BuildNodesCallback f,
{required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
_encoding.buildOutlineNodes(f,
constructorBuilder: constructorBuilder,
libraryBuilder: libraryBuilder,
declarationBuilder:
constructorBuilder.declarationBuilder as SourceClassBuilder,
declarationConstructor: declarationConstructor,
formalsOffset: _fragment.formalsOffset,
isConst: _fragment.modifiers.isConst,
returnType: returnType,
typeParameters: typeParameters,
formals: formals,
delayedDefaultValueCloners: delayedDefaultValueCloners);
}
@override
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
}) {
for (Annotatable annotatable in annotatables) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
}
_buildTypeParametersAndFormals(
libraryBuilder: libraryBuilder,
declarationBuilder: declarationBuilder,
bodyBuilderContext: bodyBuilderContext,
classHierarchy: classHierarchy,
typeParameterScope: _fragment.typeParameterScope);
}
}
// Coverage-ignore(suite): Not run.
class PrimaryConstructorDeclaration
with RegularConstructorDeclarationMixin
implements ConstructorDeclaration {
final PrimaryConstructorFragment _fragment;
@override
final RegularConstructorEncoding _encoding;
PrimaryConstructorDeclaration(this._fragment)
: _encoding = new RegularConstructorEncoding(
isExternal: _fragment.modifiers.isExternal);
@override
LookupScope get typeParameterScope => _fragment.typeParameterScope;
@override
OmittedTypeBuilder get returnType => _fragment.returnType;
@override
List<MetadataBuilder>? get metadata => null;
@override
List<FormalParameterBuilder>? get formals => _fragment.formals;
@override
List<NominalParameterBuilder>? get typeParameters => null;
@override
void createNode(
{required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference}) {
_encoding.createNode(
name: name,
libraryBuilder: libraryBuilder,
nameScheme: nameScheme,
constructorReference: constructorReference,
tearOffReference: tearOffReference,
fileUri: _fragment.fileUri,
startOffset: _fragment.startOffset,
fileOffset: _fragment.fileOffset,
// TODO(johnniwinther): Provide `endOffset`.
endOffset: _fragment.formalsOffset,
isSynthetic: false,
forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin);
}
@override
void buildOutlineNodes(BuildNodesCallback f,
{required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
_encoding.buildOutlineNodes(f,
constructorBuilder: constructorBuilder,
libraryBuilder: libraryBuilder,
declarationBuilder:
constructorBuilder.declarationBuilder as SourceClassBuilder,
declarationConstructor: declarationConstructor,
formalsOffset: _fragment.formalsOffset,
isConst: _fragment.modifiers.isConst,
returnType: returnType,
typeParameters: typeParameters,
formals: formals,
delayedDefaultValueCloners: delayedDefaultValueCloners);
}
@override
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
}) {
// There is no metadata on a primary constructor.
_buildTypeParametersAndFormals(
libraryBuilder: libraryBuilder,
declarationBuilder: declarationBuilder,
bodyBuilderContext: bodyBuilderContext,
classHierarchy: classHierarchy,
typeParameterScope: _fragment.typeParameterScope);
}
}
class DefaultEnumConstructorDeclaration
with RegularConstructorDeclarationMixin
implements ConstructorDeclaration {
final Uri _fileUri;
final int _fileOffset;
@override
final OmittedTypeBuilder returnType;
@override
final List<FormalParameterBuilder> formals;
@override
final RegularConstructorEncoding _encoding =
new RegularConstructorEncoding(isExternal: false);
/// The scope in which to build the formal parameters.
final LookupScope _lookupScope;
DefaultEnumConstructorDeclaration(
{required this.returnType,
required this.formals,
required Uri fileUri,
required int fileOffset,
required LookupScope lookupScope})
: _fileUri = fileUri,
_fileOffset = fileOffset,
_lookupScope = lookupScope;
@override
LookupScope get typeParameterScope => _lookupScope;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => null;
@override
List<NominalParameterBuilder>? get typeParameters => null;
@override
void createNode(
{required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference}) {
_encoding.createNode(
name: name,
libraryBuilder: libraryBuilder,
nameScheme: nameScheme,
constructorReference: constructorReference,
tearOffReference: tearOffReference,
fileUri: _fileUri,
startOffset: _fileOffset,
fileOffset: _fileOffset,
endOffset: _fileOffset,
isSynthetic: true,
forAbstractClassOrEnumOrMixin: true);
}
@override
void buildOutlineNodes(BuildNodesCallback f,
{required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
_encoding.buildOutlineNodes(f,
constructorBuilder: constructorBuilder,
libraryBuilder: libraryBuilder,
declarationBuilder:
constructorBuilder.declarationBuilder as SourceClassBuilder,
declarationConstructor: declarationConstructor,
formalsOffset: _fileOffset,
isConst: true,
returnType: returnType,
typeParameters: typeParameters,
formals: formals,
delayedDefaultValueCloners: delayedDefaultValueCloners);
}
@override
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
}) {
// There is no metadata on a default enum constructor.
_buildTypeParametersAndFormals(
libraryBuilder: libraryBuilder,
declarationBuilder: declarationBuilder,
bodyBuilderContext: bodyBuilderContext,
classHierarchy: classHierarchy,
typeParameterScope: _lookupScope);
}
}
mixin ExtensionTypeConstructorDeclarationMixin
implements ConstructorDeclaration {
ExtensionTypeConstructorEncoding get _encoding;
@override
// Coverage-ignore(suite): Not run.
Member get constructor => _encoding.constructor;
@override
// Coverage-ignore(suite): Not run.
Procedure? get tearOff => _encoding.constructorTearOff;
@override
FunctionNode get function => _encoding.function;
@override
Member get readTarget => _encoding.readTarget;
@override
// Coverage-ignore(suite): Not run.
Reference get readTargetReference => _encoding.readTargetReference;
@override
Member get invokeTarget => _encoding.invokeTarget;
@override
// Coverage-ignore(suite): Not run.
Reference get invokeTargetReference => _encoding.invokeTargetReference;
@override
void registerFunctionBody(Statement value) {
_encoding.registerFunctionBody(value);
}
@override
void registerNoBodyConstructor() {
_encoding.registerNoBodyConstructor();
}
@override
VariableDeclaration? get thisVariable => _encoding.thisVariable;
@override
List<TypeParameter>? get thisTypeParameters => _encoding.thisTypeParameters;
@override
List<Initializer> get initializers => _encoding.initializers;
@override
void prepareInitializers() {
_encoding.prepareInitializers();
}
@override
void prependInitializer(Initializer initializer) {
_encoding.prependInitializer(initializer);
}
@override
void becomeNative() {
throw new UnsupportedError("$runtimeType.becomeNative()");
}
@override
VariableDeclaration? getTearOffParameter(int index) {
return _encoding.getTearOffParameter(index);
}
@override
void finishAugmentation(SourceConstructorBuilder origin) {
throw new UnsupportedError('$runtimeType.finishAugmentation');
}
@override
Substitution computeFieldTypeSubstitution(
DeclarationBuilder declarationBuilder) {
if (typeParameters != null) {
assert(
declarationBuilder.typeParameters!.length == typeParameters?.length);
return Substitution.fromPairs(
(declarationBuilder as SourceExtensionTypeDeclarationBuilder)
.extensionTypeDeclaration
.typeParameters,
new List<DartType>.generate(
declarationBuilder.typeParameters!.length,
(int index) => new TypeParameterType.withDefaultNullability(
function.typeParameters[index])));
} else {
return Substitution.empty;
}
}
@override
void buildBody() {
_encoding.buildBody();
}
@override
bool get isRedirecting {
for (Initializer initializer in initializers) {
if (initializer is ExtensionTypeRedirectingInitializer) {
return true;
}
}
return false;
}
@override
late final bool hasSuperInitializingFormals =
formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
@override
void addSuperParameterDefaultValueCloners(
{required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
required Member superTarget,
required List<int?>? positionalSuperParameters,
required List<String>? namedSuperParameters,
required SourceLibraryBuilder libraryBuilder}) {
throw new UnsupportedError(
'$runtimeType.addSuperParameterDefaultValueCloners');
}
void _buildTypeParametersAndFormals({
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required LookupScope typeParameterScope,
}) {
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, typeParameterScope);
}
}
if (formals != null) {
// For const constructors we need to include default parameter values
// into the outline. For all other formals we need to call
// buildOutlineExpressions to clear initializerToken to prevent
// consuming too much memory.
for (FormalParameterBuilder formal in formals!) {
formal.buildOutlineExpressions(libraryBuilder, declarationBuilder,
scope: typeParameterScope, buildDefaultValue: true);
}
}
}
}
class ExtensionTypeConstructorDeclaration
with ExtensionTypeConstructorDeclarationMixin
implements ConstructorDeclaration {
final ConstructorFragment _fragment;
@override
final List<NominalParameterBuilder>? typeParameters;
@override
final ExtensionTypeConstructorEncoding _encoding;
ExtensionTypeConstructorDeclaration(this._fragment,
{required this.typeParameters})
: _encoding = new ExtensionTypeConstructorEncoding(
isExternal: _fragment.modifiers.isExternal);
@override
LookupScope get typeParameterScope => _fragment.typeParameterScope;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
OmittedTypeBuilder get returnType => _fragment.returnType;
@override
List<FormalParameterBuilder>? get formals => _fragment.formals;
@override
void createNode(
{required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference}) {
_encoding.createNode(
name: name,
libraryBuilder: libraryBuilder,
nameScheme: nameScheme,
constructorReference: constructorReference,
tearOffReference: tearOffReference,
fileUri: _fragment.fileUri,
fileOffset: _fragment.fullNameOffset,
endOffset: _fragment.endOffset,
forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin);
}
@override
void buildOutlineNodes(BuildNodesCallback f,
{required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
_encoding.buildOutlineNodes(f,
constructorBuilder: constructorBuilder,
libraryBuilder: libraryBuilder,
declarationBuilder: constructorBuilder.declarationBuilder
as SourceExtensionTypeDeclarationBuilder,
declarationConstructor: declarationConstructor,
fileOffset: _fragment.fullNameOffset,
formalsOffset: _fragment.formalsOffset,
isConst: _fragment.modifiers.isConst,
returnType: returnType,
typeParameters: typeParameters,
formals: formals,
delayedDefaultValueCloners: delayedDefaultValueCloners);
}
@override
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
}) {
for (Annotatable annotatable in annotatables) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
}
_buildTypeParametersAndFormals(
libraryBuilder: libraryBuilder,
declarationBuilder: declarationBuilder,
bodyBuilderContext: bodyBuilderContext,
classHierarchy: classHierarchy,
typeParameterScope: _fragment.typeParameterScope);
}
}
class ExtensionTypePrimaryConstructorDeclaration
with ExtensionTypeConstructorDeclarationMixin
implements ConstructorDeclaration {
final PrimaryConstructorFragment _fragment;
@override
final List<NominalParameterBuilder>? typeParameters;
@override
final ExtensionTypeConstructorEncoding _encoding;
ExtensionTypePrimaryConstructorDeclaration(this._fragment,
{required this.typeParameters})
: _encoding = new ExtensionTypeConstructorEncoding(
isExternal: _fragment.modifiers.isExternal);
@override
LookupScope get typeParameterScope => _fragment.typeParameterScope;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => null;
@override
OmittedTypeBuilder get returnType => _fragment.returnType;
@override
List<FormalParameterBuilder>? get formals => _fragment.formals;
@override
void createNode(
{required String name,
required SourceLibraryBuilder libraryBuilder,
required NameScheme nameScheme,
required Reference? constructorReference,
required Reference? tearOffReference}) {
_encoding.createNode(
name: name,
libraryBuilder: libraryBuilder,
nameScheme: nameScheme,
constructorReference: constructorReference,
tearOffReference: tearOffReference,
fileUri: _fragment.fileUri,
fileOffset: _fragment.fileOffset,
// TODO(johnniwinther): Provide `endOffset`.
endOffset: _fragment.formalsOffset,
forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin);
}
@override
void buildOutlineNodes(BuildNodesCallback f,
{required SourceConstructorBuilder constructorBuilder,
required SourceLibraryBuilder libraryBuilder,
required Member declarationConstructor,
required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
_encoding.buildOutlineNodes(f,
constructorBuilder: constructorBuilder,
libraryBuilder: libraryBuilder,
declarationBuilder: constructorBuilder.declarationBuilder
as SourceExtensionTypeDeclarationBuilder,
declarationConstructor: declarationConstructor,
fileOffset: _fragment.fileOffset,
formalsOffset: _fragment.formalsOffset,
isConst: _fragment.modifiers.isConst,
returnType: returnType,
typeParameters: typeParameters,
formals: formals,
delayedDefaultValueCloners: delayedDefaultValueCloners);
}
@override
void buildOutlineExpressions({
required Iterable<Annotatable> annotatables,
required SourceLibraryBuilder libraryBuilder,
required DeclarationBuilder declarationBuilder,
required BodyBuilderContext bodyBuilderContext,
required ClassHierarchy classHierarchy,
required bool createFileUriExpression,
}) {
// There is no metadata on a primary constructor.
_buildTypeParametersAndFormals(
libraryBuilder: libraryBuilder,
declarationBuilder: declarationBuilder,
bodyBuilderContext: bodyBuilderContext,
classHierarchy: classHierarchy,
typeParameterScope: _fragment.typeParameterScope);
}
}