Skip to content

Commit 0c220fe

Browse files
authored
Separate coverage (#972)
* Separate coverage from compile * Remove unused * Simplify condition * Simplify struct * Simplify return statement * Simplify phase * Fix lint * Remove condition
1 parent 7657d2f commit 0c220fe

File tree

10 files changed

+100
-72
lines changed

10 files changed

+100
-72
lines changed

scala/private/phases/phase_compile.bzl

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
#
44
# DOCUMENT THIS
55
#
6-
load("@bazel_skylib//lib:dicts.bzl", "dicts")
76
load("@bazel_tools//tools/jdk:toolchain_utils.bzl", "find_java_runtime_toolchain", "find_java_toolchain")
8-
load(
9-
"@io_bazel_rules_scala//scala/private:coverage_replacements_provider.bzl",
10-
_coverage_replacements_provider = "coverage_replacements_provider",
11-
)
127
load(
138
"@io_bazel_rules_scala//scala/private:paths.bzl",
149
_get_files_with_extension = "get_files_with_extension",
@@ -23,13 +18,6 @@ load(
2318
)
2419
load(":resources.bzl", _resource_paths = "paths")
2520

26-
_empty_coverage_struct = struct(
27-
external = struct(
28-
replacements = {},
29-
),
30-
providers_dict = {},
31-
)
32-
3321
def phase_compile_binary(ctx, p):
3422
args = struct(
3523
buildijar = False,
@@ -163,13 +151,12 @@ def _phase_compile(
163151

164152
# TODO: simplify the return values and use provider
165153
return struct(
166-
coverage = out.coverage.external,
167154
files = depset(out.full_jars),
168155
rjars = depset(out.full_jars, transitive = [rjars]),
169156
merged_provider = out.merged_provider,
170-
external_providers = dicts.add(out.coverage.providers_dict, {
157+
external_providers = {
171158
"JavaInfo": out.merged_provider,
172-
}),
159+
},
173160
)
174161

175162
def _compile_or_empty(
@@ -193,7 +180,6 @@ def _compile_or_empty(
193180

194181
# no need to build ijar when empty
195182
return struct(
196-
coverage = _empty_coverage_struct,
197183
full_jars = [ctx.outputs.jar],
198184
merged_provider = scala_compilation_provider,
199185
)
@@ -264,15 +250,12 @@ def _compile_or_empty(
264250
if java_jar:
265251
full_jars += [java_jar.jar]
266252

267-
coverage = _jacoco_offline_instrument(ctx, ctx.outputs.jar)
268-
269253
if java_jar:
270254
merged_provider = java_common.merge([scala_compilation_provider, java_jar.java_compilation_provider])
271255
else:
272256
merged_provider = scala_compilation_provider
273257

274258
return struct(
275-
coverage = coverage,
276259
full_jars = full_jars,
277260
merged_provider = merged_provider,
278261
)
@@ -338,54 +321,6 @@ def _pack_source_jar(ctx, scala_srcs, in_srcjars):
338321
host_javabase = find_java_runtime_toolchain(ctx, ctx.attr._host_javabase),
339322
)
340323

341-
def _jacoco_offline_instrument(ctx, input_jar):
342-
if not ctx.configuration.coverage_enabled or not hasattr(ctx.attr, "_code_coverage_instrumentation_worker"):
343-
return _empty_coverage_struct
344-
345-
output_jar = ctx.actions.declare_file(
346-
"{}-offline.jar".format(input_jar.basename.split(".")[0]),
347-
)
348-
in_out_pairs = [
349-
(input_jar, output_jar),
350-
]
351-
352-
args = ctx.actions.args()
353-
args.add_all(in_out_pairs, map_each = _jacoco_offline_instrument_format_each)
354-
args.set_param_file_format("multiline")
355-
args.use_param_file("@%s", use_always = True)
356-
357-
ctx.actions.run(
358-
mnemonic = "JacocoInstrumenter",
359-
inputs = [in_out_pair[0] for in_out_pair in in_out_pairs],
360-
outputs = [in_out_pair[1] for in_out_pair in in_out_pairs],
361-
executable = ctx.attr._code_coverage_instrumentation_worker.files_to_run,
362-
execution_requirements = {"supports-workers": "1"},
363-
arguments = [args],
364-
)
365-
366-
replacements = {i: o for (i, o) in in_out_pairs}
367-
provider = _coverage_replacements_provider.create(
368-
replacements = replacements,
369-
)
370-
instrumented_files_provider = coverage_common.instrumented_files_info(
371-
ctx,
372-
source_attributes = ["srcs"],
373-
dependency_attributes = _coverage_replacements_provider.dependency_attributes,
374-
extensions = ["scala", "java"],
375-
)
376-
return struct(
377-
external = struct(
378-
replacements = replacements,
379-
),
380-
providers_dict = {
381-
"_CoverageReplacements": provider,
382-
"InstrumentedFilesInfo": instrumented_files_provider,
383-
},
384-
)
385-
386-
def _jacoco_offline_instrument_format_each(in_out_pair):
387-
return (["%s=%s" % (in_out_pair[0].path, in_out_pair[1].path)])
388-
389324
def _try_to_compile_java_jar(
390325
ctx,
391326
scala_output,
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#
2+
# PHASE: coverage
3+
#
4+
# DOCUMENT THIS
5+
#
6+
7+
load(
8+
"@io_bazel_rules_scala//scala/private:coverage_replacements_provider.bzl",
9+
_coverage_replacements_provider = "coverage_replacements_provider",
10+
)
11+
12+
def phase_coverage_library(ctx, p):
13+
args = struct(
14+
srcjars = p.collect_srcjars,
15+
)
16+
return _phase_coverage_default(ctx, p, args)
17+
18+
def phase_coverage_common(ctx, p):
19+
return _phase_coverage_default(ctx, p)
20+
21+
def _phase_coverage_default(ctx, p, _args = struct()):
22+
return _phase_coverage(
23+
ctx,
24+
p,
25+
_args.srcjars if hasattr(_args, "srcjars") else depset(),
26+
)
27+
28+
def _phase_coverage(ctx, p, srcjars):
29+
if len(ctx.files.srcs) + len(srcjars.to_list()) == 0 or not ctx.configuration.coverage_enabled:
30+
return struct(
31+
replacements = {},
32+
external_providers = {},
33+
)
34+
else:
35+
input_jar = ctx.outputs.jar
36+
output_jar = ctx.actions.declare_file(
37+
"{}-offline.jar".format(input_jar.basename.split(".")[0]),
38+
)
39+
in_out_pairs = [
40+
(input_jar, output_jar),
41+
]
42+
43+
args = ctx.actions.args()
44+
args.add_all(in_out_pairs, map_each = _jacoco_offline_instrument_format_each)
45+
args.set_param_file_format("multiline")
46+
args.use_param_file("@%s", use_always = True)
47+
48+
ctx.actions.run(
49+
mnemonic = "JacocoInstrumenter",
50+
inputs = [in_out_pair[0] for in_out_pair in in_out_pairs],
51+
outputs = [in_out_pair[1] for in_out_pair in in_out_pairs],
52+
executable = ctx.attr._code_coverage_instrumentation_worker.files_to_run,
53+
execution_requirements = {"supports-workers": "1"},
54+
arguments = [args],
55+
)
56+
57+
replacements = {i: o for (i, o) in in_out_pairs}
58+
provider = _coverage_replacements_provider.create(
59+
replacements = replacements,
60+
)
61+
instrumented_files_provider = coverage_common.instrumented_files_info(
62+
ctx,
63+
source_attributes = ["srcs"],
64+
dependency_attributes = _coverage_replacements_provider.dependency_attributes,
65+
extensions = ["scala", "java"],
66+
)
67+
return struct(
68+
replacements = replacements,
69+
external_providers = {
70+
"_CoverageReplacements": provider,
71+
"InstrumentedFilesInfo": instrumented_files_provider,
72+
},
73+
)
74+
75+
def _jacoco_offline_instrument_format_each(in_out_pair):
76+
return (["%s=%s" % (in_out_pair[0].path, in_out_pair[1].path)])

scala/private/phases/phase_coverage_runfiles.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def phase_coverage_runfiles(ctx, p):
1414
if ctx.configuration.coverage_enabled and _coverage_replacements_provider.is_enabled(ctx):
1515
coverage_replacements = _coverage_replacements_provider.from_ctx(
1616
ctx,
17-
base = p.compile.coverage.replacements,
17+
base = p.coverage.replacements,
1818
).replacements
1919

2020
rjars = depset([

scala/private/phases/phases.bzl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ load(
4545
_phase_runfiles_library = "phase_runfiles_library",
4646
_phase_runfiles_scalatest = "phase_runfiles_scalatest",
4747
)
48+
load(
49+
"@io_bazel_rules_scala//scala/private:phases/phase_coverage.bzl",
50+
_phase_coverage_common = "phase_coverage_common",
51+
_phase_coverage_library = "phase_coverage_library",
52+
)
4853
load("@io_bazel_rules_scala//scala/private:phases/phase_default_info.bzl", _phase_default_info = "phase_default_info")
4954
load("@io_bazel_rules_scala//scala/private:phases/phase_scalac_provider.bzl", _phase_scalac_provider = "phase_scalac_provider")
5055
load("@io_bazel_rules_scala//scala/private:phases/phase_write_manifest.bzl", _phase_write_manifest = "phase_write_manifest")
@@ -85,6 +90,10 @@ phase_merge_jars = _phase_merge_jars
8590
# jvm_flags
8691
phase_jvm_flags = _phase_jvm_flags
8792

93+
# coverage
94+
phase_coverage_library = _phase_coverage_library
95+
phase_coverage_common = _phase_coverage_common
96+
8897
# coverage_runfiles
8998
phase_coverage_runfiles = _phase_coverage_runfiles
9099

scala/private/rule_impls.bzl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
"""Rules for supporting the Scala language."""
1515

1616
load("@bazel_skylib//lib:paths.bzl", "paths")
17-
load(
18-
"@io_bazel_rules_scala//scala/private:coverage_replacements_provider.bzl",
19-
_coverage_replacements_provider = "coverage_replacements_provider",
20-
)
2117
load(
2218
":common.bzl",
2319
_collect_plugin_paths = "collect_plugin_paths",

scala/private/rules/scala_binary.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ load(
1414
"extras_phases",
1515
"phase_collect_jars_common",
1616
"phase_compile_binary",
17+
"phase_coverage_common",
1718
"phase_declare_executable",
1819
"phase_default_info",
1920
"phase_java_wrapper_common",
@@ -39,6 +40,7 @@ def _scala_binary_impl(ctx):
3940
("declare_executable", phase_declare_executable),
4041
# no need to build an ijar for an executable
4142
("compile", phase_compile_binary),
43+
("coverage", phase_coverage_common),
4244
("merge_jars", phase_merge_jars),
4345
("runfiles", phase_runfiles_common),
4446
("write_executable", phase_write_executable_common),

scala/private/rules/scala_junit_test.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ load(
1313
"extras_phases",
1414
"phase_collect_jars_junit_test",
1515
"phase_compile_junit_test",
16+
"phase_coverage_common",
1617
"phase_declare_executable",
1718
"phase_default_info",
1819
"phase_java_wrapper_common",
@@ -43,6 +44,7 @@ def _scala_junit_test_impl(ctx):
4344
("declare_executable", phase_declare_executable),
4445
# no need to build an ijar for an executable
4546
("compile", phase_compile_junit_test),
47+
("coverage", phase_coverage_common),
4648
("merge_jars", phase_merge_jars),
4749
("runfiles", phase_runfiles_common),
4850
("jvm_flags", phase_jvm_flags),

scala/private/rules/scala_library.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ load(
2626
"phase_compile_library",
2727
"phase_compile_library_for_plugin_bootstrapping",
2828
"phase_compile_macro_library",
29+
"phase_coverage_common",
30+
"phase_coverage_library",
2931
"phase_default_info",
3032
"phase_merge_jars",
3133
"phase_runfiles_library",
@@ -63,6 +65,7 @@ def _scala_library_impl(ctx):
6365
("unused_deps_checker", phase_unused_deps_checker),
6466
("collect_jars", phase_collect_jars_common),
6567
("compile", phase_compile_library),
68+
("coverage", phase_coverage_library),
6669
("merge_jars", phase_merge_jars),
6770
("runfiles", phase_runfiles_library),
6871
("collect_exports_jars", phase_collect_exports_jars),
@@ -194,6 +197,7 @@ def _scala_macro_library_impl(ctx):
194197
("unused_deps_checker", phase_unused_deps_checker),
195198
("collect_jars", phase_collect_jars_macro_library),
196199
("compile", phase_compile_macro_library),
200+
("coverage", phase_coverage_common),
197201
("merge_jars", phase_merge_jars),
198202
("runfiles", phase_runfiles_library),
199203
("collect_exports_jars", phase_collect_exports_jars),

scala/private/rules/scala_repl.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ load(
1414
"extras_phases",
1515
"phase_collect_jars_repl",
1616
"phase_compile_repl",
17+
"phase_coverage_common",
1718
"phase_declare_executable",
1819
"phase_default_info",
1920
"phase_java_wrapper_repl",
@@ -40,6 +41,7 @@ def _scala_repl_impl(ctx):
4041
("declare_executable", phase_declare_executable),
4142
# no need to build an ijar for an executable
4243
("compile", phase_compile_repl),
44+
("coverage", phase_coverage_common),
4345
("merge_jars", phase_merge_jars),
4446
("runfiles", phase_runfiles_common),
4547
("write_executable", phase_write_executable_repl),

scala/private/rules/scala_test.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ load(
1414
"extras_phases",
1515
"phase_collect_jars_scalatest",
1616
"phase_compile_scalatest",
17+
"phase_coverage_common",
1718
"phase_coverage_runfiles",
1819
"phase_declare_executable",
1920
"phase_default_info",
@@ -40,6 +41,7 @@ def _scala_test_impl(ctx):
4041
("declare_executable", phase_declare_executable),
4142
# no need to build an ijar for an executable
4243
("compile", phase_compile_scalatest),
44+
("coverage", phase_coverage_common),
4345
("merge_jars", phase_merge_jars),
4446
("runfiles", phase_runfiles_scalatest),
4547
("coverage_runfiles", phase_coverage_runfiles),

0 commit comments

Comments
 (0)