Expose Javac command lines in aspects
See https://github.com/bazelbuild/bazel/commit/e7ce105c900ae10163e9f5ab26dce01eb7293a60 for more details.
RELNOTES: None.
PiperOrigin-RevId: 319265926
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index 11fd040..4f7ea81 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -194,6 +194,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:platform_options",
"//src/main/java/com/google/devtools/build/lib/analysis:provider_collection",
"//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
+ "//src/main/java/com/google/devtools/build/lib/analysis:starlark/args",
"//src/main/java/com/google/devtools/build/lib/analysis:starlark/starlark_api_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:test/instrumented_files_info",
"//src/main/java/com/google/devtools/build/lib/analysis:test/test_configuration",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 096307d..0cb4b9f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.rules.java;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
import com.google.common.annotations.VisibleForTesting;
@@ -40,6 +41,7 @@
import com.google.devtools.build.lib.actions.CommandLine;
import com.google.devtools.build.lib.actions.CommandLineExpansionException;
import com.google.devtools.build.lib.actions.CommandLines;
+import com.google.devtools.build.lib.actions.CommandLines.CommandLineAndParamFileInfo;
import com.google.devtools.build.lib.actions.EmptyRunfilesSupplier;
import com.google.devtools.build.lib.actions.EnvironmentalExecException;
import com.google.devtools.build.lib.actions.ExecException;
@@ -53,6 +55,7 @@
import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.starlark.Args;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -65,6 +68,7 @@
import com.google.devtools.build.lib.server.FailureDetails.JavaCompile;
import com.google.devtools.build.lib.server.FailureDetails.JavaCompile.Code;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skylarkbuildapi.CommandLineArgsApi;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Location;
import com.google.devtools.build.lib.syntax.Sequence;
@@ -512,6 +516,17 @@
}
@Override
+ public Sequence<CommandLineArgsApi> getStarlarkArgs() throws EvalException {
+ ImmutableList.Builder<CommandLineArgsApi> result = ImmutableList.builder();
+ ImmutableSet<Artifact> directoryInputs =
+ getInputs().toList().stream().filter(Artifact::isDirectory).collect(toImmutableSet());
+ for (CommandLineAndParamFileInfo commandLine : getCommandLines().getCommandLines()) {
+ result.add(Args.forRegisteredAction(commandLine, directoryInputs));
+ }
+ return StarlarkList.immutableCopyOf(result.build());
+ }
+
+ @Override
@VisibleForTesting
public final ImmutableMap<String, String> getIncompleteEnvironmentForTesting() {
// TODO(ulfjack): AbstractAction should declare getEnvironment with a return value of type
diff --git a/src/test/shell/integration/java_integration_test.sh b/src/test/shell/integration/java_integration_test.sh
index 68684a9..c6d0df7 100755
--- a/src/test/shell/integration/java_integration_test.sh
+++ b/src/test/shell/integration/java_integration_test.sh
@@ -850,4 +850,40 @@
expect_log "Hello World!"
}
+
+function test_arg_compile_action() {
+ local package="${FUNCNAME[0]}"
+ mkdir -p "${package}"
+
+ cat > "${package}/lib.bzl" <<EOF
+def _actions_test_impl(target, ctx):
+ action = target.actions[0] # digest action
+ if action.mnemonic != "Javac":
+ fail("Expected the first action to be Javac.")
+ aspect_out = ctx.actions.declare_file('aspect_out')
+ ctx.actions.run_shell(inputs = action.inputs,
+ outputs = [aspect_out],
+ command = "echo \$@ > " + aspect_out.path,
+ arguments = action.args)
+ return [OutputGroupInfo(out=[aspect_out])]
+
+actions_test_aspect = aspect(implementation = _actions_test_impl)
+EOF
+
+ touch "${package}/x.java"
+ cat > "${package}/BUILD" <<EOF
+java_library(
+ name = "x",
+ srcs = ["x.java"],
+)
+EOF
+
+ bazel build "${package}:x" \
+ --aspects="//${package}:lib.bzl%actions_test_aspect" \
+ --output_groups=out --experimental_action_args
+
+ cat "${PRODUCT_NAME}-bin/${package}/aspect_out" | grep "0.params .*1.params" \
+ || fail "aspect Args do not contain both params files"
+}
+
run_suite "Java integration tests"