Skip to content

Commit

Permalink
dependency analyzer plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
mateuszkuta256 committed Mar 20, 2024
1 parent d513a6f commit e9dddea
Show file tree
Hide file tree
Showing 9 changed files with 101 additions and 75 deletions.
10 changes: 9 additions & 1 deletion scala/private/rule_impls.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_tools//tools/jdk:toolchain_utils.bzl", "find_java_toolchain")
load(":common.bzl", "rlocationpath_from_rootpath", _collect_plugin_paths = "collect_plugin_paths")
load(":resources.bzl", _resource_paths = "paths")
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "version_suffix")

def expand_location(ctx, flags):
if hasattr(ctx.attr, "data"):
Expand Down Expand Up @@ -62,7 +63,7 @@ def compile_scala(
input_plugins = plugins
plugins = _collect_plugin_paths(plugins)
if dependency_info.use_analyzer:
plugins = depset(transitive = [plugins, ctx.attr._dependency_analyzer_plugin.files])
plugins = depset(transitive = [plugins, _dependency_analyzer_plugin(ctx).files])

toolchain = ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"]
compiler_classpath_jars = cjars if dependency_info.dependency_mode == "direct" else transitive_compile_jars
Expand Down Expand Up @@ -144,6 +145,13 @@ def compile_scala(
] + [args],
)

def _dependency_analyzer_plugin(ctx):
suffix = version_suffix(ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scala_version)
for plugin in ctx.attr._dependency_analyzer_plugin:
if plugin.label.name.endswith(suffix):
return plugin
return ctx.attr._dependency_analyzer_plugin[0]

def compile_java(ctx, source_jars, source_files, output, extra_javac_opts, providers_of_dependencies):
java_toolchain = specified_java_compile_toolchain(ctx)

Expand Down
2 changes: 1 addition & 1 deletion test/plugins/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ scala_library(
":gen-scalac-plugin.xml",
],
deps = [
"@io_bazel_rules_scala_scala_compiler",
"//scala/private/toolchain_deps:scala_compile_classpath",
],
)

Expand Down
4 changes: 2 additions & 2 deletions test/shell/test_scala_config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
runner=$(get_test_runner "${1:-local}")

test_classpath_contains_2_12() {
bazel aquery 'mnemonic("Javac", //src/java/io/bazel/rulesscala/scalac:scalac)' \
bazel aquery 'mnemonic("Javac", //src/java/io/bazel/rulesscala/scalac:scalac_2_12_18)' \
--repo_env=SCALA_VERSION=2.12.18 \
| grep scala-library-2.12
}

test_classpath_contains_2_13() {
bazel aquery 'mnemonic("Javac", //src/java/io/bazel/rulesscala/scalac:scalac)' \
bazel aquery 'mnemonic("Javac", //src/java/io/bazel/rulesscala/scalac:scalac_2_13_12)' \
--repo_env=SCALA_VERSION=2.13.12 \
| grep scala-library-2.13
}
Expand Down
40 changes: 25 additions & 15 deletions third_party/dependency_analyzer/src/main/analyzer.bzl
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
load("//scala:scala.bzl", "scala_library_for_plugin_bootstrapping")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION", "SCALA_VERSION")
load(
"//scala:scala_cross_version.bzl",
"extract_major_version",
"version_suffix",
)
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSIONS")

def analyzer():
if SCALA_MAJOR_VERSION.startswith("2"):
_analyzer_scala_2()
for scala_version in SCALA_VERSIONS:
_analyzer(scala_version)

def _analyzer(scala_version):
if scala_version.startswith("2"):
_analyzer_scala_2(scala_version)
else:
_analyzer_scala_3()
_analyzer_scala_3(scala_version)

def _analyzer_scala_3():
def _analyzer_scala_3(scala_version):
scala_library_for_plugin_bootstrapping(
name = "dependency_analyzer",
name = "dependency_analyzer" + version_suffix(scala_version),
srcs = [
"io/bazel/rulesscala/dependencyanalyzer3/DependencyAnalyzer.scala",
],
Expand All @@ -20,9 +29,9 @@ def _analyzer_scala_3():
],
)

def _analyzer_scala_2():
def _analyzer_scala_2(scala_version):
scala_library_for_plugin_bootstrapping(
name = "scala_version",
name = "scala_version" + version_suffix(scala_version),
srcs = [
"io/bazel/rulesscala/dependencyanalyzer/ScalaVersion.scala",
],
Expand All @@ -35,17 +44,18 @@ def _analyzer_scala_2():
],
)

SCALA_MINOR_VERSION = int(SCALA_VERSION.replace(
"%s." % SCALA_MAJOR_VERSION,
scala_major_version = extract_major_version(scala_version)
scala_minor_version = int(scala_version.replace(
"%s." % scala_major_version,
"",
))

REPORTER_COMPATIBILITY_FOR_212 = SCALA_MAJOR_VERSION == "2.12" and SCALA_MINOR_VERSION >= 13
REPORTER_COMPATIBILITY_FOR_212 = scala_major_version == "2.12" and scala_minor_version >= 13

REPORTER_COMPATIBILITY = "213" if (SCALA_MAJOR_VERSION == "2.13" or REPORTER_COMPATIBILITY_FOR_212) else ""
REPORTER_COMPATIBILITY = "213" if (scala_major_version == "2.13" or REPORTER_COMPATIBILITY_FOR_212) else ""

scala_library_for_plugin_bootstrapping(
name = "dependency_analyzer",
name = "dependency_analyzer" + version_suffix(scala_version),
srcs = [
"io/bazel/rulesscala/dependencyanalyzer/AstUsedJarFinder.scala",
"io/bazel/rulesscala/dependencyanalyzer/DependencyAnalyzer.scala",
Expand All @@ -57,8 +67,8 @@ def _analyzer_scala_2():
resources = ["resources/scalac-plugin.xml"],
visibility = ["//visibility:public"],
deps = [
":scala_version",
":scala_version" + version_suffix(scala_version),
"//scala/private/toolchain_deps:scala_compile_classpath",
"//src/java/io/bazel/rulesscala/scalac/reporter",
"//src/java/io/bazel/rulesscala/scalac:scalac_reporter" + version_suffix(scala_version),
],
)
4 changes: 3 additions & 1 deletion third_party/dependency_analyzer/src/test/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
load(":analyzer_test.bzl", "tests")
load("//scala:scala.bzl", "scala_test")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION")
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "version_suffix")

tests()

scala_test(
name = "test_optionsparser",
srcs = ["test_optionsparser.scala"],
deps = ["//third_party/dependency_analyzer/src/main:dependency_analyzer"],
deps = ["//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix(SCALA_VERSION)],
)
10 changes: 6 additions & 4 deletions third_party/dependency_analyzer/src/test/analyzer_test.bzl
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
load(":analyzer_test_scala_2.bzl", "analyzer_tests_scala_2")
load(":analyzer_test_scala_3.bzl", "analyzer_tests_scala_3")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION")
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "version_suffix")

def tests():
if SCALA_MAJOR_VERSION.startswith("2"):
analyzer_tests_scala_2()
suffix = version_suffix(SCALA_VERSION)
if SCALA_VERSION.startswith("2"):
analyzer_tests_scala_2(suffix)
else:
analyzer_tests_scala_3()
analyzer_tests_scala_3(suffix)
56 changes: 28 additions & 28 deletions third_party/dependency_analyzer/src/test/analyzer_test_scala_2.bzl
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
load("//scala:scala.bzl", "scala_test")

def analyzer_tests_scala_2():
def analyzer_tests_scala_2(version_suffix):
common_jvm_flags = [
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)",
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)",
"-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect)",
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer%s)" % version_suffix,
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library%s)" % version_suffix,
"-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect%s)" % version_suffix,
]

scala_test(
Expand All @@ -16,12 +16,12 @@ def analyzer_tests_scala_2():
jvm_flags = common_jvm_flags,
deps = [
"//src/java/io/bazel/rulesscala/io_utils",
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
"//third_party/dependency_analyzer/src/main:scala_version",
"//third_party/utils/src/test:test_util",
"@io_bazel_rules_scala_scala_compiler",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_reflect",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix,
"//third_party/dependency_analyzer/src/main:scala_version" + version_suffix,
"//third_party/utils/src/test:test_util" + version_suffix,
"@io_bazel_rules_scala_scala_compiler" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_reflect" + version_suffix,
],
)

Expand All @@ -32,9 +32,9 @@ def analyzer_tests_scala_2():
"io/bazel/rulesscala/dependencyanalyzer/ScalaVersionTest.scala",
],
deps = [
"//third_party/dependency_analyzer/src/main:scala_version",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_reflect",
"//third_party/dependency_analyzer/src/main:scala_version" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_reflect" + version_suffix,
],
)

Expand All @@ -48,11 +48,11 @@ def analyzer_tests_scala_2():
unused_dependency_checker_mode = "off",
deps = [
"//src/java/io/bazel/rulesscala/io_utils",
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
"//third_party/utils/src/test:test_util",
"@io_bazel_rules_scala_scala_compiler",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_reflect",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix,
"//third_party/utils/src/test:test_util" + version_suffix,
"@io_bazel_rules_scala_scala_compiler" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_reflect" + version_suffix,
],
)

Expand All @@ -68,12 +68,12 @@ def analyzer_tests_scala_2():
],
unused_dependency_checker_mode = "off",
deps = [
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
"//third_party/utils/src/test:test_util",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix,
"//third_party/utils/src/test:test_util" + version_suffix,
"@com_google_guava_guava_21_0_with_file//jar",
"@io_bazel_rules_scala_scala_compiler",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_reflect",
"@io_bazel_rules_scala_scala_compiler" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_reflect" + version_suffix,
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
],
)
Expand All @@ -89,11 +89,11 @@ def analyzer_tests_scala_2():
],
unused_dependency_checker_mode = "off",
deps = [
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
"//third_party/utils/src/test:test_util",
"@io_bazel_rules_scala_scala_compiler",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_reflect",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix,
"//third_party/utils/src/test:test_util" + version_suffix,
"@io_bazel_rules_scala_scala_compiler" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_reflect" + version_suffix,
"@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file",
],
)
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_test")

def analyzer_tests_scala_3():
def analyzer_tests_scala_3(version_suffix):
common_jvm_flags = [
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)",
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)",
"-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer%s)" % version_suffix,
"-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library%s)" % version_suffix,
# Scala 2 standard library is required for compilation.
# Without it compilation fails with error:
# class dotty.tools.dotc.core.Symbols$NoSymbol$ cannot be cast to class dotty.tools.dotc.core.Symbols$ClassSymbol
"-Dscala.library2.location=$(rootpath @io_bazel_rules_scala_scala_library_2)",
"-Dscala.library2.location=$(rootpath @io_bazel_rules_scala_scala_library_2%s)" % version_suffix,
]

scala_test(
Expand All @@ -19,9 +19,9 @@ def analyzer_tests_scala_3():
],
deps = [
"//scala/private/toolchain_deps:scala_compile_classpath",
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
"//third_party/utils/src/test:test_util",
"@io_bazel_rules_scala_scala_library",
"@io_bazel_rules_scala_scala_library_2",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix,
"//third_party/utils/src/test:test_util" + version_suffix,
"@io_bazel_rules_scala_scala_library" + version_suffix,
"@io_bazel_rules_scala_scala_library_2" + version_suffix,
],
)
34 changes: 19 additions & 15 deletions third_party/utils/src/test/BUILD
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
load("//scala:scala.bzl", "scala_library")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION")
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSIONS")
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "version_suffix")

licenses(["notice"]) # 3-clause BSD

scala_library(
name = "test_util",
srcs = ([
"io/bazel/rulesscala/utils/JavaCompileUtil.scala",
"io/bazel/rulesscala/utils/TestUtil.scala",
] if SCALA_MAJOR_VERSION.startswith("2") else [
"io/bazel/rulesscala/utils/Scala3CompilerUtils.scala",
]),
visibility = ["//visibility:public"],
deps = [
"//scala/private/toolchain_deps:scala_compile_classpath",
"//third_party/dependency_analyzer/src/main:dependency_analyzer",
],
)
[
scala_library(
name = "test_util" + version_suffix(scala_version),
srcs = ([
"io/bazel/rulesscala/utils/JavaCompileUtil.scala",
"io/bazel/rulesscala/utils/TestUtil.scala",
] if scala_version.startswith("2") else [
"io/bazel/rulesscala/utils/Scala3CompilerUtils.scala",
]),
visibility = ["//visibility:public"],
deps = [
"//scala/private/toolchain_deps:scala_compile_classpath",
"//third_party/dependency_analyzer/src/main:dependency_analyzer" + version_suffix(scala_version),
],
)
for scala_version in SCALA_VERSIONS
]

0 comments on commit e9dddea

Please sign in to comment.