Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2015, the Dart Team. All rights reserved. Use of this | |
| 2 // source code is governed by a BSD-style license that can be found in | |
| 3 // the LICENSE file. | |
| 4 | |
| 5 /// File being transformed by the reflectable transformer. | |
| 6 /// Uses public features of an instance of a private class in a different | |
| 7 /// library. This illustrates that there is (very limited) support for access | |
| 8 /// to private features. | |
| 9 library test_reflectable.test.private_class_test; | |
| 10 | |
| 11 @GlobalQuantifyCapability("PublicClass", privacyReflectable) | |
| 12 import 'package:reflectable/reflectable.dart'; | |
| 13 import 'package:unittest/unittest.dart'; | |
| 14 import 'private_class_library.dart'; | |
| 15 | |
| 16 class PrivacyReflectable extends Reflectable { | |
| 17 const PrivacyReflectable() | |
| 18 : super( | |
| 19 subtypeQuantifyCapability, | |
| 20 reflectedTypeCapability, | |
| 21 instanceInvokeCapability, | |
| 22 declarationsCapability, | |
| 23 libraryCapability); | |
| 24 } | |
| 25 | |
| 26 const privacyReflectable = const PrivacyReflectable(); | |
| 27 | |
| 28 void testPrivacyViolation(PublicClass object, String description) { | |
| 29 test("Privacy violation, $description", () { | |
| 30 Map<Uri, LibraryMirror> libraries = privacyReflectable.libraries; | |
| 31 Uri libraryUri = libraries.keys.firstWhere( | |
| 32 (Uri uri) => uri.toString().contains("private_class_library")); | |
| 33 LibraryMirror library = libraries[libraryUri]; | |
| 34 expect( | |
| 35 library.declarations.keys, | |
| 36 <String>[ | |
| 37 "PublicClass", | |
| 38 "_PrivateClass1", | |
| 39 "_PrivateClass2", | |
| 40 "PublicSubclass1", | |
| 41 "PublicSubclass2" | |
| 42 ].toSet()); | |
| 43 | |
| 44 InstanceMirror instanceMirror = privacyReflectable.reflect(object); | |
|
sigurdm
2015/10/15 12:30:58
I think the right way to allow reflection on priva
sigurdm
2015/10/15 12:30:58
What about other actions on private class-mirrors?
eernst
2015/10/15 13:46:11
For now, I've changed the test to check `canReflec
eernst
2015/10/15 13:46:11
Now you won't get a mirror on them, so we can revi
| |
| 45 ClassMirror classMirror = instanceMirror.type; | |
| 46 classMirror.declarations.values.forEach((DeclarationMirror declaration) { | |
| 47 expect(declaration is MethodMirror, true); | |
| 48 MethodMirror method = | |
| 49 declaration; // Declaration needed, no type propagation. | |
| 50 expect(method.reflectedReturnType, int); | |
| 51 expect(method.parameters.length, 0); | |
| 52 expect( | |
| 53 <String>["publicMethod", "supposedlyPrivate", "supposedlyPrivateToo"] | |
| 54 .contains(method.simpleName), | |
| 55 true); | |
| 56 if (method.simpleName != "publicMethod") { | |
| 57 expect(instanceMirror.invoke(declaration.simpleName, []), | |
| 58 -object.publicMethod()); | |
| 59 } | |
| 60 }); | |
| 61 }); | |
| 62 } | |
| 63 | |
| 64 main() { | |
| 65 testPrivacyViolation(func1(), "private subclass"); | |
| 66 testPrivacyViolation(func2(), "private subtype"); | |
| 67 testPrivacyViolation(func3(), "public subclass of private subclass"); | |
| 68 testPrivacyViolation(func4(), "public subclass of private subtype"); | |
| 69 } | |
| OLD | NEW |