Description redacted.
--
MOS_MIGRATED_REVID=128199284
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 8a0c4f1..828a5e5 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 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 @@
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 @@
return builder.build(errorLoadingTarget);
}
+ @Override
protected Collection<Label> getAspectLabels(Rule fromRule, Attribute attr, Label toLabel,
ValueOrException2<NoSuchPackageException, NoSuchTargetException> toVal,
final Environment env) {