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 27 matching lines...) Expand all Loading... |
103 if (arguments != null) { | 106 if (arguments != null) { |
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 int resolveConstructors(KernelLibraryBuilder library) { | 113 int resolveConstructors(KernelLibraryBuilder library) { |
111 int count = super.resolveConstructors(library); | 114 int count = super.resolveConstructors(library); |
112 if (count != 0) { | 115 if (count != 0) { |
| 116 Map<String, MemberBuilder> constructors = this.constructors.local; |
113 // Copy keys to avoid concurrent modification error. | 117 // Copy keys to avoid concurrent modification error. |
114 List<String> names = members.keys.toList(); | 118 List<String> names = constructors.keys.toList(); |
115 for (String name in names) { | 119 for (String name in names) { |
116 Builder builder = members[name]; | 120 Builder builder = constructors[name]; |
117 if (builder is KernelProcedureBuilder && builder.isFactory) { | 121 if (builder is KernelProcedureBuilder && builder.isFactory) { |
118 // Compute the immediate redirection target, not the effective. | 122 // Compute the immediate redirection target, not the effective. |
119 ConstructorReferenceBuilder redirectionTarget = | 123 ConstructorReferenceBuilder redirectionTarget = |
120 builder.redirectionTarget; | 124 builder.redirectionTarget; |
121 if (redirectionTarget != null) { | 125 if (redirectionTarget != null) { |
122 assert(builder.actualBody == null); | 126 assert(builder.actualBody == null); |
123 Builder targetBuilder = redirectionTarget.target; | 127 Builder targetBuilder = redirectionTarget.target; |
124 addRedirectingConstructor(builder, library); | 128 addRedirectingConstructor(builder, library); |
125 if (targetBuilder is ProcedureBuilder) { | 129 if (targetBuilder is ProcedureBuilder) { |
126 Member target = targetBuilder.target; | 130 Member target = targetBuilder.target; |
(...skipping 24 matching lines...) Expand all Loading... |
151 // | 155 // |
152 // The synthetic field looks like this: | 156 // The synthetic field looks like this: |
153 // | 157 // |
154 // final _redirecting# = [c1, ..., cn]; | 158 // final _redirecting# = [c1, ..., cn]; |
155 // | 159 // |
156 // Where each c1 ... cn are an instance of [StaticGet] whose target is | 160 // Where each c1 ... cn are an instance of [StaticGet] whose target is |
157 // [constructor.target]. | 161 // [constructor.target]. |
158 // | 162 // |
159 // TODO(ahe): Generate the correct factory body instead. | 163 // TODO(ahe): Generate the correct factory body instead. |
160 DillMemberBuilder constructorsField = | 164 DillMemberBuilder constructorsField = |
161 members.putIfAbsent("_redirecting#", () { | 165 scope.local.putIfAbsent("_redirecting#", () { |
162 ListLiteral literal = new ListLiteral(<Expression>[]); | 166 ListLiteral literal = new ListLiteral(<Expression>[]); |
163 Name name = new Name("_redirecting#", library.library); | 167 Name name = new Name("_redirecting#", library.library); |
164 Field field = new Field(name, | 168 Field field = new Field(name, |
165 isStatic: true, | 169 isStatic: true, |
166 initializer: literal, | 170 initializer: literal, |
167 fileUri: cls.fileUri)..fileOffset = cls.fileOffset; | 171 fileUri: cls.fileUri)..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; |
(...skipping 90 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 |