diff options
author | Jason O'Brien <jasonobrien@google.com> | 2020-06-03 20:23:44 -0500 |
---|---|---|
committer | Jason O'Brien <jasonobrien@google.com> | 2020-06-03 20:23:44 -0500 |
commit | a5f4f0f2ada5c8040d7a02db9b423093f051b1d6 (patch) | |
tree | 4a2275d2f04a232fe4d44717e805dffbe8f95e5e | |
parent | 304176ef98fa80f35cb49ed130620c7b0ecdf5a6 (diff) | |
download | javapoet-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.java | 11 | ||||
-rw-r--r-- | src/test/java/com/squareup/javapoet/ParameterSpecTest.java | 19 |
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); |