aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Santiago <danyboricua91@gmail.com>2020-04-20 08:53:48 -0700
committerGitHub <noreply@github.com>2020-04-20 11:53:48 -0400
commit622e07eb0859fcf0eb9537ea5657277b7f3b18af (patch)
tree1ccb01b6c239623cc8f1e9d7714c96fab19be722
parent44622704248975ca398b90b4385005fdddeb35f9 (diff)
downloadjavapoet-622e07eb0859fcf0eb9537ea5657277b7f3b18af.tar.gz
Don't copy parameter annotations when creating a ParameterSpec. (#770)
* Don't copy parameter annotations when creating a ParameterSpec. This further preserves the behaviour discussed in https://github.com/square/javapoet/issues/482. Unifying it for both MethodSpec.overriding and ParameterSpec.get. * Add compilation test for when overriding a method with private annotations. * Address PR comments: * Remove unused import * Rename newly added test
-rw-r--r--src/main/java/com/squareup/javapoet/MethodSpec.java12
-rw-r--r--src/main/java/com/squareup/javapoet/ParameterSpec.java10
-rw-r--r--src/test/java/com/squareup/javapoet/MethodSpecTest.java26
-rw-r--r--src/test/java/com/squareup/javapoet/ParameterSpecTest.java2
4 files changed, 30 insertions, 20 deletions
diff --git a/src/main/java/com/squareup/javapoet/MethodSpec.java b/src/main/java/com/squareup/javapoet/MethodSpec.java
index 2284ef5..67722c7 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.LinkedHashSet;
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 final class MethodSpec {
}
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 b8f3129..342e657 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.ArrayList;
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 @@ public final class ParameterSpec {
public static ParameterSpec get(VariableElement element) {
checkArgument(element.getKind().equals(ElementKind.PARAMETER), "element is not a parameter");
- // Copy over any annotations from element.
- List<AnnotationSpec> 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 b768351..824f476 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.ExecutableElement;
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 @@ public final class MethodSpecTest {
}
}
+ 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 c3effca..8585986 100644
--- a/src/test/java/com/squareup/javapoet/ParameterSpecTest.java
+++ b/src/test/java/com/squareup/javapoet/ParameterSpecTest.java
@@ -99,7 +99,7 @@ public class ParameterSpecTest {
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() {