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_target; | 5 library fasta.kernel_target; |
6 | 6 |
7 import 'dart:async' show Future; | 7 import 'dart:async' show Future; |
8 | 8 |
9 import 'dart:io' show File, IOSink; | 9 import 'dart:io' show File, IOSink; |
10 | 10 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 show | 76 show |
77 Builder, | 77 Builder, |
78 ClassBuilder, | 78 ClassBuilder, |
79 InvalidTypeBuilder, | 79 InvalidTypeBuilder, |
80 KernelClassBuilder, | 80 KernelClassBuilder, |
81 KernelLibraryBuilder, | 81 KernelLibraryBuilder, |
82 KernelNamedTypeBuilder, | 82 KernelNamedTypeBuilder, |
83 KernelProcedureBuilder, | 83 KernelProcedureBuilder, |
84 LibraryBuilder, | 84 LibraryBuilder, |
85 MemberBuilder, | 85 MemberBuilder, |
86 MixinApplicationBuilder, | |
87 NamedMixinApplicationBuilder, | |
88 NamedTypeBuilder, | 86 NamedTypeBuilder, |
89 TypeBuilder, | 87 TypeBuilder, |
| 88 TypeDeclarationBuilder, |
90 TypeVariableBuilder; | 89 TypeVariableBuilder; |
91 | 90 |
92 import 'verifier.dart' show verifyProgram; | 91 import 'verifier.dart' show verifyProgram; |
93 | 92 |
94 class KernelTarget extends TargetImplementation { | 93 class KernelTarget extends TargetImplementation { |
95 final bool strongMode; | 94 final bool strongMode; |
96 | 95 |
97 final DillTarget dillTarget; | 96 final DillTarget dillTarget; |
98 | 97 |
99 /// Shared with [CompilerContext]. | 98 /// Shared with [CompilerContext]. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) { | 138 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) { |
140 if (dillTarget.isLoaded) { | 139 if (dillTarget.isLoaded) { |
141 var builder = dillTarget.loader.builders[uri]; | 140 var builder = dillTarget.loader.builders[uri]; |
142 if (builder != null) { | 141 if (builder != null) { |
143 return builder; | 142 return builder; |
144 } | 143 } |
145 } | 144 } |
146 return new KernelLibraryBuilder(uri, fileUri, loader); | 145 return new KernelLibraryBuilder(uri, fileUri, loader); |
147 } | 146 } |
148 | 147 |
| 148 void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) { |
| 149 TypeBuilder supertype = cls.supertype; |
| 150 if (supertype is NamedTypeBuilder) { |
| 151 f(supertype); |
| 152 } else if (supertype != null) { |
| 153 internalError("Unhandled: ${supertype.runtimeType}"); |
| 154 } |
| 155 if (cls.interfaces != null) { |
| 156 for (NamedTypeBuilder t in cls.interfaces) { |
| 157 f(t); |
| 158 } |
| 159 } |
| 160 if (cls.library.loader == loader && |
| 161 // TODO(ahe): Implement DillClassBuilder.mixedInType and remove the |
| 162 // above check. |
| 163 cls.mixedInType != null) { |
| 164 f(cls.mixedInType); |
| 165 } |
| 166 } |
| 167 |
149 void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) { | 168 void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) { |
150 if (cls == null) return; | 169 if (cls == null) return; |
151 TypeBuilder supertype = cls.supertype; | 170 forEachDirectSupertype(cls, (NamedTypeBuilder type) { |
152 add(NamedTypeBuilder type) { | |
153 Builder builder = type.builder; | 171 Builder builder = type.builder; |
154 if (builder is ClassBuilder) { | 172 if (builder is ClassBuilder) { |
155 set.add(builder); | 173 set.add(builder); |
156 } | 174 } |
157 } | 175 }); |
158 | |
159 if (supertype == null) { | |
160 // OK. | |
161 } else if (supertype is MixinApplicationBuilder) { | |
162 add(supertype.supertype); | |
163 for (NamedTypeBuilder t in supertype.mixins) { | |
164 add(t); | |
165 } | |
166 } else if (supertype is NamedTypeBuilder) { | |
167 add(supertype); | |
168 } else { | |
169 internalError("Unhandled: ${supertype.runtimeType}"); | |
170 } | |
171 if (cls.interfaces != null) { | |
172 for (NamedTypeBuilder t in cls.interfaces) { | |
173 add(t); | |
174 } | |
175 } | |
176 } | 176 } |
177 | 177 |
178 List<ClassBuilder> collectAllClasses() { | 178 List<ClassBuilder> collectAllClasses() { |
179 List<ClassBuilder> result = <ClassBuilder>[]; | 179 List<ClassBuilder> result = <ClassBuilder>[]; |
180 loader.builders.forEach((Uri uri, LibraryBuilder library) { | 180 loader.builders.forEach((Uri uri, LibraryBuilder library) { |
181 library.forEach((String name, Builder member) { | 181 library.forEach((String name, Builder member) { |
182 if (member is KernelClassBuilder) { | 182 if (member is KernelClassBuilder) { |
183 result.add(member); | 183 result.add(member); |
184 } | 184 } |
185 }); | 185 }); |
(...skipping 19 matching lines...) Expand all Loading... |
205 | 205 |
206 void breakCycle(ClassBuilder builder) { | 206 void breakCycle(ClassBuilder builder) { |
207 Class cls = builder.target; | 207 Class cls = builder.target; |
208 cls.implementedTypes.clear(); | 208 cls.implementedTypes.clear(); |
209 cls.supertype = null; | 209 cls.supertype = null; |
210 cls.mixedInType = null; | 210 cls.mixedInType = null; |
211 builder.supertype = new KernelNamedTypeBuilder("Object", null, | 211 builder.supertype = new KernelNamedTypeBuilder("Object", null, |
212 builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri)) | 212 builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri)) |
213 ..builder = objectClassBuilder; | 213 ..builder = objectClassBuilder; |
214 builder.interfaces = null; | 214 builder.interfaces = null; |
| 215 builder.mixedInType = null; |
215 } | 216 } |
216 | 217 |
217 Future<Program> handleInputError(Uri uri, InputError error, | 218 Future<Program> handleInputError(Uri uri, InputError error, |
218 {bool isFullProgram}) { | 219 {bool isFullProgram}) { |
219 if (error != null) { | 220 if (error != null) { |
220 String message = error.format(); | 221 String message = error.format(); |
221 print(message); | 222 print(message); |
222 errors.add(message); | 223 errors.add(message); |
223 } | 224 } |
224 program = erroneousProgram(isFullProgram); | 225 program = erroneousProgram(isFullProgram); |
(...skipping 13 matching lines...) Expand all Loading... |
238 loader.computeLibraryScopes(); | 239 loader.computeLibraryScopes(); |
239 loader.resolveTypes(); | 240 loader.resolveTypes(); |
240 loader.checkSemantics(); | 241 loader.checkSemantics(); |
241 loader.buildProgram(); | 242 loader.buildProgram(); |
242 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); | 243 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); |
243 installDefaultSupertypes(); | 244 installDefaultSupertypes(); |
244 installDefaultConstructors(sourceClasses); | 245 installDefaultConstructors(sourceClasses); |
245 loader.resolveConstructors(); | 246 loader.resolveConstructors(); |
246 loader.finishTypeVariables(objectClassBuilder); | 247 loader.finishTypeVariables(objectClassBuilder); |
247 program = link(new List<Library>.from(loader.libraries)); | 248 program = link(new List<Library>.from(loader.libraries)); |
248 dumpIr(); | |
249 loader.computeHierarchy(program); | 249 loader.computeHierarchy(program); |
250 loader.checkOverrides(sourceClasses); | 250 loader.checkOverrides(sourceClasses); |
251 if (uri == null) return program; | 251 if (uri == null) return program; |
252 return await writeLinkedProgram(uri, program, isFullProgram: false); | 252 return await writeLinkedProgram(uri, program, isFullProgram: false); |
253 } on InputError catch (e) { | 253 } on InputError catch (e) { |
254 return handleInputError(uri, e, isFullProgram: false); | 254 return handleInputError(uri, e, isFullProgram: false); |
255 } catch (e, s) { | 255 } catch (e, s) { |
256 return reportCrash(e, s, loader?.currentUriForCrashReporting); | 256 return reportCrash(e, s, loader?.currentUriForCrashReporting); |
257 } | 257 } |
258 } | 258 } |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 } | 438 } |
439 ticker.logMs("Installed default constructors"); | 439 ticker.logMs("Installed default constructors"); |
440 } | 440 } |
441 | 441 |
442 KernelClassBuilder get objectClassBuilder => loader.coreLibrary["Object"]; | 442 KernelClassBuilder get objectClassBuilder => loader.coreLibrary["Object"]; |
443 | 443 |
444 Class get objectClass => objectClassBuilder.cls; | 444 Class get objectClass => objectClassBuilder.cls; |
445 | 445 |
446 /// If [builder] doesn't have a constructors, install the defaults. | 446 /// If [builder] doesn't have a constructors, install the defaults. |
447 void installDefaultConstructor(SourceClassBuilder builder) { | 447 void installDefaultConstructor(SourceClassBuilder builder) { |
448 if (builder.cls.isMixinApplication) { | 448 if (builder.isMixinApplication && !builder.isNamedMixinApplication) return; |
449 // We have to test if builder.cls is a mixin application. [builder] may | |
450 // think it's a mixin application, but if its mixed-in type couldn't be | |
451 // resolved, the target class won't be a mixin application and we need | |
452 // to add a default constructor to complete error recovery. | |
453 return; | |
454 } | |
455 if (builder.constructors.local.isNotEmpty) return; | 449 if (builder.constructors.local.isNotEmpty) return; |
456 | 450 |
457 /// Quotes below are from [Dart Programming Language Specification, 4th | 451 /// Quotes below are from [Dart Programming Language Specification, 4th |
458 /// Edition]( | 452 /// Edition]( |
459 /// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf): | 453 /// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf): |
460 if (builder is NamedMixinApplicationBuilder) { | 454 if (builder.isNamedMixinApplication) { |
461 /// >A mixin application of the form S with M; defines a class C with | 455 /// >A mixin application of the form S with M; defines a class C with |
462 /// >superclass S. | 456 /// >superclass S. |
463 /// >... | 457 /// >... |
464 | 458 |
465 /// >Let LM be the library in which M is declared. For each generative | 459 /// >Let LM be the library in which M is declared. For each generative |
466 /// >constructor named qi(Ti1 ai1, . . . , Tiki aiki), i in 1..n of S | 460 /// >constructor named qi(Ti1 ai1, . . . , Tiki aiki), i in 1..n of S |
467 /// >that is accessible to LM , C has an implicitly declared constructor | 461 /// >that is accessible to LM , C has an implicitly declared constructor |
468 /// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) : | 462 /// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) : |
469 /// >super(ai1,...,aiki);. | 463 /// >super(ai1,...,aiki);. |
470 Builder supertype = builder; | 464 TypeDeclarationBuilder supertype = builder; |
471 while (supertype is NamedMixinApplicationBuilder) { | 465 while (supertype.isMixinApplication) { |
472 NamedMixinApplicationBuilder named = supertype; | 466 SourceClassBuilder named = supertype; |
473 TypeBuilder type = named.mixinApplication; | 467 TypeBuilder type = named.supertype; |
474 if (type is MixinApplicationBuilder) { | |
475 MixinApplicationBuilder t = type; | |
476 type = t.supertype; | |
477 } | |
478 if (type is NamedTypeBuilder) { | 468 if (type is NamedTypeBuilder) { |
479 supertype = type.builder; | 469 supertype = type.builder; |
480 } else { | 470 } else { |
481 internalError("Unhandled: ${type.runtimeType}"); | 471 internalError("Unhandled: ${type.runtimeType}"); |
482 } | 472 } |
483 } | 473 } |
484 if (supertype is KernelClassBuilder) { | 474 if (supertype is KernelClassBuilder) { |
485 Map<TypeParameter, DartType> substitutionMap = | 475 Map<TypeParameter, DartType> substitutionMap = |
486 computeKernelSubstitutionMap( | 476 computeKernelSubstitutionMap( |
487 builder.getSubstitutionMap(supertype, builder.fileUri, | 477 builder.getSubstitutionMap(supertype, builder.fileUri, |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 } | 707 } |
718 for (Constructor constructor in superclass.constructors) { | 708 for (Constructor constructor in superclass.constructors) { |
719 if (constructor.name.name.isEmpty) { | 709 if (constructor.name.name.isEmpty) { |
720 return constructor.function.requiredParameterCount == 0 | 710 return constructor.function.requiredParameterCount == 0 |
721 ? constructor | 711 ? constructor |
722 : null; | 712 : null; |
723 } | 713 } |
724 } | 714 } |
725 return null; | 715 return null; |
726 } | 716 } |
OLD | NEW |