| 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 library kernel.transformations.mixin_full_resolution; | 4 library kernel.transformations.mixin_full_resolution; |
| 5 | 5 |
| 6 import '../ast.dart'; | 6 import '../ast.dart'; |
| 7 import '../class_hierarchy.dart'; | 7 import '../class_hierarchy.dart'; |
| 8 import '../clone.dart'; | 8 import '../clone.dart'; |
| 9 import '../core_types.dart'; | 9 import '../core_types.dart'; |
| 10 import '../type_algebra.dart'; | 10 import '../type_algebra.dart'; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 ClassHierarchy hierarchy; | 24 ClassHierarchy hierarchy; |
| 25 CoreTypes coreTypes; | 25 CoreTypes coreTypes; |
| 26 | 26 |
| 27 void transform(Program program) { | 27 void transform(Program program) { |
| 28 var transformedClasses = new Set<Class>(); | 28 var transformedClasses = new Set<Class>(); |
| 29 | 29 |
| 30 // Desugar all mixin application classes by copying in fields/methods from | 30 // Desugar all mixin application classes by copying in fields/methods from |
| 31 // the mixin and constructors from the base class. | 31 // the mixin and constructors from the base class. |
| 32 var processedClasses = new Set<Class>(); | 32 var processedClasses = new Set<Class>(); |
| 33 for (var library in program.libraries) { | 33 for (var library in program.libraries) { |
| 34 if (library.isExternal) continue; |
| 35 |
| 34 for (var class_ in library.classes) { | 36 for (var class_ in library.classes) { |
| 35 transformClass(processedClasses, transformedClasses, class_); | 37 transformClass(processedClasses, transformedClasses, class_); |
| 36 } | 38 } |
| 37 } | 39 } |
| 38 | 40 |
| 39 hierarchy = new ClassHierarchy(program); | 41 hierarchy = new ClassHierarchy(program); |
| 40 coreTypes = new CoreTypes(program); | 42 coreTypes = new CoreTypes(program); |
| 41 | 43 |
| 42 // Resolve all super call expressions and super initializers. | 44 // Resolve all super call expressions and super initializers. |
| 43 for (var library in program.libraries) { | 45 for (var library in program.libraries) { |
| 46 if (library.isExternal) continue; |
| 47 |
| 44 for (var class_ in library.classes) { | 48 for (var class_ in library.classes) { |
| 45 final bool hasTransformedSuperclass = | 49 final bool hasTransformedSuperclass = |
| 46 transformedClasses.contains(class_.superclass); | 50 transformedClasses.contains(class_.superclass); |
| 47 | 51 |
| 48 for (var procedure in class_.procedures) { | 52 for (var procedure in class_.procedures) { |
| 49 if (procedure.containsSuperCalls) { | 53 if (procedure.containsSuperCalls) { |
| 50 new SuperCallResolutionTransformer( | 54 new SuperCallResolutionTransformer( |
| 51 hierarchy, coreTypes, class_.superclass) | 55 hierarchy, coreTypes, class_.superclass) |
| 52 .visit(procedure); | 56 .visit(procedure); |
| 53 } | 57 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 75 | 79 |
| 76 // Ensure super classes have been transformed before this class. | 80 // Ensure super classes have been transformed before this class. |
| 77 if (class_.superclass != null) { | 81 if (class_.superclass != null) { |
| 78 transformClass(processedClasses, transformedClasses, class_.superclass); | 82 transformClass(processedClasses, transformedClasses, class_.superclass); |
| 79 } | 83 } |
| 80 | 84 |
| 81 // If this is not a mixin application we don't need to make forwarding | 85 // If this is not a mixin application we don't need to make forwarding |
| 82 // constructors in this class. | 86 // constructors in this class. |
| 83 if (!class_.isMixinApplication) return; | 87 if (!class_.isMixinApplication) return; |
| 84 | 88 |
| 89 if (class_.mixedInClass.level != ClassLevel.Body) { |
| 90 throw new Exception( |
| 91 'Class "${class_.name}" mixes in "${class_.mixedInClass.name}" from' |
| 92 ' an external library. Did you forget --link?'); |
| 93 } |
| 94 |
| 85 transformedClasses.add(class_); | 95 transformedClasses.add(class_); |
| 86 | 96 |
| 87 // Clone fields and methods from the mixin class. | 97 // Clone fields and methods from the mixin class. |
| 88 var substitution = getSubstitutionMap(class_.mixedInType); | 98 var substitution = getSubstitutionMap(class_.mixedInType); |
| 89 var cloner = new CloneVisitor(typeSubstitution: substitution); | 99 var cloner = new CloneVisitor(typeSubstitution: substitution); |
| 90 for (var field in class_.mixin.fields) { | 100 for (var field in class_.mixin.fields) { |
| 91 class_.addMember(cloner.clone(field)); | 101 class_.addMember(cloner.clone(field)); |
| 92 } | 102 } |
| 93 for (var procedure in class_.mixin.procedures) { | 103 for (var procedure in class_.mixin.procedures) { |
| 94 class_.addMember(cloner.clone(procedure)); | 104 class_.addMember(cloner.clone(procedure)); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 return null; | 370 return null; |
| 361 } | 371 } |
| 362 } | 372 } |
| 363 | 373 |
| 364 throw new Exception( | 374 throw new Exception( |
| 365 'Could not find a generative constructor named "${constructor.name}" ' | 375 'Could not find a generative constructor named "${constructor.name}" ' |
| 366 'in lookup class "${lookupClass.name}"!'); | 376 'in lookup class "${lookupClass.name}"!'); |
| 367 } | 377 } |
| 368 } | 378 } |
| 369 } | 379 } |
| OLD | NEW |