diff options
Diffstat (limited to 'src')
4 files changed, 30 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/common/options/Option.java b/src/main/java/com/google/devtools/common/options/Option.java index 4a65f69abc..92436fd5f6 100644 --- a/src/main/java/com/google/devtools/common/options/Option.java +++ b/src/main/java/com/google/devtools/common/options/Option.java @@ -197,5 +197,6 @@ public @interface Option { * expansion flags to other flags, or as implicit requirements to other flags. Use the inner flags * instead. */ + @Deprecated boolean wrapperOption() default false; } diff --git a/src/main/java/com/google/devtools/common/options/processor/OptionProcessor.java b/src/main/java/com/google/devtools/common/options/processor/OptionProcessor.java index 5ccb868cee..fd7c023654 100644 --- a/src/main/java/com/google/devtools/common/options/processor/OptionProcessor.java +++ b/src/main/java/com/google/devtools/common/options/processor/OptionProcessor.java @@ -488,6 +488,30 @@ public final class OptionProcessor extends AbstractProcessor { } } + /** + * Some flags wrap other flags. They are objectively useless, as there is no difference between + * passing --wrapper=--foo and --foo other than the "source" information tracked. This + * functionality comes from requiring compatibility at some past point in time, but is actively + * being deprecated. No non-deprecated flag can use this feature. + */ + private void checkWrapperOptions(VariableElement optionField) throws OptionProcessorException { + Option annotation = optionField.getAnnotation(Option.class); + if (annotation.wrapperOption()) { + if (annotation.deprecationWarning().isEmpty()) { + throw new OptionProcessorException( + optionField, + "Can't have non deprecated wrapper options, this feature is deprecated. " + + "Please add a deprecationWarning."); + } + if (!ImmutableList.copyOf(annotation.metadataTags()).contains(OptionMetadataTag.DEPRECATED)) { + throw new OptionProcessorException( + optionField, + "Can't have non deprecated wrapper options, this feature is deprecated. " + + "Please add the metadata tag DEPRECATED."); + } + } + } + @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(Option.class)) { @@ -504,6 +528,7 @@ public final class OptionProcessor extends AbstractProcessor { checkConverter(optionField); checkEffectTagRationality(optionField); checkMetadataTagAndCategoryRationality(optionField); + checkWrapperOptions(optionField); } catch (OptionProcessorException e) { error(e.getElementInError(), e.getMessage()); } 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 index f8e8892c59..8b978d0e3d 100644 --- a/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java +++ b/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java @@ -444,11 +444,12 @@ public class AllIncompatibleChangesExpansionTest { @Option( name = "incompatible_bad", category = "incompatible changes", - metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, + metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE, OptionMetadataTag.DEPRECATED}, documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.NO_OP}, defaultValue = "false", help = "nohelp", + deprecationWarning = "wrapper options are deprecated, including this one.", wrapperOption = true ) public boolean bad; diff --git a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java index e71307b272..56e1b969c7 100644 --- a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java +++ b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java @@ -1890,8 +1890,10 @@ public class OptionsParserTest { @Option( name = "wrapper", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, + metadataTags = {OptionMetadataTag.DEPRECATED}, effectTags = {OptionEffectTag.NO_OP}, defaultValue = "null", + deprecationWarning = "wrapper options are deprecated, including this one.", wrapperOption = true ) public Void wrapperOption; |