Skip to content

Commit e9e2304

Browse files
authored
Merge pull request quarkusio#46958 from stuartwdouglas/code-gen-gradle
Allow custom code generators in gradle
2 parents 23cef13 + bdabc31 commit e9e2304

File tree

3 files changed

+56
-15
lines changed

3 files changed

+56
-15
lines changed

devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/QuarkusPlugin.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -207,19 +207,22 @@ private void registerTasks(Project project, QuarkusPluginExtension quarkusExt) {
207207

208208
// quarkusGenerateCode
209209
TaskProvider<QuarkusGenerateCode> quarkusGenerateCode = tasks.register(QUARKUS_GENERATE_CODE_TASK_NAME,
210-
QuarkusGenerateCode.class, LaunchMode.NORMAL, SourceSet.MAIN_SOURCE_SET_NAME);
210+
QuarkusGenerateCode.class, LaunchMode.NORMAL, SourceSet.MAIN_SOURCE_SET_NAME,
211+
quarkusExt.getCodeGenerationInputs().get());
211212
quarkusGenerateCode.configure(task -> configureGenerateCodeTask(task, quarkusGenerateAppModelTask,
212213
QuarkusGenerateCode.QUARKUS_GENERATED_SOURCES));
213214
// quarkusGenerateCodeDev
214215
TaskProvider<QuarkusGenerateCode> quarkusGenerateCodeDev = tasks.register(QUARKUS_GENERATE_CODE_DEV_TASK_NAME,
215-
QuarkusGenerateCode.class, LaunchMode.DEVELOPMENT, SourceSet.MAIN_SOURCE_SET_NAME);
216+
QuarkusGenerateCode.class, LaunchMode.DEVELOPMENT, SourceSet.MAIN_SOURCE_SET_NAME,
217+
quarkusExt.getCodeGenerationInputs().get());
216218
quarkusGenerateCodeDev.configure(task -> {
217219
task.dependsOn(quarkusGenerateCode);
218220
configureGenerateCodeTask(task, quarkusGenerateDevAppModelTask, QuarkusGenerateCode.QUARKUS_GENERATED_SOURCES);
219221
});
220222
// quarkusGenerateCodeTests
221223
TaskProvider<QuarkusGenerateCode> quarkusGenerateCodeTests = tasks.register(QUARKUS_GENERATE_CODE_TESTS_TASK_NAME,
222-
QuarkusGenerateCode.class, LaunchMode.TEST, SourceSet.TEST_SOURCE_SET_NAME);
224+
QuarkusGenerateCode.class, LaunchMode.TEST, SourceSet.TEST_SOURCE_SET_NAME,
225+
quarkusExt.getCodeGenerationInputs().get());
223226
quarkusGenerateCodeTests.configure(task -> {
224227
task.dependsOn("compileQuarkusTestGeneratedSourcesJava");
225228
configureGenerateCodeTask(task, quarkusGenerateTestAppModelTask,
@@ -480,13 +483,17 @@ public void execute(Task task) {
480483
SourceSet generatedSourceSet = sourceSets.getByName(QuarkusGenerateCode.QUARKUS_GENERATED_SOURCES);
481484
SourceSet generatedTestSourceSet = sourceSets.getByName(QuarkusGenerateCode.QUARKUS_TEST_GENERATED_SOURCES);
482485

483-
// Register the quarkus-generated-code
484-
for (String provider : QuarkusGenerateCode.CODE_GENERATION_PROVIDER) {
485-
mainSourceSet.getJava().srcDir(
486-
new File(generatedSourceSet.getJava().getClassesDirectory().get().getAsFile(), provider));
487-
testSourceSet.getJava().srcDir(
488-
new File(generatedTestSourceSet.getJava().getClassesDirectory().get().getAsFile(), provider));
489-
}
486+
project.afterEvaluate(project1 -> {
487+
// Register the quarkus-generated-code
488+
for (String provider : quarkusExt.getCodeGenerationProviders().get()) {
489+
490+
mainSourceSet.getJava().srcDir(
491+
new File(generatedSourceSet.getJava().getClassesDirectory().get().getAsFile(), provider));
492+
testSourceSet.getJava().srcDir(
493+
new File(generatedTestSourceSet.getJava().getClassesDirectory().get().getAsFile(),
494+
provider));
495+
}
496+
});
490497
});
491498

492499
project.getPlugins().withId("org.jetbrains.kotlin.jvm", plugin -> {

devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/extension/QuarkusPluginExtension.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.nio.file.Path;
77
import java.nio.file.Paths;
88
import java.util.LinkedHashSet;
9+
import java.util.List;
910
import java.util.Map;
1011
import java.util.Objects;
1112
import java.util.Set;
@@ -44,10 +45,15 @@
4445
import io.smallrye.config.SmallRyeConfig;
4546

4647
public abstract class QuarkusPluginExtension extends AbstractQuarkusExtension {
48+
// TODO dynamically load generation provider, or make them write code directly in quarkus-generated-sources
49+
public static final String[] CODE_GENERATION_PROVIDER = new String[] { "grpc", "avdl", "avpr", "avsc" };
50+
public static final String[] CODE_GENERATION_INPUT = new String[] { "proto", "avro" };
4751
private final SourceSetExtension sourceSetExtension;
4852

4953
private final Property<Boolean> cacheLargeArtifacts;
5054
private final Property<Boolean> cleanupBuildOutput;
55+
private final ListProperty<String> codeGenerationProviders;
56+
private final ListProperty<String> codeGenerationInputs;
5157

5258
public QuarkusPluginExtension(Project project) {
5359
super(project);
@@ -56,6 +62,10 @@ public QuarkusPluginExtension(Project project) {
5662
.convention(true);
5763
this.cacheLargeArtifacts = project.getObjects().property(Boolean.class)
5864
.convention(!System.getenv().containsKey("CI"));
65+
this.codeGenerationProviders = project.getObjects().listProperty(String.class)
66+
.convention(List.of(CODE_GENERATION_PROVIDER));
67+
this.codeGenerationInputs = project.getObjects().listProperty(String.class)
68+
.convention(List.of(CODE_GENERATION_INPUT));
5969

6070
this.sourceSetExtension = new SourceSetExtension();
6171
}
@@ -147,6 +157,30 @@ public void setCacheLargeArtifacts(boolean cacheLargeArtifacts) {
147157
this.cacheLargeArtifacts.set(cacheLargeArtifacts);
148158
}
149159

160+
public void setCodeGenerationInputs(List<String> codeGenerationInputs) {
161+
this.codeGenerationInputs.set(codeGenerationInputs);
162+
}
163+
164+
/**
165+
* The directories of code generation inputs, only needed if using a customer extension that provides its own code
166+
* generator.
167+
*/
168+
public ListProperty<String> getCodeGenerationInputs() {
169+
return codeGenerationInputs;
170+
}
171+
172+
public void setCodeGenerationProviders(List<String> codeGenerationProviders) {
173+
this.codeGenerationProviders.set(codeGenerationProviders);
174+
}
175+
176+
/**
177+
* The identifiers of the code generation providers, only needed if using a customer extension that provides its own code
178+
* generator.
179+
*/
180+
public ListProperty<String> getCodeGenerationProviders() {
181+
return codeGenerationProviders;
182+
}
183+
150184
public String finalName() {
151185
return getFinalName().get();
152186
}

devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusGenerateCode.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Collections;
88
import java.util.HashMap;
99
import java.util.HashSet;
10+
import java.util.List;
1011
import java.util.Map;
1112
import java.util.Set;
1213
import java.util.TreeMap;
@@ -41,9 +42,6 @@ public abstract class QuarkusGenerateCode extends QuarkusTask {
4142

4243
public static final String QUARKUS_GENERATED_SOURCES = "quarkus-generated-sources";
4344
public static final String QUARKUS_TEST_GENERATED_SOURCES = "quarkus-test-generated-sources";
44-
// TODO dynamically load generation provider, or make them write code directly in quarkus-generated-sources
45-
public static final String[] CODE_GENERATION_PROVIDER = new String[] { "grpc", "avdl", "avpr", "avsc" };
46-
public static final String[] CODE_GENERATION_INPUT = new String[] { "proto", "avro" };
4745

4846
private Set<Path> sourcesDirectories;
4947
private FileCollection compileClasspath;
@@ -52,13 +50,15 @@ public abstract class QuarkusGenerateCode extends QuarkusTask {
5250
private final String inputSourceSetName;
5351

5452
private final QuarkusPluginExtensionView extensionView;
53+
private final List<String> codeGenInput;
5554

5655
@Inject
57-
public QuarkusGenerateCode(LaunchMode launchMode, String inputSourceSetName) {
56+
public QuarkusGenerateCode(LaunchMode launchMode, String inputSourceSetName, List<String> codeGenInput) {
5857
super("Performs Quarkus pre-build preparations, such as sources generation", true);
5958
this.launchMode = launchMode;
6059
this.inputSourceSetName = inputSourceSetName;
6160
this.extensionView = getProject().getObjects().newInstance(QuarkusPluginExtensionView.class, extension());
61+
this.codeGenInput = codeGenInput;
6262

6363
}
6464

@@ -98,7 +98,7 @@ public Set<File> getInputDirectory() {
9898

9999
Path src = projectDir.toPath().resolve("src").resolve(inputSourceSetName);
100100

101-
for (String input : CODE_GENERATION_INPUT) {
101+
for (String input : codeGenInput) {
102102
Path providerSrcDir = src.resolve(input);
103103
if (Files.exists(providerSrcDir)) {
104104
inputDirectories.add(providerSrcDir.toFile());

0 commit comments

Comments
 (0)