From 534a3c8c73aa02794f53b78759ba72663787988e Mon Sep 17 00:00:00 2001 From: Marian Lobur Date: Wed, 18 Mar 2015 11:00:05 +0000 Subject: Add support of aspects to blaze query. -- MOS_MIGRATED_REVID=88917871 --- .../devtools/build/lib/query2/LabelVisitor.java | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java') 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 labelBuilder = ImmutableMultimap.builder(); + RuleClass ruleClass = ((Rule) to).getRuleClassObject(); + + for (Class> 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 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