You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2020/08/21 19:34:31 UTC

[groovy] branch GROOVY-9699 updated (e0a0ba5 -> 48e2ea9)

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

emilles pushed a change to branch GROOVY-9699
in repository https://gitbox.apache.org/repos/asf/groovy.git.


 discard e0a0ba5  reuse getType for field in visitVariableExpression and simplify its flow
     new 48e2ea9  reuse getType for field in visitVariableExpression and simplify its flow

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (e0a0ba5)
            \
             N -- N -- N   refs/heads/GROOVY-9699 (48e2ea9)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../groovy/typecheckers/RegexCheckerTest.groovy    | 64 +++++++++++-----------
 1 file changed, 31 insertions(+), 33 deletions(-)


[groovy] 01/01: reuse getType for field in visitVariableExpression and simplify its flow

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-9699
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 48e2ea93542e51859c5a796f5ce62b08e141a83b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Aug 21 10:53:13 2020 -0500

    reuse getType for field in visitVariableExpression and simplify its flow
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 41 +++++---------
 .../groovy/typecheckers/RegexCheckerTest.groovy    | 64 +++++++++++-----------
 2 files changed, 46 insertions(+), 59 deletions(-)

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 a2e814d..409f4fb 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -189,8 +189,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.thisPropX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.findActualTypeByGenericsPlaceholderName;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.makeDeclaringAndActualGenericsTypeMapOfExactType;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.toGenericTypesString;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isBigDecCategory;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isBigIntCategory;
@@ -552,7 +550,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         final Variable accessedVariable = vexp.getAccessedVariable();
         final TypeCheckingContext.EnclosingClosure enclosingClosure = typeCheckingContext.getEnclosingClosure();
 
-        VariableExpression localVariableExpression = null;
+        if (accessedVariable == null) {
+            return;
+        }
+
         if (accessedVariable instanceof DynamicVariable) {
             // a dynamic variable is either a closure property, a class member referenced from a closure, or an undeclared variable
 
@@ -601,15 +602,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                 if (inferredType != null && !inferredType.equals(OBJECT_TYPE)) {
                     vexp.putNodeMetaData(INFERRED_RETURN_TYPE, inferredType);
                 } else {
-                    // GROOVY-7691
-                    FieldNode fieldNode = (FieldNode) accessedVariable;
-                    ClassNode fieldType = findActualTypeByGenericsPlaceholderName(
-                            fieldNode.getOriginType().getUnresolvedName(),
-                            makeDeclaringAndActualGenericsTypeMapOfExactType(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode())
-                    );
-                    if (fieldType != null) {
-                        storeType(vexp, fieldType);
-                    }
+                    storeType(vexp, getType(vexp));
                 }
             }
         } else if (accessedVariable instanceof PropertyNode) {
@@ -623,25 +616,21 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                     SetterInfo setterInfo = removeSetterInfo(leftExpression);
                     if (setterInfo != null) {
                         Expression rightExpression = enclosingBinaryExpression.getRightExpression();
-                        if (!ensureValidSetter(vexp, leftExpression, rightExpression, setterInfo)) {
-                            return;
-                        }
+                        ensureValidSetter(vexp, leftExpression, rightExpression, setterInfo);
                     }
                 }
             }
-        } else if (accessedVariable instanceof Parameter) {
-            if (enclosingClosure == null) {
-                localVariableExpression = new ParameterVariableExpression((Parameter) accessedVariable);
-            }
-        } else if (accessedVariable instanceof VariableExpression) {
-            if (enclosingClosure == null) {
-                localVariableExpression = (VariableExpression) accessedVariable;
+        } else if (enclosingClosure == null) {
+            VariableExpression localVariable;
+            if (accessedVariable instanceof Parameter) {
+                Parameter parameter = (Parameter) accessedVariable;
+                localVariable = new ParameterVariableExpression(parameter);
+            } else {
+                localVariable = vexp;
             }
-        }
 
-        if (localVariableExpression != null) {
-            ClassNode inferredType = localVariableExpression.getNodeMetaData(INFERRED_TYPE);
-            inferredType = getInferredTypeFromTempInfo(localVariableExpression, inferredType);
+            ClassNode inferredType = localVariable.getNodeMetaData(INFERRED_TYPE);
+            inferredType = getInferredTypeFromTempInfo(localVariable, inferredType);
             if (inferredType != null && !inferredType.equals(OBJECT_TYPE)) {
                 vexp.putNodeMetaData(INFERRED_RETURN_TYPE, inferredType);
             }
diff --git a/subprojects/groovy-typecheckers/src/test/groovy/groovy/typecheckers/RegexCheckerTest.groovy b/subprojects/groovy-typecheckers/src/test/groovy/groovy/typecheckers/RegexCheckerTest.groovy
index 138b1bd..ec2c66f 100644
--- a/subprojects/groovy-typecheckers/src/test/groovy/groovy/typecheckers/RegexCheckerTest.groovy
+++ b/subprojects/groovy-typecheckers/src/test/groovy/groovy/typecheckers/RegexCheckerTest.groovy
@@ -18,27 +18,25 @@
  */
 package groovy.typecheckers
 
-import groovy.transform.TypeChecked
 import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
-import org.codehaus.groovy.control.customizers.ImportCustomizer
+import org.codehaus.groovy.control.customizers.*
 import org.junit.BeforeClass
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
 import static groovy.test.GroovyAssert.shouldFail
 
-class RegexCheckerTest {
+final class RegexCheckerTest {
+
     private static GroovyShell shell
 
     @BeforeClass
-    static void setup() {
-        def cc = new CompilerConfiguration()
-        def customizer = new ASTTransformationCustomizer(TypeChecked)
-        customizer.annotationParameters = [extensions: 'groovy.typecheckers.RegexChecker']
-        cc.addCompilationCustomizers(customizer)
-        cc.addCompilationCustomizers(new ImportCustomizer().addStarImports("java.util.regex"))
-        shell = new GroovyShell(cc)
+    static void setUp() {
+        shell = new GroovyShell(new CompilerConfiguration().tap {
+            def customizer = new ASTTransformationCustomizer(groovy.transform.TypeChecked)
+            customizer.annotationParameters = [extensions: 'groovy.typecheckers.RegexChecker']
+            addCompilationCustomizers(customizer, new ImportCustomizer().addStarImports('java.util.regex'))
+        })
     }
 
     @Test
@@ -244,34 +242,34 @@ class RegexCheckerTest {
 
     @Test
     void testBadRegexGroupCount() {
-        shouldFailWithBadGroupCount'''
-        def m = 'foobaz' =~ /(...)(...)/
-        assert m.find()
-        assert m.group(3)
+        def shouldFailWithBadGroupCount = { String script ->
+            def err = shouldFail(shell, script)
+            assert err =~ /No group 3|Invalid group count 3 for regex with 2 groups/
+        }
+
+        shouldFailWithBadGroupCount '''
+            def m = 'foobaz' =~ /(...)(...)/
+            assert m.find()
+            assert m.group(3)
         '''
-        shouldFailWithBadGroupCount'''
-        def p = ~'(...)(...)'
-        Matcher m = p.matcher('barfoo')
-        assert m.find()
-        assert m.group(3)
+        shouldFailWithBadGroupCount '''
+            def p = ~'(...)(...)'
+            Matcher m = p.matcher('barfoo')
+            assert m.find()
+            assert m.group(3)
         '''
-        shouldFailWithBadGroupCount'''
-        Pattern p = Pattern.compile('(...)(...)')
-        Matcher m = p.matcher('foobar')
-        assert m.find()
-        assert m.group(3)
+        shouldFailWithBadGroupCount '''
+            Pattern p = Pattern.compile('(...)(...)')
+            Matcher m = p.matcher('foobar')
+            assert m.find()
+            assert m.group(3)
         '''
-        shouldFailWithBadGroupCount'''
-        def m = 'barbaz' =~ /(...)(...)/
-        assert m[0][3]
+        shouldFailWithBadGroupCount '''
+            def m = 'barbaz' =~ /(...)(...)/
+            assert m[0][3]
         '''
     }
 
-    private void shouldFailWithBadGroupCount(String script) {
-        def err = shouldFail(shell, script)
-        assert err.message.contains(/Invalid group count 3 for regex with 2 groups/)
-    }
-
     @Test
     void testGoodRegexGroupCount() {
         assertScript shell, '''