Skip to content

Commit 1042a66

Browse files
borkaehwAndre Rocha
authored and
Andre Rocha
committed
Separate coverage (bazel-contrib#972)
* Separate coverage from compile * Remove unused * Simplify condition * Simplify struct * Simplify return statement * Simplify phase * Fix lint * Remove condition
1 parent 784928e commit 1042a66

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
)
@@ -265,15 +251,12 @@ def _compile_or_empty(
265251
if java_jar:
266252
full_jars += [java_jar.jar]
267253

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

275259
return struct(
276-
coverage = coverage,
277260
full_jars = full_jars,
278261
merged_provider = merged_provider,
279262
)
@@ -339,54 +322,6 @@ def _pack_source_jar(ctx, scala_srcs, in_srcjars):
339322
host_javabase = find_java_runtime_toolchain(ctx, ctx.attr._host_javabase),
340323
)
341324

342-
def _jacoco_offline_instrument(ctx, input_jar):
343-
if not ctx.configuration.coverage_enabled or not hasattr(ctx.attr, "_code_coverage_instrumentation_worker"):
344-
return _empty_coverage_struct
345-
346-
output_jar = ctx.actions.declare_file(
347-
"{}-offline.jar".format(input_jar.basename.split(".")[0]),
348-
)
349-
in_out_pairs = [
350-
(input_jar, output_jar),
351-
]
352-
353-
args = ctx.actions.args()
354-
args.add_all(in_out_pairs, map_each = _jacoco_offline_instrument_format_each)
355-
args.set_param_file_format("multiline")
356-
args.use_param_file("@%s", use_always = True)
357-
358-
ctx.actions.run(
359-
mnemonic = "JacocoInstrumenter",
360-
inputs = [in_out_pair[0] for in_out_pair in in_out_pairs],
361-
outputs = [in_out_pair[1] for in_out_pair in in_out_pairs],
362-
executable = ctx.attr._code_coverage_instrumentation_worker.files_to_run,
363-
execution_requirements = {"supports-workers": "1"},
364-
arguments = [args],
365-
)
366-
367-
replacements = {i: o for (i, o) in in_out_pairs}
368-
provider = _coverage_replacements_provider.create(
369-
replacements = replacements,
370-
)
371-
instrumented_files_provider = coverage_common.instrumented_files_info(
372-
ctx,
373-
source_attributes = ["srcs"],
374-
dependency_attributes = _coverage_replacements_provider.dependency_attributes,
375-
extensions = ["scala", "java"],
376-
)
377-
return struct(
378-
external = struct(
379-
replacements = replacements,
380-
),
381-
providers_dict = {
382-
"_CoverageReplacements": provider,
383-
"InstrumentedFilesInfo": instrumented_files_provider,
384-
},
385-
)
386-
387-
def _jacoco_offline_instrument_format_each(in_out_pair):
388-
return (["%s=%s" % (in_out_pair[0].path, in_out_pair[1].path)])
389-
390325
def _try_to_compile_java_jar(
391326
ctx,
392327
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)