Disable --all_incompatible_changes. Step 1 of https://github.com/bazelbuild/bazel/issues/13892 RELNOTES: Disable --all_incompatible_changes flag. PiperOrigin-RevId: 392476629
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansion.java b/src/main/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansion.java deleted file mode 100644 index 9dff3d9..0000000 --- a/src/main/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansion.java +++ /dev/null
@@ -1,181 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.runtime; - -import com.google.common.collect.ImmutableList; -import com.google.devtools.common.options.Converter; -import com.google.devtools.common.options.ExpansionFunction; -import com.google.devtools.common.options.IsolatedOptionsData; -import com.google.devtools.common.options.OptionDefinition; -import com.google.devtools.common.options.OptionMetadataTag; -import java.util.ArrayList; -import java.util.Map; - -/** - * Expansion function for {@code --all_incompatible_changes}. Expands to all options of form {@code - * --incompatible_*} that are declared in the {@link com.google.devtools.common.options.OptionsBase} - * subclasses that are passed to the parser. - * - * <p>The incompatible changes system provides users with a uniform way of opting into backwards- - * incompatible changes, in order to test whether their builds will be broken by an upcoming - * release. When adding a new breaking change to Bazel, prefer to use this mechanism for guarding - * the behavior. - * - * <p>An {@link com.google.devtools.common.options.Option}-annotated field that is considered an - * incompatible change must satisfy the following requirements. - * - * <ul> - * <li>the {@link com.google.devtools.common.options.Option#name} must be prefixed with - * "incompatible_" - * <li>the {@link com.google.devtools.common.options.Option#metadataTags()} must include {@link - * OptionMetadataTag#INCOMPATIBLE_CHANGE} and {@link - * OptionMetadataTag#TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES} - * <li>the {@link com.google.devtools.common.options.Option#help} field must be set, and must - * refer the user to information about what the change does and how to migrate their code - * <li>the following fields may not be used: {@link - * com.google.devtools.common.options.Option#abbrev}, {@link - * com.google.devtools.common.options.Option#valueHelp}, {@link - * com.google.devtools.common.options.Option#converter}, {@link - * com.google.devtools.common.options.Option#allowMultiple}, and {@link - * com.google.devtools.common.options.Option#oldName} - * </ul> - * - * Example: - * - * <pre>{@code - * @Option( - * name = "incompatible_foo", - * metadataTags = { - * OptionMetadataTag.INCOMPATIBLE_CHANGE, - * OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - * }, - * defaultValue = "false", - * help = "Deprecates bar and changes the semantics of baz. To migrate your code see [...].") - * public boolean incompatibleFoo; - * }</pre> - * - * All options that have either the "incompatible_" prefix or the tag {@link - * OptionMetadataTag#TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES} will be validated using the above - * criteria. Any failure will cause {@link IllegalArgumentException} to be thrown, which will cause - * the construction of the {@link com.google.devtools.common.options.OptionsParser} to fail with the - * <i>unchecked</i> exception {@link - * com.google.devtools.common.options.OptionsParser.ConstructionException}. Therefore, when adding a - * new incompatible change, be aware that an error in the specification of the {@code @Option} will - * exercise failure code paths in the early part of the Bazel server execution. - * - * <p>After the breaking change has been enabled by default, it is recommended (required?) that the - * flag stick around for a few releases, to provide users the flexibility to opt out. Even after - * enabling the behavior unconditionally, it can still be useful to keep the flag around as a valid - * no-op so that Bazel invocations are not immediately broken. - * - * <p>Generally speaking, we should never reuse names for multiple options. Therefore, when choosing - * a name for a new incompatible change, try to describe not just the affected feature, but what the - * change to that feature is. This avoids conflicts in case the feature changes multiple times. For - * example, {@code "--incompatible_depset_constructor"} is ambiguous because it only communicates - * that there is a change to how depsets are constructed, but {@code - * "--incompatible_disallow_set_constructor"} uniquely says that the {@code set} alias for the - * depset constructor is being disallowed. - */ -// Javadoc can't resolve inner classes. -@SuppressWarnings("javadoc") -public class AllIncompatibleChangesExpansion implements ExpansionFunction { - - // The reserved prefix for all incompatible change option names. - public static final String INCOMPATIBLE_NAME_PREFIX = "incompatible_"; - - /** - * Ensures that the given option satisfies all the requirements on incompatible change options - * enumerated above. - * - * <p>If any of these requirements are not satisfied, {@link IllegalArgumentException} is thrown, - * as this constitutes an internal error in the declaration of the option. - */ - private static void validateIncompatibleChange(OptionDefinition optionDefinition) { - String prefix = String.format("Incompatible change %s ", optionDefinition); - - // To avoid ambiguity, and the suggestion of using .isEmpty(). - String defaultString = ""; - - // Validate that disallowed fields aren't used. These will need updating if the default values - // in Option ever change, and perhaps if new fields are added. - if (optionDefinition.getAbbreviation() != '\0') { - throw new IllegalArgumentException(prefix + "must not use the abbrev field"); - } - if (!optionDefinition.getValueTypeHelpText().equals(defaultString)) { - throw new IllegalArgumentException(prefix + "must not use the valueHelp field"); - } - if (optionDefinition.getProvidedConverter() != Converter.class) { - throw new IllegalArgumentException(prefix + "must not use the converter field"); - } - if (optionDefinition.allowsMultiple()) { - throw new IllegalArgumentException(prefix + "must not use the allowMultiple field"); - } - if (optionDefinition.hasImplicitRequirements()) { - throw new IllegalArgumentException(prefix + "must not use the implicitRequirements field"); - } - if (!optionDefinition.getOldOptionName().equals(defaultString) - && !optionDefinition.getOldOptionName().startsWith("experimental_")) { - throw new IllegalArgumentException(prefix + "must not use the oldName field"); - } - - // Validate the fields that are actually allowed. - if (!optionDefinition.getOptionName().startsWith(INCOMPATIBLE_NAME_PREFIX)) { - throw new IllegalArgumentException(prefix + "must have name starting with \"incompatible_\""); - } - if (!ImmutableList.copyOf(optionDefinition.getOptionMetadataTags()) - .contains(OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES)) { - throw new IllegalArgumentException( - prefix - + "must have metadata tag OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES"); - } - if (!ImmutableList.copyOf(optionDefinition.getOptionMetadataTags()) - .contains(OptionMetadataTag.INCOMPATIBLE_CHANGE)) { - throw new IllegalArgumentException( - prefix + "must have metadata tag OptionMetadataTag.INCOMPATIBLE_CHANGE"); - } - if (!optionDefinition.isExpansionOption()) { - if (!optionDefinition.getType().equals(Boolean.TYPE)) { - throw new IllegalArgumentException( - prefix + "must have boolean type (unless it's an expansion option)"); - } - } - if (optionDefinition.getHelpText().equals(defaultString)) { - throw new IllegalArgumentException( - prefix - + "must have a \"help\" string that refers the user to " - + "information about this change and how to migrate their code"); - } - } - - @Override - public ImmutableList<String> getExpansion(IsolatedOptionsData optionsData) { - // Grab all registered options that are identified as incompatible changes by either name or - // by OptionMetadataTag. Ensure they satisfy our requirements. - ArrayList<String> incompatibleChanges = new ArrayList<>(); - for (Map.Entry<String, OptionDefinition> entry : optionsData.getAllOptionDefinitions()) { - OptionDefinition optionDefinition = entry.getValue(); - if (optionDefinition.getOptionName().startsWith(INCOMPATIBLE_NAME_PREFIX) - || ImmutableList.copyOf(optionDefinition.getOptionMetadataTags()) - .contains(OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES)) { - validateIncompatibleChange(optionDefinition); - incompatibleChanges.add("--" + optionDefinition.getOptionName()); - } - } - // Sort to get a deterministic canonical order. This probably isn't necessary because the - // options parser will do its own sorting when canonicalizing, but it seems like it can't hurt. - incompatibleChanges.sort(null); - return ImmutableList.copyOf(incompatibleChanges); - } -}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java b/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java index 29077ad..21a5b72 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java
@@ -47,12 +47,9 @@ name = "all_incompatible_changes", defaultValue = "null", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.UNKNOWN}, + effectTags = {OptionEffectTag.NO_OP}, metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, - expansionFunction = AllIncompatibleChangesExpansion.class, - help = - "Enables all options of the form --incompatible_*. Use this option to find places where " - + "your build may break in the future due to deprecations or other changes.") + help = "No-op, being removed. See https://github.com/bazelbuild/bazel/issues/13892") public Void allIncompatibleChanges; @Option(
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java b/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java deleted file mode 100644 index 1906f60..0000000 --- a/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java +++ /dev/null
@@ -1,515 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.runtime; - -import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.fail; - -import com.google.common.collect.ImmutableList; -import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy; -import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.UseDefault; -import com.google.devtools.common.options.Converters; -import com.google.devtools.common.options.ExpansionFunction; -import com.google.devtools.common.options.InvocationPolicyEnforcer; -import com.google.devtools.common.options.IsolatedOptionsData; -import com.google.devtools.common.options.Option; -import com.google.devtools.common.options.OptionDocumentationCategory; -import com.google.devtools.common.options.OptionEffectTag; -import com.google.devtools.common.options.OptionMetadataTag; -import com.google.devtools.common.options.OptionsBase; -import com.google.devtools.common.options.OptionsParser; -import com.google.devtools.common.options.OptionsParsingException; -import java.util.List; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** - * Tests for the Incompatible Changes system (--incompatible_* flags). These go in their own suite - * because the options parser doesn't know the business logic for incompatible changes. - */ -@RunWith(JUnit4.class) -public class AllIncompatibleChangesExpansionTest { - - /** Dummy comment (linter suppression) */ - public static class ExampleOptions extends OptionsBase { - @Option( - name = "all", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "null", - expansionFunction = AllIncompatibleChangesExpansion.class - ) - public Void all; - - @Option( - name = "X", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false" - ) - public boolean x; - - @Option( - name = "Y", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "true" - ) - public boolean y; - - @Option( - name = "incompatible_A", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "Migrate to A" - ) - public boolean incompatibleA; - - @Option( - name = "incompatible_B", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "Migrate to B" - ) - public boolean incompatibleB; - - @Option( - name = "incompatible_C", - oldName = "experimental_C", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "true", - help = "Migrate to C" - ) - public boolean incompatibleC; - } - - /** Dummy comment (linter suppression) */ - public static class ExampleExpansionOptions extends OptionsBase { - @Option( - name = "incompatible_expX", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "null", - expansion = {"--X"}, - help = "Start using X" - ) - public Void incompatibleExpX; - - /** Dummy comment (linter suppression) */ - public static class NoYExpansion implements ExpansionFunction { - @Override - public ImmutableList<String> getExpansion(IsolatedOptionsData optionsData) { - return ImmutableList.of("--noY"); - } - } - - @Option( - name = "incompatible_expY", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "null", - expansionFunction = NoYExpansion.class, - help = "Stop using Y" - ) - public Void incompatibleExpY; - } - - @Test - public void noChangesSelected() throws OptionsParsingException { - OptionsParser parser = OptionsParser.builder().optionsClasses(ExampleOptions.class).build(); - parser.parse(""); - ExampleOptions opts = parser.getOptions(ExampleOptions.class); - assertThat(opts.x).isFalse(); - assertThat(opts.y).isTrue(); - assertThat(opts.incompatibleA).isFalse(); - assertThat(opts.incompatibleB).isFalse(); - assertThat(opts.incompatibleC).isTrue(); - } - - @Test - public void allChangesSelected() throws OptionsParsingException { - OptionsParser parser = OptionsParser.builder().optionsClasses(ExampleOptions.class).build(); - parser.parse("--all"); - ExampleOptions opts = parser.getOptions(ExampleOptions.class); - assertThat(opts.x).isFalse(); - assertThat(opts.y).isTrue(); - assertThat(opts.incompatibleA).isTrue(); - assertThat(opts.incompatibleB).isTrue(); - assertThat(opts.incompatibleC).isTrue(); - } - - @Test - public void rightmostOverrides() throws OptionsParsingException { - // Check that all-expansion behaves just like any other expansion flag: - // the rightmost setting of any individual option wins. - OptionsParser parser = OptionsParser.builder().optionsClasses(ExampleOptions.class).build(); - parser.parse("--noincompatible_A", "--all", "--noincompatible_B"); - ExampleOptions opts = parser.getOptions(ExampleOptions.class); - assertThat(opts.incompatibleA).isTrue(); - assertThat(opts.incompatibleB).isFalse(); - } - - @Test - public void expansionOptions() throws OptionsParsingException { - // Check that all-expansion behaves just like any other expansion flag: - // the rightmost setting of any individual option wins. - OptionsParser parser = - OptionsParser.builder() - .optionsClasses(ExampleOptions.class, ExampleExpansionOptions.class) - .build(); - parser.parse("--all"); - ExampleOptions opts = parser.getOptions(ExampleOptions.class); - assertThat(opts.x).isTrue(); - assertThat(opts.y).isFalse(); - assertThat(opts.incompatibleA).isTrue(); - assertThat(opts.incompatibleB).isTrue(); - } - - @Test - public void invocationPolicy() throws OptionsParsingException { - // Check that all-expansion behaves just like any other expansion flag and can be filtered - // by invocation policy. - InvocationPolicy.Builder invocationPolicyBuilder = InvocationPolicy.newBuilder(); - invocationPolicyBuilder - .addFlagPoliciesBuilder() - .setFlagName("incompatible_A") - .setUseDefault(UseDefault.getDefaultInstance()); - InvocationPolicy policy = invocationPolicyBuilder.build(); - InvocationPolicyEnforcer enforcer = new InvocationPolicyEnforcer(policy); - - OptionsParser parser = OptionsParser.builder().optionsClasses(ExampleOptions.class).build(); - parser.parse("--all"); - enforcer.enforce(parser); - - ExampleOptions opts = parser.getOptions(ExampleOptions.class); - assertThat(opts.x).isFalse(); - assertThat(opts.y).isTrue(); - assertThat(opts.incompatibleA).isFalse(); // A should have been removed from the expansion. - assertThat(opts.incompatibleB).isTrue(); // B, without a policy, should have been left alone. - } - - /** Option with the right prefix, but the wrong metadata tag. */ - public static class IncompatibleChangeTagOption extends OptionsBase { - @Option( - name = "some_option_with_a_tag", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp" - ) - public boolean opt; - } - - @Test - public void incompatibleChangeTagDoesNotTriggerAllIncompatibleChangesCheck() { - try { - OptionsParser.builder() - .optionsClasses(ExampleOptions.class, IncompatibleChangeTagOption.class) - .build(); - } catch (OptionsParser.ConstructionException e) { - fail( - "some_option_with_a_tag should not trigger the expansion, so there should be no checks " - + "on it having the right prefix and metadata tags. Instead, the following exception " - + "was thrown: " - + e.getMessage()); - } - } - - // There's no unit test to check that the expansion of --all is sorted. IsolatedOptionsData is not - // exposed from OptionsParser, making it difficult to check, and it's not clear that exposing it - // would be worth it. - - /** - * Ensure that we get an {@link OptionsParser.ConstructionException} containing {@code message} - * when the incompatible changes in the given {@link OptionsBase} subclass are validated. - */ - // Because javadoc can't resolve inner classes. - @SuppressWarnings("javadoc") - private static void assertBadness(Class<? extends OptionsBase> optionsBaseClass, String message) { - OptionsParser.ConstructionException e = - assertThrows( - "Should have failed with message \"" + message + "\"", - OptionsParser.ConstructionException.class, - () -> - OptionsParser.builder() - .optionsClasses(ExampleOptions.class, optionsBaseClass) - .build()); - assertThat(e).hasMessageThat().contains(message); - } - - /** Dummy comment (linter suppression) */ - public static class BadNameOptions extends OptionsBase { - @Option( - name = "badname", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp" - ) - public boolean bad; - } - - @Test - public void badName() { - assertBadness( - BadNameOptions.class, - "Incompatible change option '--badname' must have name " - + "starting with \"incompatible_\""); - } - - /** Option with the right prefix, but the wrong metadata tag. */ - public static class MissingTriggeredByTagOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp" - ) - public boolean bad; - } - - @Test - public void badTag() { - assertBadness( - MissingTriggeredByTagOptions.class, - "must have metadata tag OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES"); - } - - /** Option with the right prefix, but the wrong metadata tag. */ - public static class MissingIncompatibleTagOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - metadataTags = {OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES}, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp" - ) - public boolean bad; - } - - @Test - public void otherBadTag() { - assertBadness( - MissingIncompatibleTagOptions.class, - "must have metadata tag OptionMetadataTag.INCOMPATIBLE_CHANGE"); - } - - /** Dummy comment (linter suppression) */ - public static class BadTypeOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "0", - help = "nohelp" - ) - public int bad; - } - - @Test - public void badType() { - assertBadness(BadTypeOptions.class, "must have boolean type"); - } - - /** Dummy comment (linter suppression) */ - public static class BadHelpOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false" - ) - public boolean bad; - } - - @Test - public void badHelp() { - assertBadness(BadHelpOptions.class, "must have a \"help\" string"); - } - - /** Dummy comment (linter suppression) */ - public static class BadAbbrevOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp", - abbrev = 'x' - ) - public boolean bad; - } - - @Test - public void badAbbrev() { - assertBadness(BadAbbrevOptions.class, "must not use the abbrev field"); - } - - /** Dummy comment (linter suppression) */ - public static class BadValueHelpOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp", - valueHelp = "x" - ) - public boolean bad; - } - - @Test - public void badValueHelp() { - assertBadness(BadValueHelpOptions.class, "must not use the valueHelp field"); - } - - /** Dummy comment (linter suppression) */ - public static class BadConverterOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp", - converter = Converters.BooleanConverter.class - ) - public boolean bad; - } - - @Test - public void badConverter() { - assertBadness(BadConverterOptions.class, "must not use the converter field"); - } - - /** Dummy comment (linter suppression) */ - public static class BadAllowMultipleOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "null", - help = "nohelp", - allowMultiple = true - ) - public List<String> bad; - } - - @Test - public void badAllowMutliple() { - assertBadness(BadAllowMultipleOptions.class, "must not use the allowMultiple field"); - } - - /** Dummy comment (linter suppression) */ - public static class BadImplicitRequirementsOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp", - implicitRequirements = "--x" - ) - public boolean bad; - } - - @Test - public void badImplicitRequirements() { - assertBadness( - BadImplicitRequirementsOptions.class, "must not use the implicitRequirements field"); - } - - /** Dummy comment (linter suppression) */ - public static class BadOldNameOptions extends OptionsBase { - @Option( - name = "incompatible_bad", - metadataTags = { - OptionMetadataTag.INCOMPATIBLE_CHANGE, - OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES - }, - documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, - effectTags = {OptionEffectTag.NO_OP}, - defaultValue = "false", - help = "nohelp", - oldName = "x" - ) - public boolean bad; - } - - @Test - public void badOldName() { - assertBadness(BadOldNameOptions.class, "must not use the oldName field"); - } -}