| 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 '../compiler.dart'; | 7 import '../compiler.dart'; |
| 8 import '../constants/values.dart'; | 8 import '../constants/values.dart'; |
| 9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
| 10 import '../elements/resolution_types.dart'; | 10 import '../elements/resolution_types.dart'; |
| 11 import '../enqueue.dart'; | 11 import '../enqueue.dart'; |
| 12 import '../options.dart'; |
| 12 import '../world.dart'; | 13 import '../world.dart'; |
| 13 import '../util/emptyset.dart'; | 14 import '../util/emptyset.dart'; |
| 15 import 'backend_helpers.dart'; |
| 14 | 16 |
| 15 class MirrorsData { | 17 class MirrorsData { |
| 16 /// True if a call to preserveMetadataMarker has been seen. This means that | 18 /// True if a call to preserveMetadataMarker has been seen. This means that |
| 17 /// metadata must be retained for dart:mirrors to work correctly. | 19 /// metadata must be retained for dart:mirrors to work correctly. |
| 18 bool mustRetainMetadata = false; | 20 bool mustRetainMetadata = false; |
| 19 | 21 |
| 20 /// True if any metadata has been retained. This is slightly different from | 22 /// True if any metadata has been retained. This is slightly different from |
| 21 /// [mustRetainMetadata] and tells us if any metadata was retained. For | 23 /// [mustRetainMetadata] and tells us if any metadata was retained. For |
| 22 /// example, if [mustRetainMetadata] is true but there is no metadata in the | 24 /// example, if [mustRetainMetadata] is true but there is no metadata in the |
| 23 /// program, this variable will stil be false. | 25 /// program, this variable will stil be false. |
| 24 bool hasRetainedMetadata = false; | 26 bool hasRetainedMetadata = false; |
| 25 | 27 |
| 26 /// True if a call to preserveLibraryNames has been seen. | 28 /// True if a call to preserveLibraryNames has been seen. |
| 27 bool mustRetainLibraryNames = false; | 29 bool mustRetainLibraryNames = false; |
| 28 | 30 |
| 29 /// True if a call to preserveNames has been seen. | 31 /// True if a call to preserveNames has been seen. |
| 30 bool mustPreserveNames = false; | 32 bool mustPreserveNames = false; |
| 31 | 33 |
| 32 /// True if a call to disableTreeShaking has been seen. | 34 /// True if a call to disableTreeShaking has been seen. |
| 33 bool isTreeShakingDisabled = false; | 35 bool isTreeShakingDisabled = false; |
| 34 | 36 |
| 35 /// True if there isn't sufficient @MirrorsUsed data. | 37 /// True if there isn't sufficient @MirrorsUsed data. |
| 36 bool hasInsufficientMirrorsUsed = false; | 38 bool hasInsufficientMirrorsUsed = false; |
| 37 | 39 |
| 40 /// True if a call to preserveUris has been seen and the preserve-uris flag |
| 41 /// is set. |
| 42 bool mustPreserveUris = false; |
| 43 |
| 38 /// List of symbols that the user has requested for reflection. | 44 /// List of symbols that the user has requested for reflection. |
| 39 final Set<String> symbolsUsed = new Set<String>(); | 45 final Set<String> symbolsUsed = new Set<String>(); |
| 40 | 46 |
| 41 /// List of elements that the user has requested for reflection. | 47 /// List of elements that the user has requested for reflection. |
| 42 final Set<Element> targetsUsed = new Set<Element>(); | 48 final Set<Element> targetsUsed = new Set<Element>(); |
| 43 | 49 |
| 44 /// List of annotations provided by user that indicate that the annotated | 50 /// List of annotations provided by user that indicate that the annotated |
| 45 /// element must be retained. | 51 /// element must be retained. |
| 46 final Set<Element> metaTargetsUsed = new Set<Element>(); | 52 final Set<Element> metaTargetsUsed = new Set<Element>(); |
| 47 | 53 |
| 48 final Compiler compiler; | 54 final Compiler compiler; |
| 49 | 55 |
| 50 MirrorsData(this.compiler); | 56 MirrorsData(this.compiler); |
| 51 | 57 |
| 58 CompilerOptions get _options => compiler.options; |
| 59 |
| 60 BackendHelpers get _helpers => compiler.backend.helpers; |
| 61 |
| 62 void registerUsedMember(MemberElement member) { |
| 63 if (member == _helpers.disableTreeShakingMarker) { |
| 64 isTreeShakingDisabled = true; |
| 65 } else if (member == _helpers.preserveNamesMarker) { |
| 66 mustPreserveNames = true; |
| 67 } else if (member == _helpers.preserveMetadataMarker) { |
| 68 mustRetainMetadata = true; |
| 69 } else if (member == _helpers.preserveUrisMarker) { |
| 70 if (_options.preserveUris) mustPreserveUris = true; |
| 71 } else if (member == _helpers.preserveLibraryNamesMarker) { |
| 72 mustRetainLibraryNames = true; |
| 73 } |
| 74 } |
| 75 |
| 52 /// Should [element] (a getter) that would normally not be generated due to | 76 /// Should [element] (a getter) that would normally not be generated due to |
| 53 /// treeshaking be retained for reflection? | 77 /// treeshaking be retained for reflection? |
| 54 bool shouldRetainGetter(Element element) { | 78 bool shouldRetainGetter(Element element) { |
| 55 return isTreeShakingDisabled && isAccessibleByReflection(element); | 79 return isTreeShakingDisabled && isAccessibleByReflection(element); |
| 56 } | 80 } |
| 57 | 81 |
| 58 /// Should [element] (a setter) hat would normally not be generated due to | 82 /// Should [element] (a setter) hat would normally not be generated due to |
| 59 /// treeshaking be retained for reflection? | 83 /// treeshaking be retained for reflection? |
| 60 bool shouldRetainSetter(Element element) { | 84 bool shouldRetainSetter(Element element) { |
| 61 return isTreeShakingDisabled && isAccessibleByReflection(element); | 85 return isTreeShakingDisabled && isAccessibleByReflection(element); |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 for (Element closure in closureMap[null]) { | 347 for (Element closure in closureMap[null]) { |
| 324 if (referencedFromMirrorSystem(closure)) { | 348 if (referencedFromMirrorSystem(closure)) { |
| 325 reflectableMembers.add(closure); | 349 reflectableMembers.add(closure); |
| 326 foundClosure = true; | 350 foundClosure = true; |
| 327 } | 351 } |
| 328 } | 352 } |
| 329 } | 353 } |
| 330 // As we do not think about closures as classes, yet, we have to make sure | 354 // As we do not think about closures as classes, yet, we have to make sure |
| 331 // their superclasses are available for reflection manually. | 355 // their superclasses are available for reflection manually. |
| 332 if (foundClosure) { | 356 if (foundClosure) { |
| 333 ClassElement cls = compiler.backend.helpers.closureClass; | 357 ClassElement cls = _helpers.closureClass; |
| 334 reflectableMembers.add(cls); | 358 reflectableMembers.add(cls); |
| 335 } | 359 } |
| 336 Set<Element> closurizedMembers = | 360 Set<Element> closurizedMembers = |
| 337 compiler.resolutionWorldBuilder.closurizedMembers; | 361 compiler.resolutionWorldBuilder.closurizedMembers; |
| 338 if (closurizedMembers.any(reflectableMembers.contains)) { | 362 if (closurizedMembers.any(reflectableMembers.contains)) { |
| 339 ClassElement cls = compiler.backend.helpers.boundClosureClass; | 363 ClassElement cls = _helpers.boundClosureClass; |
| 340 reflectableMembers.add(cls); | 364 reflectableMembers.add(cls); |
| 341 } | 365 } |
| 342 // Add typedefs. | 366 // Add typedefs. |
| 343 reflectableMembers | 367 reflectableMembers |
| 344 .addAll(closedWorld.allTypedefs.where(referencedFromMirrorSystem)); | 368 .addAll(closedWorld.allTypedefs.where(referencedFromMirrorSystem)); |
| 345 // Register all symbols of reflectable elements | 369 // Register all symbols of reflectable elements |
| 346 for (Element element in reflectableMembers) { | 370 for (Element element in reflectableMembers) { |
| 347 symbolsUsed.add(element.name); | 371 symbolsUsed.add(element.name); |
| 348 } | 372 } |
| 349 _membersNeededForReflection = reflectableMembers; | 373 _membersNeededForReflection = reflectableMembers; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 361 } | 385 } |
| 362 | 386 |
| 363 /// Called when [:const Symbol(name):] is seen. | 387 /// Called when [:const Symbol(name):] is seen. |
| 364 void registerConstSymbol(String name) { | 388 void registerConstSymbol(String name) { |
| 365 symbolsUsed.add(name); | 389 symbolsUsed.add(name); |
| 366 if (name.endsWith('=')) { | 390 if (name.endsWith('=')) { |
| 367 symbolsUsed.add(name.substring(0, name.length - 1)); | 391 symbolsUsed.add(name.substring(0, name.length - 1)); |
| 368 } | 392 } |
| 369 } | 393 } |
| 370 } | 394 } |
| OLD | NEW |