blob: e5b061699aac4700aceee97a8040b9103cfbb053 [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';
abstract class ClassDeclaration {
String get name;
List<MetadataBuilder>? get metadata;
LookupScope get compilationUnitScope;
LookupScope get bodyScope;
Uri get fileUri;
int get nameOffset;
int get startOffset;
int get endOffset;
List<NominalParameterBuilder>? get typeParameters;
bool get isMixinDeclaration;
TypeBuilder? get supertype;
List<TypeBuilder>? get mixedInTypes;
List<TypeBuilder>? get interfaces;
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression});
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder);
}
class RegularClassDeclaration implements ClassDeclaration {
final ClassFragment _fragment;
RegularClassDeclaration(this._fragment);
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
LookupScope get compilationUnitScope => _fragment.enclosingScope;
@override
LookupScope get bodyScope => _fragment.bodyScope;
@override
Uri get fileUri => _fragment.fileUri;
@override
int get endOffset => _fragment.endOffset;
@override
String get name => _fragment.name;
@override
int get nameOffset => _fragment.nameOffset;
@override
int get startOffset => _fragment.startOffset;
@override
List<NominalParameterBuilder>? get typeParameters =>
_fragment.typeParameters?.builders;
@override
bool get isMixinDeclaration => false;
@override
TypeBuilder? get supertype => _fragment.supertype;
@override
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
@override
List<TypeBuilder>? get interfaces => _fragment.interfaces;
@override
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression}) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, _fragment.typeParameterScope);
}
}
}
@override
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder) {
for (ConstructorReferenceBuilder ref in _fragment.constructorReferences) {
ref.resolveIn(bodyScope, libraryBuilder);
}
return _fragment.constructorReferences.length;
}
}
class EnumDeclaration implements ClassDeclaration {
final EnumFragment _fragment;
@override
final TypeBuilder supertype;
EnumDeclaration(this._fragment, this.supertype);
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
LookupScope get compilationUnitScope => _fragment.enclosingScope;
@override
LookupScope get bodyScope => _fragment.bodyScope;
@override
Uri get fileUri => _fragment.fileUri;
@override
int get endOffset => _fragment.endOffset;
@override
String get name => _fragment.name;
@override
int get nameOffset => _fragment.nameOffset;
@override
int get startOffset => _fragment.startOffset;
@override
List<NominalParameterBuilder>? get typeParameters =>
_fragment.typeParameters?.builders;
@override
bool get isMixinDeclaration => false;
@override
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
@override
List<TypeBuilder>? get interfaces => _fragment.interfaces;
@override
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression}) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, _fragment.typeParameterScope);
}
}
}
@override
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder) {
for (ConstructorReferenceBuilder ref in _fragment.constructorReferences) {
ref.resolveIn(bodyScope, libraryBuilder);
}
return _fragment.constructorReferences.length;
}
}
class NamedMixinApplication implements ClassDeclaration {
final NamedMixinApplicationFragment _fragment;
@override
final List<TypeBuilder> mixedInTypes;
NamedMixinApplication(this._fragment, this.mixedInTypes);
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
LookupScope get compilationUnitScope => _fragment.enclosingScope;
@override
// Coverage-ignore(suite): Not run.
LookupScope get bodyScope => compilationUnitScope;
@override
Uri get fileUri => _fragment.fileUri;
@override
int get endOffset => _fragment.endOffset;
@override
String get name => _fragment.name;
@override
int get nameOffset => _fragment.nameOffset;
@override
int get startOffset => _fragment.startOffset;
@override
List<NominalParameterBuilder>? get typeParameters =>
_fragment.typeParameters?.builders;
@override
bool get isMixinDeclaration => false;
@override
TypeBuilder? get supertype => _fragment.supertype;
@override
List<TypeBuilder>? get interfaces => _fragment.interfaces;
@override
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression}) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, _fragment.typeParameterScope);
}
}
}
@override
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder) {
return 0;
}
}
class AnonymousMixinApplication implements ClassDeclaration {
@override
final String name;
@override
final LookupScope compilationUnitScope;
@override
final int nameOffset;
@override
final int startOffset;
@override
final int endOffset;
@override
final Uri fileUri;
@override
final List<NominalParameterBuilder>? typeParameters;
@override
final TypeBuilder? supertype;
@override
bool get isMixinDeclaration => false;
@override
List<TypeBuilder>? get mixedInTypes => null;
@override
final List<TypeBuilder>? interfaces;
AnonymousMixinApplication(
{required this.name,
required this.compilationUnitScope,
required this.fileUri,
required this.nameOffset,
required this.startOffset,
required this.endOffset,
required this.typeParameters,
required this.supertype,
required this.interfaces});
@override
// Coverage-ignore(suite): Not run.
LookupScope get bodyScope => compilationUnitScope;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => null;
@override
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression}) {}
@override
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder) {
return 0;
}
}
class MixinDeclaration implements ClassDeclaration {
final MixinFragment _fragment;
MixinDeclaration(this._fragment);
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
LookupScope get compilationUnitScope => _fragment.enclosingScope;
@override
// Coverage-ignore(suite): Not run.
LookupScope get bodyScope => _fragment.bodyScope;
@override
Uri get fileUri => _fragment.fileUri;
@override
int get endOffset => _fragment.endOffset;
@override
String get name => _fragment.name;
@override
int get nameOffset => _fragment.nameOffset;
@override
int get startOffset => _fragment.startOffset;
@override
List<NominalParameterBuilder>? get typeParameters =>
_fragment.typeParameters?.builders;
@override
bool get isMixinDeclaration => true;
@override
TypeBuilder? get supertype => _fragment.supertype;
@override
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
@override
List<TypeBuilder>? get interfaces => _fragment.interfaces;
@override
void buildOutlineExpressions(
{required Annotatable annotatable,
required SourceLibraryBuilder libraryBuilder,
required ClassHierarchy classHierarchy,
required BodyBuilderContext bodyBuilderContext,
required bool createFileUriExpression}) {
MetadataBuilder.buildAnnotations(
annotatable,
_fragment.metadata,
bodyBuilderContext,
libraryBuilder,
_fragment.fileUri,
_fragment.enclosingScope,
createFileUriExpression: createFileUriExpression);
if (typeParameters != null) {
for (int i = 0; i < typeParameters!.length; i++) {
typeParameters![i].buildOutlineExpressions(libraryBuilder,
bodyBuilderContext, classHierarchy, _fragment.typeParameterScope);
}
}
}
@override
int resolveConstructorReferences(SourceLibraryBuilder libraryBuilder) {
for (ConstructorReferenceBuilder ref in _fragment.constructorReferences) {
// Coverage-ignore-block(suite): Not run.
ref.resolveIn(bodyScope, libraryBuilder);
}
return _fragment.constructorReferences.length;
}
}