-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Array creation annotation checks #928
base: master
Are you sure you want to change the base?
Array creation annotation checks #928
Conversation
You can use |
@thisisalexandercook Please also add test case to show the the check is implemented correctly. |
TreeUtils.annotationsFromArrayCreation(tree, 0); | ||
if (AnnotationUtils.containsSame(annotations, NULLABLE)) { | ||
checker.reportWarning(tree, "new.array.nullable.ignored"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we use this error message?
new.array.type.invalid=annotations %s may not be applied as component type for array "%s"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, because it is not about the component type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you also look at checker/src/main/java/org/checkerframework/checker/nullness/NullnessNoInitAnnotatedTypeFactory.java
and see why visitNewArray
and visitNewClass
are slightly different? Is there a reason one doesn't call super
?
In a separate PR, can you also look at why we backed out fb6cb61 12 years ago? Why doesn't the simpler check work?
List<? extends AnnotationMirror> annotations = | ||
TreeUtils.annotationsFromArrayCreation(tree, 0); | ||
if (AnnotationUtils.containsSame(annotations, NULLABLE)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
List<? extends AnnotationMirror> annotations = | |
TreeUtils.annotationsFromArrayCreation(tree, 0); | |
if (AnnotationUtils.containsSame(annotations, NULLABLE)) { | |
if (type.hasAnnotation(NULLABLE)) { |
type
is the type of the NewArrayTree
, so wouldn't this perform the check you want?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about @PolyNull
? Is that allowed? MonotonicNonNull
?
Are some of these checks maybe in isValid
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
type
is holding what the annotation defaulted to (i.e. @NonNull
) and I couldn't find a utility to retrieve the original @Nullable
annotation (i.e. getExplicitonAnnotation() does not hold onto it), so I pull the annotations directly from the 0th dim of the tree.
Thanks for bringing up @PolyNull
and @MonotonicNonNull
, both suggest possible nullness so I think they should be disallowed.
public class ArrayMainModifierNullableAnnotation { | ||
void foo() { | ||
// :: warning: (new.array.nullable.ignored) | ||
int[] o = new int @Nullable [10]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's usually a good idea to include a test where you expect no error. Here, how about adding something with new int [10] @Nullable []
to make sure that is allowed?
@@ -22,6 +22,7 @@ nulltest.redundant=redundant test against null; "%s" is non-null | |||
instanceof.nullable=instanceof is only true for a non-null expression | |||
instanceof.nonnull.redundant=redundant @NonNull annotation on instanceof |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we have a similar warning for object and array creations?
On the other hand, there is the -AwarnRedundantAnnotations
option... so should we remove the special case for instanceof? If needed, please file a new issue for this.
TreeUtils.annotationsFromArrayCreation(tree, 0); | ||
if (AnnotationUtils.containsSame(annotations, NULLABLE)) { | ||
checker.reportWarning(tree, "new.array.nullable.ignored"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, because it is not about the component type.
@@ -22,6 +22,7 @@ nulltest.redundant=redundant test against null; "%s" is non-null | |||
instanceof.nullable=instanceof is only true for a non-null expression | |||
instanceof.nonnull.redundant=redundant @NonNull annotation on instanceof | |||
new.array.type.invalid=annotations %s may not be applied as component type for array "%s" | |||
new.array.nullable.ignored=nullable annotation on new array main modifier ignored, must be nonnull |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see any other message, here or in the basetype, refer to the main
modifier... which is odd... somewhere we called it primary
, but I also don't see that in any of the error messages... Can you look what would be a consistent way to word this?
Other messages in this file also don't use nullable
and use non-null
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also can't see any reference to main or primary anywhere else. Where does this wording originate from, what other contexts is it used in?
We could use the JLS wording:
new.array.nullable.ignored=nullable annotation on new array main modifier ignored, must be nonnull | |
new.array.nullable.ignored=array type annotation must be nonnull |
fixes #927 , added a warning if the first dimension (element type) of array creation is annotated with nullable. Warning will inform user that this annotation has been ignored. Also added a new error message to support the warning.