| Index: pkg/fasta/lib/src/kernel/kernel_class_builder.dart
|
| diff --git a/pkg/fasta/lib/src/kernel/kernel_class_builder.dart b/pkg/fasta/lib/src/kernel/kernel_class_builder.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8240de74216fe90478169078fb7bb248809eb087
|
| --- /dev/null
|
| +++ b/pkg/fasta/lib/src/kernel/kernel_class_builder.dart
|
| @@ -0,0 +1,121 @@
|
| +// 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_class_builder;
|
| +
|
| +import 'package:kernel/ast.dart' show
|
| + Class,
|
| + DartType,
|
| + ExpressionStatement,
|
| + InterfaceType,
|
| + Member,
|
| + StringLiteral,
|
| + Supertype,
|
| + Throw;
|
| +
|
| +import '../errors.dart' show
|
| + internalError;
|
| +
|
| +import 'kernel_builder.dart' show
|
| + Builder,
|
| + ClassBuilder,
|
| + ConstructorReferenceBuilder,
|
| + KernelProcedureBuilder,
|
| + KernelTypeBuilder,
|
| + LibraryBuilder,
|
| + MetadataBuilder,
|
| + ProcedureBuilder,
|
| + TypeVariableBuilder,
|
| + computeDefaultTypeArguments;
|
| +
|
| +import 'redirecting_factory_body.dart' show
|
| + RedirectingFactoryBody;
|
| +
|
| +abstract class KernelClassBuilder
|
| + extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
|
| + KernelClassBuilder(
|
| + List<MetadataBuilder> metadata, int modifiers,
|
| + String name, List<TypeVariableBuilder> typeVariables,
|
| + KernelTypeBuilder supertype, List<KernelTypeBuilder> interfaces,
|
| + Map<String, Builder> members, List<KernelTypeBuilder> types,
|
| + LibraryBuilder parent)
|
| + : super(metadata, modifiers, name, typeVariables, supertype, interfaces,
|
| + members, types, parent);
|
| +
|
| + Class get cls;
|
| +
|
| + Class get target => cls;
|
| +
|
| + /// [arguments] have already been built.
|
| + InterfaceType buildTypesWithBuiltArguments(List<DartType> arguments) {
|
| + return arguments == null
|
| + ? cls.rawType
|
| + : new InterfaceType(cls,
|
| + // TODO(ahe): Not sure what to do if `arguments.length !=
|
| + // cls.typeParameters.length`.
|
| + computeDefaultTypeArguments(cls.typeParameters, arguments));
|
| + }
|
| +
|
| + InterfaceType buildType(List<KernelTypeBuilder> arguments) {
|
| + List<DartType> typeArguments;
|
| + if (arguments != null) {
|
| + typeArguments = <DartType>[];
|
| + for (KernelTypeBuilder builder in arguments) {
|
| + DartType type = builder.build();
|
| + if (type == null) {
|
| + internalError("Bad type: ${builder.runtimeType}");
|
| + }
|
| + typeArguments.add(type);
|
| + }
|
| + }
|
| + return buildTypesWithBuiltArguments(typeArguments);
|
| + }
|
| +
|
| + Supertype buildSupertype(List<KernelTypeBuilder> arguments) {
|
| + List<DartType> typeArguments;
|
| + if (arguments != null) {
|
| + typeArguments = <DartType>[];
|
| + for (KernelTypeBuilder builder in arguments) {
|
| + DartType type = builder.build();
|
| + if (type == null) {
|
| + internalError("Bad type: ${builder.runtimeType}");
|
| + }
|
| + typeArguments.add(type);
|
| + }
|
| + return new Supertype(cls, typeArguments);
|
| + } else {
|
| + return cls.asRawSupertype;
|
| + }
|
| + }
|
| +
|
| + int resolveConstructors(LibraryBuilder library) {
|
| + int count = super.resolveConstructors(library);
|
| + if (count != 0) {
|
| + members.forEach((String name, Builder builder) {
|
| + if (builder is KernelProcedureBuilder && builder.isFactory) {
|
| + // Compute the immediate redirection target, not the effective.
|
| + ConstructorReferenceBuilder redirectionTarget =
|
| + builder.redirectionTarget;
|
| + if (redirectionTarget != null) {
|
| + assert(builder.actualBody == null);
|
| + Builder targetBuilder = redirectionTarget.target;
|
| + if (targetBuilder is ProcedureBuilder) {
|
| + Member target = targetBuilder.target;
|
| + builder.body = new RedirectingFactoryBody(target);
|
| + } else {
|
| + // TODO(ahe): Throw NSM error. This requires access to core
|
| + // types.
|
| + String message =
|
| + "Missing constructor: ${redirectionTarget.fullNameForErrors}";
|
| + print(message);
|
| + builder.body = new ExpressionStatement(
|
| + new Throw(new StringLiteral(message)));
|
| + }
|
| + }
|
| + }
|
| + });
|
| + }
|
| + return count;
|
| + }
|
| +}
|
|
|