diff options
author | 2018-06-15 08:41:59 -0700 | |
---|---|---|
committer | 2018-06-15 08:43:36 -0700 | |
commit | fc0030c9b2261096cab72f7addfe7966915758dc (patch) | |
tree | 9635858d6f475c0e592ec15928c69c986a8c3cca /src | |
parent | a5e36eeb6d97cb7530317d565062b39de7392c55 (diff) |
Don't propagate empty asset containers
If asset containers are empty, simply discard them rather than propagating them up the dependency graph. We don't currently use merging output except at the top level, so we don't need any of this information. (If/when asset merging is redone, we'd need to redo this code anyway.)
RELNOTES: none
PiperOrigin-RevId: 200721055
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java | 14 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AssetDependencies.java | 24 |
2 files changed, 30 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index b60d9d1972..c3a0c8634d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -228,17 +228,23 @@ public abstract class AndroidSkylarkData } // Get the target's local assets, if defined, from the provider - boolean definesLocalAssets = assetsInfo.getDirectParsedAssets().isSingleton(); + boolean definesLocalAssets = false; AndroidAssets assets = AndroidAssets.empty(); - if (definesLocalAssets) { + if (assetsInfo.getDirectParsedAssets().isSingleton()) { ParsedAndroidAssets parsed = assetsInfo.getDirectParsedAssets().toList().get(0); if (parsed.getLabel().equals(ctx.getLabel())) { assets = parsed; - } else { - definesLocalAssets = false; + definesLocalAssets = true; } } + if (!definesLocalAssets) { + // The target might still define an empty list of assets, in which case its information is not + // propagated for efficiency. If this is the case, we will still have an artifact for the + // merging output. + definesLocalAssets = assetsInfo.getValidationResult() != null; + } + if (definesLocalResources != definesLocalAssets) { throw new EvalException( Location.BUILTIN, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AssetDependencies.java b/src/main/java/com/google/devtools/build/lib/rules/android/AssetDependencies.java index 531d2501cf..2d52a7cb79 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AssetDependencies.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AssetDependencies.java @@ -119,6 +119,25 @@ public class AssetDependencies { return AndroidAssetsInfo.empty(assets.getLabel()); } + NestedSet<ParsedAndroidAssets> updatedTransitiveParsedAssets = + NestedSetBuilder.<ParsedAndroidAssets>naiveLinkOrder() + .addTransitive(transitiveParsedAssets) + .addTransitive(directParsedAssets) + .build(); + + if (assets.getAssets().isEmpty()) { + return AndroidAssetsInfo.of( + assets.getLabel(), + // Even though no new assets were added, we should still make merging output available so + // callers can ensure validation succeeded. + assets.getMergedAssets(), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + updatedTransitiveParsedAssets, + transitiveAssets, + transitiveSymbols, + transitiveCompiledSymbols); + } + // Create a new object to avoid passing around unwanted merge information to the provider ParsedAndroidAssets parsedAssets = new ParsedAndroidAssets(assets); @@ -133,10 +152,7 @@ public class AssetDependencies { assets.getLabel(), assets.getMergedAssets(), NestedSetBuilder.create(Order.NAIVE_LINK_ORDER, parsedAssets), - NestedSetBuilder.<ParsedAndroidAssets>naiveLinkOrder() - .addTransitive(transitiveParsedAssets) - .addTransitive(directParsedAssets) - .build(), + updatedTransitiveParsedAssets, NestedSetBuilder.<Artifact>naiveLinkOrder() .addTransitive(transitiveAssets) .addAll(assets.getAssets()) |