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:
Peter von der Ahé 2018-06-12 13:50:19 +00:00 committed by commit-bot@chromium.org
parent c8134f372e
commit 2c72215203
6 changed files with 37 additions and 61 deletions

View file

@ -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;

View file

@ -225,7 +225,5 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
library.addProblem(message, charOffset, length, fileUri, context: context);
}
int get typeVariablesCount;
void prepareTopLevelInference() {}
}

View file

@ -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) {

View file

@ -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.

View file

@ -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;
}

View file

@ -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);
}