Skip to content

Commit 17862f9

Browse files
Generate KSP classes jar as output (#1329)
* Generate KSP classes jar as output * Revert unrelated changes * rename var for consistency * Attempt to fix tests * lint * Add tests
1 parent 43a1533 commit 17862f9

File tree

15 files changed

+322
-3
lines changed

15 files changed

+322
-3
lines changed

kotlin/internal/jvm/compile.bzl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ def _run_ksp_builder_actions(
419419
A struct containing KSP outputs
420420
"""
421421
ksp_generated_java_srcjar = ctx.actions.declare_file(ctx.label.name + "-ksp-kt-gensrc.jar")
422+
ksp_generated_classes_jar = ctx.actions.declare_file(ctx.label.name + "-ksp-kt-genclasses.jar")
422423

423424
_run_kt_builder_action(
424425
ctx = ctx,
@@ -433,12 +434,13 @@ def _run_ksp_builder_actions(
433434
plugins = plugins,
434435
outputs = {
435436
"ksp_generated_java_srcjar": ksp_generated_java_srcjar,
437+
"ksp_generated_classes_jar": ksp_generated_classes_jar,
436438
},
437439
build_kotlin = False,
438440
mnemonic = "KotlinKsp",
439441
)
440442

441-
return struct(ksp_generated_class_jar = ksp_generated_java_srcjar)
443+
return struct(ksp_generated_class_jar = ksp_generated_classes_jar, ksp_generated_src_jar = ksp_generated_java_srcjar)
442444

443445
def _run_kt_builder_action(
444446
ctx,
@@ -804,6 +806,7 @@ def _run_kt_java_builder_actions(
804806

805807
# Run KSP
806808
ksp_generated_class_jar = None
809+
ksp_generated_src_jar = None
807810
if has_kt_sources and ksp_annotation_processors:
808811
ksp_outputs = _run_ksp_builder_actions(
809812
ctx,
@@ -817,7 +820,9 @@ def _run_kt_java_builder_actions(
817820
plugins = plugins,
818821
)
819822
ksp_generated_class_jar = ksp_outputs.ksp_generated_class_jar
820-
generated_ksp_src_jars.append(ksp_generated_class_jar)
823+
output_jars.append(ksp_generated_class_jar)
824+
ksp_generated_src_jar = ksp_outputs.ksp_generated_src_jar
825+
generated_ksp_src_jars.append(ksp_generated_src_jar)
821826

822827
java_infos = []
823828

@@ -942,7 +947,7 @@ def _run_kt_java_builder_actions(
942947
if annotation_processors or ksp_annotation_processors:
943948
is_ksp = (ksp_annotation_processors != None)
944949
processor = ksp_annotation_processors if is_ksp else annotation_processors
945-
gen_jar = ksp_generated_class_jar if is_ksp else ap_generated_src_jar
950+
gen_jar = ksp_generated_src_jar if is_ksp else ap_generated_src_jar
946951
outputs_list = [java_info.outputs for java_info in java_infos]
947952
annotation_processing = _create_annotation_processing(
948953
annotation_processors = processor,

src/main/kotlin/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class KotlinBuilder
8888
REDUCED_CLASSPATH_MODE("--reduced_classpath_mode"),
8989
INSTRUMENT_COVERAGE("--instrument_coverage"),
9090
KSP_GENERATED_JAVA_SRCJAR("--ksp_generated_java_srcjar"),
91+
KSP_GENERATED_CLASSES_JAR("--ksp_generated_classes_jar"),
9192
BUILD_TOOLS_API("--build_tools_api"),
9293
}
9394
}
@@ -222,6 +223,9 @@ class KotlinBuilder
222223
argMap.optionalSingle(KotlinBuilderFlags.KSP_GENERATED_JAVA_SRCJAR)?.let {
223224
generatedKspSrcJar = it
224225
}
226+
argMap.optionalSingle(KotlinBuilderFlags.KSP_GENERATED_CLASSES_JAR)?.let {
227+
generatedKspClassesJar = it
228+
}
225229
}
226230

227231
with(root.directoriesBuilder) {

src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,21 @@ internal fun JvmCompilationTask.createGeneratedKspKotlinSrcJar() {
422422
}
423423
}
424424

425+
/**
426+
* Produce a jar of classes generated by KSP.
427+
*/
428+
internal fun JvmCompilationTask.createdGeneratedKspClassesJar() {
429+
JarCreator(
430+
path = Paths.get(outputs.generatedKspClassesJar),
431+
normalize = true,
432+
verbose = false,
433+
).also {
434+
it.addDirectory(Paths.get(directories.generatedClasses))
435+
it.setJarOwner(info.label, info.bazelRuleKind)
436+
it.execute()
437+
}
438+
}
439+
425440
/**
426441
* Compiles Kotlin sources to classes. Does not compile Java sources.
427442
*/

src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ class KotlinJvmTaskExecutor
150150
if (outputs.generatedKspSrcJar.isNotEmpty()) {
151151
context.execute("creating KSP generated src jar", ::createGeneratedKspKotlinSrcJar)
152152
}
153+
if (outputs.generatedKspClassesJar.isNotEmpty()) {
154+
context.execute("creating KSP generated classes jar", ::createdGeneratedKspClassesJar)
155+
}
153156
}
154157
}
155158
}

src/main/protobuf/kotlin_model.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ message JvmCompilationTask {
131131
string generated_class_jar = 7;
132132
// Source jar containing the generated KSP sources.
133133
string generated_ksp_src_jar = 8;
134+
// The path to the jar containing the generated KSP classes
135+
string generated_ksp_classes_jar = 9;
134136
}
135137

136138
message Inputs {

src/test/data/jvm/ksp/BUILD

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ kt_ksp_plugin(
4848
],
4949
)
5050

51+
kt_ksp_plugin(
52+
name = "generate_bytecode_plugin",
53+
processor_class = "com.example.BytecodeGeneratorProcessor",
54+
deps = [
55+
"//src/test/data/jvm/ksp/bytecodegenerator/processor/src/main/com/example:processor",
56+
],
57+
)
58+
5159
kt_jvm_library(
5260
name = "ksp_kotlin_resources",
5361
srcs = ["CoffeeAppModel.kt"],
@@ -140,9 +148,40 @@ kt_jvm_library(
140148
],
141149
)
142150

151+
kt_jvm_library(
152+
name = "ksp_generate_bytecode",
153+
srcs = ["BytecodeExample.kt"],
154+
plugins = [":generate_bytecode_plugin"],
155+
deps = [
156+
"//src/test/data/jvm/ksp/bytecodegenerator/annotation",
157+
],
158+
)
159+
160+
kt_jvm_library(
161+
name = "ksp_bytecode_plugin_generates_no_classes_with_other_plugins",
162+
# these files don't have relevant annotations, and don't generate the bytecode/generated classes
163+
# from generate_bytecode_plugin
164+
srcs = [
165+
"CoffeeApp.kt",
166+
"CoffeeBean.java",
167+
"CoffeeMaker.kt",
168+
"DripCoffeeModule.kt",
169+
],
170+
plugins = [
171+
":generate_bytecode_plugin",
172+
":dagger",
173+
],
174+
deps = [
175+
"@kotlin_rules_maven//:com_google_dagger_dagger",
176+
"@kotlin_rules_maven//:com_google_dagger_dagger_compiler",
177+
],
178+
)
179+
143180
filegroup(
144181
name = "ksp",
145182
srcs = [
183+
":ksp_bytecode_plugin_generates_no_classes_with_other_plugins.jar",
184+
":ksp_generate_bytecode.jar",
146185
":ksp_kotlin_resources.jar",
147186
":ksp_kotlin_resources_missing_plugin.jar",
148187
":ksp_kotlin_resources_multiple_plugins.jar",
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package src.test.data.jvm.ksp
2+
3+
import src.test.data.jvm.ksp.bytecodegenerator.annotation.GenerateBytecode
4+
5+
@GenerateBytecode
6+
class BytecodeExample
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
load("//kotlin:jvm.bzl", "kt_jvm_library")
2+
3+
# Copyright 2018 The Bazel Authors. All rights reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
package(default_visibility = ["//visibility:private"])
17+
18+
kt_jvm_library(
19+
name = "annotation",
20+
srcs = ["GenerateBytecode.kt"],
21+
visibility = ["//src/test:__subpackages__"],
22+
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package src.test.data.jvm.ksp.bytecodegenerator.annotation
2+
3+
@Target(AnnotationTarget.CLASS)
4+
@Retention(AnnotationRetention.SOURCE)
5+
annotation class GenerateBytecode
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
load("//kotlin:jvm.bzl", "kt_jvm_library")
2+
3+
# Copyright 2018 The Bazel Authors. All rights reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
package(default_visibility = ["//visibility:private"])
17+
18+
kt_jvm_library(
19+
name = "processor",
20+
srcs = [
21+
"BytecodeGeneratorProcessor.kt",
22+
"BytecodeGeneratorProcessorProvider.kt",
23+
],
24+
resource_strip_prefix = "src/test/data/jvm/ksp/bytecodegenerator/processor/src/main/resources",
25+
resources = ["//src/test/data/jvm/ksp/bytecodegenerator/processor/src/main/resources"],
26+
visibility = ["//src/test:__subpackages__"],
27+
deps = [
28+
"//kotlin/compiler:symbol-processing",
29+
"//kotlin/compiler:symbol-processing-api",
30+
"//src/test/data/jvm/ksp/bytecodegenerator/annotation",
31+
"@kotlin_rules_maven//:org_ow2_asm_asm",
32+
],
33+
)

0 commit comments

Comments
 (0)