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

Unified Diff: reflectable/lib/src/transformer_implementation.dart

Issue 1236983004: Support metadata for methods and fields in the transformed view. (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: Addressing review. Adding tests for name-clashes. Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: reflectable/lib/src/transformer_implementation.dart
diff --git a/reflectable/lib/src/transformer_implementation.dart b/reflectable/lib/src/transformer_implementation.dart
index 2f1100aa8ca9764707d88cfd898c8189d2608ddb..9a02de01435ac3f0ee629aeb87be1ac3a8962339 100644
--- a/reflectable/lib/src/transformer_implementation.dart
+++ b/reflectable/lib/src/transformer_implementation.dart
@@ -164,10 +164,6 @@ class ReflectorDomain {
'(${argumentParts.join(", ")})');
}
- String formatAsList(Iterable parts) => "[${parts.join(", ")}]";
-
- String formatAsMap(Iterable parts) => "{${parts.join(", ")}}";
-
String generateCode() {
Enumerator<ClassElement> classes = new Enumerator<ClassElement>();
Enumerator<ExecutableElement> members = new Enumerator<ExecutableElement>();
@@ -307,11 +303,11 @@ class ReflectorDomain {
}));
}
- String metadataCode;
+ String classMetadataCode;
if (capabilities.supportsMetadata) {
- metadataCode = classDomain.metadataCode;
+ classMetadataCode = extractMetadataCode(classDomain.classElement);
} else {
- metadataCode = "null";
+ classMetadataCode = "null";
}
String staticGettersCode = formatAsMap([
@@ -333,7 +329,7 @@ class ReflectorDomain {
'const ${reflector.name}(), '
'$declarationsCode, $instanceMembersCode, $superclassIndex, '
'$staticGettersCode, $staticSettersCode, $constructorsCode, '
- '$metadataCode)';
+ '$classMetadataCode)';
classIndex++;
return result;
}));
@@ -344,15 +340,27 @@ class ReflectorDomain {
List<String> methodsList = members.items.map((ExecutableElement element) {
int descriptor = _declarationDescriptor(element);
int ownerIndex = classes.indexOf(element.enclosingElement);
+ String metadataCode;
+ if (capabilities.supportsMetadata) {
+ metadataCode = extractMetadataCode(element);
+ } else {
+ metadataCode = null;
+ }
return 'new r.MethodMirrorImpl("${element.name}", $descriptor, '
- '$ownerIndex, const ${reflector.name}())';
+ '$ownerIndex, const ${reflector.name}(), $metadataCode)';
});
List<String> fieldsList = fields.items.map((FieldElement element) {
int descriptor = _fieldDescriptor(element);
int ownerIndex = classes.indexOf(element.enclosingElement);
+ String metadataCode;
+ if (capabilities.supportsMetadata) {
+ metadataCode = extractMetadataCode(element);
+ } else {
+ metadataCode = null;
+ }
return 'new r.VariableMirrorImpl("${element.name}", $descriptor, '
- '$ownerIndex, const ${reflector.name}())';
+ '$ownerIndex, const ${reflector.name}(), $metadataCode)';
});
List<String> membersList = <String>[]
@@ -473,31 +481,6 @@ class ClassDomain {
return element.name;
}
- /// Returns a String with the textual representations of the metadata list.
- // TODO(sigurdm, 17307): Make this less fragile when the analyzer's
- // element-model exposes the metadata in a more friendly way.
- String get metadataCode {
- List<String> metadataParts = new List<String>();
- Iterator<Annotation> nodeIterator = classElement.node.metadata.iterator;
- Iterator<ElementAnnotation> elementIterator =
- classElement.metadata.iterator;
- while (nodeIterator.moveNext()) {
- bool r = elementIterator.moveNext();
- assert(r);
- Annotation annotationNode = nodeIterator.current;
- ElementAnnotation elementAnnotation = elementIterator.current;
- // Remove the @-sign.
- String source = annotationNode.toSource().substring(1);
- if (elementAnnotation.element is ConstructorElement) {
- // If this is a constructor call, add the otherwise implicit 'const'.
- metadataParts.add("const $source");
- } else {
- metadataParts.add(source);
- }
- }
- return "[${metadataParts.join(", ")}]";
- }
-
String toString() {
return "ClassDomain(classElement)";
}
@@ -1529,3 +1512,36 @@ String _nameOfDeclaration(ExecutableElement element) {
}
return element.name;
}
+
+String formatAsList(Iterable parts) => "[${parts.join(", ")}]";
+
+String formatAsMap(Iterable parts) => "{${parts.join(", ")}}";
+
+/// Returns a String with the code used to build the metadata of [element].
+// TODO(sigurdm, 17307): Make this less fragile when the analyzer's
+// element-model exposes the metadata in a more friendly way.
+String extractMetadataCode(Element element) {
+ Iterable<ElementAnnotation> elementAnnotations = element.metadata;
+ if (elementAnnotations == null) return "[]";
+
+ List<String> metadataParts = new List<String>();
+ // Run through the two iterators in parallel.
+ Iterator<Annotation> nodeIterator =
+ (element.node as AnnotatedNode).metadata.iterator;
+ Iterator<ElementAnnotation> elementIterator = elementAnnotations.iterator;
+ while (nodeIterator.moveNext()) {
+ bool r = elementIterator.moveNext();
+ assert(r);
+ Annotation annotationNode = nodeIterator.current;
+ ElementAnnotation elementAnnotation = elementIterator.current;
+ // Remove the @-sign.
+ String source = annotationNode.toSource().substring(1);
+ if (elementAnnotation.element is ConstructorElement) {
+ // If this is a constructor call, add the otherwise implicit 'const'.
+ metadataParts.add("const $source");
+ } else {
+ metadataParts.add(source);
+ }
+ }
+ return formatAsList(metadataParts);
+}
« no previous file with comments | « reflectable/lib/src/mirrors_unimpl.dart ('k') | reflectable/test/mock_tests/check_literal_transform_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698