Skip to content

Commit 23b3b97

Browse files
committed
Intorduce flag that switches where toolchains reads config from
Unfortunately bazel rules doesn't know if attr was set by user or not bazelbuild/bazel#14434
1 parent 31001b8 commit 23b3b97

File tree

2 files changed

+56
-36
lines changed

2 files changed

+56
-36
lines changed

scala/scala_toolchain.bzl

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -43,66 +43,80 @@ def _partition_patterns(patterns):
4343
]
4444
return includes, excludes
4545

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"]),
46+
_config_attrs = {
47+
"dependency_mode": attr.string(
48+
default = "direct",
49+
values = ["direct", "plus-one", "transitive"],
50+
),
51+
"strict_deps_mode": attr.string(
52+
default = "default",
53+
values = ["off", "warn", "error", "default"],
54+
),
55+
"unused_dependency_checker_mode": attr.string(
56+
default = "off",
57+
values = ["off", "warn", "error"],
58+
),
59+
"compiler_deps_mode": attr.string(
60+
default = "off",
61+
values = ["off", "warn", "error"],
62+
),
63+
"dependency_tracking_method": attr.string(
64+
default = "default",
65+
values = ["ast-plus", "ast", "high-level", "default"],
66+
),
5267
"dependency_tracking_strict_deps_patterns": attr.string_list(
5368
doc = "List of target prefixes included for strict deps analysis. Exclude patterns with '-'",
69+
default = [""],
5470
),
5571
"dependency_tracking_unused_deps_patterns": attr.string_list(
5672
doc = "List of target prefixes included for unused deps analysis. Exclude patterns with '-'",
73+
default = [""],
5774
),
5875
"enable_diagnostics_report": attr.bool(
5976
doc = "Enable the output of structured diagnostics through the BEP",
6077
),
6178
"enable_stats_file": attr.bool(
79+
default = True,
6280
doc = "Enable writing of statsfile",
6381
),
6482
"enable_semanticdb": attr.bool(
83+
default = False,
6584
doc = "Enable SemanticDb",
6685
),
67-
"semanticdb_bundle_in_jar": attr.bool(
68-
doc = "Option to bundle the semanticdb files inside the output jar file",
69-
),
86+
"semanticdb_bundle_in_jar": attr.bool(default = False, doc = "Option to bundle the semanticdb files inside the output jar file"),
7087
"use_argument_file_in_runner": attr.bool(
88+
default = False,
7189
doc = "Changes java binaries scripts (including tests) to use argument files and not classpath jars to improve performance, requires java > 8",
7290
),
7391
}
7492

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()
93+
_config_flags = {
94+
"_" + k: attr.label(default = "//scala/settings:%s" % k)
95+
for k in _config_attrs.keys()
8196
}
8297

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()})
98+
def _config(ctx):
99+
if ctx.attr._scala_toolchain_flags[BuildSettingInfo].value:
100+
return struct(**{k: getattr(ctx.attr, "_" + k)[BuildSettingInfo].value for k in _config_attrs.keys()})
101+
else:
102+
return struct(**{k: getattr(ctx.attr, k) for k in _config_attrs.keys()})
89103

90104
def _scala_toolchain_impl(ctx):
91-
flags = _resolve_flags(ctx)
105+
config = _config(ctx)
92106

93-
dependency_mode = flags.dependency_mode
107+
dependency_mode = config.dependency_mode
94108

95109
strict_deps_mode = _compute_strict_deps_mode(
96-
flags.strict_deps_mode,
110+
config.strict_deps_mode,
97111
dependency_mode,
98112
)
99113

100-
compiler_deps_mode = flags.compiler_deps_mode
114+
compiler_deps_mode = config.compiler_deps_mode
101115

102-
unused_dependency_checker_mode = flags.unused_dependency_checker_mode
116+
unused_dependency_checker_mode = config.unused_dependency_checker_mode
103117
dependency_tracking_method = _compute_dependency_tracking_method(
104118
dependency_mode,
105-
flags.dependency_tracking_method,
119+
config.dependency_tracking_method,
106120
)
107121

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

124-
all_strict_deps_patterns = flags.dependency_tracking_strict_deps_patterns
138+
all_strict_deps_patterns = config.dependency_tracking_strict_deps_patterns
125139
strict_deps_includes, strict_deps_excludes = _partition_patterns(all_strict_deps_patterns)
126140

127-
all_unused_deps_patterns = flags.dependency_tracking_unused_deps_patterns
141+
all_unused_deps_patterns = config.dependency_tracking_unused_deps_patterns
128142
unused_deps_includes, unused_deps_excludes = _partition_patterns(all_unused_deps_patterns)
129143

130144
toolchain = platform_common.ToolchainInfo(
@@ -141,12 +155,12 @@ def _scala_toolchain_impl(ctx):
141155
unused_deps_exclude_patterns = unused_deps_excludes,
142156
scalac_jvm_flags = ctx.attr.scalac_jvm_flags,
143157
scala_test_jvm_flags = ctx.attr.scala_test_jvm_flags,
144-
enable_diagnostics_report = flags.enable_diagnostics_report,
158+
enable_diagnostics_report = config.enable_diagnostics_report,
145159
jacocorunner = ctx.attr.jacocorunner,
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,
160+
enable_stats_file = config.enable_stats_file,
161+
enable_semanticdb = config.enable_semanticdb,
162+
semanticdb_bundle_in_jar = config.semanticdb_bundle_in_jar,
163+
use_argument_file_in_runner = config.use_argument_file_in_runner,
150164
scala_version = ctx.attr._scala_version[BuildSettingInfo].value,
151165
)
152166
return [toolchain]
@@ -166,8 +180,8 @@ def _default_dep_providers():
166180
scala_toolchain = rule(
167181
_scala_toolchain_impl,
168182
attrs = _dicts.add(
169-
_deprecated_attrs,
170-
_flag_attrs,
183+
_config_attrs,
184+
_config_flags,
171185
{
172186
"dep_providers": attr.label_list(
173187
default = _default_dep_providers(),
@@ -178,6 +192,7 @@ scala_toolchain = rule(
178192
"scalac_jvm_flags": attr.string_list(),
179193
"scala_test_jvm_flags": attr.string_list(),
180194
"_scala_version": attr.label(default = "@io_bazel_rules_scala_config//:scala_version"),
195+
"_scala_toolchain_flags": attr.label(default = "//scala/settings:scala_toolchain_flags"),
181196
},
182197
),
183198
fragments = ["java"],

scala/settings/BUILD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ stamp_scala_import(
99

1010
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag", "string_list_flag")
1111

12+
bool_flag(
13+
name = "scala_toolchain_flags",
14+
build_setting_default = False,
15+
)
16+
1217
string_flag(
1318
name = "dependency_mode",
1419
build_setting_default = "direct",

0 commit comments

Comments
 (0)