From 119b15f5d7a8f8c165598073fe7be8a0617526be Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 22 Jul 2016 19:22:48 +0000 Subject: Description redacted. -- MOS_MIGRATED_REVID=128199284 --- .../build/lib/skyframe/TransitiveTargetFunction.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/skyframe') 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> computeOptionsToFragmentMap( ConfiguredRuleClassProvider ruleClassProvider) { Map> result = new LinkedHashMap<>(); - Set> visitedOptionsClasses = new HashSet<>(); + Map, Integer> visitedOptionsClasses = new HashMap<>(); for (ConfigurationFragmentFactory factory : ruleClassProvider.getConfigurationFragments()) { - for (Class optionsClass : factory.requiredOptions()) { - if (visitedOptionsClasses.contains(optionsClass)) { + Set> requiredOpts = factory.requiredOptions(); + for (Class 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