diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/contract/ContractHandler.java b/nullaway/src/main/java/com/uber/nullaway/handlers/contract/ContractHandler.java index 3c8c48a3e2..f89455f79a 100644 --- a/nullaway/src/main/java/com/uber/nullaway/handlers/contract/ContractHandler.java +++ b/nullaway/src/main/java/com/uber/nullaway/handlers/contract/ContractHandler.java @@ -101,7 +101,7 @@ public NullnessHint onDataflowVisitMethodInvocation( Preconditions.checkNotNull(callee); // Check to see if this method has an @Contract annotation String contractString = NullabilityUtil.getAnnotationValue(callee, CONTRACT_ANNOTATION_NAME); - if (contractString != null) { + if (contractString != null && contractString.trim().length() > 0) { // Found a contract, lets parse it. String[] clauses = contractString.split(";"); for (String clause : clauses) { diff --git a/nullaway/src/test/java/com/uber/nullaway/NullAwayTest.java b/nullaway/src/test/java/com/uber/nullaway/NullAwayTest.java index 8860177150..dd099528a4 100644 --- a/nullaway/src/test/java/com/uber/nullaway/NullAwayTest.java +++ b/nullaway/src/test/java/com/uber/nullaway/NullAwayTest.java @@ -566,6 +566,46 @@ public void contractNonVarArg() { .doTest(); } + @Test + public void contractPureOnlyIgnored() { + compilationHelper + .setArgs( + Arrays.asList( + "-d", + temporaryFolder.getRoot().getAbsolutePath(), + "-XepOpt:NullAway:AnnotatedPackages=com.uber")) + .addSourceLines( + "PureLibrary.java", + "package com.example.library;", + "import org.jetbrains.annotations.Contract;", + "public class PureLibrary {", + " @Contract(", + " pure = true", + " )", + " public static String pi() {", + " // Meh, close enough...", + " return Double.toString(3.14);", + " }", + "}") + .addSourceLines( + "Test.java", + "package com.uber;", + "import com.example.library.PureLibrary;", + "import javax.annotation.Nullable;", + "class Test {", + " String piValue() {", + " String pi = PureLibrary.pi();", + " // Note: we must trigger dataflow to ensure that", + " // ContractHandler.onDataflowVisitMethodInvocation is called", + " if (pi != null) {", + " return pi;", + " }", + " return Integer.toString(3);", + " }", + "}") + .doTest(); + } + @Test public void testEnumInit() { compilationHelper