blob: 9e5d750d9f12e9cdb895558742ef57d3d6e4e2a5 [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 '../base/combinator.dart' show CombinatorBuilder;
import '../base/configuration.dart' show Configuration;
import '../base/export.dart';
import '../base/identifiers.dart' show Identifier;
import '../base/import.dart';
import '../base/modifiers.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/mixin_application_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 'offset_map.dart';
import 'source_class_builder.dart';
import 'source_enum_builder.dart';
import 'source_library_builder.dart';
import 'type_parameter_scope_builder.dart';
abstract class BuilderFactoryResult {
String? get name;
bool get isPart;
String? get partOfName;
Uri? get partOfUri;
/// The part directives in this compilation unit.
List<Part> get parts;
List<Import> get imports;
List<Export> get exports;
List<MetadataBuilder>? get metadata;
TypeScope get typeScope;
void takeMixinApplications(
Map<SourceClassBuilder, TypeBuilder> mixinApplications);
void collectUnboundTypeParameters(
SourceLibraryBuilder libraryBuilder,
Map<NominalParameterBuilder, SourceLibraryBuilder> nominalParameters,
Map<StructuralParameterBuilder, SourceLibraryBuilder>
structuralParameters);
int finishNativeMethods();
void registerUnresolvedStructuralParameters(
List<StructuralParameterBuilder> unboundTypeParameters);
List<LibraryPart> get libraryParts;
}
abstract class BuilderFactory {
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<NominalParameterBuilder>? typeParameters);
void beginClassBody();
void endClassDeclaration(String name);
void endClassDeclarationForParserRecovery(
List<NominalParameterBuilder>? 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<NominalParameterBuilder>? typeParameters);
void beginMixinBody();
void endMixinDeclaration(String name);
void endMixinDeclarationForParserRecovery(
List<NominalParameterBuilder>? 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<NominalParameterBuilder>? typeParameters);
void endNamedMixinApplication(String name);
void endNamedMixinApplicationForParserRecovery(
List<NominalParameterBuilder>? 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<NominalParameterBuilder>? typeParameters);
void beginEnumBody();
void endEnumDeclaration(String name);
void endEnumDeclarationForParserRecovery(
List<NominalParameterBuilder>? typeParameters);
void beginExtensionOrExtensionTypeHeader();
/// Registers that this builder is preparing for an extension declaration with
/// the given [name] and [typeParameters] located [charOffset].
void beginExtensionDeclaration(String? name, int charOffset,
List<NominalParameterBuilder>? typeParameters);
void beginExtensionBody(TypeBuilder? extensionThisType);
void endExtensionDeclaration(String? name);
/// 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<NominalParameterBuilder>? typeParameters);
void beginExtensionTypeBody();
void endExtensionTypeDeclaration(String name);
void beginFactoryMethod();
void endFactoryMethodForParserRecovery();
void beginFunctionType();
void endFunctionType();
void beginConstructor();
void endConstructorForParserRecovery(
List<NominalParameterBuilder>? typeParameters);
void beginStaticMethod();
void endStaticMethodForParserRecovery(
List<NominalParameterBuilder>? typeParameters);
void beginInstanceMethod();
void endInstanceMethodForParserRecovery(
List<NominalParameterBuilder>? typeParameters);
void beginTopLevelMethod();
void endTopLevelMethodForParserRecovery(
List<NominalParameterBuilder>? typeParameters);
void beginTypedef();
void endTypedef();
void endTypedefForParserRecovery(
List<NominalParameterBuilder>? 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<NominalParameterBuilder>? typeParameters,
required TypeBuilder? supertype,
required MixinApplicationBuilder? 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<NominalParameterBuilder>? typeParameters,
required MixinApplicationBuilder? supertypeBuilder,
required List<TypeBuilder>? interfaceBuilders,
required List<EnumConstantInfo?>? enumConstantInfos,
required int startOffset,
required int endOffset});
void addExtensionDeclaration(
{required OffsetMap offsetMap,
required Token beginToken,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier? identifier,
required List<NominalParameterBuilder>? typeParameters,
required TypeBuilder onType,
required int startOffset,
required int nameOrExtensionOffset,
required int endOffset});
void addExtensionTypeDeclaration(
{required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required Identifier identifier,
required List<NominalParameterBuilder>? 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<NominalParameterBuilder>? 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<NominalParameterBuilder>? typeParameters,
required Modifiers modifiers,
required TypeBuilder? supertype,
required MixinApplicationBuilder mixinApplication,
required List<TypeBuilder>? interfaces,
required int startOffset,
required int nameOffset,
required int endOffset});
MixinApplicationBuilder addMixinApplication(
List<TypeBuilder> mixins, int charOffset);
void addFunctionTypeAlias(
List<MetadataBuilder>? metadata,
String name,
List<NominalParameterBuilder>? typeParameters,
TypeBuilder type,
int charOffset);
void addClassMethod(
{required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Identifier identifier,
required String name,
required TypeBuilder? returnType,
required List<FormalParameterBuilder>? formals,
required List<NominalParameterBuilder>? 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 String constructorName,
required List<NominalParameterBuilder>? typeParameters,
required List<FormalParameterBuilder>? formals,
required int startOffset,
required int nameOffset,
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 constructorName,
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 charOffset});
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});
String? computeAndValidateConstructorName(
DeclarationFragment 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<NominalParameterBuilder>? typeParameters,
required List<FormalParameterBuilder>? formals,
required ProcedureKind kind,
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 addGetter(
{required OffsetMap offsetMap,
required List<MetadataBuilder>? metadata,
required Modifiers modifiers,
required TypeBuilder? returnType,
required Identifier identifier,
required String name,
required List<NominalParameterBuilder>? 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<NominalParameterBuilder>? 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<StructuralParameterBuilder>? structuralParameterBuilders,
List<FormalParameterBuilder>? formals,
NullabilityBuilder nullabilityBuilder,
Uri fileUri,
int charOffset,
{required bool hasFunctionFormalParameterSyntax});
TypeBuilder addVoidType(int charOffset);
InferableTypeBuilder addInferableType();
NominalParameterBuilder addNominalParameter(List<MetadataBuilder>? metadata,
String name, TypeBuilder? bound, int charOffset, Uri fileUri,
{required TypeParameterKind kind});
StructuralParameterBuilder addStructuralParameter(
List<MetadataBuilder>? metadata,
String name,
TypeBuilder? bound,
int charOffset,
Uri fileUri);
void registerUnboundStructuralParameters(
List<StructuralParameterBuilder> parameterBuilders);
}
class NominalParameterCopy {
final List<NominalParameterBuilder> newParameterBuilders;
final List<TypeBuilder> newTypeArguments;
final Map<NominalParameterBuilder, TypeBuilder> substitutionMap;
final Map<NominalParameterBuilder, NominalParameterBuilder>
newToOldParameterMap;
NominalParameterCopy(this.newParameterBuilders, this.newTypeArguments,
this.substitutionMap, this.newToOldParameterMap);
}
class FieldInfo {
final Identifier identifier;
final Token? initializerToken;
final Token? beforeLast;
final int charEndOffset;
const FieldInfo(this.identifier, this.initializerToken, this.beforeLast,
this.charEndOffset);
}