// Copyright 2014 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.pkgcache; import static java.util.Comparator.comparingInt; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.ResolvedTargets; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.FileTarget; import com.google.devtools.build.lib.packages.NoSuchThingException; import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.RawAttributeMapper; 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 java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.TreeSet; /** * Implementation of --compile_one_dependency. */ public final class CompileOneDependencyTransformer { private final TargetProvider targetProvider; public CompileOneDependencyTransformer(TargetProvider targetProvider) { this.targetProvider = targetProvider; } /** * For each input file in the original result, returns a rule in the same package which has the * input file as a source. */ public ResolvedTargets transformCompileOneDependency( ExtendedEventHandler eventHandler, ResolvedTargets original) throws TargetParsingException, InterruptedException { if (original.hasError()) { return original; } ResolvedTargets.Builder builder = ResolvedTargets.builder(); for (Target target : original.getTargets()) { builder.add(transformCompileOneDependency(eventHandler, target)); } return builder.build(); } /** * Returns a list of rules in the given package sorted by BUILD file order. When * multiple rules depend on a target, we choose the first match in this list (after * filtering for preferred dependencies - see below). */ private Iterable getOrderedRuleList(Package pkg) { List orderedList = Lists.newArrayList(); for (Rule rule : pkg.getTargets(Rule.class)) { orderedList.add(rule); } Collections.sort(orderedList, comparingInt(arg -> arg.getLocation().getStartOffset())); return orderedList; } /** * Returns true if a specific rule compiles a specific source. Looks through genrules and * filegroups. */ private boolean listContainsFile( ExtendedEventHandler eventHandler, Collection