blob: 49bc48875986c7509b79dcb0c8fc9e7f4f3140cd [file] [log] [blame]
// Copyright (c) 2024, 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:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
import 'package:kernel/ast.dart' hide Combinator, MapLiteralEntry;
import '../api_prototype/lowering_predicates.dart';
import '../base/combinator.dart' show CombinatorBuilder;
import '../base/configuration.dart' show Configuration;
import '../base/identifiers.dart' show Identifier;
import '../base/modifiers.dart';
import '../base/scope.dart';
import '../builder/constructor_reference_builder.dart';
import '../builder/declaration_builders.dart';
import '../builder/formal_parameter_builder.dart';
import '../builder/metadata_builder.dart';
import '../builder/named_type_builder.dart';
import '../builder/nullability_builder.dart';
import '../builder/omitted_type_builder.dart';
import '../builder/type_builder.dart';
import '../fragment/fragment.dart';
import 'offset_map.dart';
import 'source_type_parameter_builder.dart';
import 'type_parameter_factory.dart';
abstract class FragmentFactory {
void beginClassOrNamedMixinApplicationHeader();
/// Registers that this builder is preparing for a class declaration with the
/// given [name] and [typeParameters] located at [nameOffset].
void beginClassDeclaration(
String name,
int nameOffset,
List<TypeParameterFragment>? typeParameters,
);
void beginClassBody();
ClassFragment endClassDeclaration();
void endClassDeclarationForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
/// Registers that this builder is preparing for a mixin declaration with the
/// given [name] and [typeParameters] located at [nameOffset].
void beginMixinDeclaration(
String name,
int nameOffset,
List<TypeParameterFragment>? typeParameters,
);
void beginMixinBody();
MixinFragment endMixinDeclaration();
void endMixinDeclarationForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
/// Registers that this builder is preparing for a named mixin application
/// with the given [name] and [typeParameters] located [charOffset].
void beginNamedMixinApplication(
String name,
int charOffset,
List<TypeParameterFragment>? typeParameters,
);
// TODO(johnniwinther): Avoid returning the type parameter scope here. Should
// named mixin applications be created in the begin method, similar to the
// other declarations?
LookupScope endNamedMixinApplication(String name);
void endNamedMixinApplicationForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginEnumDeclarationHeader(String name);
/// Registers that this builder is preparing for an enum declaration with
/// the given [name] and [typeParameters] located at [nameOffset].
void beginEnumDeclaration(
String name,
int nameOffset,
List<TypeParameterFragment>? typeParameters,
);
void beginEnumBody();
EnumFragment endEnumDeclaration();
void endEnumDeclarationForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginExtensionOrExtensionTypeHeader();
/// Registers that this builder is preparing for an extension declaration with
/// the given [name] and [typeParameters] located at [nameOrExtensionOffset].
///
/// If the extension is unnamed, [nameOrExtensionOffset] is the offset of the
/// `extension` keyword. Otherwise it is the offset of the extension name.
void beginExtensionDeclaration(
String? name,
int nameOrExtensionOffset,
List<TypeParameterFragment>? typeParameters,
);
void beginExtensionBody();
ExtensionFragment endExtensionDeclaration();
/// Registers that this builder is preparing for an extension type declaration
/// with the given [name] and [typeParameters] located at [nameOffset].
void beginExtensionTypeDeclaration(
String name,
int nameOffset,
List<TypeParameterFragment>? typeParameters,
);
void beginExtensionTypeBody();
ExtensionTypeFragment endExtensionTypeDeclaration();
void beginFactoryMethod();
void endFactoryMethodForParserRecovery();
void beginFunctionType();
void endFunctionType();
void beginConstructor();
void endConstructorForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginStaticMethod();
void endStaticMethodForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginInstanceMethod();
void endInstanceMethodForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginTopLevelMethod();
void endTopLevelMethodForParserRecovery(
List<TypeParameterFragment>? typeParameters,
);
void beginTypedef();
void endTypedef();
void endTypedefForParserRecovery(List<TypeParameterFragment>? typeParameters);
void checkStacks();
void addScriptToken(int charOffset);
void addLibraryDirective({
required String? libraryName,
required List<MetadataBuilder>? metadata,
required bool isAugment,
});
void addPart(
OffsetMap offsetMap,
Token partKeyword,
List<MetadataBuilder>? metadata,
String uri,
int charOffset,
);
void addPartOf(
List<MetadataBuilder>? metadata,
String? name,
String? uri,
int uriOffset,
);
void addImport({
OffsetMap? offsetMap,
Token? importKeyword,
required List<MetadataBuilder>? metadata,
required bool isAugmentationImport,
required String uri,
required List<Configuration>? configurations,
required String? prefix,
required List<CombinatorBuilder>? combinators,
required bool deferred,
required int charOffset,
required int prefixCharOffset,
required int uriOffset,
});
void addExport(
OffsetMap offsetMap,
Token exportKeyword,
List<MetadataBuilder>? metadata,
String uri,
List<Configuration>? configurations,
List<CombinatorBuilder>? combinators,
int charOffset,
int uriOffset,
);
void addClass({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required List<TypeParameterFragment>? typeParameters,
required TypeBuilder? supertype,
required List<TypeBuilder>? mixins,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int nameOffset,
required int endOffset,
required int supertypeOffset,
});
void addEnum({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Identifier identifier,
required List<TypeParameterFragment>? typeParameters,
required List<TypeBuilder>? mixins,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int endOffset,
});
void addEnumElement({
required List<MetadataBuilder>? metadata,
required String name,
required int nameOffset,
required ConstructorReferenceBuilder? constructorReferenceBuilder,
required Token? argumentsBeginToken,
});
void addExtensionDeclaration({
required OffsetMap offsetMap,
required Token beginToken,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier? identifier,
required List<TypeParameterFragment>? typeParameters,
required TypeBuilder onType,
required int startOffset,
required int endOffset,
});
void addExtensionTypeDeclaration({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required List<TypeParameterFragment>? typeParameters,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int endOffset,
});
void addMixinDeclaration({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required List<TypeParameterFragment>? typeParameters,
required List<TypeBuilder>? supertypeConstraints,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int nameOffset,
required int endOffset,
});
void addNamedMixinApplication({
required List<MetadataBuilder>? metadata,
required String name,
required List<TypeParameterFragment>? typeParameters,
required Modifiers modifiers,
required TypeBuilder? supertype,
required List<TypeBuilder> mixins,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int nameOffset,
required int endOffset,
});
void addFunctionTypeAlias(
List<MetadataBuilder>? metadata,
String name,
List<TypeParameterFragment>? typeParameters,
TypeBuilder type,
int nameOffset,
);
void addClassMethod({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Identifier identifier,
required String name,
required TypeBuilder? returnType,
required List<FormalParameterBuilder>? formals,
required List<TypeParameterFragment>? typeParameters,
required Token? beginInitializers,
required int startOffset,
required int endOffset,
required int nameOffset,
required int formalsOffset,
required Modifiers modifiers,
required bool inConstructor,
required bool isStatic,
required bool isConstructor,
required bool forAbstractClassOrMixin,
required bool isExtensionMember,
required bool isExtensionTypeMember,
required AsyncMarker asyncModifier,
required String? nativeMethodName,
required ProcedureKind? kind,
});
void addConstructor({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required ConstructorName constructorName,
required List<TypeParameterFragment>? typeParameters,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int formalsOffset,
required int endOffset,
required String? nativeMethodName,
required Token? beginInitializers,
required bool forAbstractClassOrMixin,
});
void addPrimaryConstructor({
required OffsetMap offsetMap,
required Token beginToken,
required String? name,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int? nameOffset,
required int formalsOffset,
required bool isConst,
});
void addPrimaryConstructorField({
required List<MetadataBuilder>? metadata,
required TypeBuilder type,
required String name,
required int nameOffset,
});
void addFactoryMethod({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required List<FormalParameterBuilder>? formals,
required ConstructorReferenceBuilder? redirectionTarget,
required int startOffset,
required int nameOffset,
required int formalsOffset,
required int endOffset,
required String? nativeMethodName,
required AsyncMarker asyncModifier,
});
ConstructorName computeAndValidateConstructorName(
DeclarationFragmentImpl enclosingDeclaration,
Identifier identifier, {
isFactory = false,
});
void addMethod({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required TypeBuilder? returnType,
required Identifier identifier,
required String name,
required List<TypeParameterFragment>? typeParameters,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int nameOffset,
required int formalsOffset,
required int endOffset,
required String? nativeMethodName,
required AsyncMarker asyncModifier,
required bool isInstanceMember,
required bool isExtensionMember,
required bool isExtensionTypeMember,
required bool isOperator,
});
void addGetter({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required TypeBuilder? returnType,
required Identifier identifier,
required String name,
required List<TypeParameterFragment>? typeParameters,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int nameOffset,
required int formalsOffset,
required int endOffset,
required String? nativeMethodName,
required AsyncMarker asyncModifier,
required bool isInstanceMember,
required bool isExtensionMember,
required bool isExtensionTypeMember,
});
void addSetter({
required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required TypeBuilder? returnType,
required Identifier identifier,
required String name,
required List<TypeParameterFragment>? typeParameters,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int nameOffset,
required int formalsOffset,
required int endOffset,
required String? nativeMethodName,
required AsyncMarker asyncModifier,
required bool isInstanceMember,
required bool isExtensionMember,
required bool isExtensionTypeMember,
});
void addFields(
OffsetMap offsetMap,
List<MetadataBuilder>? metadata,
Modifiers modifiers,
bool isTopLevel,
TypeBuilder? type,
List<FieldInfo> fieldInfos,
);
FormalParameterBuilder addFormalParameter(
List<MetadataBuilder>? metadata,
FormalParameterKind kind,
Modifiers modifiers,
TypeBuilder type,
String name,
bool hasThis,
bool hasSuper,
int charOffset,
Token? initializerToken, {
bool lowerWildcard = false,
});
ConstructorReferenceBuilder addConstructorReference(
TypeName name,
List<TypeBuilder>? typeArguments,
String? suffix,
int charOffset,
);
ConstructorReferenceBuilder? addUnnamedConstructorReference(
List<TypeBuilder>? typeArguments,
Identifier? suffix,
int charOffset,
);
TypeBuilder addNamedType(
TypeName typeName,
NullabilityBuilder nullabilityBuilder,
List<TypeBuilder>? arguments,
int charOffset, {
required InstanceTypeParameterAccessState instanceTypeParameterAccess,
});
FunctionTypeBuilder addFunctionType(
TypeBuilder returnType,
List<SourceStructuralParameterBuilder>? structuralParameterBuilders,
List<FormalParameterBuilder>? formals,
NullabilityBuilder nullabilityBuilder,
Uri fileUri,
int charOffset, {
required bool hasFunctionFormalParameterSyntax,
});
TypeBuilder addVoidType(int charOffset);
InferableTypeBuilder addInferableType();
TypeParameterFragment addNominalParameter({
required List<MetadataBuilder>? metadata,
required String name,
required int nameOffset,
required Uri fileUri,
required TypeParameterKind kind,
});
StructuralParameterBuilder addStructuralParameter({
required List<MetadataBuilder>? metadata,
required String name,
required int nameOffset,
required Uri fileUri,
});
}
/// The synthesized type parameters and this formal for an extension instance
/// member.
class SynthesizedExtensionSignature {
final List<SourceNominalParameterBuilder>? clonedDeclarationTypeParameters;
final FormalParameterBuilder thisFormal;
SynthesizedExtensionSignature._(
this.clonedDeclarationTypeParameters,
this.thisFormal,
);
factory SynthesizedExtensionSignature({
required ExtensionBuilder declarationBuilder,
required List<TypeParameterFragment>? extensionTypeParameterFragments,
required TypeBuilder onTypeBuilder,
required TypeParameterFactory typeParameterFactory,
required Uri fileUri,
required int fileOffset,
}) {
NominalParameterCopy? nominalVariableCopy = typeParameterFactory
.copyTypeParameters(
oldParameterBuilders: declarationBuilder.typeParameters,
oldParameterFragments: extensionTypeParameterFragments,
kind: TypeParameterKind.extensionSynthesized,
instanceTypeParameterAccess: InstanceTypeParameterAccessState.Allowed,
);
List<SourceNominalParameterBuilder>? clonedDeclarationTypeParameters =
nominalVariableCopy?.newParameterBuilders;
TypeBuilder thisType = onTypeBuilder;
if (nominalVariableCopy != null) {
thisType = nominalVariableCopy.createInContext(thisType);
}
FormalParameterBuilder thisFormal = new FormalParameterBuilder(
FormalParameterKind.requiredPositional,
Modifiers.Final,
thisType,
syntheticThisName,
fileOffset,
fileUri: fileUri,
isExtensionThis: true,
hasImmediatelyDeclaredInitializer: false,
);
return new SynthesizedExtensionSignature._(
clonedDeclarationTypeParameters,
thisFormal,
);
}
}
/// The synthesized type parameters and this formal for an extension type
/// instance member.
class SynthesizedExtensionTypeSignature {
final List<SourceNominalParameterBuilder>? clonedDeclarationTypeParameters;
final FormalParameterBuilder thisFormal;
SynthesizedExtensionTypeSignature._(
this.clonedDeclarationTypeParameters,
this.thisFormal,
);
factory SynthesizedExtensionTypeSignature({
required ExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder,
required List<TypeParameterFragment>? extensionTypeTypeParameters,
required TypeParameterFactory typeParameterFactory,
required Uri fileUri,
required int fileOffset,
}) {
NominalParameterCopy? nominalVariableCopy = typeParameterFactory
.copyTypeParameters(
oldParameterBuilders: extensionTypeDeclarationBuilder.typeParameters,
oldParameterFragments: extensionTypeTypeParameters,
kind: TypeParameterKind.extensionSynthesized,
instanceTypeParameterAccess: InstanceTypeParameterAccessState.Allowed,
);
List<SourceNominalParameterBuilder>? clonedDeclarationTypeParameters =
nominalVariableCopy?.newParameterBuilders;
TypeBuilder thisType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
extensionTypeDeclarationBuilder,
const NullabilityBuilder.omitted(),
arguments: extensionTypeTypeParameters != null
? new List<TypeBuilder>.generate(
extensionTypeTypeParameters.length,
(int index) =>
new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
clonedDeclarationTypeParameters![index],
const NullabilityBuilder.omitted(),
instanceTypeParameterAccess:
InstanceTypeParameterAccessState.Allowed,
),
)
: null,
instanceTypeParameterAccess: InstanceTypeParameterAccessState.Allowed,
);
if (nominalVariableCopy != null) {
thisType = nominalVariableCopy.createInContext(thisType);
}
FormalParameterBuilder thisFormal = new FormalParameterBuilder(
FormalParameterKind.requiredPositional,
Modifiers.Final,
thisType,
syntheticThisName,
fileOffset,
fileUri: fileUri,
isExtensionThis: true,
hasImmediatelyDeclaredInitializer: false,
);
return new SynthesizedExtensionTypeSignature._(
clonedDeclarationTypeParameters,
thisFormal,
);
}
}
class FieldInfo {
final Identifier identifier;
final Token? initializerToken;
final Token? beforeLast;
final int endOffset;
const FieldInfo(
this.identifier,
this.initializerToken,
this.beforeLast,
this.endOffset,
);
}