// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.query2.output;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.packages.Aspect;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.DependencyFilter;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.pkgcache.PackageProvider;
import com.google.devtools.build.lib.util.BinaryPredicate;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
/**
* An aspect resolver that returns only those aspects that are possibly active given the rule
* classes of direct dependencies.
*
*
Needs to load the packages that contain dependencies through attributes with aspects.
*/
public class PreciseAspectResolver implements AspectResolver {
private final PackageProvider packageProvider;
private final ExtendedEventHandler eventHandler;
public PreciseAspectResolver(PackageProvider packageProvider, ExtendedEventHandler eventHandler) {
this.packageProvider = packageProvider;
this.eventHandler = eventHandler;
}
@Override
public ImmutableMultimap computeAspectDependencies(Target target,
DependencyFilter dependencyFilter)
throws InterruptedException {
Multimap result = LinkedListMultimap.create();
if (target instanceof Rule) {
Multimap transitions =
((Rule) target).getTransitions(DependencyFilter.NO_NODEP_ATTRIBUTES);
for (Map.Entry entry : transitions.entries()) {
Target toTarget;
try {
toTarget = packageProvider.getTarget(eventHandler, entry.getValue());
result.putAll(
AspectDefinition.visitAspectsIfRequired(
target,
entry.getKey(),
toTarget,
dependencyFilter));
} catch (NoSuchThingException e) {
// Do nothing. One of target direct deps has an error. The dependency on the BUILD file
// (or one of the files included in it) will be reported in the query result of :BUILD.
}
}
}
return ImmutableMultimap.copyOf(result);
}
@Override
public Set