Skip to content

Commit 1282132

Browse files
committed
Experiment: move toolchain attrs to build settings
Rationale: thse settings are orhogonal to scala version. If we will intorduce multiple toolchains for different scala versions then we would need to repeat same attrs for each scala version Toolchains are meant for platform specific tools/flags in our case it loosely maps to scala version Build settings/flags are meant to change behaviour of the rules like strict_deps, use_args_file etc
1 parent c80fcde commit 1282132

File tree

2 files changed

+166
-73
lines changed

2 files changed

+166
-73
lines changed

scala/scala_toolchain.bzl

Lines changed: 75 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ load(
55
"SCALA_MAJOR_VERSION",
66
)
77
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
8+
load("@bazel_skylib//lib:dicts.bzl", _dicts = "dicts")
89

910
def _compute_strict_deps_mode(input_strict_deps_mode, dependency_mode):
1011
if dependency_mode == "direct":
@@ -39,19 +40,66 @@ def _partition_patterns(patterns):
3940
]
4041
return includes, excludes
4142

43+
_deprecated_attrs = {
44+
"dependency_mode": attr.string(values = ["direct", "plus-one", "transitive"]),
45+
"strict_deps_mode": attr.string(values = ["off", "warn", "error", "default"]),
46+
"unused_dependency_checker_mode": attr.string(values = ["off", "warn", "error"]),
47+
"compiler_deps_mode": attr.string(values = ["off", "warn", "error"]),
48+
"dependency_tracking_method": attr.string(values = ["ast-plus", "ast", "high-level", "default"]),
49+
"dependency_tracking_strict_deps_patterns": attr.string_list(
50+
doc = "List of target prefixes included for strict deps analysis. Exclude patterns with '-'",
51+
),
52+
"dependency_tracking_unused_deps_patterns": attr.string_list(
53+
doc = "List of target prefixes included for unused deps analysis. Exclude patterns with '-'",
54+
),
55+
"enable_diagnostics_report": attr.bool(
56+
doc = "Enable the output of structured diagnostics through the BEP",
57+
),
58+
"enable_stats_file": attr.bool(
59+
doc = "Enable writing of statsfile",
60+
),
61+
"enable_semanticdb": attr.bool(
62+
doc = "Enable SemanticDb",
63+
),
64+
"semanticdb_bundle_in_jar": attr.bool(
65+
doc = "Option to bundle the semanticdb files inside the output jar file",
66+
),
67+
"use_argument_file_in_runner": attr.bool(
68+
doc = "Changes java binaries scripts (including tests) to use argument files and not classpath jars to improve performance, requires java > 8",
69+
),
70+
}
71+
72+
def _attr_to_flag(name):
73+
return "//scala/settings:%s" % name
74+
75+
_flag_attrs = {
76+
"_" + k: attr.label(default = _attr_to_flag(k))
77+
for k in _deprecated_attrs.keys()
78+
}
79+
80+
def _resolve_flags(ctx):
81+
def compute(name):
82+
attr = getattr(ctx.attr, name)
83+
return attr if attr else getattr(ctx.attr, "_" + name)[BuildSettingInfo].value
84+
85+
return struct(**{k: compute(k) for k in _deprecated_attrs.keys()})
86+
4287
def _scala_toolchain_impl(ctx):
43-
dependency_mode = ctx.attr.dependency_mode
88+
flags = _resolve_flags(ctx)
89+
90+
dependency_mode = flags.dependency_mode
91+
4492
strict_deps_mode = _compute_strict_deps_mode(
45-
ctx.attr.strict_deps_mode,
93+
flags.strict_deps_mode,
4694
dependency_mode,
4795
)
4896

49-
compiler_deps_mode = ctx.attr.compiler_deps_mode
97+
compiler_deps_mode = flags.compiler_deps_mode
5098

51-
unused_dependency_checker_mode = ctx.attr.unused_dependency_checker_mode
99+
unused_dependency_checker_mode = flags.unused_dependency_checker_mode
52100
dependency_tracking_method = _compute_dependency_tracking_method(
53101
dependency_mode,
54-
ctx.attr.dependency_tracking_method,
102+
flags.dependency_tracking_method,
55103
)
56104

57105
# Final quality checks to possibly detect buggy code above
@@ -70,13 +118,10 @@ def _scala_toolchain_impl(ctx):
70118
if "ast-plus" == dependency_tracking_method and not ENABLE_COMPILER_DEPENDENCY_TRACKING:
71119
fail("To use 'ast-plus' dependency tracking, you must set 'enable_compiler_dependency_tracking' to True in scala_config")
72120

73-
enable_stats_file = ctx.attr.enable_stats_file
74-
enable_diagnostics_report = ctx.attr.enable_diagnostics_report
75-
76-
all_strict_deps_patterns = ctx.attr.dependency_tracking_strict_deps_patterns
121+
all_strict_deps_patterns = flags.dependency_tracking_strict_deps_patterns
77122
strict_deps_includes, strict_deps_excludes = _partition_patterns(all_strict_deps_patterns)
78123

79-
all_unused_deps_patterns = ctx.attr.dependency_tracking_unused_deps_patterns
124+
all_unused_deps_patterns = flags.dependency_tracking_unused_deps_patterns
80125
unused_deps_includes, unused_deps_excludes = _partition_patterns(all_unused_deps_patterns)
81126

82127
toolchain = platform_common.ToolchainInfo(
@@ -93,12 +138,12 @@ def _scala_toolchain_impl(ctx):
93138
unused_deps_exclude_patterns = unused_deps_excludes,
94139
scalac_jvm_flags = ctx.attr.scalac_jvm_flags,
95140
scala_test_jvm_flags = ctx.attr.scala_test_jvm_flags,
96-
enable_diagnostics_report = enable_diagnostics_report,
141+
enable_diagnostics_report = flags.enable_diagnostics_report,
97142
jacocorunner = ctx.attr.jacocorunner,
98-
enable_stats_file = enable_stats_file,
99-
enable_semanticdb = ctx.attr.enable_semanticdb,
100-
semanticdb_bundle_in_jar = ctx.attr.semanticdb_bundle_in_jar,
101-
use_argument_file_in_runner = ctx.attr.use_argument_file_in_runner,
143+
enable_stats_file = flags.enable_stats_file,
144+
enable_semanticdb = flags.enable_semanticdb,
145+
semanticdb_bundle_in_jar = flags.semanticdb_bundle_in_jar,
146+
use_argument_file_in_runner = flags.use_argument_file_in_runner,
102147
scala_version = ctx.attr._scala_version[BuildSettingInfo].value,
103148
)
104149
return [toolchain]
@@ -120,63 +165,21 @@ def _default_dep_providers():
120165

121166
_scala_toolchain = rule(
122167
_scala_toolchain_impl,
123-
attrs = {
124-
"scalacopts": attr.string_list(),
125-
"dep_providers": attr.label_list(
126-
default = _default_dep_providers(),
127-
providers = [_DepsInfo],
128-
),
129-
"dependency_mode": attr.string(
130-
default = "direct",
131-
values = ["direct", "plus-one", "transitive"],
132-
),
133-
"strict_deps_mode": attr.string(
134-
default = "default",
135-
values = ["off", "warn", "error", "default"],
136-
),
137-
"unused_dependency_checker_mode": attr.string(
138-
default = "off",
139-
values = ["off", "warn", "error"],
140-
),
141-
"compiler_deps_mode": attr.string(
142-
default = "off",
143-
values = ["off", "warn", "error"],
144-
),
145-
"dependency_tracking_method": attr.string(
146-
default = "default",
147-
values = ["ast-plus", "ast", "high-level", "default"],
148-
),
149-
"dependency_tracking_strict_deps_patterns": attr.string_list(
150-
doc = "List of target prefixes included for strict deps analysis. Exclude patterns with '-'",
151-
default = [""],
152-
),
153-
"dependency_tracking_unused_deps_patterns": attr.string_list(
154-
doc = "List of target prefixes included for unused deps analysis. Exclude patterns with '-'",
155-
default = [""],
156-
),
157-
"scalac_jvm_flags": attr.string_list(),
158-
"scala_test_jvm_flags": attr.string_list(),
159-
"enable_diagnostics_report": attr.bool(
160-
doc = "Enable the output of structured diagnostics through the BEP",
161-
),
162-
"jacocorunner": attr.label(
163-
default = Label("@bazel_tools//tools/jdk:JacocoCoverage"),
164-
),
165-
"enable_stats_file": attr.bool(
166-
default = True,
167-
doc = "Enable writing of statsfile",
168-
),
169-
"enable_semanticdb": attr.bool(
170-
default = False,
171-
doc = "Enable SemanticDb",
172-
),
173-
"semanticdb_bundle_in_jar": attr.bool(default = False, doc = "Option to bundle the semanticdb files inside the output jar file"),
174-
"use_argument_file_in_runner": attr.bool(
175-
default = False,
176-
doc = "Changes java binaries scripts (including tests) to use argument files and not classpath jars to improve performance, requires java > 8",
177-
),
178-
"_scala_version": attr.label(default = "@io_bazel_rules_scala_config//:scala_version"),
179-
},
168+
attrs = _dicts.add(
169+
_deprecated_attrs,
170+
_flag_attrs,
171+
{
172+
"dep_providers": attr.label_list(
173+
default = _default_dep_providers(),
174+
providers = [_DepsInfo],
175+
),
176+
"jacocorunner": attr.label(default = Label("@bazel_tools//tools/jdk:JacocoCoverage")),
177+
"scalacopts": attr.string_list(),
178+
"scalac_jvm_flags": attr.string_list(),
179+
"scala_test_jvm_flags": attr.string_list(),
180+
"_scala_version": attr.label(default = "@io_bazel_rules_scala_config//:scala_version"),
181+
},
182+
),
180183
fragments = ["java"],
181184
)
182185

scala/settings/BUILD

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,97 @@
1+
package(default_visibility = ["//visibility:public"])
2+
13
load("//scala/settings:stamp_settings.bzl", "stamp_scala_import")
24

35
stamp_scala_import(
46
name = "stamp_scala_import",
57
build_setting_default = True,
6-
visibility = ["//visibility:public"],
8+
)
9+
10+
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag", "string_list_flag")
11+
12+
string_flag(
13+
name = "dependency_mode",
14+
build_setting_default = "direct",
15+
values = [
16+
"direct",
17+
"plus-one",
18+
"transitive",
19+
],
20+
)
21+
22+
string_flag(
23+
name = "strict_deps_mode",
24+
build_setting_default = "default",
25+
values = [
26+
"off",
27+
"warn",
28+
"error",
29+
"default",
30+
],
31+
)
32+
33+
string_flag(
34+
name = "unused_dependency_checker_mode",
35+
build_setting_default = "off",
36+
values = [
37+
"off",
38+
"warn",
39+
"error",
40+
],
41+
)
42+
43+
string_flag(
44+
name = "compiler_deps_mode",
45+
build_setting_default = "off",
46+
values = [
47+
"off",
48+
"warn",
49+
"error",
50+
],
51+
)
52+
53+
string_flag(
54+
name = "dependency_tracking_method",
55+
build_setting_default = "default",
56+
values = [
57+
"ast-plus",
58+
"ast",
59+
"high-level",
60+
"default",
61+
],
62+
)
63+
64+
string_list_flag(
65+
name = "dependency_tracking_strict_deps_patterns",
66+
build_setting_default = [],
67+
)
68+
69+
string_list_flag(
70+
name = "dependency_tracking_unused_deps_patterns",
71+
build_setting_default = [],
72+
)
73+
74+
bool_flag(
75+
name = "enable_diagnostics_report",
76+
build_setting_default = False,
77+
)
78+
79+
bool_flag(
80+
name = "enable_stats_file",
81+
build_setting_default = True,
82+
)
83+
84+
bool_flag(
85+
name = "enable_semanticdb",
86+
build_setting_default = False,
87+
)
88+
89+
bool_flag(
90+
name = "semanticdb_bundle_in_jar",
91+
build_setting_default = False,
92+
)
93+
94+
bool_flag(
95+
name = "use_argument_file_in_runner",
96+
build_setting_default = False,
797
)

0 commit comments

Comments
 (0)