diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 314a3a50..96c4cfce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -micronaut = "4.6.6" +micronaut = "4.7.0" micronaut-docs = "2.0.0" micronaut-test = "4.1.0" managed-kotlinpoet = "1.18.1" diff --git a/sourcegen-generator-kotlin/src/main/kotlin/io/micronaut/sourcegen/KotlinPoetSourceGenerator.kt b/sourcegen-generator-kotlin/src/main/kotlin/io/micronaut/sourcegen/KotlinPoetSourceGenerator.kt index 02194e8e..9b88ba71 100644 --- a/sourcegen-generator-kotlin/src/main/kotlin/io/micronaut/sourcegen/KotlinPoetSourceGenerator.kt +++ b/sourcegen-generator-kotlin/src/main/kotlin/io/micronaut/sourcegen/KotlinPoetSourceGenerator.kt @@ -954,6 +954,27 @@ class KotlinPoetSourceGenerator : SourceGenerator { .add(renderExpressionCode(objectDef, methodDef, expressionDef.right)) .build() } + if (expressionDef is NewArrayOfSize) { + return CodeBlock.of( + "arrayOfNulls<%T>(%L)", + asType(expressionDef.type.componentType, objectDef), + expressionDef.size + ) + } + if (expressionDef is NewArrayInitialized) { + val builder: CodeBlock.Builder = CodeBlock.builder() + builder.add("arrayOf<%T>(", asType(expressionDef.type.componentType, objectDef)) + val iterator: Iterator = expressionDef.expressions.iterator() + while (iterator.hasNext()) { + val expression = iterator.next() + builder.add(renderExpressionCode(objectDef, methodDef, expression)) + if (iterator.hasNext()) { + builder.add(",") + } + } + builder.add(")") + return builder.build() + } if (expressionDef is PrimitiveInstance) { return renderExpressionCode(objectDef, methodDef, expressionDef.value) } diff --git a/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateArrayVisitor.java b/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateArrayVisitor.java index 53703738..ca2496f0 100644 --- a/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateArrayVisitor.java +++ b/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateArrayVisitor.java @@ -40,10 +40,10 @@ public final class GenerateArrayVisitor implements TypeElementVisitor arrayType.instantiateArray(10).returning())) .build(); @@ -51,7 +51,7 @@ public void visitClass(ClassElement element, VisitorContext context) { writeObject(element, context, arrayClassDef1); ClassDef arrayClassDef2 = ClassDef.builder(element.getPackageName() + ".Array2") - .addMethod(MethodDef.builder("test").addParameter("param", String.class) + .addMethod(MethodDef.builder("test").addParameter("param", TypeDef.STRING) .addModifiers(Modifier.PUBLIC) .build((self, parameterDefs) -> arrayType.instantiateArray( diff --git a/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateIfsPredicateVisitor.java b/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateIfsPredicateVisitor.java index 7b79c229..41b2c60e 100644 --- a/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateIfsPredicateVisitor.java +++ b/test-suite-custom-generators/src/main/java/io/micronaut/sourcegen/custom/visitor/GenerateIfsPredicateVisitor.java @@ -54,13 +54,15 @@ public void visitClass(ClassElement element, VisitorContext context) { Class implementsType = Predicate.class; + TypeDef paramType = TypeDef.OBJECT.makeNullable(); + ClassDef ifPredicateDef = ClassDef.builder(element.getPackageName() + ".IfPredicate") - .addSuperinterface(TypeDef.parameterized(implementsType, Object.class)) - .addMethod(MethodDef.builder("test").addParameter(PARAM, Object.class) + .addSuperinterface(TypeDef.parameterized(implementsType, paramType)) + .addMethod(MethodDef.builder("test").addParameter(PARAM, paramType) .addModifiers(Modifier.PUBLIC) .overrides() .addStatement(new StatementDef.If( - new VariableDef.MethodParameter(PARAM, TypeDef.of(Object.class)).isNull(), + new VariableDef.MethodParameter(PARAM, paramType).isNull(), ExpressionDef.trueValue().returning() )) .addStatement(ExpressionDef.falseValue().returning()) @@ -71,12 +73,12 @@ public void visitClass(ClassElement element, VisitorContext context) { writeObject(element, context, sourceGenerator, ifPredicateDef); ClassDef ifNonPredicateDef = ClassDef.builder(element.getPackageName() + ".IfNonPredicate") - .addSuperinterface(TypeDef.parameterized(implementsType, Object.class)) - .addMethod(MethodDef.builder("test").addParameter(PARAM, Object.class) + .addSuperinterface(TypeDef.parameterized(implementsType, paramType)) + .addMethod(MethodDef.builder("test").addParameter(PARAM, paramType) .addModifiers(Modifier.PUBLIC) .overrides() .addStatement( - new VariableDef.MethodParameter(PARAM, TypeDef.of(Object.class)) + new VariableDef.MethodParameter(PARAM, paramType) .isNonNull() .asConditionIf(ExpressionDef.trueValue().returning()) ) @@ -88,14 +90,14 @@ public void visitClass(ClassElement element, VisitorContext context) { writeObject(element, context, sourceGenerator, ifNonPredicateDef); ClassDef ifElsePredicateDef = ClassDef.builder(element.getPackageName() + ".IfElsePredicate") - .addSuperinterface(TypeDef.parameterized(implementsType, Object.class)) - .addMethod(MethodDef.builder("test").addParameter(PARAM, Object.class) + .addSuperinterface(TypeDef.parameterized(implementsType, paramType)) + .addMethod(MethodDef.builder("test").addParameter(PARAM, paramType) .addModifiers(Modifier.PUBLIC) .overrides() .addStatement(new StatementDef.IfElse( new ExpressionDef.Condition( " == ", - new VariableDef.MethodParameter(PARAM, TypeDef.of(Object.class)), + new VariableDef.MethodParameter(PARAM, paramType), new ExpressionDef.Constant(TypeDef.of(Object.class), null) ), new StatementDef.Return( @@ -112,12 +114,12 @@ public void visitClass(ClassElement element, VisitorContext context) { writeObject(element, context, sourceGenerator, ifElsePredicateDef); ClassDef ifNonElsePredicateDef = ClassDef.builder(element.getPackageName() + ".IfNonElsePredicate") - .addSuperinterface(TypeDef.parameterized(implementsType, Object.class)) - .addMethod(MethodDef.builder("test").addParameter(PARAM, Object.class) + .addSuperinterface(TypeDef.parameterized(implementsType, paramType)) + .addMethod(MethodDef.builder("test").addParameter(PARAM, paramType) .addModifiers(Modifier.PUBLIC) .overrides() .addStatement( - new VariableDef.MethodParameter(PARAM, TypeDef.of(Object.class)) + new VariableDef.MethodParameter(PARAM, paramType) .isNull() .asConditionIfElse( ExpressionDef.trueValue().returning(), @@ -131,8 +133,8 @@ public void visitClass(ClassElement element, VisitorContext context) { writeObject(element, context, sourceGenerator, ifNonElsePredicateDef); ClassDef ifNonElseExpressionPredicateDef = ClassDef.builder(element.getPackageName() + ".IfNonElseExpressionPredicate") - .addSuperinterface(TypeDef.parameterized(implementsType, Object.class)) - .addMethod(MethodDef.builder("test").addParameter(PARAM, Object.class) + .addSuperinterface(TypeDef.parameterized(implementsType, paramType)) + .addMethod(MethodDef.builder("test").addParameter(PARAM, paramType) .addModifiers(Modifier.PUBLIC) .overrides() .returns(boolean.class) diff --git a/test-suite-java/src/test/java/io/micronaut/sourcegen/example/IfsPredicateTest.java b/test-suite-java/src/test/java/io/micronaut/sourcegen/example/IfsPredicateTest.java index bb0fa7ad..4a46f6e0 100644 --- a/test-suite-java/src/test/java/io/micronaut/sourcegen/example/IfsPredicateTest.java +++ b/test-suite-java/src/test/java/io/micronaut/sourcegen/example/IfsPredicateTest.java @@ -17,10 +17,7 @@ import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertTrue; class IfsPredicateTest { diff --git a/test-suite-kotlin/src/main/kotlin/io/micronaut/sourcegen/example/Trigger.kt b/test-suite-kotlin/src/main/kotlin/io/micronaut/sourcegen/example/Trigger.kt index 768c1ae6..b2d34981 100644 --- a/test-suite-kotlin/src/main/kotlin/io/micronaut/sourcegen/example/Trigger.kt +++ b/test-suite-kotlin/src/main/kotlin/io/micronaut/sourcegen/example/Trigger.kt @@ -15,11 +15,13 @@ */ package io.micronaut.sourcegen.example -import io.micronaut.sourcegen.custom.example.GenerateInterface +import io.micronaut.sourcegen.custom.example.GenerateArray +import io.micronaut.sourcegen.custom.example.GenerateIfsPredicate import io.micronaut.sourcegen.custom.example.GenerateMyBean1 import io.micronaut.sourcegen.custom.example.GenerateMyBean2 import io.micronaut.sourcegen.custom.example.GenerateMyBean3 import io.micronaut.sourcegen.custom.example.GenerateMyEnum1 +import io.micronaut.sourcegen.custom.example.GenerateInterface import io.micronaut.sourcegen.custom.example.GenerateMyRecord1 import io.micronaut.sourcegen.custom.example.GenerateMyRepository1 import io.micronaut.sourcegen.custom.example.GenerateSwitch @@ -31,5 +33,7 @@ import io.micronaut.sourcegen.custom.example.GenerateSwitch @GenerateMyRepository1 @GenerateMyRecord1 @GenerateMyEnum1 +@GenerateIfsPredicate @GenerateSwitch +@GenerateArray class Trigger diff --git a/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/ArrayTest.kt b/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/ArrayTest.kt new file mode 100644 index 00000000..049407e9 --- /dev/null +++ b/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/ArrayTest.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2003-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micronaut.sourcegen.example + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test + +internal class ArrayTest { + @Test + fun test1() { + val array1 = Array1() + val test = array1.test("") + Assertions.assertArrayEquals(arrayOfNulls(10), test) + } + + @Test + fun test2() { + val array1 = Array2() + val test = array1.test("") + Assertions.assertArrayEquals(arrayOf("A", "B", "C"), test) + } +} diff --git a/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/IfsPredicateTest.kt b/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/IfsPredicateTest.kt new file mode 100644 index 00000000..38b73d3b --- /dev/null +++ b/test-suite-kotlin/src/test/kotlin/io/micronaut/sourcegen/example/IfsPredicateTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2003-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micronaut.sourcegen.example + +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +internal class IfsPredicateTest { + @Test + fun testIf() { + val predicate: IfPredicate = IfPredicate() + assertTrue(predicate.test(null)) + assertFalse(predicate.test("")) + } + + @Test + fun testIfNon() { + val predicate: IfNonPredicate = IfNonPredicate() + assertFalse(predicate.test(null)) + assertTrue(predicate.test("")) + } + + @Test + fun testIfElse() { + val predicate: IfElsePredicate = IfElsePredicate() + assertTrue(predicate.test(null)) + assertFalse(predicate.test("")) + } + + @Test + fun testIfElseNon() { + val predicate: IfNonElsePredicate = IfNonElsePredicate() + assertTrue(predicate.test(null)) + assertFalse(predicate.test("")) + } + + @Test + fun testIfExpressionELse() { + val predicate: IfNonElseExpressionPredicate = IfNonElseExpressionPredicate() + assertTrue(predicate.test(null)) + assertFalse(predicate.test("")) + } +}