Skip to content

Commit 7b25715

Browse files
authored
Mark unused deps as ignored for mixed source targets (#1499)
* Mark unused deps as ignored for mixed source targets When Scala target include Java sources, unused deps are reported from Scala sources, which still may be required by Java code. We mark unused deps as ignored so that sdeps consumers could act accordingly. Also fixed some doc strings.
1 parent ce54e00 commit 7b25715

File tree

12 files changed

+173
-4
lines changed

12 files changed

+173
-4
lines changed

scala/scala_toolchain.bzl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ scala_toolchain = rule(
136136
values = ["ast-plus", "ast", "high-level", "default"],
137137
),
138138
"dependency_tracking_strict_deps_patterns": attr.string_list(
139-
doc = "List of target prefixes included for strict deps analysis. Exclude patetrns with '-'",
139+
doc = "List of target prefixes included for strict deps analysis. Exclude patterns with '-'",
140140
default = [""],
141141
),
142142
"dependency_tracking_unused_deps_patterns": attr.string_list(
143-
doc = "List of target prefixes included for unused deps analysis. Exclude patetrns with '-'",
143+
doc = "List of target prefixes included for unused deps analysis. Exclude patterns with '-'",
144144
default = [""],
145145
),
146146
"scalac_jvm_flags": attr.string_list(),

src/java/io/bazel/rulesscala/scalac/reporter/DepsTrackingReporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void prepareReport() throws IOException {
141141
ops.directJars[i],
142142
directTarget,
143143
Kind.UNUSED,
144-
ignoredTargets.contains(directTarget)
144+
ignoredTargets.contains(directTarget) || "off".equals(ops.unusedDependencyCheckerMode)
145145
)
146146
);
147147
}

src/java/io/bazel/rulesscala/scalac/reporter/scala_deps.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ message Dependency {
2424
// Target label for this dependency
2525
string label = 3;
2626

27-
// Path to the full
27+
// Path to the full jar
2828
string path = 4;
2929

3030
// Ignored in dep tracking

test/shell/test_compiler_dependency_tracking.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ test_fails_for_strict_dep() {
2424
build --extra_toolchains="//test_expect_failure/compiler_dependency_tracker:ast_plus_error" //test_expect_failure/compiler_dependency_tracker:missing_source_dep
2525
}
2626

27+
test_sdeps() {
28+
bazel test --extra_toolchains=//test_expect_failure/compiler_dependency_tracker:ast_plus_warn //test_expect_failure/compiler_dependency_tracker/sdeps/...
29+
}
30+
2731
$runner test_fails_for_unused_dep
2832
$runner test_fails_for_missing_compile_dep
2933
$runner test_fails_for_strict_dep
34+
$runner test_sdeps

test_expect_failure/compiler_dependency_tracker/BUILD

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,23 @@ toolchain(
1818
visibility = ["//visibility:public"],
1919
)
2020

21+
scala_toolchain(
22+
name = "ast_plus_warn_impl",
23+
compiler_deps_mode = "warn",
24+
dependency_mode = "plus-one",
25+
dependency_tracking_method = "ast-plus",
26+
strict_deps_mode = "warn",
27+
unused_dependency_checker_mode = "warn",
28+
visibility = ["//visibility:public"],
29+
)
30+
31+
toolchain(
32+
name = "ast_plus_warn",
33+
toolchain = ":ast_plus_warn_impl",
34+
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
35+
visibility = ["//visibility:public"],
36+
)
37+
2138
scala_library(
2239
name = "unused_dep",
2340
srcs = ["A.scala"],
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package sdeps
2+
3+
class AnotherScalaDep
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
load("//scala:scala.bzl", "scala_library", "scala_specs2_junit_test")
2+
3+
scala_library(
4+
name = "only_scala_sources",
5+
srcs = [
6+
"SomeScalaWithDeps.scala",
7+
],
8+
unused_dependency_checker_ignored_targets = [
9+
":scala_ignored_unused_dep",
10+
],
11+
deps = [
12+
":scala_dep",
13+
":scala_ignored_unused_dep",
14+
":scala_unused_dep",
15+
],
16+
)
17+
18+
scala_library(
19+
name = "mixed_sources",
20+
srcs = [
21+
"SomeJava.java",
22+
"SomeScalaWithDeps.scala",
23+
],
24+
unused_dependency_checker_ignored_targets = [
25+
":scala_ignored_unused_dep",
26+
],
27+
deps = [
28+
":scala_dep",
29+
":scala_ignored_unused_dep",
30+
":scala_unused_dep",
31+
],
32+
)
33+
34+
scala_library(
35+
name = "scala_dep",
36+
srcs = ["ScalaDep.scala"],
37+
)
38+
39+
scala_library(
40+
name = "scala_unused_dep",
41+
srcs = ["AnotherScalaDep.scala"],
42+
)
43+
44+
scala_library(
45+
name = "scala_ignored_unused_dep",
46+
srcs = ["IgnoredScalaDep.scala"],
47+
)
48+
49+
scala_specs2_junit_test(
50+
name = "sdeps_test",
51+
srcs = ["SdepsTest.scala"],
52+
resources = [
53+
":mixed_sources.sdeps",
54+
":only_scala_sources.sdeps",
55+
],
56+
suffixes = ["Test"],
57+
deps = [
58+
"//src/java/io/bazel/rulesscala/scalac/reporter:scala_deps_java_proto",
59+
"@com_google_protobuf//:protobuf_java",
60+
],
61+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package sdeps
2+
3+
class IgnoredScalaDep
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package sdeps
2+
3+
object ScalaDep {
4+
val foo = "bar"
5+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package sdeps
2+
3+
import org.specs2.mutable.SpecWithJUnit
4+
import io.bazel.rulesscala.deps.proto.ScalaDeps
5+
import io.bazel.rulesscala.deps.proto.ScalaDeps.Dependency.Kind._
6+
import org.specs2.matcher.Matcher
7+
8+
import java.util
9+
10+
class SdepsTest extends SpecWithJUnit {
11+
12+
"Mixed Scala/Java source targets" should {
13+
val deps = loadSdeps("mixed_sources.sdeps")
14+
15+
"mark unused deps as ignored" in {
16+
val unusedDep = findDep(deps, ":scala_unused_dep")
17+
18+
unusedDep must (beIgnored and beUnused)
19+
}
20+
21+
"mark ignored deps as ignored" in {
22+
val ignoredDep = findDep(deps, ":scala_ignored_unused_dep")
23+
24+
ignoredDep must (beIgnored and beUnused)
25+
}
26+
}
27+
28+
"Scala-only source targets" should {
29+
val deps = loadSdeps("only_scala_sources.sdeps")
30+
31+
"mark unused deps as not ignored" in {
32+
val unusedDep = findDep(deps, ":scala_unused_dep")
33+
34+
unusedDep must (not(beIgnored) and beUnused)
35+
}
36+
37+
"mark ignored deps as ignored" in {
38+
val ignoredDep = findDep(deps, ":scala_ignored_unused_dep")
39+
40+
ignoredDep must (beIgnored and beUnused)
41+
}
42+
}
43+
44+
def beIgnored: Matcher[ScalaDeps.Dependency] = {
45+
beTrue ^^ { (_: ScalaDeps.Dependency).getIgnored }
46+
}
47+
48+
def beUnused: Matcher[ScalaDeps.Dependency] = {
49+
be_==(UNUSED) ^^ { (_: ScalaDeps.Dependency).getKind }
50+
}
51+
52+
def loadSdeps(resource: String): util.List[ScalaDeps.Dependency] = {
53+
val prefix = "/test_expect_failure/compiler_dependency_tracker/sdeps/"
54+
val is = getClass.getResourceAsStream(prefix + resource)
55+
ScalaDeps.Dependencies.parseFrom(is).getDependencyList
56+
}
57+
58+
def findDep(deps: util.List[ScalaDeps.Dependency], byLabelSuffix: String): ScalaDeps.Dependency =
59+
deps.stream()
60+
.filter(_.getLabel.endsWith(byLabelSuffix))
61+
.findFirst()
62+
.orElseThrow(
63+
() => new RuntimeException(byLabelSuffix + " dep not reported in the sdeps file")
64+
)
65+
}

0 commit comments

Comments
 (0)