diff --git a/buildSrc/src/main/java/io/micronaut/guides/feature/SourcegenJava.java b/buildSrc/src/main/java/io/micronaut/guides/feature/SourcegenJava.java new file mode 100644 index 0000000000..ccae25058c --- /dev/null +++ b/buildSrc/src/main/java/io/micronaut/guides/feature/SourcegenJava.java @@ -0,0 +1,49 @@ +package io.micronaut.guides.feature; + +import io.micronaut.core.annotation.NonNull; +import io.micronaut.starter.application.ApplicationType; +import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.build.RequiresMavenLocal; +import io.micronaut.starter.build.dependencies.Dependency; +import io.micronaut.starter.build.dependencies.Scope; +import io.micronaut.starter.feature.Feature; +import io.micronaut.starter.options.Language; +import jakarta.inject.Singleton; + +@Singleton +public class SourcegenJava implements RequiresMavenLocal { + public static final String ARTIFACT_ID_SOURCEGEN_ANNOTATIONS = "micronaut-sourcegen-annotations"; + public static final String ARTIFACT_ID_SOURCEGEN_GENERATOR_JAVA = "micronaut-sourcegen-generator-java"; + public static final String ARTIFACT_ID_SOURCEGEN_GENERATOR_KOTLIN = "micronaut-sourcegen-generator-kotlin"; + + @Override + public @NonNull String getName() { + return "sourcegen-generator"; + } + + @Override + public boolean supports(ApplicationType applicationType) { + return true; + } + + @Override + public void apply(GeneratorContext generatorContext) { + addDependencies(generatorContext); + } + + protected void addDependencies(GeneratorContext generatorContext) { + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_SOURCEGEN_ANNOTATIONS) + .scope(Scope.COMPILE)); + if (generatorContext.getLanguage() == Language.JAVA) { + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_SOURCEGEN_GENERATOR_JAVA) + .scope(Scope.ANNOTATION_PROCESSOR)); + } else if (generatorContext.getLanguage() == Language.KOTLIN) { + generatorContext.addDependency(Dependency.builder() + .lookupArtifactId(ARTIFACT_ID_SOURCEGEN_GENERATOR_KOTLIN) + .scope(Scope.ANNOTATION_PROCESSOR)); + } + } +} + diff --git a/buildSrc/src/main/resources/pom.xml b/buildSrc/src/main/resources/pom.xml index 20a2254f4f..5f66770aa9 100644 --- a/buildSrc/src/main/resources/pom.xml +++ b/buildSrc/src/main/resources/pom.xml @@ -12,6 +12,21 @@ + + io.micronaut.sourcegen + micronaut-sourcegen-annotations + 1.0.0-SNAPSHOT + + + io.micronaut.sourcegen + micronaut-sourcegen-generator-java + 1.0.0-SNAPSHOT + + + io.micronaut.sourcegen + micronaut-sourcegen-generator-kotlin + 1.0.0-SNAPSHOT + com.github.librepdf openpdf diff --git a/guides/micronaut-sourcegen-builder/java/src/main/java/example/micronaut/Widget.java b/guides/micronaut-sourcegen-builder/java/src/main/java/example/micronaut/Widget.java new file mode 100644 index 0000000000..3ea5ddb2a5 --- /dev/null +++ b/guides/micronaut-sourcegen-builder/java/src/main/java/example/micronaut/Widget.java @@ -0,0 +1,7 @@ +package example.micronaut; + +import io.micronaut.sourcegen.annotations.Builder; + +@Builder +public record Widget(String name, int id) { +} \ No newline at end of file diff --git a/guides/micronaut-sourcegen-builder/java/src/test/java/example/micronaut/WidgetTest.java b/guides/micronaut-sourcegen-builder/java/src/test/java/example/micronaut/WidgetTest.java new file mode 100644 index 0000000000..63494b092a --- /dev/null +++ b/guides/micronaut-sourcegen-builder/java/src/test/java/example/micronaut/WidgetTest.java @@ -0,0 +1,19 @@ +package example.micronaut; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class WidgetTest { + + @Test + void widgetBuilder() { + Widget testWidget = WidgetBuilder.builder() + .name("foo") + .id(1) + .build(); + assertEquals("foo", testWidget.name()); + assertEquals(1, testWidget.id()); + } +} diff --git a/guides/micronaut-sourcegen-builder/kotlin/src/main/kotlin/example/micronaut/Widget.kt b/guides/micronaut-sourcegen-builder/kotlin/src/main/kotlin/example/micronaut/Widget.kt new file mode 100644 index 0000000000..fac582f183 --- /dev/null +++ b/guides/micronaut-sourcegen-builder/kotlin/src/main/kotlin/example/micronaut/Widget.kt @@ -0,0 +1,6 @@ +package example.micronaut + +import io.micronaut.sourcegen.annotations.Builder + +@Builder +data class Widget(val name: String, val id: Int) \ No newline at end of file diff --git a/guides/micronaut-sourcegen-builder/kotlin/src/test/kotlin/example/micronaut/WidgetTest.kt b/guides/micronaut-sourcegen-builder/kotlin/src/test/kotlin/example/micronaut/WidgetTest.kt new file mode 100644 index 0000000000..cda7bda6df --- /dev/null +++ b/guides/micronaut-sourcegen-builder/kotlin/src/test/kotlin/example/micronaut/WidgetTest.kt @@ -0,0 +1,18 @@ +package example.micronaut + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + + +class WidgetTest { + + @Test + fun widgetBuilder() { + val testWidget = WidgetBuilder.builder() + .name("foo") + .id(1) + .build() + assertEquals("foo", testWidget.name) + assertEquals(1, testWidget.id) + } +} diff --git a/guides/micronaut-sourcegen-builder/metadata.json b/guides/micronaut-sourcegen-builder/metadata.json new file mode 100644 index 0000000000..0afec15e72 --- /dev/null +++ b/guides/micronaut-sourcegen-builder/metadata.json @@ -0,0 +1,16 @@ +{ + "title": "Micronaut Source generation @Builder", + "intro": "Learn how to generate a Builder with Micronaut Sourcegen and the @Builder annotation.", + "authors": ["Sergio del Amo"], + "tags": [], + "categories": ["Beyond the Basics"], + "publicationDate": "2024-04-24", + "languages": ["java"], + "apps": [ + { + "validateLicense": false, + "name": "default", + "features": ["sourcegen-generator"] + } + ] +} diff --git a/guides/micronaut-sourcegen-builder/micronaut-sourcegen-builder.adoc b/guides/micronaut-sourcegen-builder/micronaut-sourcegen-builder.adoc new file mode 100644 index 0000000000..e69de29bb2