diff options
Diffstat (limited to 'value/src/main/java/com/google')
-rw-r--r-- | value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java b/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java index 0bdc47be..520a8be5 100644 --- a/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java +++ b/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java @@ -356,13 +356,23 @@ class PropertyBuilderClassifier { // with the same name. Map<String, ExecutableElement> methods = new LinkedHashMap<String, ExecutableElement>(); for (ExecutableElement method : ElementFilter.methodsIn(elementUtils.getAllMembers(type))) { - if (method.getParameters().isEmpty()) { + if (method.getParameters().isEmpty() && !isStaticInterfaceMethodNotIn(method, type)) { methods.put(method.getSimpleName().toString(), method); } } return methods; } + // Work around an Eclipse compiler bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=547185 + // The result of Elements.getAllMembers includes static methods declared in superinterfaces. + // That's wrong because those aren't inherited. So this method checks whether the given method is + // a static interface method not in the given type. + private static boolean isStaticInterfaceMethodNotIn(ExecutableElement method, TypeElement type) { + return method.getModifiers().contains(Modifier.STATIC) + && !method.getEnclosingElement().equals(type) + && method.getEnclosingElement().getKind().equals(ElementKind.INTERFACE); + } + private Optional<ExecutableElement> addAllPutAll(TypeElement barBuilderTypeElement) { for (ExecutableElement method : MoreElements.getLocalAndInheritedMethods(barBuilderTypeElement, typeUtils, elementUtils)) { |