Skip to content

Commit 5f90220

Browse files
CopilotGarciat
andauthored
Add NullAway static null-safety checker via Error Prone (#9)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Garciat <118277+Garciat@users.noreply.github.com>
1 parent 10f9a84 commit 5f90220

7 files changed

Lines changed: 62 additions & 6 deletions

File tree

pom.xml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
</properties>
2020

2121
<dependencies>
22+
<dependency>
23+
<groupId>org.jspecify</groupId>
24+
<artifactId>jspecify</artifactId>
25+
<version>1.0.0</version>
26+
</dependency>
2227
<dependency>
2328
<groupId>org.junit.jupiter</groupId>
2429
<artifactId>junit-jupiter</artifactId>
@@ -47,6 +52,38 @@
4752
<plugin>
4853
<artifactId>maven-compiler-plugin</artifactId>
4954
<version>3.14.1</version>
55+
<configuration>
56+
<fork>true</fork>
57+
<meminitial>128m</meminitial>
58+
<maxmem>2048m</maxmem>
59+
<compilerArgs>
60+
<arg>-XDcompilePolicy=simple</arg>
61+
<arg>--should-stop=ifError=FLOW</arg>
62+
<arg>-Xplugin:ErrorProne -Xep:NullAway:ERROR -XepOpt:NullAway:AnnotatedPackages=com.garciat.typeclasses</arg>
63+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
64+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
65+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
66+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
67+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
68+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
69+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
70+
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
71+
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
72+
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
73+
</compilerArgs>
74+
<annotationProcessorPaths>
75+
<path>
76+
<groupId>com.google.errorprone</groupId>
77+
<artifactId>error_prone_core</artifactId>
78+
<version>2.45.0</version>
79+
</path>
80+
<path>
81+
<groupId>com.uber.nullaway</groupId>
82+
<artifactId>nullaway</artifactId>
83+
<version>0.12.14</version>
84+
</path>
85+
</annotationProcessorPaths>
86+
</configuration>
5087
</plugin>
5188
<plugin>
5289
<artifactId>maven-surefire-plugin</artifactId>
@@ -86,6 +123,9 @@
86123
<groupId>com.spotify.fmt</groupId>
87124
<artifactId>fmt-maven-plugin</artifactId>
88125
</plugin>
126+
<plugin>
127+
<artifactId>maven-compiler-plugin</artifactId>
128+
</plugin>
89129
</plugins>
90130
</build>
91131
</project>

src/main/java/com/garciat/typeclasses/classes/PrintAll.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.garciat.typeclasses.classes;
22

3+
import static com.garciat.typeclasses.types.Unit.unit;
4+
35
import com.garciat.typeclasses.api.TypeClass;
46
import com.garciat.typeclasses.api.TypeClass.Witness;
57
import com.garciat.typeclasses.impl.utils.Lists;
68
import com.garciat.typeclasses.types.F1;
79
import com.garciat.typeclasses.types.F2;
810
import com.garciat.typeclasses.types.F3;
11+
import com.garciat.typeclasses.types.Unit;
912
import java.util.List;
1013
import java.util.function.Function;
1114

@@ -21,12 +24,12 @@ static <T> T of(PrintAll<T> printAll) {
2124
}
2225

2326
@Witness
24-
static PrintAll<Void> base() {
27+
static PrintAll<Unit> base() {
2528
return strings -> {
2629
for (String s : strings) {
2730
System.out.println(s);
2831
}
29-
return null;
32+
return unit();
3033
};
3134
}
3235

src/main/java/com/garciat/typeclasses/types/FwdList.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.garciat.typeclasses.types;
22

33
import static com.garciat.typeclasses.api.TypeClass.Witness.Overlap.OVERLAPPING;
4+
import static com.garciat.typeclasses.types.Unit.unit;
45

56
import com.garciat.typeclasses.api.hkt.Kind;
67
import com.garciat.typeclasses.api.hkt.Kind.KArr;
@@ -47,12 +48,12 @@ default <B> B foldl(B identity, BiFunction<B, A, B> f) {
4748
}
4849

4950
default void forEach(Consumer<A> action) {
50-
this.<Void>match(
51-
() -> null,
51+
this.<Unit>match(
52+
() -> unit(),
5253
(head, tail) -> {
5354
action.accept(head);
5455
tail.forEach(action);
55-
return null;
56+
return unit();
5657
});
5758
}
5859

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.garciat.typeclasses.types;
2+
3+
public record Unit() {
4+
public static Unit unit() {
5+
return new Unit();
6+
}
7+
}

src/test/java/com/garciat/typeclasses/ExamplesTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.garciat.typeclasses.types.JavaList;
1919
import com.garciat.typeclasses.types.Maybe;
2020
import com.garciat.typeclasses.types.Sum;
21+
import com.garciat.typeclasses.types.Unit;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Optional;
@@ -70,7 +71,7 @@ void example() {
7071
F3<Integer, Integer, Integer, Integer> sum = SumAllInt.of(witness(new Ty<>() {}));
7172
System.out.println(sum.apply(1, 2, 3));
7273

73-
F3<String, JavaList<String>, Integer, Void> printer = PrintAll.of(witness(new Ty<>() {}));
74+
F3<String, JavaList<String>, Integer, Unit> printer = PrintAll.of(witness(new Ty<>() {}));
7475
printer.apply("Items:", JavaList.of("apple", "banana", "cherry"), 0);
7576

7677
Foldable<FwdList.Tag> foldableFwdList = witness(new Ty<>() {});

src/test/java/com/garciat/typeclasses/TypeClassesTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,12 @@ void witnessMapWithDependencies() {
216216
// Test helper classes
217217
// ============================================
218218

219+
@SuppressWarnings("NullAway")
219220
static class NoWitnessType {
220221
String value;
221222
}
222223

224+
@SuppressWarnings("NullAway")
223225
static class CustomType {
224226
String value;
225227

src/test/java/com/garciat/typeclasses/impl/ParsedTypeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class TestClass<T> {}
7777

7878
@Test
7979
void parseTypeVariableInParameterizedType() throws Exception {
80+
@SuppressWarnings("NullAway")
8081
class TestClass<T> {
8182
List<T> field;
8283
}
@@ -88,6 +89,7 @@ class TestClass<T> {
8889

8990
@Test
9091
void parseWildcardTypeThrows() throws Exception {
92+
@SuppressWarnings("NullAway")
9193
class TestClass {
9294
List<?> field;
9395
}

0 commit comments

Comments
 (0)