diff --git a/pom.xml b/pom.xml index 6aed270..e9c6aa6 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,11 @@ + + org.jspecify + jspecify + 1.0.0 + org.junit.jupiter junit-jupiter @@ -47,6 +52,38 @@ maven-compiler-plugin 3.14.1 + + true + 128m + 2048m + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + -Xplugin:ErrorProne -Xep:NullAway:ERROR -XepOpt:NullAway:AnnotatedPackages=com.garciat.typeclasses + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + + + com.google.errorprone + error_prone_core + 2.45.0 + + + com.uber.nullaway + nullaway + 0.12.14 + + + maven-surefire-plugin @@ -86,6 +123,9 @@ com.spotify.fmt fmt-maven-plugin + + maven-compiler-plugin + \ No newline at end of file diff --git a/src/main/java/com/garciat/typeclasses/classes/PrintAll.java b/src/main/java/com/garciat/typeclasses/classes/PrintAll.java index 919be1f..1d3948d 100644 --- a/src/main/java/com/garciat/typeclasses/classes/PrintAll.java +++ b/src/main/java/com/garciat/typeclasses/classes/PrintAll.java @@ -1,11 +1,14 @@ package com.garciat.typeclasses.classes; +import static com.garciat.typeclasses.types.Unit.unit; + import com.garciat.typeclasses.api.TypeClass; import com.garciat.typeclasses.api.TypeClass.Witness; import com.garciat.typeclasses.impl.utils.Lists; import com.garciat.typeclasses.types.F1; import com.garciat.typeclasses.types.F2; import com.garciat.typeclasses.types.F3; +import com.garciat.typeclasses.types.Unit; import java.util.List; import java.util.function.Function; @@ -21,12 +24,12 @@ static T of(PrintAll printAll) { } @Witness - static PrintAll base() { + static PrintAll base() { return strings -> { for (String s : strings) { System.out.println(s); } - return null; + return unit(); }; } diff --git a/src/main/java/com/garciat/typeclasses/types/FwdList.java b/src/main/java/com/garciat/typeclasses/types/FwdList.java index ccd5c48..44d667d 100644 --- a/src/main/java/com/garciat/typeclasses/types/FwdList.java +++ b/src/main/java/com/garciat/typeclasses/types/FwdList.java @@ -1,6 +1,7 @@ package com.garciat.typeclasses.types; import static com.garciat.typeclasses.api.TypeClass.Witness.Overlap.OVERLAPPING; +import static com.garciat.typeclasses.types.Unit.unit; import com.garciat.typeclasses.api.hkt.Kind; import com.garciat.typeclasses.api.hkt.Kind.KArr; @@ -47,12 +48,12 @@ default B foldl(B identity, BiFunction f) { } default void forEach(Consumer action) { - this.match( - () -> null, + this.match( + () -> unit(), (head, tail) -> { action.accept(head); tail.forEach(action); - return null; + return unit(); }); } diff --git a/src/main/java/com/garciat/typeclasses/types/Unit.java b/src/main/java/com/garciat/typeclasses/types/Unit.java new file mode 100644 index 0000000..95d2324 --- /dev/null +++ b/src/main/java/com/garciat/typeclasses/types/Unit.java @@ -0,0 +1,7 @@ +package com.garciat.typeclasses.types; + +public record Unit() { + public static Unit unit() { + return new Unit(); + } +} diff --git a/src/test/java/com/garciat/typeclasses/ExamplesTest.java b/src/test/java/com/garciat/typeclasses/ExamplesTest.java index 706de4e..0dc6444 100644 --- a/src/test/java/com/garciat/typeclasses/ExamplesTest.java +++ b/src/test/java/com/garciat/typeclasses/ExamplesTest.java @@ -18,6 +18,7 @@ import com.garciat.typeclasses.types.JavaList; import com.garciat.typeclasses.types.Maybe; import com.garciat.typeclasses.types.Sum; +import com.garciat.typeclasses.types.Unit; import java.util.List; import java.util.Map; import java.util.Optional; @@ -70,7 +71,7 @@ void example() { F3 sum = SumAllInt.of(witness(new Ty<>() {})); System.out.println(sum.apply(1, 2, 3)); - F3, Integer, Void> printer = PrintAll.of(witness(new Ty<>() {})); + F3, Integer, Unit> printer = PrintAll.of(witness(new Ty<>() {})); printer.apply("Items:", JavaList.of("apple", "banana", "cherry"), 0); Foldable foldableFwdList = witness(new Ty<>() {}); diff --git a/src/test/java/com/garciat/typeclasses/TypeClassesTest.java b/src/test/java/com/garciat/typeclasses/TypeClassesTest.java index ae9070a..703ba1f 100644 --- a/src/test/java/com/garciat/typeclasses/TypeClassesTest.java +++ b/src/test/java/com/garciat/typeclasses/TypeClassesTest.java @@ -216,10 +216,12 @@ void witnessMapWithDependencies() { // Test helper classes // ============================================ + @SuppressWarnings("NullAway") static class NoWitnessType { String value; } + @SuppressWarnings("NullAway") static class CustomType { String value; diff --git a/src/test/java/com/garciat/typeclasses/impl/ParsedTypeTest.java b/src/test/java/com/garciat/typeclasses/impl/ParsedTypeTest.java index 66f12fe..0b77ac6 100644 --- a/src/test/java/com/garciat/typeclasses/impl/ParsedTypeTest.java +++ b/src/test/java/com/garciat/typeclasses/impl/ParsedTypeTest.java @@ -77,6 +77,7 @@ class TestClass {} @Test void parseTypeVariableInParameterizedType() throws Exception { + @SuppressWarnings("NullAway") class TestClass { List field; } @@ -88,6 +89,7 @@ class TestClass { @Test void parseWildcardTypeThrows() throws Exception { + @SuppressWarnings("NullAway") class TestClass { List field; }