Chromium Code Reviews| 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)); |
| } |
| } |
| } |