Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(424)

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_target.dart

Issue 2862223002: Rewrite mixin application handling in Fasta. (Closed)
Patch Set: Update status file. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 show 74 show
75 Builder, 75 Builder,
76 ClassBuilder, 76 ClassBuilder,
77 InvalidTypeBuilder, 77 InvalidTypeBuilder,
78 KernelClassBuilder, 78 KernelClassBuilder,
79 KernelLibraryBuilder, 79 KernelLibraryBuilder,
80 KernelNamedTypeBuilder, 80 KernelNamedTypeBuilder,
81 KernelProcedureBuilder, 81 KernelProcedureBuilder,
82 LibraryBuilder, 82 LibraryBuilder,
83 MemberBuilder, 83 MemberBuilder,
84 MixinApplicationBuilder,
85 NamedMixinApplicationBuilder,
86 NamedTypeBuilder, 84 NamedTypeBuilder,
87 TypeBuilder, 85 TypeBuilder,
86 TypeDeclarationBuilder,
88 TypeVariableBuilder; 87 TypeVariableBuilder;
89 88
90 import 'verifier.dart' show verifyProgram; 89 import 'verifier.dart' show verifyProgram;
91 90
92 class KernelTarget extends TargetImplementation { 91 class KernelTarget extends TargetImplementation {
93 /// The [FileSystem] which should be used to access files. 92 /// The [FileSystem] which should be used to access files.
94 final FileSystem fileSystem; 93 final FileSystem fileSystem;
95 94
96 final bool strongMode; 95 final bool strongMode;
97 96
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) { 140 LibraryBuilder createLibraryBuilder(Uri uri, Uri fileUri) {
142 if (dillTarget.isLoaded) { 141 if (dillTarget.isLoaded) {
143 var builder = dillTarget.loader.builders[uri]; 142 var builder = dillTarget.loader.builders[uri];
144 if (builder != null) { 143 if (builder != null) {
145 return builder; 144 return builder;
146 } 145 }
147 } 146 }
148 return new KernelLibraryBuilder(uri, fileUri, loader); 147 return new KernelLibraryBuilder(uri, fileUri, loader);
149 } 148 }
150 149
150 void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) {
151 TypeBuilder supertype = cls.supertype;
152 if (supertype is NamedTypeBuilder) {
153 f(supertype);
154 } else if (supertype != null) {
155 internalError("Unhandled: ${supertype.runtimeType}");
156 }
157 if (cls.interfaces != null) {
158 for (NamedTypeBuilder t in cls.interfaces) {
159 f(t);
160 }
161 }
162 if (cls.library.loader == loader &&
163 // TODO(ahe): Implement DillClassBuilder.mixedInType and remove the
164 // above check.
165 cls.mixedInType != null) {
166 f(cls.mixedInType);
167 }
168 }
169
151 void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) { 170 void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {
152 if (cls == null) return; 171 if (cls == null) return;
153 TypeBuilder supertype = cls.supertype; 172 forEachDirectSupertype(cls, (NamedTypeBuilder type) {
154 add(NamedTypeBuilder type) {
155 Builder builder = type.builder; 173 Builder builder = type.builder;
156 if (builder is ClassBuilder) { 174 if (builder is ClassBuilder) {
157 set.add(builder); 175 set.add(builder);
158 } 176 }
159 } 177 });
160
161 if (supertype == null) {
162 // OK.
163 } else if (supertype is MixinApplicationBuilder) {
164 add(supertype.supertype);
165 for (NamedTypeBuilder t in supertype.mixins) {
166 add(t);
167 }
168 } else if (supertype is NamedTypeBuilder) {
169 add(supertype);
170 } else {
171 internalError("Unhandled: ${supertype.runtimeType}");
172 }
173 if (cls.interfaces != null) {
174 for (NamedTypeBuilder t in cls.interfaces) {
175 add(t);
176 }
177 }
178 } 178 }
179 179
180 List<ClassBuilder> collectAllClasses() { 180 List<ClassBuilder> collectAllClasses() {
181 List<ClassBuilder> result = <ClassBuilder>[]; 181 List<ClassBuilder> result = <ClassBuilder>[];
182 loader.builders.forEach((Uri uri, LibraryBuilder library) { 182 loader.builders.forEach((Uri uri, LibraryBuilder library) {
183 library.forEach((String name, Builder member) { 183 library.forEach((String name, Builder member) {
184 if (member is KernelClassBuilder) { 184 if (member is KernelClassBuilder) {
185 result.add(member); 185 result.add(member);
186 } 186 }
187 }); 187 });
(...skipping 19 matching lines...) Expand all
207 207
208 void breakCycle(ClassBuilder builder) { 208 void breakCycle(ClassBuilder builder) {
209 Class cls = builder.target; 209 Class cls = builder.target;
210 cls.implementedTypes.clear(); 210 cls.implementedTypes.clear();
211 cls.supertype = null; 211 cls.supertype = null;
212 cls.mixedInType = null; 212 cls.mixedInType = null;
213 builder.supertype = new KernelNamedTypeBuilder("Object", null, 213 builder.supertype = new KernelNamedTypeBuilder("Object", null,
214 builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri)) 214 builder.charOffset, builder.fileUri ?? Uri.parse(cls.fileUri))
215 ..builder = objectClassBuilder; 215 ..builder = objectClassBuilder;
216 builder.interfaces = null; 216 builder.interfaces = null;
217 builder.mixedInType = null;
217 } 218 }
218 219
219 Future<Program> handleInputError(Uri uri, InputError error, 220 Future<Program> handleInputError(Uri uri, InputError error,
220 {bool isFullProgram}) { 221 {bool isFullProgram}) {
221 if (error != null) { 222 if (error != null) {
222 String message = error.format(); 223 String message = error.format();
223 print(message); 224 print(message);
224 errors.add(message); 225 errors.add(message);
225 } 226 }
226 program = erroneousProgram(isFullProgram); 227 program = erroneousProgram(isFullProgram);
227 return uri == null 228 return uri == null
228 ? new Future<Program>.value(program) 229 ? new Future<Program>.value(program)
229 : writeLinkedProgram(uri, program, isFullProgram: isFullProgram); 230 : writeLinkedProgram(uri, program, isFullProgram: isFullProgram);
230 } 231 }
231 232
232 Future<Program> writeOutline(Uri uri) async { 233 Future<Program> writeOutline(Uri uri) async {
233 if (loader.first == null) return null; 234 if (loader.first == null) return null;
234 try { 235 try {
235 loader.createTypeInferenceEngine(); 236 loader.createTypeInferenceEngine();
236 await loader.buildOutlines(); 237 await loader.buildOutlines();
237 loader.coreLibrary 238 loader.coreLibrary
238 .becomeCoreLibrary(const DynamicType(), const VoidType()); 239 .becomeCoreLibrary(const DynamicType(), const VoidType());
239 dynamicType.bind(loader.coreLibrary["dynamic"]); 240 dynamicType.bind(loader.coreLibrary["dynamic"]);
240 loader.resolveParts(); 241 loader.resolveParts();
241 loader.computeLibraryScopes(); 242 loader.computeLibraryScopes();
242 loader.resolveTypes(); 243 loader.resolveTypes();
244 loader.checkSemantics();
243 loader.buildProgram(); 245 loader.buildProgram();
244 loader.checkSemantics();
245 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses(); 246 List<SourceClassBuilder> sourceClasses = collectAllSourceClasses();
246 installDefaultSupertypes(); 247 installDefaultSupertypes();
247 installDefaultConstructors(sourceClasses); 248 installDefaultConstructors(sourceClasses);
248 loader.resolveConstructors(); 249 loader.resolveConstructors();
249 loader.finishTypeVariables(objectClassBuilder); 250 loader.finishTypeVariables(objectClassBuilder);
250 program = link(new List<Library>.from(loader.libraries)); 251 program = link(new List<Library>.from(loader.libraries));
251 loader.computeHierarchy(program); 252 loader.computeHierarchy(program);
252 loader.checkOverrides(sourceClasses); 253 loader.checkOverrides(sourceClasses);
253 loader.prepareInitializerInference(); 254 loader.prepareInitializerInference();
254 loader.performInitializerInference(); 255 loader.performInitializerInference();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 } 441 }
441 ticker.logMs("Installed default constructors"); 442 ticker.logMs("Installed default constructors");
442 } 443 }
443 444
444 KernelClassBuilder get objectClassBuilder => loader.coreLibrary["Object"]; 445 KernelClassBuilder get objectClassBuilder => loader.coreLibrary["Object"];
445 446
446 Class get objectClass => objectClassBuilder.cls; 447 Class get objectClass => objectClassBuilder.cls;
447 448
448 /// If [builder] doesn't have a constructors, install the defaults. 449 /// If [builder] doesn't have a constructors, install the defaults.
449 void installDefaultConstructor(SourceClassBuilder builder) { 450 void installDefaultConstructor(SourceClassBuilder builder) {
450 if (builder.cls.isMixinApplication) { 451 if (builder.isMixinApplication && !builder.isNamedMixinApplication) return;
451 // We have to test if builder.cls is a mixin application. [builder] may
452 // think it's a mixin application, but if its mixed-in type couldn't be
453 // resolved, the target class won't be a mixin application and we need
454 // to add a default constructor to complete error recovery.
455 return;
456 }
457 if (builder.constructors.local.isNotEmpty) return; 452 if (builder.constructors.local.isNotEmpty) return;
458 453
459 /// Quotes below are from [Dart Programming Language Specification, 4th 454 /// Quotes below are from [Dart Programming Language Specification, 4th
460 /// Edition]( 455 /// Edition](
461 /// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf): 456 /// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
462 if (builder is NamedMixinApplicationBuilder) { 457 if (builder.isNamedMixinApplication) {
463 /// >A mixin application of the form S with M; defines a class C with 458 /// >A mixin application of the form S with M; defines a class C with
464 /// >superclass S. 459 /// >superclass S.
465 /// >... 460 /// >...
466 461
467 /// >Let LM be the library in which M is declared. For each generative 462 /// >Let LM be the library in which M is declared. For each generative
468 /// >constructor named qi(Ti1 ai1, . . . , Tiki aiki), i in 1..n of S 463 /// >constructor named qi(Ti1 ai1, . . . , Tiki aiki), i in 1..n of S
469 /// >that is accessible to LM , C has an implicitly declared constructor 464 /// >that is accessible to LM , C has an implicitly declared constructor
470 /// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) : 465 /// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) :
471 /// >super(ai1,...,aiki);. 466 /// >super(ai1,...,aiki);.
472 Builder supertype = builder; 467 TypeDeclarationBuilder supertype = builder;
473 while (supertype is NamedMixinApplicationBuilder) { 468 while (supertype.isMixinApplication) {
474 NamedMixinApplicationBuilder named = supertype; 469 SourceClassBuilder named = supertype;
475 TypeBuilder type = named.mixinApplication; 470 TypeBuilder type = named.supertype;
476 if (type is MixinApplicationBuilder) {
477 MixinApplicationBuilder t = type;
478 type = t.supertype;
479 }
480 if (type is NamedTypeBuilder) { 471 if (type is NamedTypeBuilder) {
481 supertype = type.builder; 472 supertype = type.builder;
482 } else { 473 } else {
483 internalError("Unhandled: ${type.runtimeType}"); 474 internalError("Unhandled: ${type.runtimeType}");
484 } 475 }
485 } 476 }
486 if (supertype is KernelClassBuilder) { 477 if (supertype is KernelClassBuilder) {
487 Map<TypeParameter, DartType> substitutionMap = 478 Map<TypeParameter, DartType> substitutionMap =
488 computeKernelSubstitutionMap( 479 computeKernelSubstitutionMap(
489 builder.getSubstitutionMap(supertype, builder.fileUri, 480 builder.getSubstitutionMap(supertype, builder.fileUri,
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 } 718 }
728 for (Constructor constructor in superclass.constructors) { 719 for (Constructor constructor in superclass.constructors) {
729 if (constructor.name.name.isEmpty) { 720 if (constructor.name.name.isEmpty) {
730 return constructor.function.requiredParameterCount == 0 721 return constructor.function.requiredParameterCount == 0
731 ? constructor 722 ? constructor
732 : null; 723 : null;
733 } 724 }
734 } 725 }
735 return null; 726 return null;
736 } 727 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698