commons/src/main/kotlin/org/jetbrains/bsp/protocol/BuildTarget.kt (86 lines of code) (raw):
package org.jetbrains.bsp.protocol
import org.jetbrains.bazel.commons.TargetKind
import org.jetbrains.bazel.label.Label
import java.nio.file.Path
interface BuildTarget {
val id: Label
val kind: TargetKind
val baseDirectory: Path
val data: BuildTargetData?
val tags: List<String>
val noBuild: Boolean
}
data class RawBuildTarget(
override val id: Label,
override val tags: List<String>,
val dependencies: List<Label>,
override val kind: TargetKind,
val sources: List<SourceItem>,
val resources: List<Path>,
override val baseDirectory: Path,
override val noBuild: Boolean = false, // TODO https://youtrack.jetbrains.com/issue/BAZEL-1963
override var data: BuildTargetData? = null,
val lowPrioritySharedSources: List<SourceItem> = emptyList(),
) : BuildTarget
data class PartialBuildTarget(
override val id: Label,
override val tags: List<String>,
override val kind: TargetKind,
override val baseDirectory: Path,
override val data: BuildTargetData? = null,
override val noBuild: Boolean = false,
) : BuildTarget
// adding or removing new BuildTargetData should not cause cache invalidation, but still we don't want to write FQN per each target
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
// id should in 1-255 range
annotation class ClassDiscriminator(val id: Short)
sealed interface BuildTargetData
@ClassDiscriminator(1)
public data class KotlinBuildTarget(
val languageVersion: String,
val apiVersion: String,
val kotlincOptions: List<String>,
val associates: List<Label>,
var jvmBuildTarget: JvmBuildTarget? = null,
) : BuildTargetData
@ClassDiscriminator(2)
data class PythonBuildTarget(
val version: String?,
val interpreter: Path?,
// imports is the attribute in bazel python rules
// which specify a list of runfiles relative paths which will be included in PYTHONPATH
val imports: List<String>,
val isCodeGenerator: Boolean,
val generatedSources: List<Path>,
val sourceDependencies: List<Path> = listOf(),
) : BuildTargetData
@ClassDiscriminator(3)
data class ScalaBuildTarget(
val scalaVersion: String,
val sdkJars: List<Path>,
val jvmBuildTarget: JvmBuildTarget? = null,
val scalacOptions: List<String>,
) : BuildTargetData
// TODO: change to interface
@ClassDiscriminator(4)
data class JvmBuildTarget(
// not used if part of PartialBuildTarget
@Transient @JvmField val javaHome: Path? = null,
val javaVersion: String,
val javacOpts: List<String> = listOf(),
val binaryOutputs: List<Path> = listOf(),
val environmentVariables: Map<String, String> = mapOf(),
val mainClass: String? = null,
val jvmArgs: List<String> = listOf(),
val programArgs: List<String> = listOf(),
) : BuildTargetData
@ClassDiscriminator(5)
data class GoBuildTarget(
@Transient @JvmField val sdkHomePath: Path? = null,
val importPath: String,
val generatedLibraries: List<Path>,
val generatedSources: List<Path>,
val libraryLabels: List<Label>,
) : BuildTargetData
// ClassDiscriminator 6 & 7 were cpp and android, but they have been removed
@ClassDiscriminator(9)
data class ProtobufBuildTarget(
val sources: Map<String, String>, // import path -> real file
val jvmBuildTarget: JvmBuildTarget? = null,
) : BuildTargetData
@ClassDiscriminator(8)
object VoidBuildTarget : BuildTargetData