diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java index 9f291d1ee287ec..e5dfb29c9b9eec 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelper.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.analysis.test.TestProvider; +import com.google.devtools.build.lib.collect.nestedset.Depset.TypeException; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSet.Node; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -197,13 +198,12 @@ private static void memoizedAddAll( */ public static ArtifactsToBuild getAllArtifactsToBuild( ProviderCollection target, TopLevelArtifactContext context) { - return getAllArtifactsToBuild( - OutputGroupInfo.get(target), target.getProvider(FileProvider.class), context); + return getAllArtifactsToBuild(OutputGroupInfo.get(target), getFilesToBuild(target), context); } static ArtifactsToBuild getAllArtifactsToBuild( @Nullable OutputGroupInfo outputGroupInfo, - @Nullable FileProvider fileProvider, + @Nullable NestedSet filesToBuild, TopLevelArtifactContext context) { ImmutableMap.Builder allOutputGroups = ImmutableMap.builderWithExpectedSize(context.outputGroups().size()); @@ -211,8 +211,8 @@ static ArtifactsToBuild getAllArtifactsToBuild( for (String outputGroup : context.outputGroups()) { NestedSetBuilder results = NestedSetBuilder.stableOrder(); - if (outputGroup.equals(OutputGroupInfo.DEFAULT) && fileProvider != null) { - results.addTransitive(fileProvider.getFilesToBuild()); + if (outputGroup.equals(OutputGroupInfo.DEFAULT) && filesToBuild != null) { + results.addTransitive(filesToBuild); } if (outputGroupInfo != null) { @@ -239,6 +239,27 @@ static ArtifactsToBuild getAllArtifactsToBuild( allOutputGroups.buildOrThrow(), /*allOutputGroupsImportant=*/ allOutputGroupsImportant); } + /** + * Returns files to build directly from {@link FileProvider} or from {@code files} under {@link + * DefaultInfo} provider. + */ + @Nullable + private static NestedSet getFilesToBuild(ProviderCollection target) { + if (target.getProvider(FileProvider.class) != null) { + return target.getProvider(FileProvider.class).getFilesToBuild(); + } else if (target.get(DefaultInfo.PROVIDER.getKey()) != null) { + DefaultInfo defaultInfo = (DefaultInfo) target.get(DefaultInfo.PROVIDER.getKey()); + if (defaultInfo.getFiles() != null) { + try { + return defaultInfo.getFiles().getSet(Artifact.class); + } catch (TypeException e) { + throw new IllegalStateException("Error getting 'files' field of 'DefaultInfo'", e); + } + } + } + return null; + } + /** * Returns false if the build outputs provided by the target should never be shown to users. * diff --git a/src/test/shell/integration/aspect_test.sh b/src/test/shell/integration/aspect_test.sh index e643a8c3279fbc..03e8bb4e2fc2dd 100755 --- a/src/test/shell/integration/aspect_test.sh +++ b/src/test/shell/integration/aspect_test.sh @@ -1923,4 +1923,52 @@ EOF expect_log 'in rule_impl of rule: @@\?//test:t1, toolchain_aspect on dep @@\?//test:t2 = \["toolchain_aspect on @@\?//test:t2", "toolchain_aspect on @@\?//test_toolchains:foo", "toolchain_aspect on @@\?//test_toolchains:toolchain_dep"\]' } +function test_aspect_default_info_files_generated() { + local package="test" + mkdir -p "${package}" + cat > "${package}/defs.bzl" < "${package}/BUILD" < $TEST_log || fail "Build failed" + + assert_nonempty_file 'bazel-bin/test/from_aspect_on_t1' + assert_nonempty_file 'bazel-bin/test/from_rule_t1' + + assert_nonempty_file 'bazel-bin/test/from_aspect_on_t2' + assert_nonempty_file 'bazel-bin/test/from_rule_t2' +} + run_suite "Tests for aspects"