This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push: new 8cbfc36 GROOVY-6851, GROOVY-9151, GROOVY-10104: SC: skip Verifier-generated method nodes 8cbfc36 is described below commit 8cbfc36e596bda62518aef36903221cec5fbf992 Author: Eric Milles <eric.mil...@thomsonreuters.com> AuthorDate: Tue May 25 14:45:10 2021 -0500 GROOVY-6851, GROOVY-9151, GROOVY-10104: SC: skip Verifier-generated method nodes --- .../transform/sc/StaticCompilationVisitor.java | 17 ++++++----- .../transform/stc/StaticTypeCheckingVisitor.java | 20 +------------ src/test/gls/invocation/DefaultParamTest.groovy | 23 +++++++++++++++ .../classgen/asm/sc/BugsStaticCompileTest.groovy | 33 +++++++++------------- 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/transform/sc/StaticCompilationVisitor.java b/src/main/java/org/codehaus/groovy/transform/sc/StaticCompilationVisitor.java index ceda968..da07917 100644 --- a/src/main/java/org/codehaus/groovy/transform/sc/StaticCompilationVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/sc/StaticCompilationVisitor.java @@ -69,6 +69,8 @@ import java.util.Set; import static org.codehaus.groovy.ast.ClassHelper.LIST_TYPE; import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE; import static org.codehaus.groovy.ast.ClassHelper.int_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.isStringType; +import static org.codehaus.groovy.ast.ClassHelper.isWrapperCharacter; import static org.codehaus.groovy.ast.tools.GeneralUtils.args; import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS; import static org.codehaus.groovy.ast.tools.GeneralUtils.attrX; @@ -83,8 +85,7 @@ import static org.codehaus.groovy.ast.tools.GenericsUtils.applyGenericsContextTo import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse; import static org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec; import static org.codehaus.groovy.ast.tools.GenericsUtils.extractSuperClassGenerics; -import static org.codehaus.groovy.ast.ClassHelper.isStringType; -import static org.codehaus.groovy.ast.ClassHelper.isWrapperCharacter; +import static org.codehaus.groovy.classgen.Verifier.DEFAULT_PARAMETER_GENERATED; import static org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys.BINARY_EXP_TARGET; import static org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys.COMPONENT_TYPE; import static org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys.DYNAMIC_OUTER_NODE_CALLBACK; @@ -139,13 +140,15 @@ public class StaticCompilationVisitor extends StaticTypeCheckingVisitor { } public static boolean isStaticallyCompiled(final AnnotatedNode node) { - if (node.getNodeMetaData(STATIC_COMPILE_NODE) != null) { - return (Boolean) node.getNodeMetaData(STATIC_COMPILE_NODE); + if (node != null && node.getNodeMetaData(STATIC_COMPILE_NODE) != null) { + return Boolean.TRUE.equals(node.getNodeMetaData(STATIC_COMPILE_NODE)); } if (node instanceof MethodNode) { - return isStaticallyCompiled(node.getDeclaringClass()); - } - if (node instanceof ClassNode && ((ClassNode) node).getOuterClass() != null) { + // GROOVY-6851, GROOVY-9151, GROOVY-10104 + if (!Boolean.TRUE.equals(node.getNodeMetaData(DEFAULT_PARAMETER_GENERATED))) { + return isStaticallyCompiled(node.getDeclaringClass()); + } + } else if (node instanceof ClassNode) { return isStaticallyCompiled(((ClassNode) node).getOuterClass()); } return false; 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 b48f47f..ca85db6 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -2575,11 +2575,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { // method has already been visited by a static type checking visitor return; } - for (Parameter parameter : node.getParameters()) { - if (parameter.getInitialExpression() != null) { - parameter.getInitialExpression().visit(this); - } - } super.visitConstructor(node); } @@ -2600,27 +2595,14 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { typeCheckingContext.alreadyVisitedMethods.add(node); typeCheckingContext.pushErrorCollector(collector); - boolean osc = typeCheckingContext.isInStaticContext; try { typeCheckingContext.isInStaticContext = node.isStatic(); + super.visitMethod(node); - for (Parameter parameter : node.getParameters()) { - if (parameter.getInitialExpression() != null) { - parameter.getInitialExpression().visit(this); - } - } -/* - ClassNode rtype = getInferredReturnType(node); - if (rtype == null) { - storeInferredReturnType(node, node.getReturnType()); - } - addTypeCheckingInfoAnnotation(node); -*/ } finally { typeCheckingContext.isInStaticContext = osc; } - typeCheckingContext.popErrorCollector(); node.putNodeMetaData(ERROR_COLLECTOR, collector); } diff --git a/src/test/gls/invocation/DefaultParamTest.groovy b/src/test/gls/invocation/DefaultParamTest.groovy index 341e681..1dad4df 100644 --- a/src/test/gls/invocation/DefaultParamTest.groovy +++ b/src/test/gls/invocation/DefaultParamTest.groovy @@ -139,6 +139,29 @@ final class DefaultParamTest extends GroovyTestCase { ''' } + // GROOVY-6851, GROOVY-9151, GROOVY-10104 + void testMethodWithAllParametersDefaultedCS() { + assertScript ''' + @groovy.transform.CompileStatic + String greet(Object o = 'world', String s = o.toString()) { + "hello $s" + } + assert greet() == 'hello world' + ''' + + assertScript ''' + @groovy.transform.CompileStatic + class Main { + static main(args) { + assert new Main().test().isEmpty() + } + Map test(Map<String, Object> m = new HashMap<>(Collections.emptyMap())) { + return m + } + } + ''' + } + // GROOVY-9151 void testConstructorWithAllParametersDefaulted() { assertScript ''' diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/BugsStaticCompileTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/BugsStaticCompileTest.groovy index b8c41d6..0377642 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/BugsStaticCompileTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/BugsStaticCompileTest.groovy @@ -1200,27 +1200,20 @@ assert it.next() == 1G // GROOVY-6851 void testShouldNotThrowNPEIfElvisOperatorIsUsedInDefaultArgumentValue() { - assertScript '''import org.codehaus.groovy.ast.expr.MethodCallExpression - -class GrailsHomeWorkspaceReader { - @ASTTest(phase=INSTRUCTION_SELECTION,value={ - def defaultValue = node.parameters[0].initialExpression - assert defaultValue instanceof MethodCallExpression - def target = defaultValue.getNodeMetaData(DIRECT_METHOD_CALL_TARGET) - assert target != null - }) - GrailsHomeWorkspaceReader(String grailsHome = System.getProperty('grails.home')) { - } -} -new GrailsHomeWorkspaceReader() -''' assertScript ''' -class GrailsHomeWorkspaceReader { - GrailsHomeWorkspaceReader(String grailsHome = System.getProperty('grails.home') ?: System.getenv('GRAILS_HOME')) { - } -} -new GrailsHomeWorkspaceReader() -''' + class GrailsHomeWorkspaceReader { + GrailsHomeWorkspaceReader(String grailsHome = System.getProperty('grails.home')) { + } + } + new GrailsHomeWorkspaceReader() + ''' + assertScript ''' + class GrailsHomeWorkspaceReader { + GrailsHomeWorkspaceReader(String grailsHome = System.getProperty('grails.home') ?: System.getenv('GRAILS_HOME')) { + } + } + new GrailsHomeWorkspaceReader() + ''' } // GROOVY-6342