Remove ConfigurationFragmentFactory.requiredOptions(). This clears another obstacle toward removing ConfigurationFragmentFactory. PiperOrigin-RevId: 342107364
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD index 765c8d5..6ee5d7f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD +++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -1671,9 +1671,11 @@ srcs = ["config/Fragment.java"], deps = [ ":config/build_options", + ":config/fragment_options", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/net/starlark/java/eval", + "//third_party:guava", "//third_party:jsr305", ], )
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java index 210c9f5..5e51012 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -204,7 +204,7 @@ * no two different configuration fragments can share the same name. */ public Builder addConfigurationFragment(ConfigurationFragmentFactory factory) { - this.configurationOptions.addAll(factory.requiredOptions()); + this.configurationOptions.addAll(Fragment.requiredOptions(factory.creates())); configurationFragmentFactories.add(factory); return this; } @@ -598,7 +598,8 @@ Map<String, Class<? extends Fragment>> result = new LinkedHashMap<>(); Map<Class<? extends FragmentOptions>, Integer> visitedOptionsClasses = new HashMap<>(); for (ConfigurationFragmentFactory factory : configurationFragments) { - Set<Class<? extends FragmentOptions>> requiredOpts = factory.requiredOptions(); + Set<Class<? extends FragmentOptions>> requiredOpts = + Fragment.requiredOptions(factory.creates()); for (Class<? extends FragmentOptions> optionsClass : requiredOpts) { Integer previousBest = visitedOptionsClasses.get(optionsClass); if (previousBest != null && previousBest <= requiredOpts.size()) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index 26af17b..9b35cc4 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -345,7 +345,8 @@ fragmentToRequiredOptions = ArrayListMultimap.create(); for (ConfigurationFragmentFactory fragmentLoader : ((FragmentProvider) ruleClassProvider).getConfigurationFragments()) { - fragmentToRequiredOptions.putAll(fragmentLoader.creates(), fragmentLoader.requiredOptions()); + fragmentToRequiredOptions.putAll( + fragmentLoader.creates(), Fragment.requiredOptions(fragmentLoader.creates())); } Set<Class<? extends FragmentOptions>> options = new HashSet<>(); for (Class<? extends Fragment> fragmentClass : fragmentClasses) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java index a797b65..025fe18 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationFragmentFactory.java
@@ -13,7 +13,6 @@ // limitations under the License. package com.google.devtools.build.lib.analysis.config; -import com.google.common.collect.ImmutableSet; import javax.annotation.Nullable; /** @@ -34,18 +33,4 @@ /** Returns the exact type of the fragment this factory creates. */ Class<? extends Fragment> creates(); - - /** - * Returns the option classes needed to create this fragment. - * - * <p>Don't override this method. We're intending to remove it entirely in preference for {@link - * RequiresOptions}, which clears the way for removing {@link ConfigurationFragmentFactory} - * entirely. - */ - default ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { - Class<? extends Fragment> fragmentClass = creates(); - return fragmentClass.isAnnotationPresent(RequiresOptions.class) - ? ImmutableSet.copyOf(fragmentClass.getAnnotation(RequiresOptions.class).options()) - : ImmutableSet.of(); - } }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java b/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java index 1ce43ce..1ac1f6d 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/Fragment.java
@@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.analysis.config; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.events.EventHandler; import java.util.List; @@ -51,4 +52,12 @@ public String getOutputDirectoryName() { return null; } + + /** Returns the option classes needed to create a fragment. */ + public static ImmutableSet<Class<? extends FragmentOptions>> requiredOptions( + Class<? extends Fragment> fragmentClass) { + return fragmentClass.isAnnotationPresent(RequiresOptions.class) + ? ImmutableSet.copyOf(fragmentClass.getAnnotation(RequiresOptions.class).options()) + : ImmutableSet.of(); + } }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 4aa5d9a..998c8b8 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.config.CoreOptions; import com.google.devtools.build.lib.analysis.config.Fragment; import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.config.RequiresOptions; import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformRule; import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule; import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryRule; @@ -175,6 +176,7 @@ * by the registered fragments. We create and register this fragment exclusively to ensure {@link * StrictActionEnvOptions} is always available. */ + @RequiresOptions(options = {StrictActionEnvOptions.class}) private static class StrictActionEnvConfiguration extends Fragment { private StrictActionEnvConfiguration(BuildOptions buildOptions) {} @@ -188,11 +190,6 @@ public Class<? extends Fragment> creates() { return StrictActionEnvConfiguration.class; } - - @Override - public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { - return ImmutableSet.of(StrictActionEnvOptions.class); - } } }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java index 7fa1933..c270e35 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ConfigCommand.java
@@ -384,7 +384,7 @@ fragments.put( fragmentFactory.creates(), ImmutableSortedSet.copyOf( - (c1, c2) -> c1.getName().compareTo(c2.getName()), fragmentFactory.requiredOptions())); + comparing(Class::getName), Fragment.requiredOptions(fragmentFactory.creates()))); } return fragments.build(); }