Skip to content

Commit 31001b8

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 98689d0 commit 31001b8

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
@@ -8,6 +8,7 @@ load(
88
"SCALA_MAJOR_VERSION",
99
)
1010
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
11+
load("@bazel_skylib//lib:dicts.bzl", _dicts = "dicts")
1112

1213
def _compute_strict_deps_mode(input_strict_deps_mode, dependency_mode):
1314
if dependency_mode == "direct":
@@ -42,19 +43,66 @@ def _partition_patterns(patterns):
4243
]
4344
return includes, excludes
4445

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

52-
compiler_deps_mode = ctx.attr.compiler_deps_mode
100+
compiler_deps_mode = flags.compiler_deps_mode
53101

54-
unused_dependency_checker_mode = ctx.attr.unused_dependency_checker_mode
102+
unused_dependency_checker_mode = flags.unused_dependency_checker_mode
55103
dependency_tracking_method = _compute_dependency_tracking_method(
56104
dependency_mode,
57-
ctx.attr.dependency_tracking_method,
105+
flags.dependency_tracking_method,
58106
)
59107

60108
# Final quality checks to possibly detect buggy code above
@@ -73,13 +121,10 @@ def _scala_toolchain_impl(ctx):
73121
if "ast-plus" == dependency_tracking_method and not ENABLE_COMPILER_DEPENDENCY_TRACKING:
74122
fail("To use 'ast-plus' dependency tracking, you must set 'enable_compiler_dependency_tracking' to True in scala_config")
75123

76-
enable_stats_file = ctx.attr.enable_stats_file
77-
enable_diagnostics_report = ctx.attr.enable_diagnostics_report
78-
79-
all_strict_deps_patterns = ctx.attr.dependency_tracking_strict_deps_patterns
124+
all_strict_deps_patterns = flags.dependency_tracking_strict_deps_patterns
80125
strict_deps_includes, strict_deps_excludes = _partition_patterns(all_strict_deps_patterns)
81126

82-
all_unused_deps_patterns = ctx.attr.dependency_tracking_unused_deps_patterns
127+
all_unused_deps_patterns = flags.dependency_tracking_unused_deps_patterns
83128
unused_deps_includes, unused_deps_excludes = _partition_patterns(all_unused_deps_patterns)
84129

85130
toolchain = platform_common.ToolchainInfo(
@@ -96,12 +141,12 @@ def _scala_toolchain_impl(ctx):
96141
unused_deps_exclude_patterns = unused_deps_excludes,
97142
scalac_jvm_flags = ctx.attr.scalac_jvm_flags,
98143
scala_test_jvm_flags = ctx.attr.scala_test_jvm_flags,
99-
enable_diagnostics_report = enable_diagnostics_report,
144+
enable_diagnostics_report = flags.enable_diagnostics_report,
100145
jacocorunner = ctx.attr.jacocorunner,
101-
enable_stats_file = enable_stats_file,
102-
enable_semanticdb = ctx.attr.enable_semanticdb,
103-
semanticdb_bundle_in_jar = ctx.attr.semanticdb_bundle_in_jar,
104-
use_argument_file_in_runner = ctx.attr.use_argument_file_in_runner,
146+
enable_stats_file = flags.enable_stats_file,
147+
enable_semanticdb = flags.enable_semanticdb,
148+
semanticdb_bundle_in_jar = flags.semanticdb_bundle_in_jar,
149+
use_argument_file_in_runner = flags.use_argument_file_in_runner,
105150
scala_version = ctx.attr._scala_version[BuildSettingInfo].value,
106151
)
107152
return [toolchain]
@@ -120,62 +165,20 @@ 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
)

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)