in server/server/src/main/kotlin/org/jetbrains/bazel/server/bsp/managers/BazelBspAspectsManager.kt [113:188]
fun generateAspectsFromTemplates(
rulesetLanguages: List<RulesetLanguage>,
externalRulesetNames: List<String>,
workspaceContext: WorkspaceContext,
toolchains: Map<RulesetLanguage, String?>,
bazelRelease: BazelRelease,
repoMapping: RepoMapping,
featureFlags: FeatureFlags,
bazelInfo: BazelInfo,
) {
detectBazelIgnoreAndErrorOut(bazelInfo)
val languageRuleMap = rulesetLanguages.associateBy { it.language }
val activeLanguages = rulesetLanguages.map { it.language }.toSet()
val kotlinEnabled = Language.Kotlin in activeLanguages
val javaEnabled = Language.Java in activeLanguages
val pythonEnabled = Language.Python in activeLanguages
val bazel8OrAbove = bazelRelease.major >= 8
Language.entries.filter { it.isTemplate }.forEach {
val ruleLanguage = languageRuleMap[it]
val outputFile = aspectsPath.resolve(it.toAspectRelativePath())
val templateFilePath = it.toAspectTemplateRelativePath()
val canonicalRuleName = ruleLanguage?.calculateCanonicalName(repoMapping).orEmpty()
val apparentRuleName = ruleLanguage?.rulesetName.orEmpty()
val protobufRepoName = ProtobufRepoMappings(repoMapping).getMappedProtobufRepoName(canonicalRuleName, apparentRuleName)
val variableMap =
mapOf(
"rulesetName" to canonicalRuleName,
"rulesetNameApparent" to apparentRuleName,
"kotlinEnabled" to kotlinEnabled.toString(),
"javaEnabled" to javaEnabled.toString(),
"pythonEnabled" to pythonEnabled.toString(),
// https://github.com/JetBrains/intellij-community/tree/master/build/jvm-rules
"usesRulesJvm" to ("rules_jvm" in externalRulesetNames).toString(),
"bazel8OrAbove" to bazel8OrAbove.toString(),
"toolchainType" to ruleLanguage?.let { rl -> toolchains[rl] },
"codeGeneratorRules" to workspaceContext.pythonCodeGeneratorRuleNames.toStarlarkString(),
"protobufRepoName" to protobufRepoName.orEmpty(),
"bspPath" to Constants.DOT_BAZELBSP_DIR_NAME,
)
templateWriter.writeToFile(templateFilePath, outputFile, variableMap)
}
templateWriter.writeToFile(
Constants.CORE_BZL + Constants.TEMPLATE_EXTENSION,
aspectsPath.resolve(Constants.CORE_BZL),
mapOf(
"isPropagateExportsFromDepsEnabled" to
featureFlags.isPropagateExportsFromDepsEnabled.toStarlarkString(),
"bspPath" to Constants.DOT_BAZELBSP_DIR_NAME,
),
)
// https://bazel.build/rules/lib/builtins/Label#repo_name
// The canonical name of the repository containing the target referred to by this label, without any leading at-signs (@).
val starlarkRepoMapping =
when (repoMapping) {
is BzlmodRepoMapping -> {
repoMapping.canonicalRepoNameToLocalPath
.map { (key, value) ->
"\"${key.dropWhile { it == '@' }}\": \"${value.invariantSeparatorsPathString}\""
}.joinToString(",\n", "{\n", "\n}")
}
is RepoMappingDisabled -> "{}"
}
templateWriter.writeToFile(
"utils/utils.bzl" + Constants.TEMPLATE_EXTENSION,
aspectsPath.resolve("utils").resolve("utils.bzl"),
mapOf(
"repoMapping" to starlarkRepoMapping,
),
)
}