Skip to content

Commit 3bf438e

Browse files
authored
Java generator: try-catch-finally, synchronized + super method invocation (#259)
1 parent 5f9de86 commit 3bf438e

File tree

7 files changed

+551
-98
lines changed

7 files changed

+551
-98
lines changed

sourcegen-generator-java/src/main/java/io/micronaut/sourcegen/JavaPoetSourceGenerator.java

+140-90
Large diffs are not rendered by default.

test-suite-bytecode/src/test/java/io/micronaut/sourcegen/example/MethodInvokerTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,35 @@ public void testStaticMethod() {
8989
);
9090
}
9191

92+
@Test
93+
public void testInterfaceSuperMethod() {
94+
Assertions.assertEquals(
95+
"ABCSTT102",
96+
new MethodRepositoryInvoker() {
97+
98+
@Override
99+
public String interfaceMethod(String string, Integer integer, int i) {
100+
throw new UnsupportedOperationException();
101+
}
102+
103+
@Override
104+
public double interfaceMethodReturnsDouble() {
105+
throw new UnsupportedOperationException();
106+
}
107+
108+
@Override
109+
public long interfaceMethodReturnsLong() {
110+
throw new UnsupportedOperationException();
111+
}
112+
113+
@Override
114+
public int interfaceMethodReturnsInt() {
115+
throw new UnsupportedOperationException();
116+
}
117+
}.defaultMethod("STT", 100, 2)
118+
);
119+
}
120+
92121
@Test
93122
public void testDefaultMethodIgnoreResult() {
94123
Assertions.assertEquals(

test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateMethodInvocationVisitor.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micronaut.core.annotation.NonNull;
2020
import io.micronaut.core.reflect.ReflectionUtils;
2121
import io.micronaut.inject.ast.ClassElement;
22+
import io.micronaut.inject.ast.MethodElement;
2223
import io.micronaut.inject.visitor.TypeElementVisitor;
2324
import io.micronaut.inject.visitor.VisitorContext;
2425
import io.micronaut.sourcegen.custom.example.GenerateMethodInvocation;
@@ -28,6 +29,7 @@
2829
import io.micronaut.sourcegen.model.ClassTypeDef;
2930
import io.micronaut.sourcegen.model.ExpressionDef;
3031
import io.micronaut.sourcegen.model.FieldDef;
32+
import io.micronaut.sourcegen.model.JavaIdioms;
3133
import io.micronaut.sourcegen.model.MethodDef;
3234
import io.micronaut.sourcegen.model.StatementDef;
3335
import io.micronaut.sourcegen.model.TypeDef;
@@ -172,6 +174,22 @@ public void visitClass(ClassElement element, VisitorContext context) {
172174

173175
sourceGenerator.write(classDef, context, element);
174176

177+
ClassTypeDef myRepoType = ClassTypeDef.of(myRepository);
178+
MethodElement defaultMethod = myRepository.findMethod("defaultMethod").get();
179+
ClassDef interfaceSuperInvokerDef = ClassDef.builder("io.micronaut.sourcegen.example.MethodRepositoryInvoker")
180+
.addModifiers(Modifier.ABSTRACT)
181+
.addSuperinterface(myRepoType)
182+
.addMethod(MethodDef.override(defaultMethod)
183+
.build((aThis, methodParameters) ->
184+
JavaIdioms.concatStrings(
185+
ExpressionDef.constant("ABC"),
186+
aThis.superRef(myRepoType)
187+
.invoke(defaultMethod, methodParameters)
188+
).returning())
189+
).build();
190+
191+
sourceGenerator.write(interfaceSuperInvokerDef, context, element);
192+
175193
FieldDef targetField = FieldDef.builder("target", TypeDef.OBJECT).addModifiers(Modifier.PRIVATE).build();
176194
FieldDef lockField = FieldDef.builder("lock", ClassTypeDef.of(ReentrantReadWriteLock.class))
177195
.addModifiers(Modifier.PRIVATE, Modifier.FINAL)
@@ -224,7 +242,9 @@ public void visitClass(ClassElement element, VisitorContext context) {
224242
methodParameters.get(1).invoke("getAndIncrement", TypeDef.Primitive.INT),
225243
StatementDef.doTry(
226244
StatementDef.multi(
227-
ClassTypeDef.of(IllegalStateException.class).instantiate().doThrow(),
245+
ExpressionDef.trueValue().isTrue().doIf(
246+
ClassTypeDef.of(IllegalStateException.class).instantiate().doThrow()
247+
),
228248
methodParameters.get(1).invoke("getAndIncrement", TypeDef.Primitive.INT),
229249
aThis.field(targetField).returning()
230250
)
@@ -238,7 +258,9 @@ public void visitClass(ClassElement element, VisitorContext context) {
238258
methodParameters.get(1).invoke("getAndIncrement", TypeDef.Primitive.INT),
239259
StatementDef.doTry(
240260
StatementDef.multi(
241-
ClassTypeDef.of(IllegalStateException.class).instantiate(ExpressionDef.constant("Bam")).doThrow(),
261+
ExpressionDef.trueValue().isTrue().doIf(
262+
ClassTypeDef.of(IllegalStateException.class).instantiate(ExpressionDef.constant("Bam")).doThrow()
263+
),
242264
methodParameters.get(1).invoke("getAndIncrement", TypeDef.Primitive.INT),
243265
aThis.field(targetField).returning()
244266
)

test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateMyRepository2Visitor.java

-6
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,14 @@
2020
import io.micronaut.inject.ast.ClassElement;
2121
import io.micronaut.inject.visitor.TypeElementVisitor;
2222
import io.micronaut.inject.visitor.VisitorContext;
23-
import io.micronaut.sourcegen.custom.example.GenerateMyRepository1;
2423
import io.micronaut.sourcegen.custom.example.GenerateMyRepository2;
2524
import io.micronaut.sourcegen.generator.SourceGenerator;
2625
import io.micronaut.sourcegen.generator.SourceGenerators;
27-
import io.micronaut.sourcegen.model.ClassDef;
28-
import io.micronaut.sourcegen.model.ClassTypeDef;
2926
import io.micronaut.sourcegen.model.InterfaceDef;
30-
import io.micronaut.sourcegen.model.MethodDef;
31-
import io.micronaut.sourcegen.model.PropertyDef;
3227
import io.micronaut.sourcegen.model.TypeDef;
3328

3429
import javax.lang.model.element.Modifier;
3530
import java.util.List;
36-
import java.util.Optional;
3731

3832
@Internal
3933
public final class GenerateMyRepository2Visitor implements TypeElementVisitor<GenerateMyRepository2, Object> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright 2017-2024 original authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.micronaut.sourcegen.example;
17+
18+
public interface MyRepository {
19+
20+
static String staticMethod(String string, Integer integer, int i) {
21+
return string + (integer + i);
22+
}
23+
24+
default String defaultMethod(String string, Integer integer, int i) {
25+
return string + (integer + i);
26+
}
27+
28+
String interfaceMethod(String string, Integer integer, int i);
29+
30+
double interfaceMethodReturnsDouble();
31+
32+
long interfaceMethodReturnsLong();
33+
34+
int interfaceMethodReturnsInt();
35+
36+
}

test-suite-java/src/main/java/io/micronaut/sourcegen/example/Trigger.java

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
@GenerateAnnotatedType
3535
@GenerateInnerTypes
3636
@GenerateMyEnum2
37+
@GenerateMethodInvocation
3738
public class Trigger {
3839
public List<String> copyAddresses;
3940
}

0 commit comments

Comments
 (0)