You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/02/12 04:40:25 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-9389: check setter type(s) against field/property/accessor type (closes #1164)

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new d97cece  GROOVY-9389: check setter type(s) against field/property/accessor type (closes #1164)
d97cece is described below

commit d97cece34cf44ca639dd049115309f1b2f81f1cc
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Feb 11 14:19:57 2020 -0600

    GROOVY-9389: check setter type(s) against field/property/accessor type (closes #1164)
---
 .../transform/stc/StaticTypeCheckingVisitor.java     |  9 +++++++++
 .../groovy/transform/stc/STCAssignmentTest.groovy    | 20 ++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 86e49f5..1a72af2 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2010,6 +2010,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         }
         try {
             operand.visit(this);
+            SetterInfo setterInfo = removeSetterInfo(operand);
+            if (setterInfo != null) {
+                BinaryExpression rewrite = typeCheckingContext.getEnclosingBinaryExpression();
+                rewrite.setSourcePosition(origin);
+                if (ensureValidSetter(rewrite, operand, rewrite.getRightExpression(), setterInfo)) {
+                    return;
+                }
+            }
+
             ClassNode operandType = getType(operand);
             boolean isPostfix = (origin instanceof PostfixExpression);
             String name = (operator == PLUS_PLUS ? "next" : operator == MINUS_MINUS ? "previous" : null);
diff --git a/src/test/groovy/transform/stc/STCAssignmentTest.groovy b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
index 645a6de..f9a7a06 100644
--- a/src/test/groovy/transform/stc/STCAssignmentTest.groovy
+++ b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
@@ -732,6 +732,26 @@ class STCAssignmentTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-9389
+    void testPostfixOnNumber() {
+        assertScript '''
+            class Pogo {
+                Integer integer = 0
+                Integer getInteger() { return integer }
+                void setInteger(Integer i) { integer = i }
+            }
+            new Pogo().integer++
+        '''
+        shouldFailWithMessages '''
+            class Pogo {
+                Integer integer = 0
+                Integer getInteger() { return integer }
+                void setInteger(Character c) { integer = (c as int) }
+            }
+            new Pogo().integer++
+        ''', 'Cannot assign value of type java.lang.Integer to variable of type java.lang.Character'
+    }
+
     void testPostfixOnObject() {
         shouldFailWithMessages '''
             Object o = new Object()