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();
}
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
index 7e4c7d0..366a09c 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
@@ -64,7 +64,8 @@
// Check that every created fragment is present.
assertThat(configurationFragments).contains(fragmentFactory.creates());
// Check that every options class required for fragment creation is provided.
- for (Class<? extends FragmentOptions> options : fragmentFactory.requiredOptions()) {
+ for (Class<? extends FragmentOptions> options :
+ Fragment.requiredOptions(fragmentFactory.creates())) {
assertThat(configOptions).contains(options);
}
}