Reduce analysis-time iteration over nested sets
- Avoid Iterable for values that are known to be NestedSet
- Avoid Iterables.* for NestedSet
- Avoid flattening NestedSets for runfiles
- Remove some dead code from MiddlemanFactory
PiperOrigin-RevId: 284061855
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 38116fb..614cd11 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1318,9 +1318,9 @@
private Artifact transitiveInfoCollectionToArtifact(
String attributeName, TransitiveInfoCollection target) {
if (target != null) {
- Iterable<Artifact> artifacts = target.getProvider(FileProvider.class).getFilesToBuild();
- if (Iterables.size(artifacts) == 1) {
- return Iterables.getOnlyElement(artifacts);
+ NestedSet<Artifact> artifacts = target.getProvider(FileProvider.class).getFilesToBuild();
+ if (artifacts.isSingleton()) {
+ return artifacts.getSingleton();
} else {
attributeError(attributeName, target.getLabel() + " expected a single artifact");
}
@@ -1730,7 +1730,7 @@
private boolean validateFilesetEntry(FilesetEntry filesetEntry, ConfiguredTargetAndData src) {
NestedSet<Artifact> filesToBuild =
src.getConfiguredTarget().getProvider(FileProvider.class).getFilesToBuild();
- if (filesToBuild.isSingleton() && Iterables.getOnlyElement(filesToBuild).isFileset()) {
+ if (filesToBuild.isSingleton() && filesToBuild.getSingleton().isFileset()) {
return true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
index fef0eca..a6d3b71 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.RunUnder;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.TargetUtils;
@@ -286,7 +287,7 @@
* PruningManifest. This means the returned set may be an overapproximation of the actual set of
* runfiles (see {@link Runfiles.PruningManifest}).
*/
- public Iterable<Artifact> getRunfilesArtifacts() {
+ public NestedSet<Artifact> getRunfilesArtifacts() {
return runfiles.getArtifacts();
}