Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions kotlin/internal/jvm/compile.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@ def _run_ksp_builder_actions(
A struct containing KSP outputs
"""
ksp_generated_java_srcjar = ctx.actions.declare_file(ctx.label.name + "-ksp-kt-gensrc.jar")
ksp_generated_classes_jar = ctx.actions.declare_file(ctx.label.name + "-ksp-kt-genclasses.jar")

_run_kt_builder_action(
ctx = ctx,
Expand All @@ -422,12 +423,13 @@ def _run_ksp_builder_actions(
plugins = plugins,
outputs = {
"ksp_generated_java_srcjar": ksp_generated_java_srcjar,
"ksp_generated_classes_jar": ksp_generated_classes_jar,
},
build_kotlin = False,
mnemonic = "KotlinKsp",
)

return struct(ksp_generated_class_jar = ksp_generated_java_srcjar)
return struct(ksp_generated_class_jar = ksp_generated_classes_jar, ksp_generated_src_jar = ksp_generated_java_srcjar)

def _run_kt_builder_action(
ctx,
Expand Down Expand Up @@ -759,6 +761,7 @@ def _run_kt_java_builder_actions(

# Run KSP
ksp_generated_class_jar = None
ksp_generated_src_jar = None
if has_kt_sources and ksp_annotation_processors:
ksp_outputs = _run_ksp_builder_actions(
ctx,
Expand All @@ -772,7 +775,9 @@ def _run_kt_java_builder_actions(
plugins = plugins,
)
ksp_generated_class_jar = ksp_outputs.ksp_generated_class_jar
generated_ksp_src_jars.append(ksp_generated_class_jar)
output_jars.append(ksp_generated_class_jar)
ksp_generated_src_jar = ksp_outputs.ksp_generated_src_jar
generated_ksp_src_jars.append(ksp_generated_src_jar)

java_infos = []

Expand Down Expand Up @@ -897,7 +902,7 @@ def _run_kt_java_builder_actions(
if annotation_processors or ksp_annotation_processors:
is_ksp = (ksp_annotation_processors != None)
processor = ksp_annotation_processors if is_ksp else annotation_processors
gen_jar = ksp_generated_class_jar if is_ksp else ap_generated_src_jar
gen_jar = ksp_generated_src_jar if is_ksp else ap_generated_src_jar
outputs_list = [java_info.outputs for java_info in java_infos]
annotation_processing = _create_annotation_processing(
annotation_processors = processor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ class KotlinBuilder
REDUCED_CLASSPATH_MODE("--reduced_classpath_mode"),
INSTRUMENT_COVERAGE("--instrument_coverage"),
KSP_GENERATED_JAVA_SRCJAR("--ksp_generated_java_srcjar"),
KSP_GENERATED_CLASSES_JAR("--ksp_generated_classes_jar"),
}
}

Expand Down Expand Up @@ -217,6 +218,9 @@ class KotlinBuilder
argMap.optionalSingle(KotlinBuilderFlags.KSP_GENERATED_JAVA_SRCJAR)?.let {
generatedKspSrcJar = it
}
argMap.optionalSingle(KotlinBuilderFlags.KSP_GENERATED_CLASSES_JAR)?.let {
generatedKspClassesJar = it
}
}

with(root.directoriesBuilder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,21 @@ internal fun JvmCompilationTask.createGeneratedKspKotlinSrcJar() {
}
}

/**
* Produce a jar of classes generated by KSP.
*/
internal fun JvmCompilationTask.createdGeneratedKspClassesJar() {
JarCreator(
path = Paths.get(outputs.generatedKspClassesJar),
normalize = true,
verbose = false,
).also {
it.addDirectory(Paths.get(directories.generatedClasses))
it.setJarOwner(info.label, info.bazelRuleKind)
it.execute()
}
}

/**
* Compiles Kotlin sources to classes. Does not compile Java sources.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ class KotlinJvmTaskExecutor
if (outputs.generatedKspSrcJar.isNotEmpty()) {
context.execute("creating KSP generated src jar", ::createGeneratedKspKotlinSrcJar)
}
if (outputs.generatedKspClassesJar.isNotEmpty()) {
context.execute("creating KSP generated classes jar", ::createdGeneratedKspClassesJar)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you be able to add some tests for this to KotlinJvmKspAssertionTest?

Copy link
Contributor Author

@smocherla-brex smocherla-brex Jun 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't able to add tests with Micronaut because that'd require upgrading the repo to Java 17 (which introduces other breakages and probably out of scope for this PR). I'm not aware of other KSP processors that generate bytecode on the fly, so I wrote an example/dummy processor that generates class files and then added test cases to validate those class files are present in the final jar. Let me know if that works.

}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/protobuf/kotlin_model.proto
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ message JvmCompilationTask {
string generated_class_jar = 7;
// Source jar containing the generated KSP sources.
string generated_ksp_src_jar = 8;
// The path to the jar containing the generated KSP classes
string generated_ksp_classes_jar = 9;
}

message Inputs {
Expand Down