aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
diff options
context:
space:
mode:
authorGravatar Marian Lobur <loburm@google.com>2015-03-18 11:00:05 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-03-18 13:48:18 +0000
commit534a3c8c73aa02794f53b78759ba72663787988e (patch)
treef96703b31c82846403d1c56c6dcc8ca659fe6b09 /src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
parent1748fcfde058b7b3eeda8066c096cbd0ef61a1bd (diff)
Add support of aspects to blaze query.
-- MOS_MIGRATED_REVID=88917871
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
index 15534e60e8..fd3068fc34 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
@@ -18,13 +18,18 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Throwables;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.MapMaker;
import com.google.common.collect.Multimaps;
import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.concurrent.AbstractQueueVisitor;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
+import com.google.devtools.build.lib.packages.AspectFactory;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.InputFile;
@@ -33,13 +38,17 @@ import com.google.devtools.build.lib.packages.OutputFile;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.PackageGroup;
import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.packages.Type;
import com.google.devtools.build.lib.pkgcache.PackageProvider;
import com.google.devtools.build.lib.pkgcache.TargetEdgeObserver;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.util.BinaryPredicate;
import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -409,12 +418,54 @@ final class LabelVisitor {
if (from != null) {
observeEdge(from, attribute, target);
+ visitAspectsIfRequired(from, attribute, target, depth, count);
}
visitedMap.put(target.getPackage(), target);
visitTargetNode(target, depth, count);
}
+ private void visitAspectsIfRequired(
+ Target from, Attribute attribute, final Target to, int depth, int count) {
+ // Aspect can be declared only for Rules.
+ if (!(from instanceof Rule) || !(to instanceof Rule)) {
+ return;
+ }
+
+ ImmutableMultimap.Builder<Attribute, Label> labelBuilder = ImmutableMultimap.builder();
+ RuleClass ruleClass = ((Rule) to).getRuleClassObject();
+
+ for (Class<? extends AspectFactory<?, ?, ?>> candidateClass : attribute.getAspects()) {
+ ConfiguredAspectFactory candidate =
+ (ConfiguredAspectFactory) AspectFactory.Util.create(candidateClass);
+ // Check if target satisfies condition for this aspect (has to provide all required
+ // TransitiveInfoProviders)
+ if (!Sets.difference(
+ candidate.getDefinition().getRequiredProviders(),
+ ruleClass.getAdvertisedProviders()).isEmpty()) {
+ continue;
+ }
+ ImmutableMap<String, Attribute> attributes = candidate.getDefinition().getAttributes();
+ for (Attribute aspectAttribute : attributes.values()) {
+ if (aspectAttribute.getType() == Type.LABEL) {
+ Label label = Type.LABEL.cast(aspectAttribute.getDefaultValue((Rule) from));
+ if (label != null) {
+ labelBuilder.put(aspectAttribute, label);
+ }
+ } else if (attribute.getType() == Type.LABEL_LIST) {
+ List<Label> labelList = Type.LABEL_LIST.cast(attribute.getDefaultValue((Rule) from));
+ labelBuilder.putAll(aspectAttribute, labelList);
+ }
+ }
+ }
+
+ ImmutableMultimap<Attribute, Label> labelsFromAspects = labelBuilder.build();
+ // Create an edge from target to the attribute value.
+ for (Entry<Attribute, Label> entry : labelsFromAspects.entries()) {
+ enqueueTarget(to, entry.getKey(), entry.getValue(), depth, count);
+ }
+ }
+
/**
* Visit the specified target.
* Called in a worker thread if CONCURRENT.