Skip to content

Commit 5a544a7

Browse files
committed
Add baseline_coverage_files to java_common.compile
1 parent 1c24c5b commit 5a544a7

5 files changed

Lines changed: 64 additions & 11 deletions

File tree

src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public final class JavaCompilationHelper {
7171
private NestedSet<String> javaBuilderJvmFlags = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
7272
private final JavaSemantics semantics;
7373
private final ImmutableList<Artifact> additionalInputsForDatabinding;
74+
@Nullable private final Artifact baselineCoverageFile;
7475
private boolean enableJspecify = true;
7576
private boolean enableDirectClasspath = true;
7677
private final String execGroup;
@@ -81,13 +82,15 @@ public JavaCompilationHelper(
8182
ImmutableList<String> javacOpts,
8283
JavaTargetAttributes.Builder attributes,
8384
JavaToolchainProvider javaToolchainProvider,
84-
ImmutableList<Artifact> additionalInputsForDatabinding) {
85+
ImmutableList<Artifact> additionalInputsForDatabinding,
86+
@Nullable Artifact baselineCoverageFile) {
8587
this.ruleContext = ruleContext;
8688
this.javaToolchain = Preconditions.checkNotNull(javaToolchainProvider);
8789
this.attributes = attributes;
8890
this.customJavacOpts = javacOptsInterner.intern(javacOpts);
8991
this.semantics = semantics;
9092
this.additionalInputsForDatabinding = additionalInputsForDatabinding;
93+
this.baselineCoverageFile = baselineCoverageFile;
9194

9295
if (ruleContext.useAutoExecGroups()) {
9396
this.execGroup = semantics.getJavaToolchainType();
@@ -247,6 +250,7 @@ && getJavaConfiguration().experimentalEnableJspecify()
247250
builder.setTargetLabel(label);
248251
Artifact coverageArtifact = maybeCreateCoverageArtifact(outputs.output());
249252
builder.setCoverageArtifact(coverageArtifact);
253+
builder.setBaselineCoverageFile(baselineCoverageFile);
250254
BootClassPathInfo bootClassPathInfo = getBootclasspathOrDefault();
251255
builder.setBootClassPath(bootClassPathInfo);
252256
NestedSet<Artifact> classpath =
@@ -386,7 +390,9 @@ public BootClassPathInfo getBootclasspathOrDefault() throws RuleErrorException {
386390
*/
387391
@Nullable
388392
private Artifact maybeCreateCoverageArtifact(Artifact compileJar) {
389-
if (!shouldInstrumentJar()) {
393+
// baselineCoverageFile != null is meant to be equivalent to shouldInstrumentJar(), but we need
394+
// to check both to support older versions of rules_java that do not set baseline_coverage_file.
395+
if (!shouldInstrumentJar() && baselineCoverageFile == null) {
390396
return null;
391397
}
392398
PathFragment packageRelativePath =

src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ public void extend(ExtraActionInfo.Builder builder, ImmutableList<String> argume
136136
private final JavaToolchainProvider toolchain;
137137
private final String execGroup;
138138
private ImmutableSet<Artifact> additionalOutputs = ImmutableSet.of();
139-
private Artifact coverageArtifact;
139+
@Nullable private Artifact coverageArtifact;
140+
@Nullable private Artifact baselineCoverageFile;
140141
private ImmutableSet<Artifact> sourceFiles = ImmutableSet.of();
141142
private ImmutableList<Artifact> sourceJars = ImmutableList.of();
142143
private StrictDepsMode strictJavaDeps = StrictDepsMode.ERROR;
@@ -269,7 +270,12 @@ public JavaCompileAction build() throws RuleErrorException, InterruptedException
269270
private ImmutableSet<Artifact> allOutputs() {
270271
ImmutableSet.Builder<Artifact> result =
271272
ImmutableSet.<Artifact>builder().add(outputs.output()).addAll(additionalOutputs);
272-
Stream.of(outputs.depsProto(), outputs.nativeHeader(), genSourceOutput, manifestOutput)
273+
Stream.of(
274+
outputs.depsProto(),
275+
outputs.nativeHeader(),
276+
genSourceOutput,
277+
manifestOutput,
278+
baselineCoverageFile)
273279
.filter(Objects::nonNull)
274280
.forEachOrdered(result::add);
275281
return result.build();
@@ -326,6 +332,13 @@ private CustomCommandLine buildParamFileContents(ImmutableList<String> javacOpts
326332
if (coverageArtifact != null) {
327333
result.add("--post_processor");
328334
result.addExecPath(JACOCO_INSTRUMENTATION_PROCESSOR, coverageArtifact);
335+
if (baselineCoverageFile != null) {
336+
result.addExecPath(baselineCoverageFile);
337+
}
338+
} else {
339+
Preconditions.checkState(
340+
baselineCoverageFile == null,
341+
"baselineCoverageFile should be null if coverageArtifact is null");
329342
}
330343
return result.build();
331344
}
@@ -450,11 +463,17 @@ public JavaCompileActionBuilder setJavaBuilder(JavaToolchainTool javaBuilder) {
450463
}
451464

452465
@CanIgnoreReturnValue
453-
public JavaCompileActionBuilder setCoverageArtifact(Artifact coverageArtifact) {
466+
public JavaCompileActionBuilder setCoverageArtifact(@Nullable Artifact coverageArtifact) {
454467
this.coverageArtifact = coverageArtifact;
455468
return this;
456469
}
457470

471+
@CanIgnoreReturnValue
472+
public JavaCompileActionBuilder setBaselineCoverageFile(@Nullable Artifact baselineCoverageFile) {
473+
this.baselineCoverageFile = baselineCoverageFile;
474+
return this;
475+
}
476+
458477
@CanIgnoreReturnValue
459478
public JavaCompileActionBuilder setTargetLabel(Label targetLabel) {
460479
this.targetLabel = targetLabel;

src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ public void createHeaderCompilationAction(
169169
JavaHelper.tokenizeJavaOptions(Depset.cast(javacOpts, String.class, "javac_opts")),
170170
attributesBuilder,
171171
JavaToolchainProvider.wrap(toolchain),
172-
Sequence.cast(additionalInputs, Artifact.class, "additional_inputs")
173-
.getImmutableList());
172+
Sequence.cast(additionalInputs, Artifact.class, "additional_inputs").getImmutableList(),
173+
/* baselineCoverageFile= */ null);
174174
compilationHelper.enableDirectClasspath(enableDirectClasspath);
175175
compilationHelper.createHeaderCompilationAction(
176176
headerJar,
@@ -207,7 +207,8 @@ public void createCompilationAction(
207207
boolean enableJSpecify,
208208
boolean enableDirectClasspath,
209209
Sequence<?> additionalInputs,
210-
Sequence<?> additionalOutputs)
210+
Sequence<?> additionalOutputs,
211+
Object baselineCoverageFile)
211212
throws EvalException,
212213
TypeException,
213214
RuleErrorException,
@@ -261,8 +262,8 @@ public void createCompilationAction(
261262
JavaHelper.tokenizeJavaOptions(Depset.cast(javacOpts, String.class, "javac_opts")),
262263
attributesBuilder,
263264
JavaToolchainProvider.wrap(javaToolchain),
264-
Sequence.cast(additionalInputs, Artifact.class, "additional_inputs")
265-
.getImmutableList());
265+
Sequence.cast(additionalInputs, Artifact.class, "additional_inputs").getImmutableList(),
266+
baselineCoverageFile == Starlark.NONE ? null : (Artifact) baselineCoverageFile);
266267
compilationHelper.javaBuilderJvmFlags(
267268
Depset.cast(javaBuilderJvmFlags, String.class, "javabuilder_jvm_flags"));
268269
compilationHelper.enableJspecify(enableJSpecify);

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ void createHeaderCompilationAction(
525525
@Param(name = "enable_direct_classpath", defaultValue = "True", named = true),
526526
@Param(name = "additional_inputs", defaultValue = "[]", named = true),
527527
@Param(name = "additional_outputs", defaultValue = "[]", named = true),
528+
@Param(name = "baseline_coverage_file", defaultValue = "None", named = true),
528529
})
529530
void createCompilationAction(
530531
StarlarkRuleContextT ctx,
@@ -554,7 +555,8 @@ void createCompilationAction(
554555
boolean enableJSpecify,
555556
boolean enableDirectClasspath,
556557
Sequence<?> additionalInputs,
557-
Sequence<?> additionalOutputs)
558+
Sequence<?> additionalOutputs,
559+
Object baselineCoverageFile)
558560
throws EvalException,
559561
TypeException,
560562
RuleErrorException,

src/test/shell/bazel/bazel_coverage_java_test.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,31 @@ LF:6
232232
end_of_record"
233233

234234
assert_coverage_result "$expected_result" "./bazel-out/_coverage/_coverage_report.dat"
235+
236+
local expected_baseline_result="SF:src/main/com/example/Collatz.java
237+
FN:3,com/example/Collatz::<init> ()V
238+
FN:6,com/example/Collatz::getCollatzFinal (I)I
239+
FNDA:0,com/example/Collatz::<init> ()V
240+
FNDA:0,com/example/Collatz::getCollatzFinal (I)I
241+
FNF:2
242+
FNH:0
243+
BRDA:6,0,0,-
244+
BRDA:6,0,1,-
245+
BRDA:9,0,0,-
246+
BRDA:9,0,1,-
247+
BRF:4
248+
BRH:0
249+
DA:3,0
250+
DA:6,0
251+
DA:7,0
252+
DA:9,0
253+
DA:10,0
254+
DA:12,0
255+
LH:0
256+
LF:6
257+
end_of_record"
258+
# TODO(#5716): Enable this check after the next rules_java update.
259+
# assert_coverage_result "$expected_baseline_result" "./bazel-out/_coverage/_baseline_report.dat"
235260
}
236261

237262
function test_java_test_java_import_coverage() {

0 commit comments

Comments
 (0)