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

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

Issue 2862223002: Rewrite mixin application handling in Fasta. (Closed)
Patch Set: 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_mixin_application_builder; 5 library fasta.kernel_mixin_application_builder;
6 6
7 import 'package:kernel/ast.dart' show InterfaceType, Supertype, setParents; 7 import 'package:kernel/ast.dart' show InterfaceType, Supertype;
8 8
9 import '../modifier.dart' show abstractMask; 9 import '../errors.dart' show internalError;
10
11 import '../source/source_class_builder.dart' show SourceClassBuilder;
12 10
13 import '../util/relativize.dart' show relativizeUri; 11 import '../util/relativize.dart' show relativizeUri;
14 12
15 import 'kernel_builder.dart' 13 import 'kernel_builder.dart'
16 show 14 show
17 ConstructorReferenceBuilder,
18 KernelLibraryBuilder, 15 KernelLibraryBuilder,
19 KernelNamedTypeBuilder,
20 KernelTypeBuilder, 16 KernelTypeBuilder,
21 KernelTypeVariableBuilder,
22 LibraryBuilder, 17 LibraryBuilder,
23 MemberBuilder,
24 MixinApplicationBuilder, 18 MixinApplicationBuilder,
25 Scope,
26 TypeBuilder,
27 TypeVariableBuilder; 19 TypeVariableBuilder;
28 20
29 class KernelMixinApplicationBuilder 21 class KernelMixinApplicationBuilder
30 extends MixinApplicationBuilder<KernelTypeBuilder> 22 extends MixinApplicationBuilder<KernelTypeBuilder>
31 implements KernelTypeBuilder { 23 implements KernelTypeBuilder {
32 final int charOffset; 24 final int charOffset;
33 25
34 final String relativeFileUri; 26 final String relativeFileUri;
35 27
36 final KernelLibraryBuilder library; 28 final KernelLibraryBuilder library;
37 29
38 Supertype builtType; 30 Supertype builtType;
39 31
40 List<TypeVariableBuilder> typeVariables; 32 List<TypeVariableBuilder> typeVariables;
41 33
42 String subclassName; 34 String subclassName;
43 35
44 KernelMixinApplicationBuilder(KernelTypeBuilder supertype, 36 KernelMixinApplicationBuilder(KernelTypeBuilder supertype,
45 List<KernelTypeBuilder> mixins, this.library, int charOffset, Uri fileUri) 37 List<KernelTypeBuilder> mixins, this.library, int charOffset, Uri fileUri)
46 : charOffset = charOffset, 38 : charOffset = charOffset,
47 relativeFileUri = relativizeUri(fileUri), 39 relativeFileUri = relativizeUri(fileUri),
48 super(supertype, mixins, charOffset, fileUri); 40 super(supertype, mixins, charOffset, fileUri);
49 41
50 InterfaceType build(LibraryBuilder library) { 42 InterfaceType build(LibraryBuilder library) {
51 return buildSupertype(library)?.asInterfaceType; 43 return internalError("Unsupported operation.");
52 } 44 }
53 45
54 Supertype buildSupertype(LibraryBuilder library) { 46 Supertype buildSupertype(LibraryBuilder library) {
55 if (builtType != null) return builtType; 47 return internalError("Unsupported operation.");
56 KernelTypeBuilder s = this.supertype;
57 for (KernelTypeBuilder builder in mixins) {
58 s = applyMixin(s, builder);
59 }
60 builtType = s.buildSupertype(library);
61 return builtType;
62 }
63
64 TypeBuilder applyMixin(TypeBuilder supertype, TypeBuilder cls) {
65 KernelLibraryBuilder library = this.library.partOfLibrary ?? this.library;
66 TypeBuilder mixin = cls.computeMixin(fileUri, charOffset, library);
67 KernelTypeBuilder intf;
68 if (cls != mixin) {
69 intf = cls;
70 }
71 List<KernelTypeBuilder> typeArguments;
72 List<TypeVariableBuilder> newTypeVariables;
73 if (typeVariables != null) {
74 assert(subclassName != null);
75 newTypeVariables = library.copyTypeVariables(typeVariables);
76 Map<TypeVariableBuilder, TypeBuilder> substitution =
77 <TypeVariableBuilder, TypeBuilder>{};
78 typeArguments = <KernelTypeBuilder>[];
79 for (int i = 0; i < typeVariables.length; i++) {
80 substitution[typeVariables[i]] = newTypeVariables[i].asTypeBuilder();
81 typeArguments.add(typeVariables[i].asTypeBuilder());
82 }
83 supertype = supertype.subst(substitution);
84 mixin = mixin.subst(substitution);
85 intf = intf?.subst(substitution);
86 }
87 // To reduce diff against dartk, we create a different name for mixin
88 // applications that have free type variables. We do this by setting
89 // [subclassName] when setting typeVariables.
90 String name = subclassName != null
91 ? "${subclassName}^${mixin.name}"
92 : "${supertype.name}&${mixin.name}";
93 SourceClassBuilder classBuilder =
94 library.mixinApplicationClasses.putIfAbsent(name, () {
95 SourceClassBuilder classBuilder = new SourceClassBuilder(
96 null,
97 abstractMask,
98 name,
99 newTypeVariables,
100 supertype,
101 intf == null ? null : <KernelTypeBuilder>[intf],
102 new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
103 library.scope.withTypeVariables(newTypeVariables),
104 isModifiable: false),
105 new Scope(<String, MemberBuilder>{}, null, null, isModifiable: false),
106 library,
107 <ConstructorReferenceBuilder>[],
108 charOffset,
109 null,
110 mixin);
111 library.addImplementationBuilder(name, classBuilder, charOffset);
112 if (newTypeVariables != null) {
113 for (KernelTypeVariableBuilder t in newTypeVariables) {
114 classBuilder.cls.typeParameters.add(t.parameter);
115 }
116 setParents(classBuilder.cls.typeParameters, classBuilder.cls);
117 }
118 return classBuilder;
119 });
120 return new KernelNamedTypeBuilder(
121 name, typeArguments, charOffset, library.fileUri)
122 ..builder = classBuilder;
123 } 48 }
124 } 49 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698