You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2016/08/19 02:33:20 UTC

groovy git commit: GROOVY-7713: CompileStatic checking fails with null returns from Closures (closes #384)

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_4_X 5f86d08b0 -> 31778234c


GROOVY-7713: CompileStatic checking fails with null returns from Closures (closes #384)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/31778234
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/31778234
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/31778234

Branch: refs/heads/GROOVY_2_4_X
Commit: 31778234c9e29e685ef51b38b8cabb8d0b0438d9
Parents: 5f86d08
Author: John Wagenleitner <jw...@apache.org>
Authored: Sat Aug 13 23:34:09 2016 -0700
Committer: John Wagenleitner <jw...@apache.org>
Committed: Thu Aug 18 19:23:45 2016 -0700

----------------------------------------------------------------------
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java |  5 +++--
 src/test/groovy/transform/stc/GenericsSTCTest.groovy    | 12 ++++++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/31778234/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 358fe55..0bb9409 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -170,8 +170,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
 
     protected final ReturnAdder.ReturnStatementListener returnListener = new ReturnAdder.ReturnStatementListener() {
         public void returnStatementAdded(final ReturnStatement returnStatement) {
+            if (returnStatement.getExpression() == ConstantExpression.NULL) return;
+            if (isNullConstant(returnStatement.getExpression())) return;
             checkReturnType(returnStatement);
-            if (returnStatement.getExpression().equals(ConstantExpression.NULL)) return;
             if (typeCheckingContext.getEnclosingClosure()!=null) {
                 addClosureReturnType(getType(returnStatement.getExpression()));
             } else if (typeCheckingContext.getEnclosingMethod() != null) {
@@ -4158,7 +4159,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     }
 
     protected static boolean isNullConstant(final Expression expression) {
-        return expression instanceof ConstantExpression && ((ConstantExpression) expression).getValue() == null;
+        return expression instanceof ConstantExpression && ((ConstantExpression) expression).isNullExpression();
     }
 
     protected ClassNode inferMapExpressionType(final MapExpression map) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/31778234/src/test/groovy/transform/stc/GenericsSTCTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index d5220ad..49697d3 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1813,6 +1813,18 @@ assert result == 'ok'
         '''
     }
 
+    //GROOVY-7713
+    void testClosureReturnNull() {
+        assertScript '''
+            Closure<String> cl = {
+                if (hashCode() > 0) {
+                    return null
+                }
+                'foo'
+            }
+        '''
+    }
+
     static class MyList extends LinkedList<String> {}
 
     public static class ClassA<T> {