aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-07-22 19:22:48 +0000
committerGravatar John Cater <jcater@google.com>2016-07-22 20:13:11 +0000
commit119b15f5d7a8f8c165598073fe7be8a0617526be (patch)
tree0fcc628c62c8e63ae3d4c672d04ee0ef0f9a1be8 /src/main/java/com/google/devtools/build/lib/skyframe
parentd9923eaeb3cca0c5036282f161f4582e58d54fbf (diff)
Description redacted.
-- MOS_MIGRATED_REVID=128199284
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index 8a0c4f1019..828a5e5b99 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -13,13 +13,12 @@
// limitations under the License.
package com.google.devtools.build.lib.skyframe;
-import static com.google.devtools.build.lib.analysis.config.ConfigRuleClasses.ConfigSettingRule;
-
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.ConfigRuleClasses.ConfigSettingRule;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -47,7 +46,7 @@ import com.google.devtools.common.options.Option;
import java.lang.reflect.Field;
import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -86,15 +85,18 @@ public class TransitiveTargetFunction
private static Map<String, Class<? extends Fragment>> computeOptionsToFragmentMap(
ConfiguredRuleClassProvider ruleClassProvider) {
Map<String, Class<? extends Fragment>> result = new LinkedHashMap<>();
- Set<Class<? extends FragmentOptions>> visitedOptionsClasses = new HashSet<>();
+ Map<Class<? extends FragmentOptions>, Integer> visitedOptionsClasses = new HashMap<>();
for (ConfigurationFragmentFactory factory : ruleClassProvider.getConfigurationFragments()) {
- for (Class<? extends FragmentOptions> optionsClass : factory.requiredOptions()) {
- if (visitedOptionsClasses.contains(optionsClass)) {
+ Set<Class<? extends FragmentOptions>> requiredOpts = factory.requiredOptions();
+ for (Class<? extends FragmentOptions> optionsClass : requiredOpts) {
+ Integer previousBest = visitedOptionsClasses.get(optionsClass);
+ if (previousBest != null && previousBest <= requiredOpts.size()) {
// Multiple config fragments may require the same options class, but we only need one of
- // them to guarantee that class makes it into the configuration.
+ // them to guarantee that class makes it into the configuration. Pick one that depends
+ // on as few options classes as possible (not necessarily unique).
continue;
}
- visitedOptionsClasses.add(optionsClass);
+ visitedOptionsClasses.put(optionsClass, requiredOpts.size());
for (Field field : optionsClass.getFields()) {
if (field.isAnnotationPresent(Option.class)) {
result.put(field.getAnnotation(Option.class).name(), factory.creates());
@@ -214,6 +216,7 @@ public class TransitiveTargetFunction
return builder.build(errorLoadingTarget);
}
+ @Override
protected Collection<Label> getAspectLabels(Rule fromRule, Attribute attr, Label toLabel,
ValueOrException2<NoSuchPackageException, NoSuchTargetException> toVal,
final Environment env) {