Skip to content
This repository was archived by the owner on Jun 4, 2024. It is now read-only.

Commit bc2c0f7

Browse files
authored
Deps unused whitelist (#274)
1 parent 28ff055 commit bc2c0f7

File tree

7 files changed

+119
-11
lines changed

7 files changed

+119
-11
lines changed

docs/stardoc/scala.md

+30-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ configure_bootstrap_scala(<a href="#configure_bootstrap_scala-name">name</a>, <a
7272
## scala_binary
7373

7474
<pre>
75-
scala_binary(<a href="#scala_binary-name">name</a>, <a href="#scala_binary-data">data</a>, <a href="#scala_binary-deps">deps</a>, <a href="#scala_binary-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_binary-javacopts">javacopts</a>, <a href="#scala_binary-jvm_flags">jvm_flags</a>, <a href="#scala_binary-main_class">main_class</a>, <a href="#scala_binary-plugins">plugins</a>, <a href="#scala_binary-resource_jars">resource_jars</a>, <a href="#scala_binary-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_binary-resources">resources</a>, <a href="#scala_binary-runtime_deps">runtime_deps</a>, <a href="#scala_binary-scala">scala</a>, <a href="#scala_binary-scalacopts">scalacopts</a>, <a href="#scala_binary-srcs">srcs</a>)
75+
scala_binary(<a href="#scala_binary-name">name</a>, <a href="#scala_binary-data">data</a>, <a href="#scala_binary-deps">deps</a>, <a href="#scala_binary-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_binary-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_binary-javacopts">javacopts</a>, <a href="#scala_binary-jvm_flags">jvm_flags</a>, <a href="#scala_binary-main_class">main_class</a>, <a href="#scala_binary-plugins">plugins</a>, <a href="#scala_binary-resource_jars">resource_jars</a>, <a href="#scala_binary-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_binary-resources">resources</a>, <a href="#scala_binary-runtime_deps">runtime_deps</a>, <a href="#scala_binary-scala">scala</a>, <a href="#scala_binary-scalacopts">scalacopts</a>, <a href="#scala_binary-srcs">srcs</a>)
7676
</pre>
7777

7878

@@ -122,6 +122,15 @@ To run the program: `bazel run <target>`
122122
</p>
123123
</td>
124124
</tr>
125+
<tr id="scala_binary-deps_unused_whitelist">
126+
<td><code>deps_unused_whitelist</code></td>
127+
<td>
128+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
129+
<p>
130+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
131+
</p>
132+
</td>
133+
</tr>
125134
<tr id="scala_binary-deps_used_whitelist">
126135
<td><code>deps_used_whitelist</code></td>
127136
<td>
@@ -311,7 +320,7 @@ Use this only for libraries with macros. Otherwise, use `java_import`.
311320
## scala_library
312321

313322
<pre>
314-
scala_library(<a href="#scala_library-name">name</a>, <a href="#scala_library-data">data</a>, <a href="#scala_library-deps">deps</a>, <a href="#scala_library-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_library-exports">exports</a>, <a href="#scala_library-javacopts">javacopts</a>, <a href="#scala_library-macro">macro</a>, <a href="#scala_library-neverlink">neverlink</a>, <a href="#scala_library-plugins">plugins</a>, <a href="#scala_library-resource_jars">resource_jars</a>, <a href="#scala_library-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_library-resources">resources</a>, <a href="#scala_library-runtime_deps">runtime_deps</a>, <a href="#scala_library-scala">scala</a>, <a href="#scala_library-scalacopts">scalacopts</a>, <a href="#scala_library-srcs">srcs</a>)
323+
scala_library(<a href="#scala_library-name">name</a>, <a href="#scala_library-data">data</a>, <a href="#scala_library-deps">deps</a>, <a href="#scala_library-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_library-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_library-exports">exports</a>, <a href="#scala_library-javacopts">javacopts</a>, <a href="#scala_library-macro">macro</a>, <a href="#scala_library-neverlink">neverlink</a>, <a href="#scala_library-plugins">plugins</a>, <a href="#scala_library-resource_jars">resource_jars</a>, <a href="#scala_library-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_library-resources">resources</a>, <a href="#scala_library-runtime_deps">runtime_deps</a>, <a href="#scala_library-scala">scala</a>, <a href="#scala_library-scalacopts">scalacopts</a>, <a href="#scala_library-srcs">srcs</a>)
315324
</pre>
316325

317326
Compiles a Scala JVM library.
@@ -351,6 +360,15 @@ Compiles a Scala JVM library.
351360
</p>
352361
</td>
353362
</tr>
363+
<tr id="scala_library-deps_unused_whitelist">
364+
<td><code>deps_unused_whitelist</code></td>
365+
<td>
366+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
367+
<p>
368+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
369+
</p>
370+
</td>
371+
</tr>
354372
<tr id="scala_library-deps_used_whitelist">
355373
<td><code>deps_used_whitelist</code></td>
356374
<td>
@@ -555,7 +573,7 @@ To run: `bazel run <target>`
555573
## scala_test
556574

557575
<pre>
558-
scala_test(<a href="#scala_test-name">name</a>, <a href="#scala_test-data">data</a>, <a href="#scala_test-deps">deps</a>, <a href="#scala_test-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_test-frameworks">frameworks</a>, <a href="#scala_test-isolation">isolation</a>, <a href="#scala_test-javacopts">javacopts</a>, <a href="#scala_test-jvm_flags">jvm_flags</a>, <a href="#scala_test-plugins">plugins</a>, <a href="#scala_test-resource_jars">resource_jars</a>, <a href="#scala_test-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_test-resources">resources</a>, <a href="#scala_test-runner">runner</a>, <a href="#scala_test-runtime_deps">runtime_deps</a>, <a href="#scala_test-scala">scala</a>, <a href="#scala_test-scalacopts">scalacopts</a>, <a href="#scala_test-shared_deps">shared_deps</a>, <a href="#scala_test-srcs">srcs</a>, <a href="#scala_test-subprocess_runner">subprocess_runner</a>)
576+
scala_test(<a href="#scala_test-name">name</a>, <a href="#scala_test-data">data</a>, <a href="#scala_test-deps">deps</a>, <a href="#scala_test-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_test-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_test-frameworks">frameworks</a>, <a href="#scala_test-isolation">isolation</a>, <a href="#scala_test-javacopts">javacopts</a>, <a href="#scala_test-jvm_flags">jvm_flags</a>, <a href="#scala_test-plugins">plugins</a>, <a href="#scala_test-resource_jars">resource_jars</a>, <a href="#scala_test-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_test-resources">resources</a>, <a href="#scala_test-runner">runner</a>, <a href="#scala_test-runtime_deps">runtime_deps</a>, <a href="#scala_test-scala">scala</a>, <a href="#scala_test-scalacopts">scalacopts</a>, <a href="#scala_test-shared_deps">shared_deps</a>, <a href="#scala_test-srcs">srcs</a>, <a href="#scala_test-subprocess_runner">subprocess_runner</a>)
559577
</pre>
560578

561579

@@ -604,6 +622,15 @@ To build and run a specific test: `bazel test <target> --test_filter=<filter_exp
604622
</p>
605623
</td>
606624
</tr>
625+
<tr id="scala_test-deps_unused_whitelist">
626+
<td><code>deps_unused_whitelist</code></td>
627+
<td>
628+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
629+
<p>
630+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
631+
</p>
632+
</td>
633+
</tr>
607634
<tr id="scala_test-deps_used_whitelist">
608635
<td><code>deps_used_whitelist</code></td>
609636
<td>

docs/stardoc/scala_with_scalafmt.md

+30-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
## scala_binary
66

77
<pre>
8-
scala_binary(<a href="#scala_binary-name">name</a>, <a href="#scala_binary-config">config</a>, <a href="#scala_binary-data">data</a>, <a href="#scala_binary-deps">deps</a>, <a href="#scala_binary-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_binary-format">format</a>, <a href="#scala_binary-javacopts">javacopts</a>, <a href="#scala_binary-jvm_flags">jvm_flags</a>, <a href="#scala_binary-main_class">main_class</a>, <a href="#scala_binary-plugins">plugins</a>, <a href="#scala_binary-resource_jars">resource_jars</a>, <a href="#scala_binary-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_binary-resources">resources</a>, <a href="#scala_binary-runtime_deps">runtime_deps</a>, <a href="#scala_binary-scala">scala</a>, <a href="#scala_binary-scalacopts">scalacopts</a>, <a href="#scala_binary-srcs">srcs</a>)
8+
scala_binary(<a href="#scala_binary-name">name</a>, <a href="#scala_binary-config">config</a>, <a href="#scala_binary-data">data</a>, <a href="#scala_binary-deps">deps</a>, <a href="#scala_binary-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_binary-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_binary-format">format</a>, <a href="#scala_binary-javacopts">javacopts</a>, <a href="#scala_binary-jvm_flags">jvm_flags</a>, <a href="#scala_binary-main_class">main_class</a>, <a href="#scala_binary-plugins">plugins</a>, <a href="#scala_binary-resource_jars">resource_jars</a>, <a href="#scala_binary-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_binary-resources">resources</a>, <a href="#scala_binary-runtime_deps">runtime_deps</a>, <a href="#scala_binary-scala">scala</a>, <a href="#scala_binary-scalacopts">scalacopts</a>, <a href="#scala_binary-srcs">srcs</a>)
99
</pre>
1010

1111

@@ -64,6 +64,15 @@ To run the program: `bazel run <target>`
6464
</p>
6565
</td>
6666
</tr>
67+
<tr id="scala_binary-deps_unused_whitelist">
68+
<td><code>deps_unused_whitelist</code></td>
69+
<td>
70+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
71+
<p>
72+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
73+
</p>
74+
</td>
75+
</tr>
6776
<tr id="scala_binary-deps_used_whitelist">
6877
<td><code>deps_used_whitelist</code></td>
6978
<td>
@@ -188,7 +197,7 @@ To run the program: `bazel run <target>`
188197
## scala_library
189198

190199
<pre>
191-
scala_library(<a href="#scala_library-name">name</a>, <a href="#scala_library-config">config</a>, <a href="#scala_library-data">data</a>, <a href="#scala_library-deps">deps</a>, <a href="#scala_library-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_library-exports">exports</a>, <a href="#scala_library-format">format</a>, <a href="#scala_library-javacopts">javacopts</a>, <a href="#scala_library-macro">macro</a>, <a href="#scala_library-neverlink">neverlink</a>, <a href="#scala_library-plugins">plugins</a>, <a href="#scala_library-resource_jars">resource_jars</a>, <a href="#scala_library-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_library-resources">resources</a>, <a href="#scala_library-runtime_deps">runtime_deps</a>, <a href="#scala_library-scala">scala</a>, <a href="#scala_library-scalacopts">scalacopts</a>, <a href="#scala_library-srcs">srcs</a>)
200+
scala_library(<a href="#scala_library-name">name</a>, <a href="#scala_library-config">config</a>, <a href="#scala_library-data">data</a>, <a href="#scala_library-deps">deps</a>, <a href="#scala_library-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_library-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_library-exports">exports</a>, <a href="#scala_library-format">format</a>, <a href="#scala_library-javacopts">javacopts</a>, <a href="#scala_library-macro">macro</a>, <a href="#scala_library-neverlink">neverlink</a>, <a href="#scala_library-plugins">plugins</a>, <a href="#scala_library-resource_jars">resource_jars</a>, <a href="#scala_library-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_library-resources">resources</a>, <a href="#scala_library-runtime_deps">runtime_deps</a>, <a href="#scala_library-scala">scala</a>, <a href="#scala_library-scalacopts">scalacopts</a>, <a href="#scala_library-srcs">srcs</a>)
192201
</pre>
193202

194203
Compiles a Scala JVM library.
@@ -237,6 +246,15 @@ Compiles a Scala JVM library.
237246
</p>
238247
</td>
239248
</tr>
249+
<tr id="scala_library-deps_unused_whitelist">
250+
<td><code>deps_unused_whitelist</code></td>
251+
<td>
252+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
253+
<p>
254+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
255+
</p>
256+
</td>
257+
</tr>
240258
<tr id="scala_library-deps_used_whitelist">
241259
<td><code>deps_used_whitelist</code></td>
242260
<td>
@@ -370,7 +388,7 @@ Compiles a Scala JVM library.
370388
## scala_test
371389

372390
<pre>
373-
scala_test(<a href="#scala_test-name">name</a>, <a href="#scala_test-config">config</a>, <a href="#scala_test-data">data</a>, <a href="#scala_test-deps">deps</a>, <a href="#scala_test-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_test-format">format</a>, <a href="#scala_test-frameworks">frameworks</a>, <a href="#scala_test-isolation">isolation</a>, <a href="#scala_test-javacopts">javacopts</a>, <a href="#scala_test-jvm_flags">jvm_flags</a>, <a href="#scala_test-plugins">plugins</a>, <a href="#scala_test-resource_jars">resource_jars</a>, <a href="#scala_test-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_test-resources">resources</a>, <a href="#scala_test-runner">runner</a>, <a href="#scala_test-runtime_deps">runtime_deps</a>, <a href="#scala_test-scala">scala</a>, <a href="#scala_test-scalacopts">scalacopts</a>, <a href="#scala_test-shared_deps">shared_deps</a>, <a href="#scala_test-srcs">srcs</a>, <a href="#scala_test-subprocess_runner">subprocess_runner</a>)
391+
scala_test(<a href="#scala_test-name">name</a>, <a href="#scala_test-config">config</a>, <a href="#scala_test-data">data</a>, <a href="#scala_test-deps">deps</a>, <a href="#scala_test-deps_unused_whitelist">deps_unused_whitelist</a>, <a href="#scala_test-deps_used_whitelist">deps_used_whitelist</a>, <a href="#scala_test-format">format</a>, <a href="#scala_test-frameworks">frameworks</a>, <a href="#scala_test-isolation">isolation</a>, <a href="#scala_test-javacopts">javacopts</a>, <a href="#scala_test-jvm_flags">jvm_flags</a>, <a href="#scala_test-plugins">plugins</a>, <a href="#scala_test-resource_jars">resource_jars</a>, <a href="#scala_test-resource_strip_prefix">resource_strip_prefix</a>, <a href="#scala_test-resources">resources</a>, <a href="#scala_test-runner">runner</a>, <a href="#scala_test-runtime_deps">runtime_deps</a>, <a href="#scala_test-scala">scala</a>, <a href="#scala_test-scalacopts">scalacopts</a>, <a href="#scala_test-shared_deps">shared_deps</a>, <a href="#scala_test-srcs">srcs</a>, <a href="#scala_test-subprocess_runner">subprocess_runner</a>)
374392
</pre>
375393

376394

@@ -428,6 +446,15 @@ To build and run a specific test: `bazel test <target> --test_filter=<filter_exp
428446
</p>
429447
</td>
430448
</tr>
449+
<tr id="scala_test-deps_unused_whitelist">
450+
<td><code>deps_unused_whitelist</code></td>
451+
<td>
452+
<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>; optional
453+
<p>
454+
The JVM library dependencies to always consider unused for `scala_deps_direct` checks.
455+
</p>
456+
</td>
457+
</tr>
431458
<tr id="scala_test-deps_used_whitelist">
432459
<td><code>deps_used_whitelist</code></td>
433460
<td>

rules/private/phases/phase_zinc_depscheck.bzl

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ def phase_zinc_depscheck(ctx, g):
3131
deps_args.add_all("--direct", [dep.label for dep in ctx.attr.deps], format_each = "_%s")
3232
deps_args.add_all(labeled_jars, map_each = _depscheck_labeled_group)
3333
deps_args.add("--label", ctx.label, format = "_%s")
34-
deps_args.add_all("--whitelist", [dep.label for dep in ctx.attr.deps_used_whitelist], format_each = "_%s")
34+
deps_args.add_all("--used_whitelist", [dep.label for dep in ctx.attr.deps_used_whitelist], format_each = "_%s")
35+
deps_args.add_all("--unused_whitelist", [dep.label for dep in ctx.attr.deps_unused_whitelist], format_each = "_%s")
3536
deps_args.add("--")
3637
deps_args.add(g.compile.used)
3738
deps_args.add(deps_check)

rules/scala.bzl

+4
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ _compile_attributes = {
107107
doc = "The JVM library dependencies to always consider used for `scala_deps_used` checks.",
108108
providers = [JavaInfo],
109109
),
110+
"deps_unused_whitelist": attr.label_list(
111+
doc = "The JVM library dependencies to always consider unused for `scala_deps_direct` checks.",
112+
providers = [JavaInfo],
113+
),
110114
"runtime_deps": attr.label_list(
111115
doc = "The JVM runtime-only library dependencies.",
112116
providers = [JavaInfo],

src/main/scala/higherkindness/rules_scala/workers/deps/DepsRunner.scala

+11-4
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,17 @@ object DepsRunner extends WorkerMain[Unit] {
3030
.nargs("+")
3131
parser.addArgument("--label").help("Label of current target").metavar("label").required(true)
3232
parser
33-
.addArgument("--whitelist")
33+
.addArgument("--used_whitelist")
3434
.help("Whitelist of labels to ignore for unused deps")
3535
.metavar("label")
3636
.nargs("*")
3737
.setDefault_(Collections.emptyList)
38+
parser
39+
.addArgument("--unused_whitelist")
40+
.help("Whitelist of labels to ignore for direct deps")
41+
.metavar("label")
42+
.nargs("*")
43+
.setDefault_(Collections.emptyList)
3844
parser.addArgument("used").help("Manifest of used").`type`(Arguments.fileType.verifyCanRead().verifyIsFile())
3945
parser.addArgument("success").help("Success file").`type`(Arguments.fileType.verifyCanCreate())
4046
parser
@@ -54,8 +60,8 @@ object DepsRunner extends WorkerMain[Unit] {
5460
val usedPaths = Files.readAllLines(namespace.get[File]("used").toPath).asScala.toSet
5561

5662
val remove = if (namespace.getBoolean("check_used") == true) {
57-
val whitelist = namespace.getList[String]("whitelist").asScala.map(_.tail)
58-
(directLabels -- whitelist).filterNot(labelToPaths(_).exists(usedPaths))
63+
val usedWhitelist = namespace.getList[String]("used_whitelist").asScala.map(_.tail)
64+
(directLabels -- usedWhitelist).filterNot(labelToPaths(_).exists(usedPaths))
5965
} else Nil
6066
remove.foreach { depLabel =>
6167
println(s"Target '$depLabel' not used, please remove it from the deps.")
@@ -64,7 +70,8 @@ object DepsRunner extends WorkerMain[Unit] {
6470
}
6571

6672
val add = if (namespace.getBoolean("check_direct") == true) {
67-
(usedPaths -- directLabels.flatMap(labelToPaths))
73+
val unusedWhitelist = namespace.getList[String]("unused_whitelist").asScala.map(_.tail)
74+
(usedPaths -- (directLabels ++ unusedWhitelist).flatMap(labelToPaths))
6875
.flatMap(path =>
6976
groups.collectFirst { case (label, paths) if paths(path) => label }.orElse {
7077
System.err.println(s"Warning: There is a reference to $path, but no dependency of $label provides it")

tests/dependencies/unused/BUILD

+38
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ scala_library(
2020
],
2121
)
2222

23+
scala_library(
24+
name = "0_unused_whitelist",
25+
srcs = ["0_unused.scala"],
26+
deps_used_whitelist = [
27+
"@annex_test//:org_scalacheck_scalacheck_2_12",
28+
],
29+
scala = "//scala:2_12",
30+
tags = ["manual"],
31+
deps = [
32+
"@annex_test//:org_scalacheck_scalacheck_2_12",
33+
],
34+
)
35+
2336
scala_library(
2437
name = "indirect_unused",
2538
srcs = ["indirect_unused.scala"],
@@ -31,3 +44,28 @@ scala_library(
3144
"@annex_test//:org_specs2_specs2_matcher_2_12",
3245
],
3346
)
47+
48+
scala_library(
49+
name = "indirect_unused_missing",
50+
srcs = ["indirect_unused.scala"],
51+
scala = "//scala:2_12",
52+
tags = ["manual"],
53+
deps = [
54+
"@annex_test//:org_specs2_specs2_common_2_12",
55+
"@annex_test//:org_specs2_specs2_core_2_12",
56+
],
57+
)
58+
59+
scala_library(
60+
name = "indirect_unused_whitelist",
61+
srcs = ["indirect_unused.scala"],
62+
deps_unused_whitelist = [
63+
"@annex_test//:org_specs2_specs2_matcher_2_12",
64+
],
65+
scala = "//scala:2_12",
66+
tags = ["manual"],
67+
deps = [
68+
"@annex_test//:org_specs2_specs2_common_2_12",
69+
"@annex_test//:org_specs2_specs2_core_2_12",
70+
],
71+
)

tests/dependencies/unused/test

+4
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
bazel build :0_used
55
! bazel build :0_unused || false
66
bazel build :0_unused |& grep "buildozer 'remove deps @annex_test//:org_scalacheck_scalacheck_2_12' //dependencies/unused:0_unused"
7+
bazel build :0_unused_whitelist
78
bazel build :indirect_unused
9+
! bazel build :indirect_unused_missing || false
10+
bazel build :indirect_unused_missing |& grep "buildozer 'add deps @annex_test//:org_specs2_specs2_matcher_2_12' //dependencies/unused:indirect_unused_missing"
11+
bazel build :indirect_unused_whitelist

0 commit comments

Comments
 (0)