diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 25196c9..beeaade 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -432,7 +432,7 @@
         controller.getCallSiteWriter().makeSiteEntry();
 
         MethodVisitor mv = controller.getMethodVisitor();
-        final ClassNode superClass = controller.getClassNode().getSuperClass();
+        ClassNode superClass = controller.getClassNode().getSuperClass();
         if (isConstructor && (code == null || !((ConstructorNode) node).firstStatementIsSpecialConstructorCall())) {
             boolean hasCallToSuper = false;
             if (code != null && controller.getClassNode() instanceof InnerClassNode) {
@@ -441,7 +441,7 @@
                 if (code instanceof BlockStatement) {
                     for (Statement statement : ((BlockStatement) code).getStatements()) {
                         if (statement instanceof ExpressionStatement) {
-                            final Expression expression = ((ExpressionStatement) statement).getExpression();
+                            Expression expression = ((ExpressionStatement) statement).getExpression();
                             if (expression instanceof ConstructorCallExpression) {
                                 ConstructorCallExpression call = (ConstructorCallExpression) expression;
                                 if (call.isSuperCall()) {
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
index ac312ab..857c712 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
@@ -18,8 +18,9 @@
  */
 package org.codehaus.groovy.macro.matcher
 
+import groovy.transform.AutoFinal
+import groovy.transform.CompileDynamic
 import groovy.transform.CompileStatic
-import groovy.transform.TypeCheckingMode
 import org.codehaus.groovy.ast.ASTNode
 import org.codehaus.groovy.ast.AnnotatedNode
 import org.codehaus.groovy.ast.AnnotationNode
@@ -32,7 +33,6 @@
 import org.codehaus.groovy.ast.PackageNode
 import org.codehaus.groovy.ast.Parameter
 import org.codehaus.groovy.ast.PropertyNode
-import org.codehaus.groovy.ast.expr.ArgumentListExpression
 import org.codehaus.groovy.ast.expr.ArrayExpression
 import org.codehaus.groovy.ast.expr.AttributeExpression
 import org.codehaus.groovy.ast.expr.BinaryExpression
@@ -46,7 +46,6 @@
 import org.codehaus.groovy.ast.expr.ConstructorCallExpression
 import org.codehaus.groovy.ast.expr.DeclarationExpression
 import org.codehaus.groovy.ast.expr.Expression
-import org.codehaus.groovy.ast.expr.FieldExpression
 import org.codehaus.groovy.ast.expr.GStringExpression
 import org.codehaus.groovy.ast.expr.ListExpression
 import org.codehaus.groovy.ast.expr.MapEntryExpression
@@ -59,8 +58,6 @@
 import org.codehaus.groovy.ast.expr.PropertyExpression
 import org.codehaus.groovy.ast.expr.RangeExpression
 import org.codehaus.groovy.ast.expr.SpreadExpression
-import org.codehaus.groovy.ast.expr.SpreadMapExpression
-import org.codehaus.groovy.ast.expr.StaticMethodCallExpression
 import org.codehaus.groovy.ast.expr.TernaryExpression
 import org.codehaus.groovy.ast.expr.TupleExpression
 import org.codehaus.groovy.ast.expr.UnaryMinusExpression
@@ -72,23 +69,23 @@
 import org.codehaus.groovy.ast.stmt.IfStatement
 import org.codehaus.groovy.ast.stmt.Statement
 import org.codehaus.groovy.ast.stmt.WhileStatement
-import org.codehaus.groovy.classgen.BytecodeExpression
 import org.codehaus.groovy.control.SourceUnit
 import org.codehaus.groovy.macro.matcher.internal.MatchingConstraintsBuilder
 
-@CompileStatic
+@AutoFinal @CompileStatic
 class ASTMatcher extends ContextualClassCodeVisitor {
 
-    public static final String WILDCARD = "_";
+    public static final String WILDCARD = "_"
 
     private Object current = null
     private boolean match = true
 
-    private ASTMatcher() {}
+    private ASTMatcher() {
+    }
 
     @Override
     protected SourceUnit getSourceUnit() {
-        null
+        return null
     }
 
     /**
@@ -98,7 +95,7 @@
      * @param pattern the pattern AST we want to match to
      * @return true if this AST matches the pattern
      */
-    public static boolean matches(ASTNode node, ASTNode pattern) {
+    static boolean matches(ASTNode node, ASTNode pattern) {
         ASTMatcher matcher = new ASTMatcher()
         matcher.current = node
         matcher.match = true
@@ -107,21 +104,21 @@
         } else {
             pattern.visit(matcher)
         }
-
-        matcher.match
+        return matcher.match
     }
 
     private boolean failIfNot(boolean value) {
-        match = match && value
+        match = (match && value)
+        return match
     }
 
     private static boolean matchByName(String patternText, String nodeText) {
-        return nodeText.equals(patternText) || WILDCARD.equals(patternText);
+        return nodeText.equals(patternText) || WILDCARD.equals(patternText)
     }
 
     private static boolean isWildcardExpression(Object exp) {
         return (exp instanceof VariableExpression && WILDCARD.equals(exp.getName())
-            || (exp instanceof ConstantExpression && WILDCARD.equals(exp.getValue())));
+            || (exp instanceof ConstantExpression && WILDCARD.equals(exp.getValue())))
     }
 
     /**
@@ -132,10 +129,9 @@
      * @param pattern a pattern to be found somewhere in the AST
      * @return a list of {@link TreeContext}, always not null.
      */
-    public static List<TreeContext> find(ASTNode node, ASTNode pattern) {
-        ASTFinder finder = new ASTFinder(pattern);
-        node.visit(finder);
-
+    static List<TreeContext> find(ASTNode node, ASTNode pattern) {
+        def finder = new ASTFinder(pattern)
+        node.visit(finder)
         finder.matches
     }
 
@@ -146,7 +142,7 @@
         }
     }
 
-    public <T> T ifConstraint(T defaultValue, @DelegatesTo(MatchingConstraints) Closure<T> code) {
+    def <T> T ifConstraint(T defaultValue, @DelegatesTo(value=MatchingConstraints, strategy=Closure.DELEGATE_FIRST) Closure<T> code) {
         def constraints = (List<MatchingConstraints>) treeContext.getUserdata(MatchingConstraints, true)
         if (constraints) {
             def clone = (Closure<T>) code.clone()
@@ -160,23 +156,23 @@
 
     private String findPlaceholder(Object exp) {
         ifConstraint(null) {
-            if ((exp instanceof VariableExpression && placeholders.contains(exp.name))) {
+            if (exp instanceof VariableExpression && placeholders.contains(exp.name)) {
                 return exp.name
-            } else if ((exp instanceof ConstantExpression && placeholders.contains(exp.value))) {
+            } else if (exp instanceof ConstantExpression && placeholders.contains(exp.value)) {
                 return exp.value
             } else {
-                null
+                return null
             }
         }
     }
 
     private void doWithNode(Object patternNode, Object foundNode, Closure cl) {
-        Class expectedClass = patternNode?patternNode.class:Object
+        Class expectedClass = patternNode ? patternNode.class : Object
         if (expectedClass == null) {
             expectedClass = Object
         }
 
-        boolean doPush = treeContext.node!=foundNode && foundNode instanceof ASTNode
+        boolean doPush = (treeContext.node != foundNode && foundNode instanceof ASTNode)
         if (doPush) {
             pushContext((ASTNode)foundNode)
             if (patternNode instanceof ASTNode) {
@@ -188,12 +184,12 @@
             String placeholder = findPlaceholder(patternNode)
             if (placeholder) {
                 def alreadySeenAST = treeContext.getUserdata("placeholder_$placeholder", true)
-                if (alreadySeenAST==null) {
+                if (alreadySeenAST == null) {
                     treeContext.parent.putUserdata("placeholder_$placeholder", foundNode)
                 } else {
                     // during the tree inspection, placeholder already found
                     // so we need to check that they are identical
-                    failIfNot(matches((ASTNode)alreadySeenAST[0], (ASTNode)foundNode))
+                    failIfNot(matches((ASTNode) alreadySeenAST[0], (ASTNode) foundNode))
                 }
             } else if (match && (foundNode == null || expectedClass.isAssignableFrom(foundNode.class))) {
                 Object old = current
@@ -210,7 +206,7 @@
     }
 
     @Override
-    public void visitClass(final ClassNode node) {
+    void visitClass(ClassNode node) {
         doWithNode(node, current) {
             visitAnnotations(node)
             doWithNode(node.package, ((ClassNode) current).package) {
@@ -227,7 +223,7 @@
             def curIntfs = cur.interfaces
             failIfNot(intfs.length == curIntfs.length)
             if (intfs.length == curIntfs.length) {
-                for (int i = 0; i < intfs.length && match; i++) {
+                for (int i = 0; i < intfs.length && match; i += 1) {
                     failIfNot(intfs[i] == curIntfs[i])
                 }
             }
@@ -281,7 +277,7 @@
     }
 
     @Override
-    protected void visitObjectInitializerStatements(final ClassNode node) {
+    protected void visitObjectInitializerStatements(ClassNode node) {
         doWithNode(node, current) {
             def initializers = ((ClassNode) current).objectInitializerStatements
             if (initializers.size() == node.objectInitializerStatements.size()) {
@@ -298,7 +294,7 @@
     }
 
     @Override
-    public void visitPackage(final PackageNode node) {
+    void visitPackage(PackageNode node) {
         if (node) {
             doWithNode(node, current) {
                 visitAnnotations(node)
@@ -308,7 +304,7 @@
     }
 
     @Override
-    public void visitImports(final ModuleNode node) {
+    void visitImports(ModuleNode node) {
         if (node) {
             doWithNode(node, current) {
                 ModuleNode module = (ModuleNode) current
@@ -367,7 +363,7 @@
     }
 
     @Override
-    public void visitAnnotations(final AnnotatedNode node) {
+    void visitAnnotations(AnnotatedNode node) {
         doWithNode(node, current) {
             List<AnnotationNode> refAnnotations = node.annotations
             AnnotatedNode cur = (AnnotatedNode) current
@@ -388,7 +384,7 @@
                     }
                     continue
                 }
-                failIfNot(an.classNode==curNext.classNode)
+                failIfNot(an.classNode == curNext.classNode)
                 def refEntrySet = an.members.entrySet()
                 def curEntrySet = curNext.members.entrySet()
                 if (refEntrySet.size() == curEntrySet.size()) {
@@ -411,7 +407,7 @@
     }
 
     @Override
-    protected void visitClassCodeContainer(final Statement code) {
+    protected void visitClassCodeContainer(Statement code) {
         doWithNode(code, current) {
             if (code) {
                 code.visit(this)
@@ -419,16 +415,15 @@
         }
     }
 
-    @Override
-    @CompileStatic(TypeCheckingMode.SKIP)
-    public void visitDeclarationExpression(final DeclarationExpression expression) {
+    @Override @CompileDynamic
+    void visitDeclarationExpression(DeclarationExpression expression) {
         doWithNode(expression, current) {
             super.visitDeclarationExpression(expression)
         }
     }
 
     @Override
-    protected void visitConstructorOrMethod(final MethodNode node, final boolean isConstructor) {
+    protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor) {
         doWithNode(node, current) {
             visitAnnotations(node)
             def cur = (MethodNode) current
@@ -450,7 +445,7 @@
     }
 
     @Override
-    public void visitField(final FieldNode node) {
+    void visitField(FieldNode node) {
         doWithNode(node, current) {
             visitAnnotations(node)
             def fieldNode = (FieldNode) current
@@ -459,7 +454,6 @@
             failIfNot(fieldNode.modifiers == node.modifiers)
 
             Expression init = node.initialExpression
-
             Expression curInit = fieldNode.initialExpression
             if (init) {
                 if (curInit) {
@@ -476,7 +470,7 @@
     }
 
     @Override
-    public void visitProperty(final PropertyNode node) {
+    void visitProperty(PropertyNode node) {
         doWithNode(node, current) {
             PropertyNode pNode = (PropertyNode) current
             visitAnnotations(node)
@@ -510,7 +504,7 @@
     }
 
     @Override
-    void visitExpressionStatement(final ExpressionStatement statement) {
+    void visitExpressionStatement(ExpressionStatement statement) {
         doWithNode(statement.expression, ((ExpressionStatement) current).expression) {
             visitStatement(statement)
             statement.expression.visit(this)
@@ -518,7 +512,7 @@
     }
 
     @Override
-    public void visitBlockStatement(BlockStatement block) {
+    void visitBlockStatement(BlockStatement block) {
         doWithNode(block, current) {
             def statements = ((BlockStatement) current).statements
             if (statements.size() == block.statements.size()) {
@@ -535,7 +529,7 @@
     }
 
     @Override
-    public void visitMethodCallExpression(final MethodCallExpression call) {
+    void visitMethodCallExpression(MethodCallExpression call) {
         doWithNode(call, current) {
             def mce = (MethodCallExpression) current
             doWithNode(call.objectExpression, mce.objectExpression) {
@@ -547,20 +541,15 @@
             doWithNode(call.arguments, mce.arguments) {
                 call.arguments.visit(this)
             }
-            failIfNot(matchByName(call.methodAsString, mce.methodAsString) &&
-                    (call.safe == mce.safe) &&
-                    (call.spreadSafe == mce.spreadSafe) &&
-                    (call.implicitThis == mce.implicitThis))
+            failIfNot(matchByName(call.methodAsString, mce.methodAsString)
+                    && call.safe == mce.safe
+                    && call.spreadSafe == mce.spreadSafe
+                    && call.implicitThis == mce.implicitThis)
         }
     }
 
     @Override
-    public void visitStaticMethodCallExpression(final StaticMethodCallExpression call) {
-        super.visitStaticMethodCallExpression(call);
-    }
-
-    @Override
-    public void visitConstructorCallExpression(final ConstructorCallExpression call) {
+    void visitConstructorCallExpression(ConstructorCallExpression call) {
         doWithNode(call, current) {
             def cur = (ConstructorCallExpression) current
             doWithNode(call.arguments, cur.arguments) {
@@ -571,7 +560,7 @@
     }
 
     @Override
-    public void visitBinaryExpression(final BinaryExpression expression) {
+    void visitBinaryExpression(BinaryExpression expression) {
         doWithNode(expression, current) {
             def bin = (BinaryExpression) current
             def leftExpression = expression.getLeftExpression()
@@ -602,7 +591,7 @@
     }
 
     @Override
-    public void visitTernaryExpression(final TernaryExpression expression) {
+    void visitTernaryExpression(TernaryExpression expression) {
         doWithNode(expression, current) {
             TernaryExpression te = (TernaryExpression) current
             doWithNode(expression.booleanExpression, te.booleanExpression) {
@@ -620,7 +609,7 @@
     }
 
     @Override
-    public void visitPostfixExpression(final PostfixExpression expression) {
+    void visitPostfixExpression(PostfixExpression expression) {
         doWithNode(expression, current) {
             def origExpr = expression.expression
             def curExpr = (PostfixExpression) current
@@ -632,7 +621,7 @@
     }
 
     @Override
-    public void visitPrefixExpression(final PrefixExpression expression) {
+    void visitPrefixExpression(PrefixExpression expression) {
         doWithNode(expression, current) {
             def origExpr = expression.expression
             def curExpr = (PrefixExpression) current
@@ -644,7 +633,7 @@
     }
 
     @Override
-    public void visitBooleanExpression(final BooleanExpression expression) {
+    void visitBooleanExpression(BooleanExpression expression) {
         doWithNode(expression, current) {
             doWithNode(expression.expression, ((BooleanExpression) current).expression) {
                 expression.expression.visit(this)
@@ -653,7 +642,7 @@
     }
 
     @Override
-    public void visitNotExpression(final NotExpression expression) {
+    void visitNotExpression(NotExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             def cur = ((NotExpression) current).expression
@@ -664,7 +653,7 @@
     }
 
     @Override
-    public void visitClosureExpression(final ClosureExpression expression) {
+    void visitClosureExpression(ClosureExpression expression) {
         doWithNode(expression, current) {
             def code = expression.code
             def cl = (ClosureExpression) current
@@ -682,13 +671,13 @@
         }
         if (nodeParams) {
             if (curParams.length == nodeParams.length) {
-                for (int i = 0; i < nodeParams.length && match; i++) {
+                for (int i = 0; i < nodeParams.length && match; i += 1) {
                     def n = nodeParams[i]
                     def c = curParams[i]
                     doWithNode(n, c) {
-                        failIfNot(matchByName(n.name, c.name) &&
-                                (n.originType == c.originType) &&
-                                (n.type == c.originType))
+                        failIfNot(matchByName(n.name, c.name)
+                            && n.originType == c.originType
+                            && n.type == c.originType)
                     }
                 }
             } else {
@@ -698,7 +687,7 @@
     }
 
     @Override
-    public void visitTupleExpression(final TupleExpression expression) {
+    void visitTupleExpression(TupleExpression expression) {
         doWithNode(expression, current) {
             doWithNode(expression.expressions, ((TupleExpression) current).expressions) {
                 visitListOfExpressions(expression.expressions)
@@ -707,7 +696,7 @@
     }
 
     @Override
-    public void visitListExpression(final ListExpression expression) {
+    void visitListExpression(ListExpression expression) {
         doWithNode(expression, current) {
             def exprs = expression.expressions
             doWithNode(exprs, ((ListExpression) current).expressions) {
@@ -717,7 +706,7 @@
     }
 
     @Override
-    public void visitArrayExpression(final ArrayExpression expression) {
+    void visitArrayExpression(ArrayExpression expression) {
         doWithNode(expression, current) {
             def expressions = expression.expressions
             def size = expression.sizeExpression
@@ -735,7 +724,7 @@
     }
 
     @Override
-    public void visitMapExpression(final MapExpression expression) {
+    void visitMapExpression(MapExpression expression) {
         doWithNode(expression, current) {
             def entries = expression.mapEntryExpressions
             def curEntries = ((MapExpression) current).mapEntryExpressions
@@ -746,7 +735,7 @@
     }
 
     @Override
-    public void visitMapEntryExpression(final MapEntryExpression expression) {
+    void visitMapEntryExpression(MapEntryExpression expression) {
         doWithNode(expression, current) {
             def key = expression.keyExpression
             def value = expression.valueExpression
@@ -763,7 +752,7 @@
     }
 
     @Override
-    public void visitRangeExpression(final RangeExpression expression) {
+    void visitRangeExpression(RangeExpression expression) {
         doWithNode(expression, current) {
             def from = expression.from
             def to = expression.to
@@ -780,7 +769,7 @@
     }
 
     @Override
-    public void visitSpreadExpression(final SpreadExpression expression) {
+    void visitSpreadExpression(SpreadExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             doWithNode(expr, ((SpreadExpression) current).expression) {
@@ -790,12 +779,7 @@
     }
 
     @Override
-    public void visitSpreadMapExpression(final SpreadMapExpression expression) {
-        super.visitSpreadMapExpression(expression);
-    }
-
-    @Override
-    public void visitMethodPointerExpression(final MethodPointerExpression expression) {
+    void visitMethodPointerExpression(MethodPointerExpression expression) {
         doWithNode(expression, current) {
             def cur = (MethodPointerExpression) current
             def expr = expression.expression
@@ -812,7 +796,7 @@
     }
 
     @Override
-    public void visitUnaryMinusExpression(final UnaryMinusExpression expression) {
+    void visitUnaryMinusExpression(UnaryMinusExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             doWithNode(expr, ((UnaryMinusExpression) current).expression) {
@@ -822,7 +806,7 @@
     }
 
     @Override
-    public void visitUnaryPlusExpression(final UnaryPlusExpression expression) {
+    void visitUnaryPlusExpression(UnaryPlusExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             doWithNode(expr, ((UnaryPlusExpression) current).expression) {
@@ -832,7 +816,7 @@
     }
 
     @Override
-    public void visitBitwiseNegationExpression(final BitwiseNegationExpression expression) {
+    void visitBitwiseNegationExpression(BitwiseNegationExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             doWithNode(expr, ((BitwiseNegationExpression) current).expression) {
@@ -842,7 +826,7 @@
     }
 
     @Override
-    public void visitCastExpression(final CastExpression expression) {
+    void visitCastExpression(CastExpression expression) {
         doWithNode(expression, current) {
             def expr = expression.expression
             doWithNode(expr, ((CastExpression) current).expression) {
@@ -852,20 +836,17 @@
         }
     }
 
-    @Override
-    @CompileStatic(TypeCheckingMode.SKIP)
-    public void visitConstantExpression(final ConstantExpression expression) {
+    @Override @CompileDynamic
+    void visitConstantExpression(ConstantExpression expression) {
         doWithNode(expression, current) {
             def cur = (ConstantExpression) current
             super.visitConstantExpression(expression)
-            failIfNot((expression.type == cur.type) &&
-                    (expression.value == cur.value))
+            failIfNot(expression.type == cur.type && expression.value == cur.value)
         }
     }
 
-    @Override
-    @CompileStatic(TypeCheckingMode.SKIP)
-    public void visitClassExpression(final ClassExpression expression) {
+    @Override @CompileDynamic
+    void visitClassExpression(ClassExpression expression) {
         doWithNode(expression, current) {
             super.visitClassExpression(expression)
             def cexp = (ClassExpression) current
@@ -874,17 +855,16 @@
     }
 
     @Override
-    public void visitVariableExpression(final VariableExpression expression) {
+    void visitVariableExpression(VariableExpression expression) {
         doWithNode(expression, current) {
             def curVar = (VariableExpression) current
-            failIfNot(matchByName(expression.name, curVar.name) &&
-                    (expression.type == curVar.type) &&
-                    (expression.originType == curVar.originType))
+            failIfNot(matchByName(expression.name, curVar.name)
+                    && expression.type == curVar.type && expression.originType == curVar.originType)
         }
     }
 
     @Override
-    public void visitPropertyExpression(final PropertyExpression expression) {
+    void visitPropertyExpression(PropertyExpression expression) {
         doWithNode(expression, current) {
             def currentPexp = (PropertyExpression) current
             doWithNode(expression.objectExpression, currentPexp.objectExpression) {
@@ -893,15 +873,15 @@
             doWithNode(expression.property, currentPexp.property) {
                 expression.property.visit(this)
             }
-            failIfNot((expression.propertyAsString == currentPexp.propertyAsString) &&
-                    (expression.implicitThis == currentPexp.implicitThis) &&
-                    (expression.safe == currentPexp.safe) &&
-                    (expression.spreadSafe == currentPexp.spreadSafe))
+            failIfNot(expression.propertyAsString == currentPexp.propertyAsString
+                    && expression.implicitThis == currentPexp.implicitThis
+                    && expression.safe == currentPexp.safe
+                    && expression.spreadSafe == currentPexp.spreadSafe)
         }
     }
 
     @Override
-    public void visitAttributeExpression(final AttributeExpression expression) {
+    void visitAttributeExpression(AttributeExpression expression) {
         doWithNode(expression, current) {
             def currentPexp = (AttributeExpression) current
             doWithNode(expression.objectExpression, currentPexp.objectExpression) {
@@ -910,20 +890,15 @@
             doWithNode(expression.property, currentPexp.property) {
                 expression.property.visit(this)
             }
-            failIfNot((expression.propertyAsString == currentPexp.propertyAsString) &&
-                    (expression.implicitThis == currentPexp.implicitThis) &&
-                    (expression.safe == currentPexp.safe) &&
-                    (expression.spreadSafe == currentPexp.spreadSafe))
+            failIfNot(expression.propertyAsString == currentPexp.propertyAsString
+                    && expression.implicitThis == currentPexp.implicitThis
+                    && expression.safe == currentPexp.safe
+                    && expression.spreadSafe == currentPexp.spreadSafe)
         }
     }
 
     @Override
-    public void visitFieldExpression(final FieldExpression expression) {
-        super.visitFieldExpression(expression);
-    }
-
-    @Override
-    public void visitGStringExpression(final GStringExpression expression) {
+    void visitGStringExpression(GStringExpression expression) {
         doWithNode(expression, current) {
             def cur = (GStringExpression) current
             def strings = expression.strings
@@ -940,8 +915,8 @@
     }
 
     @Override
-    void visitListOfExpressions(final List<? extends Expression> list) {
-        if (list == null) return;
+    void visitListOfExpressions(List<? extends Expression> list) {
+        if (list == null) return
         def currentExprs = (List<Expression>) current
         if (currentExprs.size() != list.size()) {
             failIfNot(false)
@@ -957,12 +932,7 @@
     }
 
     @Override
-    public void visitArgumentlistExpression(final ArgumentListExpression ale) {
-        super.visitArgumentlistExpression(ale);
-    }
-
-    @Override
-    public void visitClosureListExpression(final ClosureListExpression cle) {
+    void visitClosureListExpression(ClosureListExpression cle) {
         doWithNode(cle, current) {
             def exprs = cle.expressions
             doWithNode(exprs, ((ClosureListExpression)current).expressions) {
@@ -972,12 +942,7 @@
     }
 
     @Override
-    public void visitBytecodeExpression(final BytecodeExpression cle) {
-        super.visitBytecodeExpression(cle);
-    }
-
-    @Override
-    void visitIfElse(final IfStatement ifElse) {
+    void visitIfElse(IfStatement ifElse) {
         doWithNode(ifElse, current) {
             visitStatement(ifElse)
             def cur = (IfStatement) current
@@ -998,7 +963,7 @@
     }
 
     @Override
-    void visitForLoop(final ForStatement forLoop) {
+    void visitForLoop(ForStatement forLoop) {
         doWithNode(forLoop, current) {
             visitStatement(forLoop)
             def cur = (ForStatement) current
@@ -1014,7 +979,7 @@
     }
 
     @Override
-    void visitWhileLoop(final WhileStatement loop) {
+    void visitWhileLoop(WhileStatement loop) {
         doWithNode(loop, current) {
             visitStatement(loop)
             def cur = (WhileStatement) current
@@ -1030,7 +995,7 @@
     }
 
     /**
-     * // todo: experimental!
+     * TODO: experimental!
      *
      * Annotates an AST node with matching contraints. This method should be called
      * on an AST intended to be used as a pattern only. It will put node metadata on
@@ -1040,9 +1005,7 @@
      * @param constraintsSpec a closure specification of matching constraints
      * @return the same pattern, annotated with constraints
      */
-    public static ASTNode withConstraints(
-            final ASTNode pattern,
-            final @DelegatesTo(value=MatchingConstraintsBuilder, strategy=Closure.DELEGATE_ONLY) Closure constraintsSpec) {
+    static ASTNode withConstraints(ASTNode pattern, @DelegatesTo(value=MatchingConstraintsBuilder, strategy=Closure.DELEGATE_ONLY) Closure constraintsSpec) {
         def builder = new MatchingConstraintsBuilder()
         def constraints = builder.build(constraintsSpec)
         pattern.putNodeMetaData(MatchingConstraints, constraints)
