Vladimir Sitnikov created CALCITE-4199:
------------------------------------------
Summary: Add nullability annotations to the methods and fields,
ensure consistency with checkerframework
Key: CALCITE-4199
URL: https://issues.apache.org/jira/browse/CALCITE-4199
Project: Calcite
Issue Type: New Feature
Affects Versions: 1.25.0
Reporter: Vladimir Sitnikov
The current codebase uses jsr305 javax.annotation.Nullable / NonNull which
helps to catch bugs while developing Calcite and libraries.
Unfortunately, the current annotation is not enforced, and it lacks support for
generics.
jsr305.jar is probably abandoned (see
https://github.com/google/guava/issues/2960), so we should probably migrate to
something else.
https://checkerframework.org/ is a solid framework for machine verification
which is tailored to Java.
The releases are quite frequent:
https://github.com/typetools/checker-framework/releases
Their annotations are recognized by major IDEs.
So I see the following options:
a) Leave the code as is
b) Annotate (gradually?) the code with checkerframework annotations
c) Migrate (gradually?) the code to Kotlin
I've created a PR to verify which changes would be needed, verify if CI is able
to type check in a reasonable time, and so on:
https://github.com/apache/calcite/pull/1929
My findings regarding checkerframework so far are:
0) It does detect NPEs (which were hidden in the current code), and it does
detect initialized files in the constructors
1) Checkerframework takes ~2 minutes for linq4j, and 13+min (unknown yet, 13m
produces 100 errors and stops) for core
2) "non-nullable by default" is quite close to the current Calcite conventions.
3) There are cases when javadoc comments says "or null", however, the code
reads much easier if {{@Nullable}} nullable appears in the signature
4) If a third-party library supplies invalid type annotations, there's a way to
fix that. For instance, Guava's Function is annotated as "always nullable", and
we can overrule that (so the nullability is taken from generic signature rather
than "always nullable"). The override files are placed to
src/main/config/checkerframework
5) Generic-heavy code might be challenging (they are always like that),
however, in the most obscure cases there's always a way to suppress the warning
6) I've filed a Gradle improvement so it schedules recently modified files
first for the compilation: https://github.com/gradle/gradle/issues/14332
--
This message was sent by Atlassian Jira
(v8.3.4#803005)