blob: ef75ed9ad6fa069c1c2f7bd15a702bf5a3a8a706 [file] [log] [blame]
// Copyright (c) 2017, 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.unresolved_type;
import '../fasta_codes.dart' show templateTypeArgumentMismatch;
import 'builder.dart'
show
ClassBuilder,
FunctionTypeAliasBuilder,
NamedTypeBuilder,
Scope,
TypeBuilder,
TypeDeclarationBuilder;
/// A wrapper around a type that is yet to be resolved.
class UnresolvedType<T extends TypeBuilder> {
final T builder;
final int charOffset;
final Uri fileUri;
UnresolvedType(this.builder, this.charOffset, this.fileUri);
void resolveIn(Scope scope) => builder.resolveIn(scope, charOffset, fileUri);
/// Performs checks on the type after it's resolved.
void checkType() {
if (builder is NamedTypeBuilder) {
NamedTypeBuilder resolvedType = builder as NamedTypeBuilder;
TypeDeclarationBuilder declaration = resolvedType.builder;
if (declaration is ClassBuilder) {
if (resolvedType.arguments != null &&
resolvedType.arguments.length != declaration.typeVariablesCount) {
resolvedType.builder = 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.builder = resolvedType.buildInvalidType(
charOffset,
fileUri,
templateTypeArgumentMismatch.withArguments(
resolvedType.name, "${declaration.typeVariablesCount}"));
}
}
}
}
}