Skip to content

Commit d60ebe9

Browse files
authored
Merge pull request #102 from lucidsoftware/jpeterson-adds-the-deps-checker-label-attribute
Add the deps_checker_label attribute
2 parents d3d92bd + 1269b40 commit d60ebe9

File tree

9 files changed

+118
-24
lines changed

9 files changed

+118
-24
lines changed

rules/jvm/private/label.bzl

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,27 @@ load(
55
_LabeledJarsData = "LabeledJarsData",
66
)
77

8+
def get_labeled_jars(label, java_info, deps):
9+
deps_labeled_jars = [dep[_LabeledJars] for dep in deps if _LabeledJars in dep]
10+
return _LabeledJars(
11+
label = label,
12+
values = depset(
13+
[
14+
_LabeledJarsData(
15+
label = label,
16+
jars = depset(transitive = [java_info.compile_jars, java_info.full_compile_jars]),
17+
),
18+
],
19+
order = "preorder",
20+
transitive = [labeled_jars.values for labeled_jars in deps_labeled_jars],
21+
),
22+
)
23+
824
def labeled_jars_implementation(target, ctx):
925
if JavaInfo not in target:
1026
return []
1127

12-
deps_labeled_jars = [dep[_LabeledJars] for dep in getattr(ctx.rule.attr, "deps", []) if _LabeledJars in dep]
13-
java_info = target[JavaInfo]
14-
return [
15-
_LabeledJars(
16-
values = depset(
17-
[
18-
_LabeledJarsData(
19-
label = ctx.label,
20-
jars = depset(transitive = [java_info.compile_jars, java_info.full_compile_jars]),
21-
),
22-
],
23-
order = "preorder",
24-
transitive = [labeled_jars.values for labeled_jars in deps_labeled_jars],
25-
),
26-
),
27-
]
28+
if _LabeledJars in target:
29+
return []
30+
31+
return [get_labeled_jars(ctx.label, target[JavaInfo], getattr(ctx.rule.attr, "deps", []))]

rules/private/phases.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ load(":phases/phase_coda.bzl", _phase_coda = "phase_coda")
77
load(":phases/phase_coverage_jacoco.bzl", _phase_coverage_jacoco = "phase_coverage_jacoco")
88
load(":phases/phase_ijinfo.bzl", _phase_ijinfo = "phase_ijinfo")
99
load(":phases/phase_javainfo.bzl", _phase_javainfo = "phase_javainfo")
10+
load(":phases/phase_labeledjars.bzl", _phase_labeledjars = "phase_labeledjars")
1011
load(":phases/phase_library_defaultinfo.bzl", _phase_library_defaultinfo = "phase_library_defaultinfo")
1112
load(":phases/phase_outputgroupinfo.bzl", _phase_outputgroupinfo = "phase_outputgroupinfo")
1213
load(":phases/phase_resources.bzl", _phase_resources = "phase_resources")
@@ -37,6 +38,8 @@ phase_ijinfo = _phase_ijinfo
3738

3839
phase_javainfo = _phase_javainfo
3940

41+
phase_labeledjars = _phase_labeledjars
42+
4043
phase_library_defaultinfo = _phase_library_defaultinfo
4144

4245
phase_outputgroupinfo = _phase_outputgroupinfo
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
load("//rules:providers.bzl", "LabeledJars")
2+
load("//rules/jvm:private/label.bzl", "get_labeled_jars")
3+
4+
#
5+
# PHASE: labeledjars
6+
#
7+
# Outputs the `LabeledJars` provider if `deps_checker_label` is set.
8+
#
9+
10+
def phase_labeledjars(ctx, g):
11+
if ctx.attr.deps_checker_label != "":
12+
g.out.providers.append(get_labeled_jars(ctx.attr.deps_checker_label, g.javainfo.java_info, ctx.attr.deps))

rules/private/phases/phase_zinc_depscheck.bzl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,16 @@ def phase_zinc_depscheck(ctx, g):
2525
deps_check = ctx.actions.declare_file("{}/depscheck_{}.success".format(ctx.label.name, name))
2626
deps_args = ctx.actions.args()
2727
deps_args.add(name, format = "--check_%s=true")
28-
deps_args.add_all("--direct", [dep.label for dep in ctx.attr.deps], format_each = "_%s")
28+
29+
direct_dependency_labels = []
30+
31+
for dependency in ctx.attr.deps:
32+
if _LabeledJars in dependency:
33+
direct_dependency_labels.append(dependency[_LabeledJars].label)
34+
else:
35+
direct_dependency_labels.append(dependency.label)
36+
37+
deps_args.add_all("--direct", direct_dependency_labels, format_each = "_%s")
2938

3039
# Check the comment on the function we're calling here to understand why
3140
# we're not using map_each

rules/providers.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ IntellijInfo = provider(
6666
LabeledJars = provider(
6767
doc = "Exported jars and their labels.",
6868
fields = {
69+
"label": "The label of the target providing this provider.",
6970
"values": "The preorder depset of label and jars.",
7071
},
7172
)

rules/scala.bzl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ load(
1919
_phase_coverage_jacoco = "phase_coverage_jacoco",
2020
_phase_ijinfo = "phase_ijinfo",
2121
_phase_javainfo = "phase_javainfo",
22+
_phase_labeledjars = "phase_labeledjars",
2223
_phase_library_defaultinfo = "phase_library_defaultinfo",
2324
_phase_outputgroupinfo = "phase_outputgroupinfo",
2425
_phase_resources = "phase_resources",
@@ -75,7 +76,19 @@ _compile_private_attributes = {
7576
),
7677
}
7778

78-
_compile_attributes = {
79+
_deps_checker_label_attributes = {
80+
"deps_checker_label": attr.string(
81+
doc = """\
82+
The label to identify this target in the output of the dependency checker.
83+
84+
By default, this is just the label of the target. But sometimes—for example, when overriding an artifact with
85+
`rules_jvm_external` to point to your own, or defining an alias to target—you want the dependency checker to suggest
86+
you add or remove a different label as a dependency. In that case, you can set this attribute to that label.
87+
""",
88+
),
89+
}
90+
91+
_compile_attributes = _deps_checker_label_attributes | {
7992
"srcs": attr.label_list(
8093
cfg = _scala_outgoing_transition,
8194
doc = "The source Scala and Java files (and `-sources.jar` `.srcjar` `-src.jar` files of those).",
@@ -213,6 +226,7 @@ def _scala_library_implementation(ctx):
213226
("resources", _phase_resources),
214227
("classpaths", _phase_classpaths),
215228
("javainfo", _phase_javainfo),
229+
("labeledjars", _phase_labeledjars),
216230
("semanticdb", _phase_semanticdb),
217231
("singlejar", _phase_singlejar),
218232
("coverage", _phase_coverage_jacoco),
@@ -227,6 +241,7 @@ def _scala_binary_implementation(ctx):
227241
("resources", _phase_resources),
228242
("classpaths", _phase_classpaths),
229243
("javainfo", _phase_javainfo),
244+
("labeledjars", _phase_labeledjars),
230245
("semanticdb", _phase_semanticdb),
231246
("singlejar", _phase_singlejar),
232247
("coverage", _phase_coverage_jacoco),
@@ -242,6 +257,7 @@ def _scala_test_implementation(ctx):
242257
("resources", _phase_resources),
243258
("classpaths", _phase_classpaths),
244259
("javainfo", _phase_javainfo),
260+
("labeledjars", _phase_labeledjars),
245261
("semanticdb", _phase_semanticdb),
246262
("singlejar", _phase_singlejar),
247263
("coverage", _phase_coverage_jacoco),
@@ -458,6 +474,7 @@ To run: `bazel run <target>`
458474
scala_import = rule(
459475
attrs = _dicts.add(
460476
_scala_import_private_attributes,
477+
_deps_checker_label_attributes,
461478
{
462479
"deps": attr.label_list(
463480
doc = "Libraries used by this one.",

rules/scala/private/import.bzl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ load(
66
"//rules/common:private/utils.bzl",
77
_separate_src_jars_srcs_and_other = "separate_src_jars_srcs_and_other",
88
)
9+
load("//rules/jvm:private/label.bzl", "get_labeled_jars")
910

1011
scala_import_private_attributes = {
1112
"_java_toolchain": attr.label(
@@ -14,10 +15,6 @@ scala_import_private_attributes = {
1415
}
1516

1617
def scala_import_implementation(ctx):
17-
default_info = DefaultInfo(
18-
files = depset(ctx.files.jars + ctx.files.srcjar),
19-
)
20-
2118
if ctx.files.jars:
2219
_src_jar, _, _jar = _separate_src_jars_srcs_and_other(ctx.files.jars)
2320
_src_jar += ctx.files.srcjar
@@ -66,9 +63,12 @@ def scala_import_implementation(ctx):
6663
else:
6764
java_info = java_common.merge([dep[JavaInfo] for dep in ctx.attr.deps])
6865

69-
intellij_info = create_intellij_info(ctx.label, ctx.attr.deps, java_info)
66+
providers = [java_info, create_intellij_info(ctx.label, ctx.attr.deps, java_info)]
67+
68+
if ctx.attr.deps_checker_label != "":
69+
providers.append(get_labeled_jars(ctx.attr.deps_checker_label, java_info, ctx.attr.deps))
7070

71-
return [intellij_info, java_info]
71+
return providers
7272

7373
def create_intellij_info(label, deps, java_info):
7474
# note: tried using transitive_exports from a JavaInfo that was given non-empty exports, but it was always empty
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
load("@rules_scala_annex//rules:scala.bzl", "scala_import", "scala_library")
2+
3+
scala_library(
4+
name = "library",
5+
srcs = [],
6+
deps_checker_label = "//dependencies/deps_checker_label:library-alias",
7+
scala_toolchain_name = "test_zinc_2_13",
8+
)
9+
10+
alias(
11+
name = "library-alias",
12+
actual = ":library",
13+
)
14+
15+
scala_library(
16+
name = "depends-on-library-alias",
17+
srcs = [],
18+
scala_toolchain_name = "test_zinc_2_13",
19+
tags = ["manual"],
20+
deps = [":library-alias"],
21+
)
22+
23+
scala_import(
24+
name = "import",
25+
deps_checker_label = "//dependencies/deps_checker_label:import-alias",
26+
jars = [],
27+
)
28+
29+
alias(
30+
name = "import-alias",
31+
actual = ":import",
32+
)
33+
34+
scala_library(
35+
name = "depends-on-import-alias",
36+
srcs = [],
37+
scala_toolchain_name = "test_zinc_2_13",
38+
tags = ["manual"],
39+
deps = [":import-alias"],
40+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash -e
2+
. "$(dirname "$0")"/../../common.sh
3+
4+
! bazel build :depends-on-library-alias || false
5+
bazel build :depends-on-library-alias |& grep "buildozer 'remove deps //dependencies/deps_checker_label:library-alias' //dependencies/deps_checker_label:depends-on-library-alias"
6+
7+
! bazel build :depends-on-import-alias || false
8+
bazel build :depends-on-import-alias |& grep "buildozer 'remove deps //dependencies/deps_checker_label:import-alias' //dependencies/deps_checker_label:depends-on-import-alias"

0 commit comments

Comments
 (0)