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-25 09:36:28 +0000
committerGravatar Lukacs Berki <lberki@google.com>2015-03-25 10:32:18 +0000
commitfdd788e15f71bdc9601d4e73a23b75710dcbaec9 (patch)
treefdce3c9f2050cb65ac09836e52c95f186e510442 /src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
parentaae65e0e9d94eb89bcc75c8be8a62fbbe1e55250 (diff)
Add support of aspects to the skyframe implementation of query. To keep these two versions of query consistent we need to add additional edges to the target that contains aspects, instead of adding it to the target that was in direct deps of the original one.
-- MOS_MIGRATED_REVID=89483301
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.java45
1 files changed, 4 insertions, 41 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 fd3068fc34..e2cf9eac66 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,18 +18,15 @@ 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.AspectDefinition;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.InputFile;
@@ -38,16 +35,13 @@ 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;
@@ -427,42 +421,11 @@ final class LabelVisitor {
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();
+ ImmutableMultimap<Attribute, Label> labelsFromAspects =
+ AspectDefinition.visitAspectsIfRequired(from, attribute, to);
// Create an edge from target to the attribute value.
for (Entry<Attribute, Label> entry : labelsFromAspects.entries()) {
- enqueueTarget(to, entry.getKey(), entry.getValue(), depth, count);
+ enqueueTarget(from, entry.getKey(), entry.getValue(), depth, count);
}
}