LexicographicalAnnotationListing
SUGGESTION
Style
Summary
Sort annotations lexicographically where possible
Suppression
Suppress false positives by adding the suppression annotation
@SuppressWarnings("LexicographicalAnnotationListing")
to the enclosing element.Disable this pattern completely by adding
-Xep:LexicographicalAnnotationListing:OFF
as compiler argument. Learn more.
Samples
Replacement
Shows the difference in example code before and after the bug pattern is applied.
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Target;
interface A {
@Repeatable(Foos.class)
@interface Foo {
String[] value() default {};
int[] ints() default {};
Bar[] anns() default {};
}
@Target(ElementType.METHOD)
@interface Bar {
String[] value() default {};
}
@interface Baz {
String[] str() default {};
}
@interface Foos {
Foo[] value();
}
@Target(ElementType.TYPE_USE)
@interface FooTypeUse {
String[] value() default {};
}
@Target(ElementType.TYPE_USE)
@interface BarTypeUse {
String[] value() default {};
}
@Bar
A singleAnnotation();
@Bar
@Foo
A sortedAnnotations();
- @Foo
@Bar
+ @Foo
A unsortedAnnotations();
- @Foo()
- @Baz()
@Bar
+ @Baz()
+ @Foo()
A unsortedAnnotationsWithSomeParens();
@Bar
@Baz(str = {"a", "b"})
@Foo()
A unsortedAnnotationsOneContainingAttributes();
+ @Bar({"b"})
@Baz(str = {"a", "b"})
@Foo(anns = {@Bar("b"), @Bar("a")})
- @Bar({"b"})
A unsortedAnnotationsWithAttributes();
@Foo(anns = {@Bar("b"), @Bar("a")})
@Foo(ints = {1, 2})
@Foo({"b"})
A sortedRepeatableAnnotation();
- @Foo(anns = {@Bar("b"), @Bar("a")})
@Bar
+ @Foo(anns = {@Bar("b"), @Bar("a")})
@Foo(ints = {1, 2})
A unsortedRepeatableAnnotation();
- @Baz
@Bar
- default @FooTypeUse @BarTypeUse A unsortedWithTypeUseAnnotations() {
+ @Baz
+ default @BarTypeUse @FooTypeUse A unsortedWithTypeUseAnnotations() {
return null;
}
}
Identification
Shows code lines which will (not) be flagged by this bug pattern.
A //BUG: Diagnostic contains:
comment is placed above any violating line.
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Target;
interface A {
@Repeatable(Foos.class)
@interface Foo {
String[] value() default {};
int[] ints() default {};
Bar[] anns() default {};
}
@Target(ElementType.METHOD)
@interface Bar {
String[] value() default {};
}
@interface Baz {
String[] str() default {};
}
@interface Foos {
Foo[] value();
}
@Target(ElementType.TYPE_USE)
@interface FooTypeUse {
String[] value() default {};
}
@Target(ElementType.TYPE_USE)
@interface BarTypeUse {
String[] value() default {};
}
// BUG: Diagnostic contains:
@Foo
@Bar
A unsortedSimpleCase();
// BUG: Diagnostic contains:
@Foo()
@Bar()
A unsortedWithParens();
@Foo()
A onlyOneAnnotation();
@Bar
@Foo()
A sortedAnnotationsOneWithParens();
// BUG: Diagnostic contains:
@Foo
@Baz
@Bar
A threeUnsortedAnnotationsSameInitialLetter();
// BUG: Diagnostic contains:
@Bar
@Foo()
@Baz
A firstOrderedWithTwoUnsortedAnnotations();
@Bar
@Baz
@Foo()
A threeSortedAnnotations();
// BUG: Diagnostic contains:
@Foo({"b"})
@Bar({"a"})
A unsortedWithStringAttributes();
// BUG: Diagnostic contains:
@Baz(str = {"a", "b"})
@Foo(ints = {1, 0})
@Bar
A unsortedWithAttributes();
// BUG: Diagnostic contains:
@Bar
@Foo(anns = {@Bar("b"), @Bar("a")})
@Baz
A unsortedWithNestedBar();
@Bar
@Baz
@Foo(anns = {@Bar("b"), @Bar("a")})
A sortedWithNestedBar();
@Foo(anns = {@Bar("b"), @Bar("a")})
@Foo(ints = {1, 2})
@Foo({"b"})
A sortedRepeatableAnnotation();
// BUG: Diagnostic contains:
@Foo(anns = {@Bar("b"), @Bar("a")})
@Bar
@Foo(ints = {1, 2})
A unsortedRepeatableAnnotation();
// BUG: Diagnostic contains:
default @FooTypeUse @BarTypeUse A unsortedTypeAnnotations() {
return null;
}
// BUG: Diagnostic contains:
@Baz
@Bar
default @FooTypeUse @BarTypeUse A unsortedTypeUseAndOtherAnnotations() {
return null;
}
}