OLD | NEW |
1 // (c) 2015, the Dart Team. All rights reserved. Use of this | 1 // (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 | 2 // source code is governed by a BSD-style license that can be found in |
3 // the LICENSE file. | 3 // the LICENSE file. |
4 | 4 |
5 library reflectable.src.transformer_implementation; | 5 library reflectable.src.transformer_implementation; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:io'; | 9 import 'dart:io'; |
10 import 'dart:math' show max; | 10 import 'dart:math' show max; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 result += constants.abstractAttribute; | 112 result += constants.abstractAttribute; |
113 } | 113 } |
114 if (element.isStatic) { | 114 if (element.isStatic) { |
115 result += constants.staticAttribute; | 115 result += constants.staticAttribute; |
116 } | 116 } |
117 return result; | 117 return result; |
118 } | 118 } |
119 | 119 |
120 /// Returns a String with the textual representation of the declarations-map. | 120 /// Returns a String with the textual representation of the declarations-map. |
121 String get declarationsString { | 121 String get declarationsString { |
122 Iterable<String> declarationParts = declarations | 122 Iterable<String> declarationParts = declarations.map( |
123 .map((ExecutableElement instanceMember) { | 123 (ExecutableElement instanceMember) { |
124 return '"${instanceMember.name}": ' | 124 return '"${instanceMember.name}": ' |
125 'new MethodMirrorImpl("${instanceMember.name}", ' | 125 'new MethodMirrorImpl("${instanceMember.name}", ' |
126 '${_declarationDescriptor(instanceMember)}, this)'; | 126 '${_declarationDescriptor(instanceMember)}, this)'; |
127 }); | 127 }); |
128 return "{${declarationParts.join(", ")}}"; | 128 return "{${declarationParts.join(", ")}}"; |
129 } | 129 } |
130 | 130 |
131 void computeNames(Namer namer) { | 131 void computeNames(Namer namer) { |
132 staticClassMirrorName = namer.freshName("Static_${baseName}_ClassMirror"); | 132 staticClassMirrorName = namer.freshName("Static_${baseName}_ClassMirror"); |
133 staticInstanceMirrorName = | 133 staticInstanceMirrorName = |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 Iterable<${prefix}ClassMirror> get annotatedClasses { | 757 Iterable<${prefix}ClassMirror> get annotatedClasses { |
758 return [${annotatedClassesStrings.join(", ")}]; | 758 return [${annotatedClassesStrings.join(", ")}]; |
759 }"""); | 759 }"""); |
760 } | 760 } |
761 | 761 |
762 /// Returns the source code for the reflection free subclass of | 762 /// Returns the source code for the reflection free subclass of |
763 /// [ClassMirror] which is specialized for a `reflectedType` which | 763 /// [ClassMirror] which is specialized for a `reflectedType` which |
764 /// is the class modeled by [classElement]. | 764 /// is the class modeled by [classElement]. |
765 String _staticClassMirrorCode(ClassDomain classDomain) { | 765 String _staticClassMirrorCode(ClassDomain classDomain) { |
766 String declarationsString = classDomain.declarationsString; | 766 String declarationsString = classDomain.declarationsString; |
| 767 String simpleName = classDomain.classElement.name; |
| 768 // When/if we have library-mirrors there could be a generic implementation: |
| 769 // String get qualifiedName => "${owner.qualifiedName}.${simpleName}"; |
| 770 String qualifiedName = |
| 771 "${classDomain.classElement.library.name}.$simpleName"; |
767 return """ | 772 return """ |
768 class ${classDomain.staticClassMirrorName} extends ClassMirrorUnimpl { | 773 class ${classDomain.staticClassMirrorName} extends ClassMirrorUnimpl { |
769 final String simpleName = "${classDomain.classElement.name}"; | 774 final String simpleName = "$simpleName"; |
| 775 final String qualifiedName = "$qualifiedName"; |
770 | 776 |
771 Map<String, MethodMirror> _declarationsCache; | 777 Map<String, MethodMirror> _declarationsCache; |
772 | 778 |
773 Map<String, MethodMirror> get declarations { | 779 Map<String, MethodMirror> get declarations { |
774 if (_declarationsCache == null) { | 780 if (_declarationsCache == null) { |
775 _declarationsCache = new UnmodifiableMapView($declarationsString); | 781 _declarationsCache = new UnmodifiableMapView($declarationsString); |
776 } | 782 } |
777 return _declarationsCache; | 783 return _declarationsCache; |
778 } | 784 } |
779 } | 785 } |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 /// [InstanceMirror] which is specialized for a `reflectee` which | 1120 /// [InstanceMirror] which is specialized for a `reflectee` which |
1115 /// is an instance of the class modeled by [classElement]. The | 1121 /// is an instance of the class modeled by [classElement]. The |
1116 /// generated code will provide support as specified by | 1122 /// generated code will provide support as specified by |
1117 /// [capabilities]. | 1123 /// [capabilities]. |
1118 String _staticInstanceMirrorCode(ClassDomain classDomain) { | 1124 String _staticInstanceMirrorCode(ClassDomain classDomain) { |
1119 // The `rest` of the code is the entire body of the static mirror class, | 1125 // The `rest` of the code is the entire body of the static mirror class, |
1120 // except for the declaration of `reflectee`, and a constructor. | 1126 // except for the declaration of `reflectee`, and a constructor. |
1121 String rest = ""; | 1127 String rest = ""; |
1122 rest += instanceMethodFilter(classDomain.reflectorDomain.capabilities); | 1128 rest += instanceMethodFilter(classDomain.reflectorDomain.capabilities); |
1123 rest += _staticInstanceMirrorInvokeCode(classDomain); | 1129 rest += _staticInstanceMirrorInvokeCode(classDomain); |
| 1130 rest += " ClassMirror get type => " |
| 1131 "new ${classDomain.staticClassMirrorName}();\n"; |
1124 // TODO(eernst): add code for other mirror methods than `invoke`. | 1132 // TODO(eernst): add code for other mirror methods than `invoke`. |
1125 return """ | 1133 return """ |
1126 class ${classDomain.staticInstanceMirrorName} extends InstanceMirrorUnimpl { | 1134 class ${classDomain.staticInstanceMirrorName} extends InstanceMirrorUnimpl { |
1127 final ${_classElementName(classDomain)} reflectee; | 1135 final ${_classElementName(classDomain)} reflectee; |
1128 ${classDomain.staticInstanceMirrorName}(this.reflectee); | 1136 ${classDomain.staticInstanceMirrorName}(this.reflectee); |
1129 $rest} | 1137 $rest} |
1130 """; | 1138 """; |
1131 } | 1139 } |
1132 | 1140 |
1133 /// Returns the result of transforming the given [source] code, which is | 1141 /// Returns the result of transforming the given [source] code, which is |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1336 TransformLogger get logger => _aggregateTransform.logger; | 1344 TransformLogger get logger => _aggregateTransform.logger; |
1337 Future<Asset> getInput(AssetId id) => _aggregateTransform.getInput(id); | 1345 Future<Asset> getInput(AssetId id) => _aggregateTransform.getInput(id); |
1338 Future<String> readInputAsString(AssetId id, {Encoding encoding}) { | 1346 Future<String> readInputAsString(AssetId id, {Encoding encoding}) { |
1339 return _aggregateTransform.readInputAsString(id, encoding: encoding); | 1347 return _aggregateTransform.readInputAsString(id, encoding: encoding); |
1340 } | 1348 } |
1341 Stream<List<int>> readInput(AssetId id) => _aggregateTransform.readInput(id); | 1349 Stream<List<int>> readInput(AssetId id) => _aggregateTransform.readInput(id); |
1342 Future<bool> hasInput(AssetId id) => _aggregateTransform.hasInput(id); | 1350 Future<bool> hasInput(AssetId id) => _aggregateTransform.hasInput(id); |
1343 void addOutput(Asset output) => _aggregateTransform.addOutput(output); | 1351 void addOutput(Asset output) => _aggregateTransform.addOutput(output); |
1344 void consumePrimary() => _aggregateTransform.consumePrimary(primaryInput.id); | 1352 void consumePrimary() => _aggregateTransform.consumePrimary(primaryInput.id); |
1345 } | 1353 } |
OLD | NEW |