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 2022/04/14 03:17:56 UTC

[groovy] branch GROOVY_4_0_X updated (fab723c705 -> 246f11fbee)

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

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


    from fab723c705 GROOVY-10579: SC: write array component type for optimized for-each loop
     new 3628bf1593 minor refactor
     new 568d821b30 GROOVY-10561: @NamedVariant self referential default values are not correctly resolved
     new a9b55e58e7 remove Xlint warning
     new 324a8e6558 remove Xlint warning
     new dc63ea3531 remove deprecation warnings warning
     new 0da505f11c remove "obsolete options" warning
     new 37bc929296 remove deprecation/style warnings
     new 4a9f3e20cf remove unchecked/style warnings
     new 246f11fbee GROOVY-10580: Conditionally initialized `final` variables considered maybe uninitialized

The 9 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:
 build.gradle                                       |   4 +-
 src/main/java/groovy/lang/GroovyShell.java         |   4 +-
 .../java/groovy/util/FactoryBuilderSupport.java    |   7 +-
 src/main/java/groovy/util/ObjectGraphBuilder.java  |   8 +-
 .../groovy/classgen/FinalVariableAnalyzer.java     |   8 +-
 .../org/codehaus/groovy/classgen/Verifier.java     |   5 +-
 .../org/codehaus/groovy/runtime/InvokerHelper.java |   8 +-
 .../transform/NamedVariantASTTransformation.java   |  40 +++++++-
 .../TupleConstructorASTTransformation.java         |   5 +-
 .../classgen/FinalVariableAnalyzerTest.groovy      |  28 ++++++
 .../transform/NamedVariantTransformTest.groovy     |  27 ++++++
 .../groovy/console/ui/ConsoleTextEditor.java       |  30 +++---
 .../groovy/groovy/console/ui/text/TextEditor.java  |  20 ++--
 .../ast/visitor/AnnotationProcessorVisitor.java    | 106 ++++++++++-----------
 .../src/test/java/groovy/text/TemplateTest.java    |   2 +-
 .../java/groovy/text/XmlTemplateEngineTest.java    |   6 +-
 .../src/main/java/groovy/test/GroovyTestSuite.java |   5 +-
 17 files changed, 209 insertions(+), 104 deletions(-)


[groovy] 08/09: remove unchecked/style warnings

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

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

commit 4a9f3e20cfe059dc29c4793a0230216b6b0b313b
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 14 12:28:30 2022 +1000

    remove unchecked/style warnings
---
 .../ast/visitor/AnnotationProcessorVisitor.java    | 106 ++++++++++-----------
 1 file changed, 52 insertions(+), 54 deletions(-)

diff --git a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ast/visitor/AnnotationProcessorVisitor.java b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ast/visitor/AnnotationProcessorVisitor.java
index cba9df3a61..b09df6191c 100644
--- a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ast/visitor/AnnotationProcessorVisitor.java
+++ b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ast/visitor/AnnotationProcessorVisitor.java
@@ -60,6 +60,7 @@ import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveVoid;
  */
 public class AnnotationProcessorVisitor extends BaseVisitor {
 
+    private static final String DO_CALL = "doCall";
     private ProcessingContextInformation pci;
 
     public AnnotationProcessorVisitor(final SourceUnit sourceUnit, final ReaderSource source, final ProcessingContextInformation pci) {
@@ -73,7 +74,7 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
     public void visitClass(ClassNode type) {
         handleClassNode(type);
 
-        List<MethodNode> methodNodes = new ArrayList<MethodNode>();
+        List<MethodNode> methodNodes = new ArrayList<>();
         methodNodes.addAll(type.getMethods());
         methodNodes.addAll(type.getDeclaredConstructors());
 
@@ -81,7 +82,7 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
             if (!CandidateChecks.isClassInvariantCandidate(type, methodNode) && !CandidateChecks.isPreOrPostconditionCandidate(type, methodNode))
                 continue;
 
-            handleMethodNode(methodNode, AnnotationUtils.hasMetaAnnotations(methodNode, ContractElement.class.getName()));
+            handleMethodAnnotations(methodNode, AnnotationUtils.hasMetaAnnotations(methodNode, ContractElement.class.getName()));
         }
 
         // visit all interfaces of this class
@@ -94,7 +95,7 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
         if (!Modifier.isAbstract(superClass.getModifiers())) return;
 
         for (ClassNode interfaceClassNode : superClass.getInterfaces()) {
-            List<MethodNode> methodNodes = new ArrayList<MethodNode>(interfaceClassNode.getMethods());
+            List<MethodNode> methodNodes = new ArrayList<>(interfaceClassNode.getMethods());
 
             for (MethodNode interfaceMethodNode : methodNodes) {
                 final List<AnnotationNode> annotationNodes = AnnotationUtils.hasMetaAnnotations(interfaceMethodNode, ContractElement.class.getName());
@@ -109,14 +110,14 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
                 MethodNode implementationInOriginClassNode = origin.getMethod(interfaceMethodNode.getName(), interfaceMethodNode.getParameters());
                 if (implementationInOriginClassNode == null) continue;
 
-                handleMethodNode(implementationInOriginClassNode, annotationNodes);
+                handleMethodAnnotations(implementationInOriginClassNode, annotationNodes);
             }
         }
     }
 
     private void visitInterfaces(final ClassNode classNode, final ClassNode[] interfaces) {
         for (ClassNode interfaceClassNode : interfaces) {
-            List<MethodNode> methodNodes = new ArrayList<MethodNode>(interfaceClassNode.getMethods());
+            List<MethodNode> methodNodes = new ArrayList<>(interfaceClassNode.getMethods());
 
             // @ContractElement annotations are by now only supported on method interfaces
             for (MethodNode interfaceMethodNode : methodNodes) {
@@ -142,9 +143,9 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
 
                 MethodCallExpression doCall = callX(
                         ctorX(closureClassExpression.getType(), args(VariableExpression.THIS_EXPRESSION, VariableExpression.THIS_EXPRESSION)),
-                        "doCall"
+                        DO_CALL
                 );
-                doCall.setMethodTarget(closureClassExpression.getType().getMethods("doCall").get(0));
+                doCall.setMethodTarget(closureClassExpression.getType().getMethods(DO_CALL).get(0));
 
                 final BooleanExpression booleanExpression = boolX(doCall);
                 booleanExpression.setSourcePosition(annotationNode);
@@ -155,57 +156,59 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
     }
 
     private void handleInterfaceMethodNode(ClassNode type, MethodNode methodNode, List<AnnotationNode> annotationNodes) {
-        handleMethodNode(type.getMethod(methodNode.getName(), methodNode.getParameters()), annotationNodes);
+        handleMethodAnnotations(type.getMethod(methodNode.getName(), methodNode.getParameters()), annotationNodes);
     }
 
-    private void handleMethodNode(MethodNode methodNode, List<AnnotationNode> annotationNodes) {
+    private void handleMethodAnnotations(MethodNode methodNode, List<AnnotationNode> annotationNodes) {
         if (methodNode == null) return;
-
         for (AnnotationNode annotationNode : annotationNodes) {
             final AnnotationProcessor annotationProcessor = createAnnotationProcessor(annotationNode);
-
             if (annotationProcessor != null && annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME) instanceof ClassExpression) {
-                boolean isPostcondition = AnnotationUtils.hasAnnotationOfType(annotationNode.getClassNode(), org.apache.groovy.contracts.annotations.meta.Postcondition.class.getName());
+                handleMethodAnnotation(methodNode, annotationNode, annotationProcessor);
+            }
+        }
+    }
 
-                ClassExpression closureClassExpression = (ClassExpression) annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME);
+    private void handleMethodAnnotation(MethodNode methodNode, AnnotationNode annotationNode, AnnotationProcessor annotationProcessor) {
+        boolean isPostcondition = AnnotationUtils.hasAnnotationOfType(annotationNode.getClassNode(), org.apache.groovy.contracts.annotations.meta.Postcondition.class.getName());
 
-                ArgumentListExpression closureArgumentList = new ArgumentListExpression();
+        ClassExpression closureClassExpression = (ClassExpression) annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME);
 
-                for (Parameter parameter : methodNode.getParameters()) {
-                    closureArgumentList.addExpression(varX(parameter));
-                }
+        ArgumentListExpression closureArgumentList = new ArgumentListExpression();
 
-                if (!isPrimitiveVoid(methodNode.getReturnType()) && isPostcondition && !(methodNode instanceof ConstructorNode)) {
-                    closureArgumentList.addExpression(localVarX("result", methodNode.getReturnType()));
-                }
+        for (Parameter parameter : methodNode.getParameters()) {
+            closureArgumentList.addExpression(varX(parameter));
+        }
 
-                if (isPostcondition && !(methodNode instanceof ConstructorNode)) {
-                    closureArgumentList.addExpression(localVarX("old", new ClassNode(Map.class)));
-                }
+        if (!isPrimitiveVoid(methodNode.getReturnType()) && isPostcondition && !(methodNode instanceof ConstructorNode)) {
+            closureArgumentList.addExpression(localVarX("result", methodNode.getReturnType()));
+        }
 
-                MethodCallExpression doCall = callX(
-                        ctorX(annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME).getType(), args(VariableExpression.THIS_EXPRESSION, VariableExpression.THIS_EXPRESSION)),
-                        "doCall",
-                        closureArgumentList
-                );
-                ClassNode type = annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME).getType();
-                doCall.setMethodTarget(type.getMethods("doCall").get(0));
+        if (isPostcondition && !(methodNode instanceof ConstructorNode)) {
+            closureArgumentList.addExpression(localVarX("old", new ClassNode(Map.class)));
+        }
 
-                final BooleanExpression booleanExpression = boolX(doCall);
-                booleanExpression.setSourcePosition(annotationNode);
+        MethodCallExpression doCall = callX(
+                ctorX(annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME).getType(), args(VariableExpression.THIS_EXPRESSION, VariableExpression.THIS_EXPRESSION)),
+                DO_CALL,
+                closureArgumentList
+        );
+        ClassNode type = annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME).getType();
+        doCall.setMethodTarget(type.getMethods(DO_CALL).get(0));
 
-                annotationProcessor.process(pci, pci.contract(), methodNode.getDeclaringClass(), methodNode, closureClassExpression.getNodeMetaData(AnnotationClosureVisitor.META_DATA_ORIGINAL_TRY_CATCH_BLOCK), booleanExpression);
+        final BooleanExpression booleanExpression = boolX(doCall);
+        booleanExpression.setSourcePosition(annotationNode);
 
-                // if the implementation method has no annotation, we need to set a dummy marker in order to find parent pre/postconditions
-                if (!AnnotationUtils.hasAnnotationOfType(methodNode, annotationNode.getClassNode().getName())) {
-                    AnnotationNode annotationMarker = new AnnotationNode(annotationNode.getClassNode());
-                    annotationMarker.setMember(CLOSURE_ATTRIBUTE_NAME, annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME));
-                    annotationMarker.setRuntimeRetention(true);
-                    annotationMarker.setSourceRetention(false);
+        annotationProcessor.process(pci, pci.contract(), methodNode.getDeclaringClass(), methodNode, closureClassExpression.getNodeMetaData(AnnotationClosureVisitor.META_DATA_ORIGINAL_TRY_CATCH_BLOCK), booleanExpression);
 
-                    methodNode.addAnnotation(annotationMarker);
-                }
-            }
+        // if the implementation method has no annotation, we need to set a dummy marker in order to find parent pre/postconditions
+        if (!AnnotationUtils.hasAnnotationOfType(methodNode, annotationNode.getClassNode().getName())) {
+            AnnotationNode annotationMarker = new AnnotationNode(annotationNode.getClassNode());
+            annotationMarker.setMember(CLOSURE_ATTRIBUTE_NAME, annotationNode.getMember(CLOSURE_ATTRIBUTE_NAME));
+            annotationMarker.setRuntimeRetention(true);
+            annotationMarker.setSourceRetention(false);
+
+            methodNode.addAnnotation(annotationMarker);
         }
     }
 
@@ -214,7 +217,7 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
 
         List<AnnotationNode> annotations = annotationNode.getClassNode().redirect().getAnnotations();
         for (AnnotationNode anno : annotations) {
-            Class typeClass = anno.getClassNode().getTypeClass();
+            Class<?> typeClass = anno.getClassNode().getTypeClass();
 
             if (typeClass.getName().equals("org.apache.groovy.contracts.annotations.meta.AnnotationProcessorImplementation")) {
                 annotationProcessingAnno = (ClassExpression) anno.getMember("value");
@@ -222,17 +225,12 @@ public class AnnotationProcessorVisitor extends BaseVisitor {
             }
         }
 
-        if (annotationProcessingAnno == null)
-            throw new GroovyBugError("Annotation processing class could not be found! This indicates a bug in groovy-contracts, please file an issue!");
-
-        try {
-            final Class clz = Class.forName(annotationProcessingAnno.getType().getTypeClass().getName());
-            return (AnnotationProcessor) clz.getDeclaredConstructor().newInstance();
-        } catch (InstantiationException e) {
-        } catch (IllegalAccessException e) {
-        } catch (ClassNotFoundException e) {
-        } catch (NoSuchMethodException e) {
-        } catch (InvocationTargetException e) {
+        if (annotationProcessingAnno != null) {
+            try {
+                final Class<?> clz = Class.forName(annotationProcessingAnno.getType().getTypeClass().getName());
+                return (AnnotationProcessor) clz.getDeclaredConstructor().newInstance();
+            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException ignore) {
+            }
         }
 
         throw new GroovyBugError("Annotation processing class could not be instantiated! This indicates a bug in groovy-contracts, please file an issue!");


[groovy] 06/09: remove "obsolete options" warning

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

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

commit 0da505f11cdd45e7366a5dfa1ef86a556f9338ee
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 14 10:01:46 2022 +1000

    remove "obsolete options" warning
---
 build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/build.gradle b/build.gradle
index 537e76a07b..18246e15f2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -213,8 +213,8 @@ def compileTestExtensionModule = tasks.register("compileTestExtensionModule", Ja
     classpath = files(tasks.named('jar'))
     source fileTree(extModuleFixtureDir.dir("src/main/java"))
     destinationDirectory = extModuleOutputDir.map  { it.dir("classes") }
-    sourceCompatibility = 1.7
-    targetCompatibility = 1.7
+    sourceCompatibility = 1.8
+    targetCompatibility = 1.8
 }
 
 def testExtensionModuleJar = tasks.register("testExtensionModuleJar", Jar) {


[groovy] 09/09: GROOVY-10580: Conditionally initialized `final` variables considered maybe uninitialized

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

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

commit 246f11fbee3c952b6feff3de1ff4b52594213d16
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 13 13:17:34 2022 +1000

    GROOVY-10580: Conditionally initialized `final` variables considered maybe uninitialized
---
 .../groovy/classgen/FinalVariableAnalyzer.java     |  8 ++++++-
 .../classgen/FinalVariableAnalyzerTest.groovy      | 28 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/FinalVariableAnalyzer.java b/src/main/java/org/codehaus/groovy/classgen/FinalVariableAnalyzer.java
index a2d799c1b0..907182ebea 100644
--- a/src/main/java/org/codehaus/groovy/classgen/FinalVariableAnalyzer.java
+++ b/src/main/java/org/codehaus/groovy/classgen/FinalVariableAnalyzer.java
@@ -290,13 +290,19 @@ public class FinalVariableAnalyzer extends ClassCodeVisitorSupport {
         allVars.addAll(curState.keySet());
         allVars.addAll(ifState.keySet());
         allVars.addAll(elseState.keySet());
+        boolean ifReturning = returningBlock(ifElse.getIfBlock());
+        boolean elseReturning = returningBlock(ifElse.getElseBlock());
         for (Variable var : allVars) {
             VariableState beforeValue = curState.get(var);
             if (beforeValue != null) {
                 VariableState ifValue = ifState.get(var);
                 VariableState elseValue = elseState.get(var);
-                if (ifValue == elseValue) {
+                if (ifValue == elseValue || (elseReturning && !ifReturning)) {
                     curState.put(var, ifValue);
+                } else if (ifReturning && !elseReturning) {
+                    curState.put(var, elseValue);
+                } else if (ifReturning) {
+                    curState.put(var, beforeValue);
                 } else {
                     curState.put(var, beforeValue == VariableState.is_uninitialized ? VariableState.is_ambiguous : VariableState.is_var);
                 }
diff --git a/src/test/org/codehaus/groovy/classgen/FinalVariableAnalyzerTest.groovy b/src/test/org/codehaus/groovy/classgen/FinalVariableAnalyzerTest.groovy
index 5e136db1c8..0142721fcd 100644
--- a/src/test/org/codehaus/groovy/classgen/FinalVariableAnalyzerTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/FinalVariableAnalyzerTest.groovy
@@ -534,6 +534,34 @@ class FinalVariableAnalyzerTest extends GroovyTestCase {
         '''
     }
 
+    // GROOVY-10580
+    void testFinalVarIfElseStatementReturningBranch() {
+        assertScript '''
+            final int i
+            final boolean a = true
+            if (a) {
+                i = 1
+            } else {
+                throw new IllegalStateException('a is false')
+            }
+            def result = i
+            assert result == 1
+
+            def evalJ() {
+                final int j
+                final boolean b = true
+                if (!b) {
+                    return null
+                } else {
+                    j = 2
+                }
+                def result = j
+                return result
+            }
+            assert evalJ() == 2
+        '''
+    }
+
     @CompileStatic
     private static class AssertionFinalVariableAnalyzer extends FinalVariableAnalyzer {
 


[groovy] 01/09: minor refactor

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

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

commit 3628bf1593a4f33d3cd3d85b78cb5d0acf1d619e
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Apr 11 18:08:33 2022 +1000

    minor refactor
---
 src/main/java/org/codehaus/groovy/classgen/Verifier.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index 6eed40febc..99f52fbc2a 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -992,6 +992,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
         List<ConstructorNode> constructors = new ArrayList<>(type.getDeclaredConstructors());
         addDefaultParameters(constructors, (arguments, params, method) -> {
             // GROOVY-9151: check for references to parameters that have been removed
+            List<Parameter> paramList = Arrays.asList(params);
             for (ListIterator<Expression> it = arguments.getExpressions().listIterator(); it.hasNext(); ) {
                 Expression argument = it.next();
                 if (argument instanceof CastExpression) {
@@ -1001,7 +1002,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
                     VariableExpression v = (VariableExpression) argument;
                     if (v.getAccessedVariable() instanceof Parameter) {
                         Parameter p = (Parameter) v.getAccessedVariable();
-                        if (p.hasInitialExpression() && !Arrays.asList(params).contains(p)
+                        if (p.hasInitialExpression() && !paramList.contains(p)
                                 && p.getInitialExpression() instanceof ConstantExpression) {
                             // replace argument "(Type) param" with "(Type) <param's default>" for simple default value
                             it.set(castX(method.getParameters()[it.nextIndex() - 1].getType(), p.getInitialExpression()));
@@ -1014,7 +1015,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
                 public void visitVariableExpression(final VariableExpression e) {
                     if (e.getAccessedVariable() instanceof Parameter) {
                         Parameter p = (Parameter) e.getAccessedVariable();
-                        if (p.hasInitialExpression() && !Arrays.asList(params).contains(p)) {
+                        if (p.hasInitialExpression() && !paramList.contains(p)) {
                             String error = String.format(
                                     "The generated constructor \"%s(%s)\" references parameter '%s' which has been replaced by a default value expression.",
                                     type.getNameWithoutPackage(),


[groovy] 04/09: remove Xlint warning

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

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

commit 324a8e6558b1ebd44ce7e1bb5963e81f12e9d2d4
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 13 16:17:11 2022 +1000

    remove Xlint warning
---
 .../groovy-templates/src/test/java/groovy/text/TemplateTest.java    | 2 +-
 .../src/test/java/groovy/text/XmlTemplateEngineTest.java            | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/subprojects/groovy-templates/src/test/java/groovy/text/TemplateTest.java b/subprojects/groovy-templates/src/test/java/groovy/text/TemplateTest.java
index b4938d6345..736f66e8d5 100644
--- a/subprojects/groovy-templates/src/test/java/groovy/text/TemplateTest.java
+++ b/subprojects/groovy-templates/src/test/java/groovy/text/TemplateTest.java
@@ -37,7 +37,7 @@ public class TemplateTest extends TestCase {
     }
 
     public void testBinding() throws CompilationFailedException, ClassNotFoundException, IOException {
-        Map binding = new HashMap();
+        Map<String, String> binding = new HashMap<>();
         binding.put("sam", "pullara");
 
         Template template1 = new SimpleTemplateEngine().createTemplate("<%= sam %><% print sam %>");
diff --git a/subprojects/groovy-templates/src/test/java/groovy/text/XmlTemplateEngineTest.java b/subprojects/groovy-templates/src/test/java/groovy/text/XmlTemplateEngineTest.java
index 39eb607e28..2a1746dcd6 100644
--- a/subprojects/groovy-templates/src/test/java/groovy/text/XmlTemplateEngineTest.java
+++ b/subprojects/groovy-templates/src/test/java/groovy/text/XmlTemplateEngineTest.java
@@ -26,7 +26,7 @@ import java.util.Map;
 public class XmlTemplateEngineTest extends TestCase {
 
     public void testBinding() throws Exception {
-        Map binding = new HashMap();
+        Map<String, String> binding = new HashMap();
         binding.put("Christian", "Stein");
 
         XmlTemplateEngine xmlTemplateEngine = new XmlTemplateEngine();
@@ -46,7 +46,7 @@ public class XmlTemplateEngineTest extends TestCase {
     }
 
     public void testQuotes() throws Exception {
-        Map binding = new HashMap();
+        Map<String, String> binding = new HashMap();
         binding.put("Christian", "Stein");
 
         XmlTemplateEngine xmlTemplateEngine = new XmlTemplateEngine();
@@ -66,7 +66,7 @@ public class XmlTemplateEngineTest extends TestCase {
     }
 
     public void testNamespaces() throws Exception {
-        Map binding = new HashMap();
+        Map<String, String> binding = new HashMap();
         binding.put("Christian", "Stein");
 
         XmlTemplateEngine xmlTemplateEngine = new XmlTemplateEngine();


[groovy] 03/09: remove Xlint warning

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

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

commit a9b55e58e772913077e512f00c89b860edadb772
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 13 16:12:54 2022 +1000

    remove Xlint warning
---
 .../groovy-test/src/main/java/groovy/test/GroovyTestSuite.java       | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/subprojects/groovy-test/src/main/java/groovy/test/GroovyTestSuite.java b/subprojects/groovy-test/src/main/java/groovy/test/GroovyTestSuite.java
index 1d3921b4bc..914b9f2f2f 100644
--- a/subprojects/groovy-test/src/main/java/groovy/test/GroovyTestSuite.java
+++ b/subprojects/groovy-test/src/main/java/groovy/test/GroovyTestSuite.java
@@ -21,6 +21,7 @@ package groovy.test;
 import groovy.lang.GroovyClassLoader;
 import groovy.lang.Script;
 import junit.framework.Test;
+import junit.framework.TestCase;
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
 import org.apache.groovy.test.ScriptTestAdapter;
@@ -77,7 +78,7 @@ public class GroovyTestSuite extends TestSuite {
             throw new RuntimeException("No filename given in the 'test' system property so cannot run a Groovy unit test");
         }
         System.out.println("Compiling: " + fileName);
-        Class type = compile(fileName);
+        Class<? extends TestCase> type = compile(fileName);
         String[] args = {};
         if (!Test.class.isAssignableFrom(type) && Script.class.isAssignableFrom(type)) {
             // let's treat the script as a Test
@@ -87,7 +88,7 @@ public class GroovyTestSuite extends TestSuite {
         }
     }
 
-    public Class compile(String fileName) throws Exception {
+    public Class<? extends TestCase> compile(String fileName) throws Exception {
         return loader.parseClass(new File(fileName));
     }
 }


[groovy] 02/09: GROOVY-10561: @NamedVariant self referential default values are not correctly resolved

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

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

commit 568d821b3054649790abe8383480d42ab478422d
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Mar 31 23:38:16 2022 +1000

    GROOVY-10561: @NamedVariant self referential default values are not correctly resolved
---
 .../transform/NamedVariantASTTransformation.java   | 40 +++++++++++++++++++---
 .../TupleConstructorASTTransformation.java         |  5 ++-
 .../transform/NamedVariantTransformTest.groovy     | 27 +++++++++++++++
 3 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
index ad2c1403fe..0af31ef7ae 100644
--- a/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/NamedVariantASTTransformation.java
@@ -29,9 +29,13 @@ import org.codehaus.groovy.ast.ConstructorNode;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.PropertyNode;
+import org.codehaus.groovy.ast.Variable;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
+import org.codehaus.groovy.ast.expr.CastExpression;
+import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
+import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.AssertStatement;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.codehaus.groovy.ast.stmt.ForStatement;
@@ -40,8 +44,10 @@ import org.codehaus.groovy.control.CompilePhase;
 import org.codehaus.groovy.control.SourceUnit;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedConstructor;
@@ -121,11 +127,12 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
         if (!annoFound && autoDelegate) { // the first param is the delegate
             processDelegateParam(mNode, mapParam, args, propNames, fromParams[0], coerce);
         } else {
+            Map<Parameter, Expression> seen = new HashMap<>();
             for (Parameter fromParam : fromParams) {
                 if (!annoFound) {
-                    if (!processImplicitNamedParam(this, mNode, mapParam, inner, args, propNames, fromParam, coerce)) return;
+                    if (!processImplicitNamedParam(this, mNode, mapParam, inner, args, propNames, fromParam, coerce, seen)) return;
                 } else if (AnnotatedNodeUtils.hasAnnotation(fromParam, NAMED_PARAM_TYPE)) {
-                    if (!processExplicitNamedParam(mNode, mapParam, inner, args, propNames, fromParam, coerce)) return;
+                    if (!processExplicitNamedParam(mNode, mapParam, inner, args, propNames, fromParam, coerce, seen)) return;
                 } else if (AnnotatedNodeUtils.hasAnnotation(fromParam, NAMED_DELEGATE_TYPE)) {
                     if (!processDelegateParam(mNode, mapParam, args, propNames, fromParam, coerce)) return;
                 } else {
@@ -140,7 +147,12 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
         createMapVariant(this, mNode, anno, mapParam, genParams, cNode, inner, args, propNames);
     }
 
+    // for backwards compatibility
     static boolean processImplicitNamedParam(final ErrorCollecting xform, final MethodNode mNode, final Parameter mapParam, final BlockStatement inner, final ArgumentListExpression args, final List<String> propNames, final Parameter fromParam, final boolean coerce) {
+        return processImplicitNamedParam(xform, mNode, mapParam, inner, args, propNames, fromParam, coerce, null);
+    }
+
+    static boolean processImplicitNamedParam(final ErrorCollecting xform, final MethodNode mNode, final Parameter mapParam, final BlockStatement inner, final ArgumentListExpression args, final List<String> propNames, final Parameter fromParam, final boolean coerce, Map<Parameter, Expression> seen) {
         String name = fromParam.getName();
         ClassNode type = fromParam.getType();
         boolean required = !fromParam.hasInitialExpression();
@@ -156,11 +168,26 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
             inner.addStatement(new AssertStatement(boolX(containsKey(mapParam, name)),
                     plusX(constX("Missing required named argument '" + name + "'. Keys found: "), callX(varX(mapParam), "keySet"))));
         }
-        args.addExpression(namedParamValue(mapParam, name, type, coerce, fromParam.getInitialExpression()));
+        Expression defValue = earlierParamIfSeen(seen, fromParam.getInitialExpression());
+        Expression initExpr = namedParamValue(mapParam, name, type, coerce, defValue);
+        if (seen != null) {
+            seen.put(fromParam, initExpr);
+        }
+        args.addExpression(initExpr);
         return true;
     }
 
-    private boolean processExplicitNamedParam(final MethodNode mNode, final Parameter mapParam, final BlockStatement inner, final ArgumentListExpression args, final List<String> propNames, final Parameter fromParam, final boolean coerce) {
+    private static Expression earlierParamIfSeen(Map<Parameter, Expression> seen, Expression defValue) {
+        if (seen == null) return defValue;
+        // handle earlier param with or without cast
+        if (defValue instanceof CastExpression) {
+            defValue = ((CastExpression) defValue).getExpression();
+        }
+        return defValue instanceof VariableExpression ?
+            seen.getOrDefault(((VariableExpression) defValue).getAccessedVariable(), defValue) : defValue;
+    }
+
+    private boolean processExplicitNamedParam(final MethodNode mNode, final Parameter mapParam, final BlockStatement inner, final ArgumentListExpression args, final List<String> propNames, final Parameter fromParam, final boolean coerce, Map<Parameter, Expression> seen) {
         AnnotationNode namedParam = fromParam.getAnnotations(NAMED_PARAM_TYPE).get(0);
 
         String name = getMemberStringValue(namedParam, "value");
@@ -187,7 +214,10 @@ public class NamedVariantASTTransformation extends AbstractASTTransformation {
             inner.addStatement(new AssertStatement(boolX(containsKey(mapParam, name)),
                     plusX(constX("Missing required named argument '" + name + "'. Keys found: "), callX(varX(mapParam), "keySet"))));
         }
-        args.addExpression(namedParamValue(mapParam, name, type, coerce, fromParam.getInitialExpression()));
+        Expression defValue = earlierParamIfSeen(seen, fromParam.getInitialExpression());
+        Expression initExpr = namedParamValue(mapParam, name, type, coerce, defValue);
+        seen.put(fromParam, initExpr);
+        args.addExpression(initExpr);
         mapParam.addAnnotation(namedParam);
         fromParam.getAnnotations().remove(namedParam);
         return true;
diff --git a/src/main/java/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java
index 90b610c7fc..6cfd32ba1f 100644
--- a/src/main/java/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java
@@ -54,9 +54,11 @@ import org.codehaus.groovy.control.SourceUnit;
 
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static groovy.transform.DefaultsMode.AUTO;
@@ -277,8 +279,9 @@ public class TupleConstructorASTTransformation extends AbstractASTTransformation
             genParams.add(mapParam);
             ArgumentListExpression args = new ArgumentListExpression();
             List<String> propNames = new ArrayList<>();
+            Map<Parameter, Expression> seen = new HashMap<>();
             for (Parameter p : params) {
-                if (!processImplicitNamedParam(xform, consNode, mapParam, inner, args, propNames, p,false)) return;
+                if (!processImplicitNamedParam(xform, consNode, mapParam, inner, args, propNames, p, false, seen)) return;
             }
             NamedVariantASTTransformation.createMapVariant(xform, consNode, anno, mapParam, genParams, cNode, inner, args, propNames);
         }
diff --git a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
index a98408cf4b..88814c19aa 100644
--- a/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/NamedVariantTransformTest.groovy
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.transform
 
 import groovy.transform.CompileStatic
+import groovy.transform.NamedVariant
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -392,4 +393,30 @@ final class NamedVariantTransformTest {
             assert mapper.settings.firstDataRow == 1
         '''
     }
+
+    @NamedVariant // GROOVY-10561
+    String fileInSourceSet(String language = 'java', String extension = language) {
+        return "$language -> .$extension"
+    }
+
+    @NamedVariant // GROOVY-10561
+    String foo(String a = 'a', String b = a, String c = (String) a) {
+        return "$a $b $c"
+    }
+
+    @Test // GROOVY-10561
+    void testReferenceToEarlierParam() {
+        assert fileInSourceSet() == 'java -> .java'
+        assert fileInSourceSet('groovy') == 'groovy -> .groovy'
+        assert fileInSourceSet(language: 'kotlin', extension: 'kt') == 'kotlin -> .kt'
+        assert fileInSourceSet(language: 'groovy') == 'groovy -> .groovy'
+    }
+
+    @Test // GROOVY-10561
+    void testEarlierParamInExpression() {
+        assert foo() == 'a a a'
+        assert foo('c') == 'c c c'
+        assert foo('c', 'd') == 'c d c'
+        assert foo('c', 'd', 'e') == 'c d e'
+    }
 }


[groovy] 05/09: remove deprecation warnings warning

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

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

commit dc63ea353104b8f626e77479340966099326a40e
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 13 23:09:40 2022 +1000

    remove deprecation warnings warning
---
 src/main/java/groovy/lang/GroovyShell.java                   | 4 ++--
 src/main/java/groovy/util/FactoryBuilderSupport.java         | 7 ++++++-
 src/main/java/groovy/util/ObjectGraphBuilder.java            | 8 +++++++-
 src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java | 8 ++++----
 4 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/main/java/groovy/lang/GroovyShell.java b/src/main/java/groovy/lang/GroovyShell.java
index 2efc40ce92..57fa108c60 100644
--- a/src/main/java/groovy/lang/GroovyShell.java
+++ b/src/main/java/groovy/lang/GroovyShell.java
@@ -257,8 +257,8 @@ public class GroovyShell extends GroovyObjectSupport {
             try {
                 Script script = InvokerHelper.newScript(scriptClass, context);
                 return script.run();
-            } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
-                // ignore instantiation errors,, try to do main
+            } catch (InstantiationException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
+                // ignore instantiation errors, try to do main
             }
         }
         try {
diff --git a/src/main/java/groovy/util/FactoryBuilderSupport.java b/src/main/java/groovy/util/FactoryBuilderSupport.java
index 2c6ad9c7a9..82764bf4ba 100644
--- a/src/main/java/groovy/util/FactoryBuilderSupport.java
+++ b/src/main/java/groovy/util/FactoryBuilderSupport.java
@@ -22,6 +22,7 @@ import groovy.lang.Binding;
 import groovy.lang.Closure;
 import groovy.lang.DelegatingMetaClass;
 import groovy.lang.GroovyClassLoader;
+import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaClass;
 import groovy.lang.MissingMethodException;
 import groovy.lang.MissingPropertyException;
@@ -659,7 +660,11 @@ public abstract class FactoryBuilderSupport extends Binding {
                 if (checkValueIsTypeNotString(value, name, beanClass)) {
                     return value;
                 } else {
-                    return beanClass.newInstance();
+                    try {
+                        return beanClass.getDeclaredConstructor().newInstance();
+                    } catch (NoSuchMethodException | InvocationTargetException e) {
+                        throw new GroovyRuntimeException("Failed to register bean factory", e);
+                    }
                 }
             }
         });
diff --git a/src/main/java/groovy/util/ObjectGraphBuilder.java b/src/main/java/groovy/util/ObjectGraphBuilder.java
index 7cab1c75fe..2e82132265 100644
--- a/src/main/java/groovy/util/ObjectGraphBuilder.java
+++ b/src/main/java/groovy/util/ObjectGraphBuilder.java
@@ -20,10 +20,12 @@ package groovy.util;
 
 import groovy.lang.Closure;
 import groovy.lang.GString;
+import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaProperty;
 import groovy.lang.MissingPropertyException;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -452,7 +454,11 @@ public class ObjectGraphBuilder extends FactoryBuilderSupport {
         @Override
         public Object newInstance(Class klass, Map attributes) throws InstantiationException,
                 IllegalAccessException {
-            return klass.newInstance();
+            try {
+                return klass.getDeclaredConstructor().newInstance();
+            } catch (InvocationTargetException | NoSuchMethodException e) {
+                throw new GroovyRuntimeException("Unable to create instance resolver", e);
+            }
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
index 42c760be89..66926668b3 100644
--- a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
@@ -470,14 +470,14 @@ public class InvokerHelper {
         return script;
     }
 
-    public static Script newScript(Class<?> scriptClass, Binding context) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+    public static Script newScript(Class<? extends Script> scriptClass, Binding context) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
         Script script;
         try {
-            Constructor constructor = scriptClass.getConstructor(Binding.class);
-            script = (Script) constructor.newInstance(context);
+            Constructor<? extends Script> constructor = scriptClass.getConstructor(Binding.class);
+            script = constructor.newInstance(context);
         } catch (NoSuchMethodException e) {
             // Fallback for non-standard "Script" classes.
-            script = (Script) scriptClass.newInstance();
+            script = scriptClass.getDeclaredConstructor().newInstance();
             script.setBinding(context);
         }
         return script;


[groovy] 07/09: remove deprecation/style warnings

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

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

commit 37bc92929616cbbd717fdfd02a435f3fd44cd9a7
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 14 12:01:47 2022 +1000

    remove deprecation/style warnings
---
 .../groovy/console/ui/ConsoleTextEditor.java       | 30 ++++++++++------------
 .../groovy/groovy/console/ui/text/TextEditor.java  | 20 ++++++++-------
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleTextEditor.java b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleTextEditor.java
index 70b5c1c79c..cd31d1bd96 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleTextEditor.java
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleTextEditor.java
@@ -165,10 +165,10 @@ public class ConsoleTextEditor extends JScrollPane {
         });
         textEditor.setFont(new Font(defaultFamily, Font.PLAIN, fontSize));
 
-        setViewportView(new JPanel(new BorderLayout()) {{
-            add(numbersPanel, BorderLayout.WEST);
-            add(textEditor, BorderLayout.CENTER);
-        }});
+        JPanel view = new JPanel(new BorderLayout());
+        view.add(numbersPanel, BorderLayout.WEST);
+        view.add(textEditor, BorderLayout.CENTER);
+        setViewportView(view);
 
         textEditor.setDragEnabled(editable);
 
@@ -211,26 +211,26 @@ public class ConsoleTextEditor extends JScrollPane {
         doc.addDocumentListener(redoAction);
 
         InputMap im = textEditor.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
-        KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK, false);
+        KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK, false);
         im.put(ks, StructuredSyntaxResources.UNDO);
         ActionMap am = textEditor.getActionMap();
         am.put(StructuredSyntaxResources.UNDO, undoAction);
 
-        ks = KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK, false);
+        ks = KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK, false);
         im.put(ks, StructuredSyntaxResources.REDO);
         am.put(StructuredSyntaxResources.REDO, redoAction);
 
-        ks = KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK, false);
+        ks = KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_DOWN_MASK, false);
         im.put(ks, StructuredSyntaxResources.PRINT);
         am.put(StructuredSyntaxResources.PRINT, printAction);
     }
 
     public void setShowLineNumbers(boolean showLineNumbers) {
         if (showLineNumbers) {
-            setViewportView(new JPanel(new BorderLayout()) {{
-                add(numbersPanel, BorderLayout.WEST);
-                add(textEditor, BorderLayout.CENTER);
-            }});
+            JPanel view = new JPanel(new BorderLayout());
+            view.add(numbersPanel, BorderLayout.WEST);
+            view.add(textEditor, BorderLayout.CENTER);
+            setViewportView(view);
         } else {
             setViewportView(textEditor);
         }
@@ -251,9 +251,7 @@ public class ConsoleTextEditor extends JScrollPane {
 
     protected void initActions() {
         ActionMap map = getActionMap();
-
-        PrintAction printAction = new PrintAction();
-        map.put(StructuredSyntaxResources.PRINT, printAction);
+        map.put(StructuredSyntaxResources.PRINT, new PrintAction());
     }
 
     private class PrintAction extends AbstractAction {
@@ -353,11 +351,11 @@ public class ConsoleTextEditor extends JScrollPane {
         return printAction;
     }
 
-    public void enableHighLighter(Class clazz) {
+    public void enableHighLighter(Class<? extends DocumentFilter> clazz) {
         DefaultStyledDocument doc = (DefaultStyledDocument) textEditor.getDocument();
 
         try {
-            DocumentFilter documentFilter = (DocumentFilter) clazz.getConstructor(doc.getClass()).newInstance(doc);
+            DocumentFilter documentFilter = clazz.getConstructor(doc.getClass()).newInstance(doc);
             doc.setDocumentFilter(documentFilter);
 
             disableMatchingHighlighter();
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/text/TextEditor.java b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/text/TextEditor.java
index d2bbdc663b..0e577d9327 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/text/TextEditor.java
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/text/TextEditor.java
@@ -48,6 +48,7 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -70,6 +71,7 @@ public class TextEditor extends JTextPane implements Pageable, Printable {
     public static final String FIND_PREVIOUS = "Find Previous";
     public static final String REPLACE = "Replace...";
     public static final String AUTO_INDENT = "AutoIndent";
+    public static final String DELETE = "delete";
 
     private static final String TABBED_SPACES = "    ";
     private static final Pattern TAB_BACK_PATTERN =
@@ -136,7 +138,7 @@ public class TextEditor extends JTextPane implements Pageable, Printable {
      * Creates a new instance of TextEditor
      */
     public TextEditor(boolean tabsAsSpaces, boolean multiLineTab) {
-        this(multiLineTab, tabsAsSpaces, false);
+        this(tabsAsSpaces, multiLineTab, false);
     }
 
     /**
@@ -159,15 +161,15 @@ public class TextEditor extends JTextPane implements Pageable, Printable {
         aMap = getActionMap();
         InputMap iMap = getInputMap();
         KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0, false);
-        iMap.put(keyStroke, "delete");
-        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, KeyEvent.SHIFT_MASK, false);
-        iMap.put(keyStroke, "delete");
-        aMap.put("delete", action);
+        iMap.put(keyStroke, DELETE);
+        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.SHIFT_DOWN_MASK, false);
+        iMap.put(keyStroke, DELETE);
+        aMap.put(DELETE, action);
 
         // set all the actions
         action = new FindAction();
         aMap.put(FIND, action);
-        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK, false);
+        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK, false);
         iMap.put(keyStroke, FIND);
 
         aMap.put(FIND_NEXT, FindReplaceUtility.FIND_ACTION);
@@ -175,7 +177,7 @@ public class TextEditor extends JTextPane implements Pageable, Printable {
         iMap.put(keyStroke, FIND_NEXT);
 
         aMap.put(FIND_PREVIOUS, FindReplaceUtility.FIND_ACTION);
-        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F3, KeyEvent.SHIFT_MASK, false);
+        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F3, InputEvent.SHIFT_DOWN_MASK, false);
         iMap.put(keyStroke, FIND_PREVIOUS);
 
         action = new TabAction();
@@ -185,12 +187,12 @@ public class TextEditor extends JTextPane implements Pageable, Printable {
 
         action = new ShiftTabAction();
         aMap.put("TextEditor-shiftTabAction", action);
-        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_MASK, false);
+        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK, false);
         iMap.put(keyStroke, "TextEditor-shiftTabAction");
 
         action = new ReplaceAction();
         getActionMap().put(REPLACE, action);
-        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK, false);
+        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_DOWN_MASK, false);
         do {
             iMap.remove(keyStroke);
             iMap = iMap.getParent();