Index: reflectable/lib/src/transformer_implementation.dart |
diff --git a/reflectable/lib/src/transformer_implementation.dart b/reflectable/lib/src/transformer_implementation.dart |
index 90c86356a5d92110c6e132d08ac4201f80dd8810..7a4591ee2a680c119163cd0bf44fed0b2a37b9ee 100644 |
--- a/reflectable/lib/src/transformer_implementation.dart |
+++ b/reflectable/lib/src/transformer_implementation.dart |
@@ -68,6 +68,8 @@ class ClassDomain { |
final ClassElement classElement; |
final Iterable<MethodElement> invokableMethods; |
final Iterable<MethodElement> declaredMethods; |
+ final Iterable<PropertyAccessorElement> declaredAccessors; |
+ final Iterable<ConstructorElement> constructors; |
ReflectorDomain reflectorDomain; |
String staticClassMirrorName; |
@@ -75,14 +77,12 @@ class ClassDomain { |
String get baseName => classElement.name; |
ClassDomain(this.classElement, this.invokableMethods, this.declaredMethods, |
- this.reflectorDomain); |
+ this.declaredAccessors, this.constructors, this.reflectorDomain); |
Iterable<ExecutableElement> get declarations { |
- // TODO(sigurdm): Include constructors. |
// TODO(sigurdm): Include fields. |
- // TODO(sigurdm): Include getters and setters. |
// TODO(sigurdm): Include type variables (if we decide to keep them). |
- return [declaredMethods].expand((x) => x); |
+ return [declaredMethods, declaredAccessors, constructors].expand((x) => x); |
} |
/// Returns an integer encoding the kind and attributes of the given |
@@ -94,36 +94,44 @@ class ClassDomain { |
} else if (element is ConstructorElement) { |
if (element.isFactory) { |
result = constants.factoryConstructor; |
- } else if (element.redirectedConstructor != null) { |
- result = constants.redirectingConstructor; |
} else { |
result = constants.generativeConstructor; |
} |
if (element.isConst) { |
result += constants.constAttribute; |
} |
+ if (element.redirectedConstructor != null) { |
+ result += constants.redirectingConstructor; |
+ } |
} else { |
result = constants.method; |
} |
if (element.isPrivate) { |
result += constants.privateAttribute; |
} |
- if (element.isAbstract) { |
- result += constants.abstractAttribute; |
- } |
+ assert(!element.isAbstract); |
eernst
2015/06/18 10:07:18
Seems to be enough to revert this one.
sigurdm
2015/06/18 11:04:03
Done.
|
if (element.isStatic) { |
result += constants.staticAttribute; |
} |
return result; |
} |
+ String nameOfDeclaration(ExecutableElement element) { |
+ if (element is ConstructorElement) { |
+ return element.name == "" |
+ ? classElement.name |
+ : "${classElement.name}.${element.name}"; |
+ } |
+ return element.name; |
+ } |
+ |
/// Returns a String with the textual representation of the declarations-map. |
String get declarationsString { |
Iterable<String> declarationParts = declarations.map( |
- (ExecutableElement instanceMember) { |
- return '"${instanceMember.name}": ' |
- 'new MethodMirrorImpl("${instanceMember.name}", ' |
- '${_declarationDescriptor(instanceMember)}, this)'; |
+ (ExecutableElement declaration) { |
+ return '"${nameOfDeclaration(declaration)}": ' |
+ 'new MethodMirrorImpl("${declaration.name}", ' |
+ '${_declarationDescriptor(declaration)}, this)'; |
}); |
return "{${declarationParts.join(", ")}}"; |
} |
@@ -396,8 +404,9 @@ class TransformerImplementation { |
Iterable<MethodElement> declaredMethods( |
ClassElement classElement, Capabilities capabilities) { |
return classElement.methods.where((MethodElement method) { |
+ if (method.isAbstract) return false; |
if (method.isStatic) { |
- // TODO(sigurdm): Ask capability about support. |
+ // TODO(sigurdm): Ask capabilities about support. |
return true; |
} else { |
return capabilities.supportsInstanceInvoke(method.name); |
@@ -405,6 +414,27 @@ class TransformerImplementation { |
}); |
} |
+ Iterable<PropertyAccessorElement> declaredAccessors( |
+ ClassElement classElement, Capabilities capabilities) { |
+ return classElement.accessors.where((PropertyAccessorElement accessor) { |
+ if (accessor.isAbstract) return false; |
eernst
2015/06/18 10:07:19
With abstract members included, should this line b
sigurdm
2015/06/18 11:04:03
Done.
|
+ if (accessor.isStatic) { |
+ // TODO(sigurdm): Ask capabilities about support. |
+ return true; |
+ } else { |
+ return capabilities.supportsInstanceInvoke(accessor.name); |
+ } |
+ }); |
+ } |
+ |
+ Iterable<ConstructorElement> declaredConstructors( |
+ ClassElement classElement, Capabilities capabilities) { |
+ return classElement.constructors.where((ConstructorElement constructor) { |
+ // TODO(sigurdm): Ask capabilities about support. |
+ return true; |
+ }); |
+ } |
+ |
Iterable<MethodElement> invocableInstanceMethods( |
ClassElement classElement, Capabilities capabilities) { |
return allMethods(classElement).where((MethodElement method) { |
@@ -471,8 +501,13 @@ class TransformerImplementation { |
invocableInstanceMethods(type, domain.capabilities).toList(); |
List<MethodElement> declaredMethodsOfClass = |
declaredMethods(type, domain.capabilities).toList(); |
- domain.annotatedClasses.add(new ClassDomain( |
- type, instanceMethods, declaredMethodsOfClass, domain)); |
+ List<PropertyAccessorElement> declaredAccessorsOfClass = |
+ declaredAccessors(type, domain.capabilities).toList(); |
+ List<ConstructorElement> declaredConstructorsOfClass = |
+ declaredConstructors(type, domain.capabilities).toList(); |
+ domain.annotatedClasses.add(new ClassDomain(type, instanceMethods, |
+ declaredMethodsOfClass, declaredAccessorsOfClass, |
+ declaredConstructorsOfClass, domain)); |
} |
} |
} |