diff --git a/src/main/java/com/squareup/javapoet/MethodSpec.java b/src/main/java/com/squareup/javapoet/MethodSpec.java index 2284ef512..67722c774 100644 --- a/src/main/java/com/squareup/javapoet/MethodSpec.java +++ b/src/main/java/com/squareup/javapoet/MethodSpec.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -233,16 +232,7 @@ public static Builder overriding(ExecutableElement method) { } methodBuilder.returns(TypeName.get(method.getReturnType())); - // Copying parameter annotations from the overridden method can be incorrect so we're - // deliberately dropping them. See https://github.com/square/javapoet/issues/482. - methodBuilder.addParameters(ParameterSpec.parametersOf(method) - .stream() - .map(parameterSpec -> { - ParameterSpec.Builder builder = parameterSpec.toBuilder(); - builder.annotations.clear(); - return builder.build(); - }) - .collect(Collectors.toList())); + methodBuilder.addParameters(ParameterSpec.parametersOf(method)); methodBuilder.varargs(method.isVarArgs()); for (TypeMirror thrownType : method.getThrownTypes()) { diff --git a/src/main/java/com/squareup/javapoet/ParameterSpec.java b/src/main/java/com/squareup/javapoet/ParameterSpec.java index b8f3129ae..342e657d0 100644 --- a/src/main/java/com/squareup/javapoet/ParameterSpec.java +++ b/src/main/java/com/squareup/javapoet/ParameterSpec.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.lang.model.SourceVersion; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; @@ -87,17 +86,12 @@ void emit(CodeWriter codeWriter, boolean varargs) throws IOException { public static ParameterSpec get(VariableElement element) { checkArgument(element.getKind().equals(ElementKind.PARAMETER), "element is not a parameter"); - // Copy over any annotations from element. - List annotations = element.getAnnotationMirrors() - .stream() - .map((mirror) -> AnnotationSpec.get(mirror)) - .collect(Collectors.toList()); - TypeName type = TypeName.get(element.asType()); String name = element.getSimpleName().toString(); + // Copying parameter annotations can be incorrect so we're deliberately not including them. + // See https://github.com/square/javapoet/issues/482. return ParameterSpec.builder(type, name) .addModifiers(element.getModifiers()) - .addAnnotations(annotations) .build(); } diff --git a/src/test/java/com/squareup/javapoet/MethodSpecTest.java b/src/test/java/com/squareup/javapoet/MethodSpecTest.java index b768351b5..824f476c4 100644 --- a/src/test/java/com/squareup/javapoet/MethodSpecTest.java +++ b/src/test/java/com/squareup/javapoet/MethodSpecTest.java @@ -15,6 +15,7 @@ */ package com.squareup.javapoet; +import com.google.testing.compile.Compilation; import com.google.testing.compile.CompilationRule; import java.io.Closeable; import java.io.IOException; @@ -30,14 +31,19 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; +import javax.lang.model.util.ElementFilter; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; +import javax.tools.JavaFileObject; + +import com.google.testing.compile.CompilationSubject; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.truth.Truth.assertThat; +import static com.google.testing.compile.Compiler.javac; import static com.squareup.javapoet.MethodSpec.CONSTRUCTOR; import static com.squareup.javapoet.TestUtil.findFirst; import static javax.lang.model.util.ElementFilter.methodsIn; @@ -247,6 +253,26 @@ static void staticMethod() { } } + abstract static class AbstractClassWithPrivateAnnotation { + + private @interface PrivateAnnotation{ } + + abstract void foo(@PrivateAnnotation final String bar); + } + + @Test public void overrideDoesNotCopyParameterAnnotations() { + TypeElement abstractTypeElement = getElement(AbstractClassWithPrivateAnnotation.class); + ExecutableElement fooElement = ElementFilter.methodsIn(abstractTypeElement.getEnclosedElements()).get(0); + ClassName implClassName = ClassName.get("com.squareup.javapoet", "Impl"); + TypeSpec type = TypeSpec.classBuilder(implClassName) + .superclass(abstractTypeElement.asType()) + .addMethod(MethodSpec.overriding(fooElement).build()) + .build(); + JavaFileObject jfo = JavaFile.builder(implClassName.packageName, type).build().toJavaFileObject(); + Compilation compilation = javac().compile(jfo); + CompilationSubject.assertThat(compilation).succeeded(); + } + @Test public void equalsAndHashCode() { MethodSpec a = MethodSpec.constructorBuilder().build(); MethodSpec b = MethodSpec.constructorBuilder().build(); diff --git a/src/test/java/com/squareup/javapoet/ParameterSpecTest.java b/src/test/java/com/squareup/javapoet/ParameterSpecTest.java index c3effca5a..8585986af 100644 --- a/src/test/java/com/squareup/javapoet/ParameterSpecTest.java +++ b/src/test/java/com/squareup/javapoet/ParameterSpecTest.java @@ -99,7 +99,7 @@ public void foo(@Nullable final String bar) { VariableElement parameterElement = element.getParameters().get(0); assertThat(ParameterSpec.get(parameterElement).toString()) - .isEqualTo("@javax.annotation.Nullable java.lang.String arg0"); + .isEqualTo("java.lang.String arg0"); } @Test public void addNonFinalModifier() {