diff options
author | George Mount <mount@google.com> | 2017-05-03 14:29:02 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2017-05-04 07:38:17 -0700 |
commit | 2963075c4e43f05823eb5024ea6e6198f433e729 (patch) | |
tree | 94b3fe7753d11d0750297ad3c4fc786b4cdcf1f3 /compiler/src/main/java/android/databinding/tool/reflection | |
parent | d3aa6e368c913fca9f8607cdd7f7992346d6bce0 (diff) | |
download | data-binding-2963075c4e43f05823eb5024ea6e6198f433e729.tar.gz |
Fix generics use for field access.
Bug 37942402
Fields weren't taking the generic parameters into account when
determining their type resulting in always resolving to Object types
for generics.
Test: ran TestApp tests
Change-Id: I27f6f20a2372bc2f51b1d1ee63a30da59bb84ea4
Diffstat (limited to 'compiler/src/main/java/android/databinding/tool/reflection')
2 files changed, 13 insertions, 7 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationClass.java b/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationClass.java index a5f4d27f..a4f7eb9e 100644 --- a/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationClass.java +++ b/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationClass.java @@ -363,7 +363,7 @@ class AnnotationClass extends ModelClass { List<VariableElement> fields = ElementFilter.fieldsIn(members); declaredFields = new ModelField[fields.size()]; for (int i = 0; i < declaredFields.length; i++) { - declaredFields[i] = new AnnotationField(typeElement, fields.get(i)); + declaredFields[i] = new AnnotationField(declaredType, fields.get(i)); } } else { declaredFields = new ModelField[0]; diff --git a/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationField.java b/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationField.java index be860570..25684b64 100644 --- a/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationField.java +++ b/compiler/src/main/java/android/databinding/tool/reflection/annotation/AnnotationField.java @@ -20,16 +20,18 @@ import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.reflection.ModelField; import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Types; class AnnotationField extends ModelField { final VariableElement mField; - final TypeElement mDeclaredClass; + final DeclaredType mDeclaredClass; - public AnnotationField(TypeElement declaredClass, VariableElement field) { + public AnnotationField(DeclaredType declaredClass, VariableElement field) { mDeclaredClass = declaredClass; mField = field; } @@ -66,7 +68,9 @@ class AnnotationField extends ModelField { @Override public ModelClass getFieldType() { - return new AnnotationClass(mField.asType()); + Types typeUtils = AnnotationAnalyzer.get().getTypeUtils(); + TypeMirror type = typeUtils.asMemberOf(mDeclaredClass, mField); + return new AnnotationClass(type); } @Override @@ -78,8 +82,10 @@ class AnnotationField extends ModelField { public boolean equals(Object obj) { if (obj instanceof AnnotationField) { AnnotationField that = (AnnotationField) obj; - return mDeclaredClass.equals(that.mDeclaredClass) && AnnotationAnalyzer.get() - .getTypeUtils().isSameType(mField.asType(), that.mField.asType()); + Types typeUtils = AnnotationAnalyzer.get().getTypeUtils(); + return typeUtils.isSameType(mDeclaredClass, that.mDeclaredClass) + && typeUtils.isSameType(mField.asType(), that.mField.asType()) + && mField.getSimpleName().equals(that.mField.getSimpleName()); } else { return false; } |