mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 11:11:05 +00:00
Move typeVariablesCount to TypeDeclarationBuilder
Also move checks and normalization to the wrapped builder. Change-Id: Ica8da07bf9191b997b8e00ed0af8cc70a93f9216 Reviewed-on: https://dart-review.googlesource.com/59044 Commit-Queue: Peter von der Ahé <ahe@google.com> Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
parent
c8134f372e
commit
2c72215203
|
@ -6,7 +6,7 @@ library fasta.builtin_type_builder;
|
|||
|
||||
import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeDeclarationBuilder;
|
||||
|
||||
class BuiltinTypeBuilder<T extends TypeBuilder, R>
|
||||
abstract class BuiltinTypeBuilder<T extends TypeBuilder, R>
|
||||
extends TypeDeclarationBuilder<T, R> {
|
||||
final R type;
|
||||
|
||||
|
|
|
@ -225,7 +225,5 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
|
|||
library.addProblem(message, charOffset, length, fileUri, context: context);
|
||||
}
|
||||
|
||||
int get typeVariablesCount;
|
||||
|
||||
void prepareTopLevelInference() {}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
library fasta.named_type_builder;
|
||||
|
||||
import '../fasta_codes.dart' show Message;
|
||||
import '../fasta_codes.dart' show Message, templateTypeArgumentMismatch;
|
||||
|
||||
import 'builder.dart'
|
||||
show
|
||||
|
@ -53,6 +53,27 @@ abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
|
|||
declaration = buildInvalidType(charOffset, fileUri);
|
||||
}
|
||||
|
||||
@override
|
||||
void check(int charOffset, Uri fileUri) {
|
||||
if (arguments != null &&
|
||||
arguments.length != declaration.typeVariablesCount) {
|
||||
declaration = buildInvalidType(
|
||||
charOffset,
|
||||
fileUri,
|
||||
templateTypeArgumentMismatch.withArguments(
|
||||
name, declaration.typeVariablesCount));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void normalize(int charOffset, Uri fileUri) {
|
||||
if (arguments != null &&
|
||||
arguments.length != declaration.typeVariablesCount) {
|
||||
// [arguments] will be normalized later if they are null.
|
||||
arguments = null;
|
||||
}
|
||||
}
|
||||
|
||||
String get debugName => "NamedTypeBuilder";
|
||||
|
||||
StringBuffer printOn(StringBuffer buffer) {
|
||||
|
|
|
@ -12,6 +12,12 @@ abstract class TypeBuilder {
|
|||
|
||||
void resolveIn(Scope scope, int charOffset, Uri fileUri) {}
|
||||
|
||||
/// See `UnresolvedType.checkType`.
|
||||
void check(int charOffset, Uri fileUri) {}
|
||||
|
||||
/// See `UnresolvedType.normalizeType`.
|
||||
void normalize(int charOffset, Uri fileUri) {}
|
||||
|
||||
void bind(TypeDeclarationBuilder builder) {}
|
||||
|
||||
/// May return null, for example, for mixin applications.
|
||||
|
|
|
@ -31,11 +31,13 @@ abstract class TypeDeclarationBuilder<T extends TypeBuilder, R>
|
|||
|
||||
bool get isMixinApplication => false;
|
||||
|
||||
@override
|
||||
String get fullNameForErrors => name;
|
||||
|
||||
int get typeVariablesCount => 0;
|
||||
|
||||
R buildType(LibraryBuilder library, List<T> arguments);
|
||||
|
||||
/// [arguments] have already been built.
|
||||
R buildTypesWithBuiltArguments(LibraryBuilder library, List<R> arguments);
|
||||
|
||||
@override
|
||||
String get fullNameForErrors => name;
|
||||
}
|
||||
|
|
|
@ -4,16 +4,7 @@
|
|||
|
||||
library fasta.unresolved_type;
|
||||
|
||||
import '../fasta_codes.dart' show templateTypeArgumentMismatch;
|
||||
|
||||
import 'builder.dart'
|
||||
show
|
||||
ClassBuilder,
|
||||
FunctionTypeAliasBuilder,
|
||||
NamedTypeBuilder,
|
||||
Scope,
|
||||
TypeBuilder,
|
||||
TypeDeclarationBuilder;
|
||||
import 'builder.dart' show Scope, TypeBuilder;
|
||||
|
||||
/// A wrapper around a type that is yet to be resolved.
|
||||
class UnresolvedType<T extends TypeBuilder> {
|
||||
|
@ -26,50 +17,8 @@ class UnresolvedType<T extends TypeBuilder> {
|
|||
void resolveIn(Scope scope) => builder.resolveIn(scope, charOffset, fileUri);
|
||||
|
||||
/// Performs checks on the type after it's resolved.
|
||||
void checkType() {
|
||||
TypeBuilder resolvedType = builder;
|
||||
if (resolvedType is NamedTypeBuilder) {
|
||||
TypeDeclarationBuilder declaration = resolvedType.declaration;
|
||||
if (declaration is ClassBuilder) {
|
||||
if (resolvedType.arguments != null &&
|
||||
resolvedType.arguments.length != declaration.typeVariablesCount) {
|
||||
resolvedType.declaration = resolvedType.buildInvalidType(
|
||||
charOffset,
|
||||
fileUri,
|
||||
templateTypeArgumentMismatch.withArguments(
|
||||
resolvedType.name, declaration.typeVariablesCount));
|
||||
}
|
||||
} else if (declaration is FunctionTypeAliasBuilder) {
|
||||
if (resolvedType.arguments != null &&
|
||||
resolvedType.arguments.length != declaration.typeVariablesCount) {
|
||||
resolvedType.declaration = resolvedType.buildInvalidType(
|
||||
charOffset,
|
||||
fileUri,
|
||||
templateTypeArgumentMismatch.withArguments(
|
||||
resolvedType.name, declaration.typeVariablesCount));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void checkType() => builder.check(charOffset, fileUri);
|
||||
|
||||
/// Normalizes the type arguments in accordance with Dart 1 semantics.
|
||||
void normalizeType() {
|
||||
TypeBuilder resolvedType = builder;
|
||||
if (resolvedType is NamedTypeBuilder) {
|
||||
TypeDeclarationBuilder declaration = resolvedType.declaration;
|
||||
if (declaration is ClassBuilder) {
|
||||
if (resolvedType.arguments != null &&
|
||||
resolvedType.arguments.length != declaration.typeVariablesCount) {
|
||||
// [resolveType.arguments] will be normalized later if they are null.
|
||||
resolvedType.arguments = null;
|
||||
}
|
||||
} else if (declaration is FunctionTypeAliasBuilder) {
|
||||
if (resolvedType.arguments != null &&
|
||||
resolvedType.arguments.length != declaration.typeVariablesCount) {
|
||||
// [resolveType.arguments] will be normalized later if they are null.
|
||||
resolvedType.arguments = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void normalizeType() => builder.normalize(charOffset, fileUri);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue