OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library fasta.kernel_class_builder; |
| 6 |
| 7 import 'package:kernel/ast.dart' show |
| 8 Class, |
| 9 DartType, |
| 10 ExpressionStatement, |
| 11 InterfaceType, |
| 12 Member, |
| 13 StringLiteral, |
| 14 Supertype, |
| 15 Throw; |
| 16 |
| 17 import '../errors.dart' show |
| 18 internalError; |
| 19 |
| 20 import 'kernel_builder.dart' show |
| 21 Builder, |
| 22 ClassBuilder, |
| 23 ConstructorReferenceBuilder, |
| 24 KernelProcedureBuilder, |
| 25 KernelTypeBuilder, |
| 26 LibraryBuilder, |
| 27 MetadataBuilder, |
| 28 ProcedureBuilder, |
| 29 TypeVariableBuilder, |
| 30 computeDefaultTypeArguments; |
| 31 |
| 32 import 'redirecting_factory_body.dart' show |
| 33 RedirectingFactoryBody; |
| 34 |
| 35 abstract class KernelClassBuilder |
| 36 extends ClassBuilder<KernelTypeBuilder, InterfaceType> { |
| 37 KernelClassBuilder( |
| 38 List<MetadataBuilder> metadata, int modifiers, |
| 39 String name, List<TypeVariableBuilder> typeVariables, |
| 40 KernelTypeBuilder supertype, List<KernelTypeBuilder> interfaces, |
| 41 Map<String, Builder> members, List<KernelTypeBuilder> types, |
| 42 LibraryBuilder parent) |
| 43 : super(metadata, modifiers, name, typeVariables, supertype, interfaces, |
| 44 members, types, parent); |
| 45 |
| 46 Class get cls; |
| 47 |
| 48 Class get target => cls; |
| 49 |
| 50 /// [arguments] have already been built. |
| 51 InterfaceType buildTypesWithBuiltArguments(List<DartType> arguments) { |
| 52 return arguments == null |
| 53 ? cls.rawType |
| 54 : new InterfaceType(cls, |
| 55 // TODO(ahe): Not sure what to do if `arguments.length != |
| 56 // cls.typeParameters.length`. |
| 57 computeDefaultTypeArguments(cls.typeParameters, arguments)); |
| 58 } |
| 59 |
| 60 InterfaceType buildType(List<KernelTypeBuilder> arguments) { |
| 61 List<DartType> typeArguments; |
| 62 if (arguments != null) { |
| 63 typeArguments = <DartType>[]; |
| 64 for (KernelTypeBuilder builder in arguments) { |
| 65 DartType type = builder.build(); |
| 66 if (type == null) { |
| 67 internalError("Bad type: ${builder.runtimeType}"); |
| 68 } |
| 69 typeArguments.add(type); |
| 70 } |
| 71 } |
| 72 return buildTypesWithBuiltArguments(typeArguments); |
| 73 } |
| 74 |
| 75 Supertype buildSupertype(List<KernelTypeBuilder> arguments) { |
| 76 List<DartType> typeArguments; |
| 77 if (arguments != null) { |
| 78 typeArguments = <DartType>[]; |
| 79 for (KernelTypeBuilder builder in arguments) { |
| 80 DartType type = builder.build(); |
| 81 if (type == null) { |
| 82 internalError("Bad type: ${builder.runtimeType}"); |
| 83 } |
| 84 typeArguments.add(type); |
| 85 } |
| 86 return new Supertype(cls, typeArguments); |
| 87 } else { |
| 88 return cls.asRawSupertype; |
| 89 } |
| 90 } |
| 91 |
| 92 int resolveConstructors(LibraryBuilder library) { |
| 93 int count = super.resolveConstructors(library); |
| 94 if (count != 0) { |
| 95 members.forEach((String name, Builder builder) { |
| 96 if (builder is KernelProcedureBuilder && builder.isFactory) { |
| 97 // Compute the immediate redirection target, not the effective. |
| 98 ConstructorReferenceBuilder redirectionTarget = |
| 99 builder.redirectionTarget; |
| 100 if (redirectionTarget != null) { |
| 101 assert(builder.actualBody == null); |
| 102 Builder targetBuilder = redirectionTarget.target; |
| 103 if (targetBuilder is ProcedureBuilder) { |
| 104 Member target = targetBuilder.target; |
| 105 builder.body = new RedirectingFactoryBody(target); |
| 106 } else { |
| 107 // TODO(ahe): Throw NSM error. This requires access to core |
| 108 // types. |
| 109 String message = |
| 110 "Missing constructor: ${redirectionTarget.fullNameForErrors}"; |
| 111 print(message); |
| 112 builder.body = new ExpressionStatement( |
| 113 new Throw(new StringLiteral(message))); |
| 114 } |
| 115 } |
| 116 } |
| 117 }); |
| 118 } |
| 119 return count; |
| 120 } |
| 121 } |
OLD | NEW |