blob: e41d72bb2b866a74d09b127642b68c79d70d07e1 [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.kernel_interface_type_builder;
import 'package:kernel/ast.dart' show DartType, DynamicType, Supertype;
import '../messages.dart' show templateTypeNotFound, warning;
import 'kernel_builder.dart'
show
KernelClassBuilder,
KernelInvalidTypeBuilder,
KernelTypeBuilder,
LibraryBuilder,
NamedTypeBuilder,
TypeBuilder,
TypeVariableBuilder;
class KernelNamedTypeBuilder
extends NamedTypeBuilder<KernelTypeBuilder, DartType>
implements KernelTypeBuilder {
KernelNamedTypeBuilder(String name, List<KernelTypeBuilder> arguments,
int charOffset, Uri fileUri)
: super(name, arguments, charOffset, fileUri);
KernelInvalidTypeBuilder buildInvalidType(String name) {
// TODO(ahe): Record error instead of printing.
warning(templateTypeNotFound.withArguments(name), charOffset, fileUri);
return new KernelInvalidTypeBuilder(name, charOffset, fileUri);
}
DartType handleMissingType() {
// TODO(ahe): Record error instead of printing.
warning(templateTypeNotFound.withArguments(name), charOffset, fileUri);
return const DynamicType();
}
Supertype handleMissingSupertype() {
warning(templateTypeNotFound.withArguments(name), charOffset, fileUri);
return null;
}
Supertype handleInvalidSupertype(LibraryBuilder library) {
String message = builder.isTypeVariable
? "The type variable '$name' can't be used as supertype."
: "The type '$name' can't be used as supertype.";
library.deprecated_addCompileTimeError(charOffset, message,
fileUri: fileUri);
return null;
}
DartType build(LibraryBuilder library) {
if (builder == null) return handleMissingType();
return builder.buildType(library, arguments);
}
Supertype buildSupertype(LibraryBuilder library) {
if (builder == null) return handleMissingSupertype();
if (builder is KernelClassBuilder) {
KernelClassBuilder builder = this.builder;
return builder.buildSupertype(library, arguments);
} else {
return handleInvalidSupertype(library);
}
}
TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
TypeBuilder result = substitution[builder];
if (result != null) {
assert(builder is TypeVariableBuilder);
return result;
} else if (arguments != null) {
List<KernelTypeBuilder> arguments;
int i = 0;
for (KernelTypeBuilder argument in this.arguments) {
KernelTypeBuilder type = argument.subst(substitution);
if (type != argument) {
arguments ??= this.arguments.toList();
arguments[i] = type;
}
i++;
}
if (arguments != null) {
return new KernelNamedTypeBuilder(name, arguments, charOffset, fileUri)
..builder = builder;
}
}
return this;
}
}