From 2063666c382f8fd0b35811db0d761c5b6ba18484 Mon Sep 17 00:00:00 2001 From: Egor Andreevici Date: Mon, 20 Jan 2020 08:53:53 -0600 Subject: [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6011c8d..1b04f78 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.squareup javapoet - 1.12.1 + 1.13.0-SNAPSHOT JavaPoet Use beautiful Java code to generate beautiful Java code. -- cgit v1.2.3 From 44622704248975ca398b90b4385005fdddeb35f9 Mon Sep 17 00:00:00 2001 From: Egor Andreevici Date: Mon, 20 Jan 2020 08:58:04 -0600 Subject: Update changelog for 1.12.1 --- CHANGELOG.md | 6 ++++++ README.md | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e02a975..0eed1ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Change Log ========== +JavaPoet 1.12.1 *(2020-01-20)* +----------------------------- + + * Fix: Ignore parameter annotations in `MethodSpec.overriding()`. + + JavaPoet 1.12.0 *(2020-01-09)* ----------------------------- diff --git a/README.md b/README.md index 0b627aa..b38a5d1 100644 --- a/README.md +++ b/README.md @@ -892,12 +892,12 @@ Download [the latest .jar][dl] or depend via Maven: com.squareup javapoet - 1.12.0 + 1.12.1 ``` or Gradle: ```groovy -compile 'com.squareup:javapoet:1.12.0' +compile 'com.squareup:javapoet:1.12.1' ``` Snapshots of the development version are available in [Sonatype's `snapshots` repository][snap]. -- cgit v1.2.3 From 622e07eb0859fcf0eb9537ea5657277b7f3b18af Mon Sep 17 00:00:00 2001 From: Daniel Santiago Date: Mon, 20 Apr 2020 08:53:48 -0700 Subject: 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 --- .../java/com/squareup/javapoet/MethodSpec.java | 12 +--------- .../java/com/squareup/javapoet/ParameterSpec.java | 10 ++------- .../java/com/squareup/javapoet/MethodSpecTest.java | 26 ++++++++++++++++++++++ .../com/squareup/javapoet/ParameterSpecTest.java | 2 +- 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 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() { -- cgit v1.2.3 From 4135ccbc902eac2f2bfc063aacd8b3e7864e1ab5 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Mon, 20 Apr 2020 11:56:24 -0400 Subject: Static import CompilationSubject.assertThat --- src/test/java/com/squareup/javapoet/MethodSpecTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/squareup/javapoet/MethodSpecTest.java b/src/test/java/com/squareup/javapoet/MethodSpecTest.java index 824f476..e180f20 100644 --- a/src/test/java/com/squareup/javapoet/MethodSpecTest.java +++ b/src/test/java/com/squareup/javapoet/MethodSpecTest.java @@ -36,15 +36,14 @@ 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.CompilationSubject.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; import static org.junit.Assert.fail; @@ -270,7 +269,7 @@ public final class MethodSpecTest { .build(); JavaFileObject jfo = JavaFile.builder(implClassName.packageName, type).build().toJavaFileObject(); Compilation compilation = javac().compile(jfo); - CompilationSubject.assertThat(compilation).succeeded(); + assertThat(compilation).succeeded(); } @Test public void equalsAndHashCode() { -- cgit v1.2.3 From a5f4f0f2ada5c8040d7a02db9b423093f051b1d6 Mon Sep 17 00:00:00 2001 From: Jason O'Brien Date: Wed, 3 Jun 2020 20:23:44 -0500 Subject: Add support for explicit receiver parameters Annotated "this" arguments for instance methods and non-static nested class constructors were added in Java 8. This special cases "this" and "OuterClass.this" so that they are allowed as parameter names. --- .../java/com/squareup/javapoet/ParameterSpec.java | 11 ++++++++++- .../java/com/squareup/javapoet/ParameterSpecTest.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/squareup/javapoet/ParameterSpec.java b/src/main/java/com/squareup/javapoet/ParameterSpec.java index 342e657..8b2b6ed 100644 --- a/src/main/java/com/squareup/javapoet/ParameterSpec.java +++ b/src/main/java/com/squareup/javapoet/ParameterSpec.java @@ -103,9 +103,18 @@ public final class ParameterSpec { return result; } + private static boolean isValidParameterName(String name) { + // Allow "this" for explicit receiver parameters + // See https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.1. + if (name.endsWith(".this")) { + return SourceVersion.isIdentifier(name.substring(0, name.length() - ".this".length())); + } + return name.equals("this") || SourceVersion.isName(name); + } + public static Builder builder(TypeName type, String name, Modifier... modifiers) { checkNotNull(type, "type == null"); - checkArgument(SourceVersion.isName(name), "not a valid name: %s", name); + checkArgument(isValidParameterName(name), "not a valid name: %s", name); return new Builder(type, name) .addModifiers(modifiers); } diff --git a/src/test/java/com/squareup/javapoet/ParameterSpecTest.java b/src/test/java/com/squareup/javapoet/ParameterSpecTest.java index 8585986..561eebf 100644 --- a/src/test/java/com/squareup/javapoet/ParameterSpecTest.java +++ b/src/test/java/com/squareup/javapoet/ParameterSpecTest.java @@ -60,6 +60,25 @@ public class ParameterSpecTest { assertThat(a.toString()).isEqualTo(b.toString()); } + @Test public void receiverParameterInstanceMethod() { + ParameterSpec.Builder builder = ParameterSpec.builder(int.class, "this"); + assertThat(builder.build().name).isEqualTo("this"); + } + + @Test public void receiverParameterNestedClass() { + ParameterSpec.Builder builder = ParameterSpec.builder(int.class, "Foo.this"); + assertThat(builder.build().name).isEqualTo("Foo.this"); + } + + @Test public void keywordName() { + try { + ParameterSpec.builder(int.class, "super"); + fail(); + } catch (Exception e) { + assertThat(e.getMessage()).isEqualTo("not a valid name: super"); + } + } + @Test public void nullAnnotationsAddition() { try { ParameterSpec.builder(int.class, "foo").addAnnotations(null); -- cgit v1.2.3 From 8705e5ce5befdc0cc47ef57919cf69ab2dde9ff8 Mon Sep 17 00:00:00 2001 From: Egor Andreevici Date: Thu, 18 Jun 2020 10:45:40 -0400 Subject: Update changelog for 1.13.0. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eed1ff..4b88c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Change Log ========== +JavaPoet 1.13.0 *(2020-06-18)* +----------------------------- + + * New: Add support for explicit receiver parameters. + * Fix: Don't copy parameter annotations when creating a `ParameterSpec`. + + JavaPoet 1.12.1 *(2020-01-20)* ----------------------------- -- cgit v1.2.3 From 714e05ca60179285746604452324262b126dcb2d Mon Sep 17 00:00:00 2001 From: Egor Andreevici Date: Thu, 18 Jun 2020 11:11:11 -0400 Subject: [maven-release-plugin] prepare release javapoet-1.13.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b04f78..04ecc62 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.squareup javapoet - 1.13.0-SNAPSHOT + 1.13.0 JavaPoet Use beautiful Java code to generate beautiful Java code. -- cgit v1.2.3