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

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

Issue 2982373002: Resynthesize mixins from Kernel. (Closed)
Patch Set: Created 3 years, 5 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_library_builder; 5 library fasta.kernel_library_builder;
6 6
7 import 'package:kernel/ast.dart'; 7 import 'package:kernel/ast.dart';
8 8
9 import 'package:kernel/clone.dart' show CloneVisitor; 9 import 'package:kernel/clone.dart' show CloneVisitor;
10 10
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 // library scope. 138 // library scope.
139 Scope constructorScope = 139 Scope constructorScope =
140 new Scope(constructors, null, null, isModifiable: false); 140 new Scope(constructors, null, null, isModifiable: false);
141 ClassBuilder cls = new SourceClassBuilder( 141 ClassBuilder cls = new SourceClassBuilder(
142 documentationComment, 142 documentationComment,
143 metadata, 143 metadata,
144 modifiers, 144 modifiers,
145 className, 145 className,
146 typeVariables, 146 typeVariables,
147 applyMixins(supertype, 147 applyMixins(supertype,
148 subclassName: className, typeVariables: typeVariables), 148 isSyntheticMixinImplementation: true,
149 subclassName: className,
150 typeVariables: typeVariables),
149 interfaces, 151 interfaces,
150 classScope, 152 classScope,
151 constructorScope, 153 constructorScope,
152 this, 154 this,
153 new List<ConstructorReferenceBuilder>.from(constructorReferences), 155 new List<ConstructorReferenceBuilder>.from(constructorReferences),
154 charOffset); 156 charOffset);
155 constructorReferences.clear(); 157 constructorReferences.clear();
156 Map<String, TypeVariableBuilder> typeVariablesByName = 158 Map<String, TypeVariableBuilder> typeVariablesByName =
157 checkTypeVariables(typeVariables, cls); 159 checkTypeVariables(typeVariables, cls);
158 void setParent(String name, MemberBuilder member) { 160 void setParent(String name, MemberBuilder member) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 } 212 }
211 } 213 }
212 } 214 }
213 return typeVariablesByName; 215 return typeVariablesByName;
214 } 216 }
215 217
216 KernelTypeBuilder applyMixin( 218 KernelTypeBuilder applyMixin(
217 KernelTypeBuilder supertype, KernelTypeBuilder mixin, String signature, 219 KernelTypeBuilder supertype, KernelTypeBuilder mixin, String signature,
218 {String documentationComment, 220 {String documentationComment,
219 List<MetadataBuilder> metadata, 221 List<MetadataBuilder> metadata,
222 bool isSyntheticMixinImplementation: false,
220 String name, 223 String name,
221 List<TypeVariableBuilder> typeVariables, 224 List<TypeVariableBuilder> typeVariables,
222 int modifiers: abstractMask, 225 int modifiers: abstractMask,
223 List<KernelTypeBuilder> interfaces, 226 List<KernelTypeBuilder> interfaces,
224 int charOffset: -1}) { 227 int charOffset: -1}) {
225 var constructors = <String, MemberBuilder>{}; 228 var constructors = <String, MemberBuilder>{};
226 bool isNamed = name != null; 229 bool isNamed = name != null;
227 SourceClassBuilder builder; 230 SourceClassBuilder builder;
228 if (isNamed) { 231 if (isNamed) {
229 modifiers |= namedMixinApplicationMask; 232 modifiers |= namedMixinApplicationMask;
(...skipping 17 matching lines...) Expand all
247 interfaces, 250 interfaces,
248 new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{}, 251 new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
249 scope.withTypeVariables(typeVariables), 252 scope.withTypeVariables(typeVariables),
250 isModifiable: false), 253 isModifiable: false),
251 new Scope(constructors, null, null, isModifiable: false), 254 new Scope(constructors, null, null, isModifiable: false),
252 this, 255 this,
253 <ConstructorReferenceBuilder>[], 256 <ConstructorReferenceBuilder>[],
254 charOffset, 257 charOffset,
255 null, 258 null,
256 mixin); 259 mixin);
260 builder.cls.isSyntheticMixinImplementation =
261 isSyntheticMixinImplementation;
257 addBuilder(name, builder, charOffset); 262 addBuilder(name, builder, charOffset);
258 if (!isNamed) { 263 if (!isNamed) {
259 mixinApplicationClasses[name] = builder; 264 mixinApplicationClasses[name] = builder;
260 } 265 }
261 } 266 }
262 return addNamedType(name, <KernelTypeBuilder>[], charOffset) 267 return addNamedType(name, <KernelTypeBuilder>[], charOffset)
263 ..bind(isNamed ? builder : null); 268 ..bind(isNamed ? builder : null);
264 } 269 }
265 270
266 KernelTypeBuilder applyMixins(KernelTypeBuilder type, 271 KernelTypeBuilder applyMixins(KernelTypeBuilder type,
267 {List<MetadataBuilder> metadata, 272 {List<MetadataBuilder> metadata,
273 bool isSyntheticMixinImplementation: false,
268 String name, 274 String name,
269 String subclassName, 275 String subclassName,
270 List<TypeVariableBuilder> typeVariables, 276 List<TypeVariableBuilder> typeVariables,
271 int modifiers: abstractMask, 277 int modifiers: abstractMask,
272 List<KernelTypeBuilder> interfaces, 278 List<KernelTypeBuilder> interfaces,
273 int charOffset: -1}) { 279 int charOffset: -1}) {
274 if (type is KernelMixinApplicationBuilder) { 280 if (type is KernelMixinApplicationBuilder) {
275 subclassName ??= name; 281 subclassName ??= name;
276 List<List<String>> signatureParts = <List<String>>[]; 282 List<List<String>> signatureParts = <List<String>>[];
277 Map<String, String> unresolved = <String, String>{}; 283 Map<String, String> unresolved = <String, String>{};
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 .toList(), 406 .toList(),
401 -1); 407 -1);
402 } 408 }
403 KernelNamedTypeBuilder mixin = type.mixins[i]; 409 KernelNamedTypeBuilder mixin = type.mixins[i];
404 for (var type in mixin.arguments ?? const []) { 410 for (var type in mixin.arguments ?? const []) {
405 type.bind(variables[type.name]); 411 type.bind(variables[type.name]);
406 } 412 }
407 checkArguments(supertype); 413 checkArguments(supertype);
408 checkArguments(mixin); 414 checkArguments(mixin);
409 supertype = applyMixin(supertype, mixin, signature, 415 supertype = applyMixin(supertype, mixin, signature,
416 isSyntheticMixinImplementation: true,
410 typeVariables: 417 typeVariables:
411 new List<TypeVariableBuilder>.from(variables.values)); 418 new List<TypeVariableBuilder>.from(variables.values));
412 } 419 }
413 KernelNamedTypeBuilder mixin = type.mixins.last; 420 KernelNamedTypeBuilder mixin = type.mixins.last;
414 421
415 Set<String> supertypeArguments = new Set<String>(); 422 Set<String> supertypeArguments = new Set<String>();
416 for (var part in currentSignatureParts) { 423 for (var part in currentSignatureParts) {
417 supertypeArguments.addAll(part); 424 supertypeArguments.addAll(part);
418 } 425 }
419 String signature = name == null ? computeSignature() : ""; 426 String signature = name == null ? computeSignature() : "";
(...skipping 20 matching lines...) Expand all
440 for (var type in mixin.arguments ?? const []) { 447 for (var type in mixin.arguments ?? const []) {
441 type.bind(variables[type.name]); 448 type.bind(variables[type.name]);
442 } 449 }
443 } 450 }
444 checkArguments(supertype); 451 checkArguments(supertype);
445 checkArguments(mixin); 452 checkArguments(mixin);
446 453
447 KernelNamedTypeBuilder t = applyMixin(supertype, mixin, signature, 454 KernelNamedTypeBuilder t = applyMixin(supertype, mixin, signature,
448 metadata: metadata, 455 metadata: metadata,
449 name: name, 456 name: name,
457 isSyntheticMixinImplementation: isSyntheticMixinImplementation,
450 typeVariables: typeVariables, 458 typeVariables: typeVariables,
451 modifiers: modifiers, 459 modifiers: modifiers,
452 interfaces: interfaces, 460 interfaces: interfaces,
453 charOffset: charOffset); 461 charOffset: charOffset);
454 if (name == null) { 462 if (name == null) {
455 var builder = t.builder; 463 var builder = t.builder;
456 t = addNamedType( 464 t = addNamedType(
457 t.name, freeTypes.keys.map((k) => freeTypes[k]).toList(), -1); 465 t.name, freeTypes.keys.map((k) => freeTypes[k]).toList(), -1);
458 if (builder != null) { 466 if (builder != null) {
459 t.bind(builder); 467 t.bind(builder);
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 mixinApplicationClasses.putIfAbsent(name, () => builder); 878 mixinApplicationClasses.putIfAbsent(name, () => builder);
871 if (existing != builder) { 879 if (existing != builder) {
872 part.scope.local.remove(name); 880 part.scope.local.remove(name);
873 } 881 }
874 }); 882 });
875 super.includePart(part); 883 super.includePart(part);
876 nativeMethods.addAll(part.nativeMethods); 884 nativeMethods.addAll(part.nativeMethods);
877 boundlessTypeVariables.addAll(part.boundlessTypeVariables); 885 boundlessTypeVariables.addAll(part.boundlessTypeVariables);
878 } 886 }
879 } 887 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698