aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java69
1 files changed, 44 insertions, 25 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
index 4d1b86bed2..1e78a41891 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
@@ -13,7 +13,10 @@
// limitations under the License.
package com.google.devtools.build.lib.skyframe;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
import com.google.devtools.build.lib.analysis.DependencyResolver;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -35,6 +38,8 @@ import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.ValueOrException;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
@@ -88,39 +93,53 @@ public final class SkyframeDependencyResolver extends DependencyResolver {
@Nullable
@Override
- protected Target getTarget(Target from, Label label, NestedSetBuilder<Cause> rootCauses)
+ protected Map<Label, Target> getTargets(
+ Iterable<Label> labels,
+ Target fromTarget,
+ NestedSetBuilder<Cause> rootCauses,
+ int labelsSizeHint)
throws InterruptedException {
- SkyKey key = PackageValue.key(label.getPackageIdentifier());
- PackageValue packageValue;
- try {
- packageValue = (PackageValue) env.getValueOrThrow(key, NoSuchPackageException.class);
- } catch (NoSuchPackageException e) {
- rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
- missingEdgeHook(from, label, e);
+ Map<SkyKey, ValueOrException<NoSuchPackageException>> packages =
+ env.getValuesOrThrow(
+ Iterables.transform(labels, label -> PackageValue.key(label.getPackageIdentifier())),
+ NoSuchPackageException.class);
+ if (env.valuesMissing()) {
return null;
}
- if (packageValue == null) {
- return null;
+ if (labels instanceof Collection) {
+ labelsSizeHint = ((Collection<Label>) labels).size();
+ } else if (labelsSizeHint <= 0) {
+ labelsSizeHint = 2 * packages.size();
}
- Package pkg = packageValue.getPackage();
- try {
- Target target = pkg.getTarget(label.getName());
- if (pkg.containsErrors()) {
- NoSuchTargetException e = new NoSuchTargetException(target);
- missingEdgeHook(from, label, e);
- if (target != null) {
+ // Duplicates can occur, so we can't use ImmutableMap.
+ HashMap<Label, Target> result = Maps.newHashMapWithExpectedSize(labelsSizeHint);
+ for (Label label : labels) {
+ PackageValue packageValue;
+ try {
+ packageValue =
+ Preconditions.checkNotNull(
+ (PackageValue) packages.get(PackageValue.key(label.getPackageIdentifier())).get(),
+ label);
+ } catch (NoSuchPackageException e) {
+ rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
+ missingEdgeHook(fromTarget, label, e);
+ continue;
+ }
+ Package pkg = packageValue.getPackage();
+ try {
+ Target target = pkg.getTarget(label.getName());
+ if (pkg.containsErrors()) {
+ NoSuchTargetException e = new NoSuchTargetException(target);
+ missingEdgeHook(fromTarget, label, e);
rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
- return target;
- } else {
- return null;
}
+ result.put(label, target);
+ } catch (NoSuchTargetException e) {
+ rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
+ missingEdgeHook(fromTarget, label, e);
}
- return target;
- } catch (NoSuchTargetException e) {
- rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
- missingEdgeHook(from, label, e);
- return null;
}
+ return result;
}
@Nullable