aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason O'Brien <jasonobrien@google.com>2020-06-03 20:23:44 -0500
committerJason O'Brien <jasonobrien@google.com>2020-06-03 20:23:44 -0500
commita5f4f0f2ada5c8040d7a02db9b423093f051b1d6 (patch)
tree4a2275d2f04a232fe4d44717e805dffbe8f95e5e
parent304176ef98fa80f35cb49ed130620c7b0ecdf5a6 (diff)
downloadjavapoet-a5f4f0f2ada5c8040d7a02db9b423093f051b1d6.tar.gz
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.
-rw-r--r--src/main/java/com/squareup/javapoet/ParameterSpec.java11
-rw-r--r--src/test/java/com/squareup/javapoet/ParameterSpecTest.java19
2 files changed, 29 insertions, 1 deletions
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);