Skip to content
This repository has been archived by the owner on Aug 5, 2024. It is now read-only.

Commit

Permalink
change java_target_info to jvm_target_info
Browse files Browse the repository at this point in the history
  • Loading branch information
mielnikk committed Aug 25, 2023
1 parent 2ca3c8a commit f4afb90
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 204 deletions.
146 changes: 1 addition & 145 deletions aspects/rules/java/java_info.bzl
Original file line number Diff line number Diff line change
@@ -1,148 +1,4 @@
load("//aspects:utils/java_utils.bzl", "get_java_provider")
load("//aspects:utils/utils.bzl", "create_proto", "create_struct", "file_location", "is_external", "map", "to_file_location", "update_sync_output_groups")

def map_with_resolve_files(f, xs):
results = []
resolve_files = []

for x in xs:
if x != None:
res = f(x)
if res != None:
a, b = res
if a != None:
results.append(a)
if b != None:
resolve_files += b

return results, resolve_files

def get_interface_jars(output):
if hasattr(output, "compile_jar") and output.compile_jar:
return [output.compile_jar]
elif hasattr(output, "ijar") and output.ijar:
return [output.ijar]
else:
return []

def get_source_jars(output):
if hasattr(output, "source_jars"):
return output.source_jars
if hasattr(output, "source_jar"):
return [output.source_jar]
return []

def get_generated_jars(provider):
if hasattr(provider, "java_outputs"):
return map_with_resolve_files(to_generated_jvm_outputs, provider.java_outputs)

if hasattr(provider, "annotation_processing") and provider.annotation_processing and provider.annotation_processing.enabled:
class_jar = provider.annotation_processing.class_jar
source_jar = provider.annotation_processing.source_jar
output = struct(
binary_jars = [file_location(class_jar)],
source_jars = [file_location(source_jar)],
)
resolve_files = [class_jar, source_jar]
return [output], resolve_files

return [], []

def to_generated_jvm_outputs(output):
if output == None or output.generated_class_jar == None:
return None

class_jar = output.generated_class_jar
source_jar = output.generated_source_jar

output = struct(
binary_jars = [file_location(class_jar)],
source_jars = [file_location(source_jar)],
)
resolve_files = [class_jar, source_jar]
return output, resolve_files

def to_jvm_outputs(output):
if output == None or output.class_jar == None:
return None

binary_jars = [output.class_jar]
interface_jars = get_interface_jars(output)
source_jars = get_source_jars(output)
output = struct(
binary_jars = map(file_location, binary_jars),
interface_jars = map(file_location, interface_jars),
source_jars = map(file_location, source_jars),
)
resolve_files = binary_jars + interface_jars + source_jars
return output, resolve_files

def extract_runtime_jars(target, provider):
compilation_info = getattr(provider, "compilation_info", None)

if compilation_info:
return compilation_info.runtime_classpath

return getattr(provider, "transitive_runtime_jars", target[JavaInfo].transitive_runtime_jars)

def extract_compile_jars(provider):
compilation_info = getattr(provider, "compilation_info", None)
transitive_compile_time_jars = getattr(provider, "transitive_compile_time_jars", depset())

return compilation_info.compilation_classpath if compilation_info else transitive_compile_time_jars

def extract_java_info(target, ctx, output_groups, **kwargs):
provider = get_java_provider(target)
if not provider:
return None, None

if hasattr(provider, "java_outputs") and provider.java_outputs:
java_outputs = provider.java_outputs
elif hasattr(provider, "outputs") and provider.outputs:
java_outputs = provider.outputs.jars
else:
return None, None

resolve_files = []

jars, resolve_files_jars = map_with_resolve_files(to_jvm_outputs, java_outputs)
resolve_files += resolve_files_jars

generated_jars, resolve_files_generated_jars = get_generated_jars(provider)
resolve_files += resolve_files_generated_jars

runtime_jars = extract_runtime_jars(target, provider).to_list()
compile_jars = extract_compile_jars(provider).to_list()
source_jars = getattr(provider, "transitive_source_jars", depset()).to_list()
resolve_files += runtime_jars
resolve_files += compile_jars
resolve_files += source_jars

runtime_classpath = map(file_location, runtime_jars)
compile_classpath = map(file_location, compile_jars)
source_classpath = map(file_location, source_jars)

javac_opts = getattr(ctx.rule.attr, "javacopts", [])
jvm_flags = getattr(ctx.rule.attr, "jvm_flags", [])
args = getattr(ctx.rule.attr, "args", [])
main_class = getattr(ctx.rule.attr, "main_class", None)

if (is_external(target)):
update_sync_output_groups(output_groups, "external-deps-resolve", depset(resolve_files))

info = create_struct(
jars = jars,
generated_jars = generated_jars,
runtime_classpath = runtime_classpath,
compile_classpath = compile_classpath,
source_classpath = source_classpath,
javac_opts = javac_opts,
jvm_flags = jvm_flags,
main_class = main_class,
args = args,
)

return create_proto(target, ctx, info, "java_target_info"), None
load("//aspects:utils/utils.bzl", "create_proto", "create_struct", "to_file_location")

def extract_java_toolchain(target, ctx, dep_targets, **kwargs):
toolchain = None
Expand Down
153 changes: 153 additions & 0 deletions aspects/rules/jvm/jvm_info.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
load("//aspects:utils/utils.bzl", "create_proto", "create_struct", "file_location", "is_external", "map", "update_sync_output_groups")

def map_with_resolve_files(f, xs):
results = []
resolve_files = []

for x in xs:
if x != None:
res = f(x)
if res != None:
a, b = res
if a != None:
results.append(a)
if b != None:
resolve_files += b

return results, resolve_files

def get_interface_jars(output):
if hasattr(output, "compile_jar") and output.compile_jar:
return [output.compile_jar]
elif hasattr(output, "ijar") and output.ijar:
return [output.ijar]
else:
return []

def get_source_jars(output):
if hasattr(output, "source_jars"):
return output.source_jars
if hasattr(output, "source_jar"):
return [output.source_jar]
return []

def to_generated_jvm_outputs(output):
if output == None or output.generated_class_jar == None:
return None

class_jar = output.generated_class_jar
source_jar = output.generated_source_jar

output = struct(
binary_jars = [file_location(class_jar)],
source_jars = [file_location(source_jar)],
)
resolve_files = [class_jar, source_jar]
return output, resolve_files

def get_generated_jars(provider):
if hasattr(provider, "java_outputs"):
return map_with_resolve_files(to_generated_jvm_outputs, provider.java_outputs)

if hasattr(provider, "annotation_processing") and provider.annotation_processing and provider.annotation_processing.enabled:
class_jar = provider.annotation_processing.class_jar
source_jar = provider.annotation_processing.source_jar
output = struct(
binary_jars = [file_location(class_jar)],
source_jars = [file_location(source_jar)],
)
resolve_files = [class_jar, source_jar]
return [output], resolve_files

return [], []

def to_jvm_outputs(output):
if output == None or output.class_jar == None:
return None

binary_jars = [output.class_jar]
interface_jars = get_interface_jars(output)
source_jars = get_source_jars(output)
output = struct(
binary_jars = map(file_location, binary_jars),
interface_jars = map(file_location, interface_jars),
source_jars = map(file_location, source_jars),
)
resolve_files = binary_jars + interface_jars + source_jars
return output, resolve_files

def extract_runtime_jars(target, provider):
compilation_info = getattr(provider, "compilation_info", None)

if compilation_info:
return compilation_info.runtime_classpath

return getattr(provider, "transitive_runtime_jars", target[JavaInfo].transitive_runtime_jars)

def extract_compile_jars(provider):
compilation_info = getattr(provider, "compilation_info", None)
transitive_compile_time_jars = getattr(provider, "transitive_compile_time_jars", depset())

return compilation_info.compilation_classpath if compilation_info else transitive_compile_time_jars

def get_jvm_provider(target):
if hasattr(target, "scala"):
return target.scala
if hasattr(target, "kt") and hasattr(target.kt, "outputs"):
return target.kt
if JavaInfo in target:
return target[JavaInfo]
return None

def extract_jvm_info(target, ctx, output_groups, **kwargs):
provider = get_jvm_provider(target)
if not provider:
return None, None

if hasattr(provider, "java_outputs") and provider.java_outputs:
java_outputs = provider.java_outputs
elif hasattr(provider, "outputs") and provider.outputs:
java_outputs = provider.outputs.jars
else:
return None, None

resolve_files = []

jars, resolve_files_jars = map_with_resolve_files(to_jvm_outputs, java_outputs)
resolve_files += resolve_files_jars

generated_jars, resolve_files_generated_jars = get_generated_jars(provider)
resolve_files += resolve_files_generated_jars

runtime_jars = extract_runtime_jars(target, provider).to_list()
compile_jars = extract_compile_jars(provider).to_list()
source_jars = getattr(provider, "transitive_source_jars", depset()).to_list()
resolve_files += runtime_jars
resolve_files += compile_jars
resolve_files += source_jars

runtime_classpath = map(file_location, runtime_jars)
compile_classpath = map(file_location, compile_jars)
source_classpath = map(file_location, source_jars)

javac_opts = getattr(ctx.rule.attr, "javacopts", [])
jvm_flags = getattr(ctx.rule.attr, "jvm_flags", [])
args = getattr(ctx.rule.attr, "args", [])
main_class = getattr(ctx.rule.attr, "main_class", None)

if (is_external(target)):
update_sync_output_groups(output_groups, "external-deps-resolve", depset(resolve_files))

info = create_struct(
jars = jars,
generated_jars = generated_jars,
runtime_classpath = runtime_classpath,
compile_classpath = compile_classpath,
source_classpath = source_classpath,
javac_opts = javac_opts,
jvm_flags = jvm_flags,
main_class = main_class,
args = args,
)

return create_proto(target, ctx, info, "jvm_target_info"), None
6 changes: 3 additions & 3 deletions aspects/rules/scala/scala_info.bzl
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
load("//aspects:utils/java_utils.bzl", "get_java_provider")
load("//aspects:utils/utils.bzl", "create_proto", "file_location", "is_external", "map", "update_sync_output_groups")

def find_scalac_classpath(runfiles):
Expand Down Expand Up @@ -32,10 +31,11 @@ def extract_scala_toolchain_info(target, ctx, output_groups, **kwargs):
return create_proto(target, ctx, scala_toolchain_info, "scala_toolchain_info"), None

def extract_scala_info(target, ctx, output_groups, **kwargs):
provider = get_java_provider(target)
if not provider:
if not hasattr(target, "scala"):
return None, None

provider = target.scala

SCALA_TOOLCHAIN = "@io_bazel_rules_scala//scala:toolchain_type"

# check of _scala_toolchain is necessary, because SCALA_TOOLCHAIN will always be present
Expand Down
8 changes: 0 additions & 8 deletions aspects/utils/java_utils.bzl

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ class EnvironmentCreatorTest {
dotBazelBsp.resolve("aspects/rules").isDirectory() shouldBeEqual true
dotBazelBsp.resolve("aspects/utils").isDirectory() shouldBeEqual true
dotBazelBsp.resolve("aspects/utils/utils.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/utils/java_utils.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/rules/java/java_info.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/rules/jvm/jvm_info.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/rules/kt/kt_info.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/rules/python/python_info.bzl").exists() shouldBeEqual true
dotBazelBsp.resolve("aspects/rules/scala/scala_info.bzl").exists() shouldBeEqual true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ import java.nio.file.Paths
import kotlin.io.path.writeText

enum class Language(private val fileName: String, val functions: List<String>) {
Java(
"//aspects:rules/java/java_info.bzl",
listOf("extract_java_info", "extract_java_toolchain", "extract_java_runtime")
),
Java("//aspects:rules/java/java_info.bzl", listOf("extract_java_toolchain", "extract_java_runtime")),
Jvm("//aspects:rules/jvm/jvm_info.bzl", listOf("extract_jvm_info")),
Scala("//aspects:rules/scala/scala_info.bzl", listOf("extract_scala_info", "extract_scala_toolchain_info")),
Cpp("//aspects:rules/cpp/cpp_info.bzl", listOf("extract_cpp_info")),
Kotlin("//aspects:rules/kt/kt_info.bzl", listOf("extract_kotlin_info")),
Expand Down Expand Up @@ -46,7 +44,8 @@ class BazelBspEnvironmentManager(
checkForLanguage(listOf("rules_cc"), Language.Cpp),
checkForLanguage(listOf("io_bazel_rules_kotlin"), Language.Kotlin),
checkForLanguage(listOf("io_bazel_rules_scala"), Language.Scala),
checkForLanguage(listOf("rules_java"), Language.Java)
checkForLanguage(listOf("rules_java"), Language.Java),
checkForLanguage(listOf("rules_java", "io_bazel_rules_kotlin", "io_bazel_rules_scala"), Language.Jvm)
)
}

Expand Down Expand Up @@ -83,8 +82,8 @@ class BazelBspEnvironmentManager(
private fun createToolchainListString(languages: List<Language>): String =
languages.mapNotNull {
when (it) {
Language.Java -> """"@bazel_tools//tools/jdk:runtime_toolchain_type","""
Language.Scala -> """"@io_bazel_rules_scala//scala:toolchain_type""""
Language.Java -> """"@bazel_tools//tools/jdk:runtime_toolchain_type""""
else -> null
}
}
Expand Down
Loading

0 comments on commit f4afb90

Please sign in to comment.