OLD | NEW |
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 '../closure.dart'; | 5 import '../closure.dart'; |
6 import '../common.dart'; | 6 import '../common.dart'; |
7 import '../common_elements.dart'; | 7 import '../common_elements.dart'; |
8 import '../compiler.dart'; | 8 import '../compiler.dart'; |
9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 } else if (target.isTypedef) { | 365 } else if (target.isTypedef) { |
366 _typedefsInMirrorsUsedTargets.add(target); | 366 _typedefsInMirrorsUsedTargets.add(target); |
367 } else if (target.isLibrary) { | 367 } else if (target.isLibrary) { |
368 librariesInMirrorsUsedTargets.add(target as LibraryEntity); | 368 librariesInMirrorsUsedTargets.add(target as LibraryEntity); |
369 } else if (target != null) { | 369 } else if (target != null) { |
370 membersInMirrorsUsedTargets.add(target as MemberEntity); | 370 membersInMirrorsUsedTargets.add(target as MemberEntity); |
371 } | 371 } |
372 } | 372 } |
373 } | 373 } |
374 if (metaTargets != null) { | 374 if (metaTargets != null) { |
375 for (var element in metaTargets) { | 375 for (dynamic element in metaTargets) { |
376 if (element is ClassEntity) { | 376 if (element is ClassEntity) { |
377 metaTargetsUsed.add(element); | 377 metaTargetsUsed.add(element); |
378 } | 378 } |
379 } | 379 } |
380 } | 380 } |
381 } | 381 } |
382 | 382 |
383 @override | 383 @override |
384 bool isClassAccessibleByReflection(ClassEntity element) { | 384 bool isClassAccessibleByReflection(ClassEntity element) { |
385 return _classesNeededForReflection.contains(_getDartClass(element)); | 385 return _classesNeededForReflection.contains(_getDartClass(element)); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 bool foundClosure = false; | 562 bool foundClosure = false; |
563 for (ClassElement cls in worldBuilder.directlyInstantiatedClasses) { | 563 for (ClassElement cls in worldBuilder.directlyInstantiatedClasses) { |
564 // Do not process internal classes. | 564 // Do not process internal classes. |
565 if (cls.library.isInternalLibrary || cls.isInjected) continue; | 565 if (cls.library.isInternalLibrary || cls.isInjected) continue; |
566 if (isClassReferencedFromMirrorSystem(cls)) { | 566 if (isClassReferencedFromMirrorSystem(cls)) { |
567 Set<Name> memberNames = new Set<Name>(); | 567 Set<Name> memberNames = new Set<Name>(); |
568 // 1) the class (should be resolved) | 568 // 1) the class (should be resolved) |
569 assert(cls.isResolved, failedAt(cls)); | 569 assert(cls.isResolved, failedAt(cls)); |
570 _classesNeededForReflection.add(cls); | 570 _classesNeededForReflection.add(cls); |
571 // 2) its constructors (if resolved) | 571 // 2) its constructors (if resolved) |
572 cls.constructors.forEach((ConstructorElement constructor) { | 572 cls.constructors.forEach((Element _constructor) { |
| 573 ConstructorElement constructor = _constructor; |
573 if (worldBuilder.isMemberUsed(constructor)) { | 574 if (worldBuilder.isMemberUsed(constructor)) { |
574 _membersNeededForReflection.add(constructor); | 575 _membersNeededForReflection.add(constructor); |
575 } | 576 } |
576 }); | 577 }); |
577 // 3) all members, including fields via getter/setters (if resolved) | 578 // 3) all members, including fields via getter/setters (if resolved) |
578 cls.forEachClassMember((Member member) { | 579 cls.forEachClassMember((Member member) { |
579 MemberElement element = member.element; | 580 MemberElement element = member.element; |
580 if (worldBuilder.isMemberUsed(element)) { | 581 if (worldBuilder.isMemberUsed(element)) { |
581 memberNames.add(member.name); | 582 memberNames.add(member.name); |
582 _membersNeededForReflection.add(element); | 583 _membersNeededForReflection.add(element); |
583 element.nestedClosures | 584 element.nestedClosures.forEach((FunctionElement _callFunction) { |
584 .forEach((SynthesizedCallMethodElementX callFunction) { | 585 SynthesizedCallMethodElementX callFunction = _callFunction; |
585 _membersNeededForReflection.add(callFunction); | 586 _membersNeededForReflection.add(callFunction); |
586 _classesNeededForReflection.add(callFunction.closureClass); | 587 _classesNeededForReflection.add(callFunction.closureClass); |
587 }); | 588 }); |
588 } | 589 } |
589 }); | 590 }); |
590 // 4) all overriding members of subclasses/subtypes (should be resolved) | 591 // 4) all overriding members of subclasses/subtypes (should be resolved) |
591 if (closedWorld.hasAnyStrictSubtype(cls)) { | 592 if (closedWorld.hasAnyStrictSubtype(cls)) { |
592 closedWorld.forEachStrictSubtypeOf(cls, (ClassElement subcls) { | 593 closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity _subcls) { |
| 594 ClassElement subcls = _subcls; |
593 subcls.forEachClassMember((Member member) { | 595 subcls.forEachClassMember((Member member) { |
594 if (memberNames.contains(member.name)) { | 596 if (memberNames.contains(member.name)) { |
595 // TODO(20993): find out why this assertion fails. | 597 // TODO(20993): find out why this assertion fails. |
596 // assert(worldBuilder.isMemberUsed(member.element), | 598 // assert(worldBuilder.isMemberUsed(member.element), |
597 // failedAt(member.element)); | 599 // failedAt(member.element)); |
598 if (worldBuilder.isMemberUsed(member.element)) { | 600 if (worldBuilder.isMemberUsed(member.element)) { |
599 _membersNeededForReflection.add(member.element); | 601 _membersNeededForReflection.add(member.element); |
600 } | 602 } |
601 } | 603 } |
602 }); | 604 }); |
603 }); | 605 }); |
604 } | 606 } |
605 // 5) all its closures | 607 // 5) all its closures |
606 List<LocalFunctionElement> closures = closureMap[cls]; | 608 List<LocalFunctionElement> closures = closureMap[cls]; |
607 if (closures != null) { | 609 if (closures != null) { |
608 _closuresNeededForReflection.addAll(closures); | 610 _closuresNeededForReflection.addAll(closures); |
609 foundClosure = true; | 611 foundClosure = true; |
610 } | 612 } |
611 } else { | 613 } else { |
612 // check members themselves | 614 // check members themselves |
613 cls.constructors.forEach((ConstructorElement element) { | 615 cls.constructors.forEach((Element _element) { |
| 616 ConstructorElement element = _element; |
614 if (!worldBuilder.isMemberUsed(element)) return; | 617 if (!worldBuilder.isMemberUsed(element)) return; |
615 if (_memberReferencedFromMirrorSystem(element)) { | 618 if (_memberReferencedFromMirrorSystem(element)) { |
616 _membersNeededForReflection.add(element); | 619 _membersNeededForReflection.add(element); |
617 } | 620 } |
618 }); | 621 }); |
619 cls.forEachClassMember((Member member) { | 622 cls.forEachClassMember((Member member) { |
620 if (!worldBuilder.isMemberUsed(member.element)) return; | 623 if (!worldBuilder.isMemberUsed(member.element)) return; |
621 if (_memberReferencedFromMirrorSystem(member.element)) { | 624 if (_memberReferencedFromMirrorSystem(member.element)) { |
622 _membersNeededForReflection.add(member.element); | 625 _membersNeededForReflection.add(member.element); |
623 } | 626 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 } | 704 } |
702 | 705 |
703 /// Called when `const Symbol(name)` is seen. | 706 /// Called when `const Symbol(name)` is seen. |
704 void registerConstSymbol(String name) { | 707 void registerConstSymbol(String name) { |
705 symbolsUsed.add(name); | 708 symbolsUsed.add(name); |
706 if (name.endsWith('=')) { | 709 if (name.endsWith('=')) { |
707 symbolsUsed.add(name.substring(0, name.length - 1)); | 710 symbolsUsed.add(name.substring(0, name.length - 1)); |
708 } | 711 } |
709 } | 712 } |
710 } | 713 } |
OLD | NEW |