OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library fasta.kernel_class_builder; | 5 library fasta.kernel_class_builder; |
6 | 6 |
7 import 'package:kernel/ast.dart' | 7 import 'package:kernel/ast.dart' |
8 show | 8 show |
9 Class, | 9 Class, |
10 Constructor, | 10 Constructor, |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 import 'kernel_builder.dart' | 36 import 'kernel_builder.dart' |
37 show | 37 show |
38 Builder, | 38 Builder, |
39 ClassBuilder, | 39 ClassBuilder, |
40 ConstructorReferenceBuilder, | 40 ConstructorReferenceBuilder, |
41 KernelLibraryBuilder, | 41 KernelLibraryBuilder, |
42 KernelProcedureBuilder, | 42 KernelProcedureBuilder, |
43 KernelTypeBuilder, | 43 KernelTypeBuilder, |
44 LibraryBuilder, | 44 LibraryBuilder, |
| 45 MemberBuilder, |
45 MetadataBuilder, | 46 MetadataBuilder, |
46 ProcedureBuilder, | 47 ProcedureBuilder, |
| 48 Scope, |
47 TypeVariableBuilder, | 49 TypeVariableBuilder, |
48 computeDefaultTypeArguments; | 50 computeDefaultTypeArguments; |
49 | 51 |
50 import 'redirecting_factory_body.dart' show RedirectingFactoryBody; | 52 import 'redirecting_factory_body.dart' show RedirectingFactoryBody; |
51 | 53 |
52 abstract class KernelClassBuilder | 54 abstract class KernelClassBuilder |
53 extends ClassBuilder<KernelTypeBuilder, InterfaceType> { | 55 extends ClassBuilder<KernelTypeBuilder, InterfaceType> { |
54 KernelClassBuilder( | 56 KernelClassBuilder( |
55 List<MetadataBuilder> metadata, | 57 List<MetadataBuilder> metadata, |
56 int modifiers, | 58 int modifiers, |
57 String name, | 59 String name, |
58 List<TypeVariableBuilder> typeVariables, | 60 List<TypeVariableBuilder> typeVariables, |
59 KernelTypeBuilder supertype, | 61 KernelTypeBuilder supertype, |
60 List<KernelTypeBuilder> interfaces, | 62 List<KernelTypeBuilder> interfaces, |
61 Map<String, Builder> members, | 63 Scope scope, |
| 64 Scope constructors, |
62 LibraryBuilder parent, | 65 LibraryBuilder parent, |
63 int charOffset) | 66 int charOffset) |
64 : super(metadata, modifiers, name, typeVariables, supertype, interfaces, | 67 : super(metadata, modifiers, name, typeVariables, supertype, interfaces, |
65 members, parent, charOffset); | 68 scope, constructors, parent, charOffset); |
66 | 69 |
67 Class get cls; | 70 Class get cls; |
68 | 71 |
69 Class get target => cls; | 72 Class get target => cls; |
70 | 73 |
71 /// [arguments] have already been built. | 74 /// [arguments] have already been built. |
72 InterfaceType buildTypesWithBuiltArguments( | 75 InterfaceType buildTypesWithBuiltArguments( |
73 LibraryBuilder library, List<DartType> arguments) { | 76 LibraryBuilder library, List<DartType> arguments) { |
74 assert(arguments == null || cls.typeParameters.length == arguments.length); | 77 assert(arguments == null || cls.typeParameters.length == arguments.length); |
75 return arguments == null ? cls.rawType : new InterfaceType(cls, arguments); | 78 return arguments == null ? cls.rawType : new InterfaceType(cls, arguments); |
(...skipping 28 matching lines...) Expand all Loading... |
104 return new Supertype(cls, buildTypeArguments(library, arguments)); | 107 return new Supertype(cls, buildTypeArguments(library, arguments)); |
105 } else { | 108 } else { |
106 return cls.asRawSupertype; | 109 return cls.asRawSupertype; |
107 } | 110 } |
108 } | 111 } |
109 | 112 |
110 @override | 113 @override |
111 int resolveConstructors(LibraryBuilder library) { | 114 int resolveConstructors(LibraryBuilder library) { |
112 int count = super.resolveConstructors(library); | 115 int count = super.resolveConstructors(library); |
113 if (count != 0) { | 116 if (count != 0) { |
| 117 Map<String, MemberBuilder> constructors = this.constructors.local; |
114 // Copy keys to avoid concurrent modification error. | 118 // Copy keys to avoid concurrent modification error. |
115 List<String> names = members.keys.toList(); | 119 List<String> names = constructors.keys.toList(); |
116 for (String name in names) { | 120 for (String name in names) { |
117 Builder builder = members[name]; | 121 Builder builder = constructors[name]; |
118 if (builder is KernelProcedureBuilder && builder.isFactory) { | 122 if (builder is KernelProcedureBuilder && builder.isFactory) { |
119 // Compute the immediate redirection target, not the effective. | 123 // Compute the immediate redirection target, not the effective. |
120 ConstructorReferenceBuilder redirectionTarget = | 124 ConstructorReferenceBuilder redirectionTarget = |
121 builder.redirectionTarget; | 125 builder.redirectionTarget; |
122 if (redirectionTarget != null) { | 126 if (redirectionTarget != null) { |
123 assert(builder.actualBody == null); | 127 assert(builder.actualBody == null); |
124 Builder targetBuilder = redirectionTarget.target; | 128 Builder targetBuilder = redirectionTarget.target; |
125 addRedirectingConstructor(builder, library); | 129 addRedirectingConstructor(builder, library); |
126 if (targetBuilder is ProcedureBuilder) { | 130 if (targetBuilder is ProcedureBuilder) { |
127 Member target = targetBuilder.target; | 131 Member target = targetBuilder.target; |
(...skipping 24 matching lines...) Expand all Loading... |
152 // | 156 // |
153 // The synthetic field looks like this: | 157 // The synthetic field looks like this: |
154 // | 158 // |
155 // final _redirecting# = [c1, ..., cn]; | 159 // final _redirecting# = [c1, ..., cn]; |
156 // | 160 // |
157 // Where each c1 ... cn are an instance of [StaticGet] whose target is | 161 // Where each c1 ... cn are an instance of [StaticGet] whose target is |
158 // [constructor.target]. | 162 // [constructor.target]. |
159 // | 163 // |
160 // TODO(ahe): Generate the correct factory body instead. | 164 // TODO(ahe): Generate the correct factory body instead. |
161 DillMemberBuilder constructorsField = | 165 DillMemberBuilder constructorsField = |
162 members.putIfAbsent("_redirecting#", () { | 166 scope.local.putIfAbsent("_redirecting#", () { |
163 ListLiteral literal = new ListLiteral(<Expression>[]); | 167 ListLiteral literal = new ListLiteral(<Expression>[]); |
164 Name name = new Name("_redirecting#", library.library); | 168 Name name = new Name("_redirecting#", library.library); |
165 Field field = new Field(name, | 169 Field field = new Field(name, |
166 isStatic: true, initializer: literal, fileUri: cls.fileUri) | 170 isStatic: true, initializer: literal, fileUri: cls.fileUri) |
167 ..fileOffset = cls.fileOffset; | 171 ..fileOffset = cls.fileOffset; |
168 cls.addMember(field); | 172 cls.addMember(field); |
169 return new DillMemberBuilder(field, this); | 173 return new DillMemberBuilder(field, this); |
170 }); | 174 }); |
171 Field field = constructorsField.target; | 175 Field field = constructorsField.target; |
172 ListLiteral literal = field.initializer; | 176 ListLiteral literal = field.initializer; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 "The method '$name::${declaredMember.name.name}' doesn't have " | 266 "The method '$name::${declaredMember.name.name}' doesn't have " |
263 "the named parameter '${interfaceNamedParameters.current.name}' " | 267 "the named parameter '${interfaceNamedParameters.current.name}' " |
264 "of overriden method '${interfaceMember.enclosingClass.name}::" | 268 "of overriden method '${interfaceMember.enclosingClass.name}::" |
265 "${interfaceMember.name.name}'."); | 269 "${interfaceMember.name.name}'."); |
266 break outer; | 270 break outer; |
267 } | 271 } |
268 } | 272 } |
269 } | 273 } |
270 } | 274 } |
271 } | 275 } |
OLD | NEW |