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

Side by Side Diff: pkg/compiler/lib/src/kernel/world_builder.dart

Issue 2675103003: Refactor BackendHelpers to be reusageable with KernelWorldBuilder (Closed)
Patch Set: Updated cf. comments Created 3 years, 10 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) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 import 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/names.dart'; 8 import '../common/names.dart';
9 import '../core_types.dart'; 9 import '../core_types.dart';
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
(...skipping 28 matching lines...) Expand all
39 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = 39 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
40 <ir.TypeParameter, KTypeVariable>{}; 40 <ir.TypeParameter, KTypeVariable>{};
41 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; 41 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
42 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; 42 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
43 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; 43 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
44 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = 44 Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
45 <ir.TreeNode, KLocalFunction>{}; 45 <ir.TreeNode, KLocalFunction>{};
46 46
47 KernelWorldBuilder(this.reporter, ir.Program program) 47 KernelWorldBuilder(this.reporter, ir.Program program)
48 : _env = new KEnv(program) { 48 : _env = new KEnv(program) {
49 _commonElements = new KernelCommonElements(this); 49 _commonElements =
50 new KernelCommonElements(new KernelElementEnvironment(this));
50 _typeConverter = new DartTypeConverter(this); 51 _typeConverter = new DartTypeConverter(this);
51 } 52 }
52 53
53 CommonElements get commonElements => _commonElements; 54 CommonElements get commonElements => _commonElements;
54 55
55 LibraryEntity lookupLibrary(Uri uri) { 56 LibraryEntity lookupLibrary(Uri uri) {
56 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); 57 KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
57 return _getLibrary(libraryEnv.library, libraryEnv); 58 return _getLibrary(libraryEnv.library, libraryEnv);
58 } 59 }
59 60
60 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { 61 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) {
61 return _libraryMap.putIfAbsent(node, () { 62 return _libraryMap.putIfAbsent(node, () {
62 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri)); 63 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri));
63 return new KLibrary(_libraryMap.length, node.name ?? '${node.importUri}', 64 return new KLibrary(_libraryMap.length, node.name ?? '${node.importUri}',
64 node.name ?? node.fileUri ?? '${node.importUri}'); 65 node.name ?? node.fileUri ?? '${node.importUri}');
65 }); 66 });
66 } 67 }
67 68
69 MemberEntity lookupLibraryMember(KLibrary library, String name,
70 {bool setter: false}) {
71 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
72 ir.Member member = libraryEnv.lookupMember(name, setter: setter);
73 return member != null ? getMember(member) : null;
74 }
75
68 ClassEntity lookupClass(KLibrary library, String name) { 76 ClassEntity lookupClass(KLibrary library, String name) {
69 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; 77 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
70 KClassEnv classEnv = libraryEnv.lookupClass(name); 78 KClassEnv classEnv = libraryEnv.lookupClass(name);
71 return _getClass(classEnv.cls, classEnv); 79 return _getClass(classEnv.cls, classEnv);
72 } 80 }
73 81
82 MemberEntity lookupClassMember(KClass cls, String name,
83 {bool setter: false}) {
84 KClassEnv classEnv = _classEnvs[cls.classIndex];
85 ir.Member member = classEnv.lookupMember(name, setter: setter);
86 return member != null ? getMember(member) : null;
87 }
88
89 ConstructorEntity lookupConstructor(KClass cls, String name) {
90 KClassEnv classEnv = _classEnvs[cls.classIndex];
91 ir.Member member = classEnv.lookupConstructor(name);
92 return member != null ? getConstructor(member) : null;
93 }
94
74 KClass _getClass(ir.Class node, [KClassEnv classEnv]) { 95 KClass _getClass(ir.Class node, [KClassEnv classEnv]) {
75 return _classMap.putIfAbsent(node, () { 96 return _classMap.putIfAbsent(node, () {
76 if (classEnv == null) { 97 if (classEnv == null) {
77 KLibrary library = _getLibrary(node.enclosingLibrary); 98 KLibrary library = _getLibrary(node.enclosingLibrary);
78 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); 99 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name);
79 } 100 }
80 _classEnvs.add(classEnv); 101 _classEnvs.add(classEnv);
81 return new KClass(_classMap.length, node.name); 102 return new KClass(_classMap.length, node.name);
82 }); 103 });
83 } 104 }
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 return _libraryMap[uri]; 315 return _libraryMap[uri];
295 } 316 }
296 } 317 }
297 318
298 /// Environment for fast lookup of library classes and members. 319 /// Environment for fast lookup of library classes and members.
299 // TODO(johnniwinther): Add member lookup. 320 // TODO(johnniwinther): Add member lookup.
300 class KLibraryEnv { 321 class KLibraryEnv {
301 final ir.Library library; 322 final ir.Library library;
302 323
303 Map<String, KClassEnv> _classMap; 324 Map<String, KClassEnv> _classMap;
325 Map<String, ir.Member> _memberMap;
304 326
305 KLibraryEnv(this.library); 327 KLibraryEnv(this.library);
306 328
307 /// Return the [KClassEnv] for the class [name] in [library]. 329 /// Return the [KClassEnv] for the class [name] in [library].
308 KClassEnv lookupClass(String name) { 330 KClassEnv lookupClass(String name) {
309 if (_classMap == null) { 331 if (_classMap == null) {
310 _classMap = <String, KClassEnv>{}; 332 _classMap = <String, KClassEnv>{};
311 for (ir.Class cls in library.classes) { 333 for (ir.Class cls in library.classes) {
312 _classMap[cls.name] = new KClassEnv(cls); 334 _classMap[cls.name] = new KClassEnv(cls);
313 } 335 }
314 } 336 }
315 return _classMap[name]; 337 return _classMap[name];
316 } 338 }
339
340 /// Return the [ir.Member] for the member [name] in [library].
341 ir.Member lookupMember(String name, {bool setter: false}) {
342 if (_memberMap == null) {
343 _memberMap = <String, ir.Member>{};
344 for (ir.Member member in library.members) {
345 // TODO(johnniwinther): Support setter vs. getter.
346 _memberMap[member.name.name] = member;
347 }
348 }
349 return _memberMap[name];
350 }
317 } 351 }
318 352
319 /// Environment for fast lookup of class members. 353 /// Environment for fast lookup of class members.
320 // TODO(johnniwinther): Add member lookup. 354 // TODO(johnniwinther): Add member lookup.
321 class KClassEnv { 355 class KClassEnv {
322 final ir.Class cls; 356 final ir.Class cls;
323 357
358 Map<String, ir.Member> _constructorMap;
359 Map<String, ir.Member> _memberMap;
360
324 KClassEnv(this.cls); 361 KClassEnv(this.cls);
362
363 void _ensureMaps() {
364 if (_memberMap == null) {
365 _memberMap = <String, ir.Member>{};
366 _constructorMap = <String, ir.Member>{};
367 for (ir.Member member in cls.members) {
368 if (member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) {
369 _constructorMap[member.name.name] = member;
370 } else {
371 // TODO(johnniwinther): Support setter vs. getter.
372 _memberMap[member.name.name] = member;
373 }
374 }
375 for (ir.Member member in cls.constructors) {
376 _constructorMap[member.name.name] = member;
377 }
378 }
379 }
380
381 /// Return the [ir.Member] for the member [name] in [library].
382 ir.Member lookupMember(String name, {bool setter: false}) {
383 return _memberMap[name];
384 }
385
386 /// Return the [ir.Member] for the member [name] in [library].
387 ir.Member lookupConstructor(String name, {bool setter: false}) {
388 return _constructorMap[name];
389 }
325 } 390 }
326 391
327 /// [CommonElements] implementation based on [KernelWorldBuilder]. 392 class KernelElementEnvironment implements ElementEnvironment {
328 class KernelCommonElements extends CommonElementsMixin {
329 final KernelWorldBuilder worldBuilder; 393 final KernelWorldBuilder worldBuilder;
330 394
331 KernelCommonElements(this.worldBuilder); 395 KernelElementEnvironment(this.worldBuilder);
332 396
333 @override 397 @override
334 LibraryEntity get coreLibrary { 398 InterfaceType getThisType(ClassEntity cls) {
335 return worldBuilder.lookupLibrary(Uris.dart_core); 399 return worldBuilder.getThisType(cls);
336 } 400 }
337 401
338 @override 402 @override
403 InterfaceType getRawType(ClassEntity cls) {
404 return worldBuilder.getRawType(cls);
405 }
406
407 @override
339 InterfaceType createInterfaceType( 408 InterfaceType createInterfaceType(
340 ClassEntity cls, List<DartType> typeArguments) { 409 ClassEntity cls, List<DartType> typeArguments) {
341 return new InterfaceType(cls, typeArguments); 410 return new InterfaceType(cls, typeArguments);
342 } 411 }
343 412
344 @override 413 @override
345 InterfaceType getRawType(ClassEntity cls) { 414 ConstructorEntity lookupConstructor(ClassEntity cls, String name,
346 return worldBuilder.getRawType(cls); 415 {bool required: false}) {
416 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name);
417 if (constructor == null && required) {
418 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
419 "The constructor $name was not found in class '${cls.name}'.");
420 }
421 return constructor;
347 } 422 }
348 423
349 @override 424 @override
350 FunctionEntity findConstructor(ClassEntity cls, String name, 425 MemberEntity lookupClassMember(ClassEntity cls, String name,
351 {bool required: true}) { 426 {bool setter: false, bool required: false}) {
352 throw new UnimplementedError('KernelCommonElements.findConstructor'); 427 MemberEntity member =
428 worldBuilder.lookupClassMember(cls, name, setter: setter);
429 if (member == null && required) {
430 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
431 "The member '$name' was not found in ${cls.name}.");
432 }
433 return member;
353 } 434 }
354 435
355 @override 436 @override
356 MemberEntity findClassMember(ClassEntity cls, String name, 437 MemberEntity lookupLibraryMember(LibraryEntity library, String name,
357 {bool required: true}) { 438 {bool setter: false, bool required: false}) {
358 throw new UnimplementedError('KernelCommonElements.findClassMember'); 439 MemberEntity member =
440 worldBuilder.lookupLibraryMember(library, name, setter: setter);
441 if (member == null && required) {
442 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
443 "The member '${name}' was not found in library '${library.name}'.");
444 }
445 return member;
359 } 446 }
360 447
361 @override 448 @override
362 MemberEntity findLibraryMember(LibraryEntity library, String name, 449 ClassEntity lookupClass(LibraryEntity library, String name,
363 {bool required: true}) { 450 {bool required: false}) {
364 throw new UnimplementedError('KernelCommonElements.findLibraryMember'); 451 ClassEntity cls = worldBuilder.lookupClass(library, name);
452 if (cls == null && required) {
453 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
454 "The class '$name' was not found in library '${library.name}'.");
455 }
456 return cls;
365 } 457 }
366 458
367 @override 459 @override
368 ClassEntity findClass(LibraryEntity library, String name, 460 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
369 {bool required: true}) { 461 LibraryEntity library = worldBuilder.lookupLibrary(uri);
370 return worldBuilder.lookupClass(library, name); 462 if (library == null && required) {
463 throw new SpannableAssertionFailure(
464 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
465 }
466 return library;
467 }
468 }
469
470 /// [CommonElements] implementation based on [KernelWorldBuilder].
471 class KernelCommonElements extends CommonElementsMixin {
472 final ElementEnvironment environment;
473
474 KernelCommonElements(this.environment);
475
476 @override
477 LibraryEntity get coreLibrary {
478 return environment.lookupLibrary(Uris.dart_core, required: true);
371 } 479 }
372 480
373 @override 481 @override
374 DynamicType get dynamicType => const DynamicType(); 482 DynamicType get dynamicType => const DynamicType();
375 483
376 @override 484 @override
377 ClassEntity get nativeAnnotationClass { 485 ClassEntity get nativeAnnotationClass {
378 throw new UnimplementedError('KernelCommonElements.nativeAnnotationClass'); 486 throw new UnimplementedError('KernelCommonElements.nativeAnnotationClass');
379 } 487 }
380 488
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 } 604 }
497 return builder._getLibrary(library); 605 return builder._getLibrary(library);
498 } 606 }
499 607
500 KLibrary getLibraryForFunction(KFunction function) => 608 KLibrary getLibraryForFunction(KFunction function) =>
501 _getLibrary(function, builder._methodMap); 609 _getLibrary(function, builder._methodMap);
502 610
503 KLibrary getLibraryForField(KField field) => 611 KLibrary getLibraryForField(KField field) =>
504 _getLibrary(field, builder._fieldMap); 612 _getLibrary(field, builder._fieldMap);
505 } 613 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart ('k') | pkg/compiler/lib/src/native/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698