blob: 1e51ffb8ba41ccf9e8b8e286a339f16b09675b8b [file] [log] [blame]
// Copyright (c) 2016, 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.
library fasta.type_declaration_builder;
import 'package:kernel/ast.dart' show DartType, Nullability;
import 'builder.dart';
import 'library_builder.dart';
import 'metadata_builder.dart';
import 'modifier_builder.dart';
import 'nullability_builder.dart';
import 'type_builder.dart';
abstract class TypeDeclarationBuilder implements ModifierBuilder {
@override
String get name;
bool get isNamedMixinApplication;
void set parent(Builder? value);
List<MetadataBuilder>? get metadata;
int get typeVariablesCount => 0;
@override
TypeDeclarationBuilder get origin;
/// Return `true` if this type declaration is an enum.
bool get isEnum;
/// Creates the [DartType] corresponding to this declaration applied with
/// [arguments] in [library] with the syntactical nullability defined by
/// [nullabilityBuilder].
///
/// For instance, if this declaration is a class declaration `C`, then
/// an occurrence of `C<int>?` in a null safe library `lib1` would call
/// `buildType(<lib1>, <?>, [<int>])` to create `C<int>?`, or `C<int>` in a
/// legacy library `lib2` call `buildType(<lib2>, <> [<int>]` to create
/// `C<int*>*`.
DartType buildType(LibraryBuilder library,
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments);
DartType buildTypeLiteralType(LibraryBuilder library,
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments);
/// [arguments] have already been built.
DartType buildTypeWithBuiltArguments(LibraryBuilder library,
Nullability nullability, List<DartType> arguments);
}
abstract class TypeDeclarationBuilderImpl extends ModifierBuilderImpl
implements TypeDeclarationBuilder {
@override
final List<MetadataBuilder>? metadata;
@override
final int modifiers;
@override
final String name;
TypeDeclarationBuilderImpl(
this.metadata, this.modifiers, this.name, Builder? parent, int charOffset)
// ignore: unnecessary_null_comparison
: assert(modifiers != null),
super(parent, charOffset);
@override
TypeDeclarationBuilder get origin => this;
@override
bool get isNamedMixinApplication => false;
@override
bool get isTypeDeclaration => true;
@override
bool get isEnum => false;
@override
String get fullNameForErrors => name;
@override
int get typeVariablesCount => 0;
@override
DartType buildTypeLiteralType(LibraryBuilder library,
NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
return buildType(library, nullabilityBuilder, arguments);
}
}