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

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


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 5ec2aec  minor edits
5ec2aec is described below

commit 5ec2aecf3d9bf5e1fee15d0818d9cdbb24b97e3a
Author: Eric Milles <[email protected]>
AuthorDate: Mon Feb 14 10:44:44 2022 -0600

    minor edits
---
 .../apache/groovy/ast/tools/ExpressionUtils.java   |   2 +-
 .../groovy/antlr/UnicodeEscapingReader.java        |  11 +-
 src/main/java/org/codehaus/groovy/ast/ASTNode.java |   2 +-
 .../org/codehaus/groovy/ast/AnnotatedNode.java     |  27 ++-
 .../groovy/ast/ClassCodeVisitorSupport.java        |  83 +++++---
 .../java/org/codehaus/groovy/ast/ClassHelper.java  |   6 +-
 .../java/org/codehaus/groovy/ast/ClassNode.java    | 120 +++++------
 .../codehaus/groovy/ast/CodeVisitorSupport.java    |   7 +-
 .../java/org/codehaus/groovy/ast/CompileUnit.java  |  67 +++---
 .../java/org/codehaus/groovy/ast/GenericsType.java |  15 +-
 .../java/org/codehaus/groovy/ast/ImportNode.java   |   5 +-
 .../java/org/codehaus/groovy/ast/MethodNode.java   |  18 +-
 .../java/org/codehaus/groovy/ast/ModuleNode.java   | 232 +++++++++++----------
 .../java/org/codehaus/groovy/ast/Parameter.java    |  24 +--
 .../groovy/ast/expr/ConstantExpression.java        |  11 +-
 .../groovy/ast/expr/ConstructorCallExpression.java |   1 +
 .../codehaus/groovy/ast/expr/EmptyExpression.java  |  11 +-
 .../codehaus/groovy/ast/expr/FieldExpression.java  |  52 +++--
 .../groovy/ast/expr/MethodCallExpression.java      |  14 +-
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |  10 +-
 .../codehaus/groovy/ast/tools/GenericsUtils.java   |  40 ++--
 .../groovy/ast/tools/WideningCategories.java       |   6 +-
 .../groovy/classgen/AnnotationVisitor.java         |  18 +-
 .../groovy/classgen/asm/BytecodeHelper.java        |   5 +-
 .../groovy/classgen/asm/ClosureWriter.java         |   7 +-
 .../codehaus/groovy/classgen/asm/CompileStack.java |  80 +++----
 .../groovy/classgen/asm/InvocationWriter.java      |   3 +-
 .../classgen/asm/sc/StaticInvocationWriter.java    |  15 +-
 src/test/groovy/grape/GrapeClassLoaderTest.groovy  |   9 +-
 .../swingui/AstNodeToScriptAdapterTest.groovy      |   4 +-
 .../swingui/ScriptToTreeNodeAdapterTest.groovy     |   2 +-
 31 files changed, 446 insertions(+), 461 deletions(-)

diff --git a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java 
b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
index af20d2a..b48c009 100644
--- a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
@@ -231,7 +231,7 @@ public final class ExpressionUtils {
                         Field field = 
type.redirect().getTypeClass().getField(pe.getPropertyAsString());
                         if (field != null && 
Modifier.isStatic(field.getModifiers()) && 
Modifier.isFinal(field.getModifiers())) {
                             ConstantExpression ce3 = new 
ConstantExpression(field.get(null), true);
-                            ce3.setSourcePosition(exp);
+                            configure(exp, ce3);
                             return ce3;
                         }
                     } catch (Exception | LinkageError e) {
diff --git a/src/main/java/org/codehaus/groovy/antlr/UnicodeEscapingReader.java 
b/src/main/java/org/codehaus/groovy/antlr/UnicodeEscapingReader.java
index aef7e7a..7809c52 100644
--- a/src/main/java/org/codehaus/groovy/antlr/UnicodeEscapingReader.java
+++ b/src/main/java/org/codehaus/groovy/antlr/UnicodeEscapingReader.java
@@ -44,6 +44,7 @@ public class UnicodeEscapingReader extends Reader {
 
     private static class DummyLexer extends CharScanner {
         private final Token t = new Token();
+        @Override
         public Token nextToken() throws TokenStreamException {
             return t;
         }
@@ -56,7 +57,7 @@ public class UnicodeEscapingReader extends Reader {
             return 0;
         }
     }
-    
+
     /**
      * Constructor.
      * @param reader The reader that this reader will filter over.
@@ -79,6 +80,7 @@ public class UnicodeEscapingReader extends Reader {
      * Reads characters from the underlying reader.
      * @see java.io.Reader#read(char[],int,int)
      */
+    @Override
     public int read(char cbuf[], int off, int len) throws IOException {
         int c = 0;
         int count = 0;
@@ -94,6 +96,7 @@ public class UnicodeEscapingReader extends Reader {
      * translating escapes as required.
      * @see java.io.Reader#close()
      */
+    @Override
     public int read() throws IOException {
         if (hasNextChar) {
             hasNextChar = false;
@@ -106,7 +109,7 @@ public class UnicodeEscapingReader extends Reader {
             numUnicodeEscapesFoundOnCurrentLine = 0;
             previousLine = lexer.getLine();
         }
-        
+
         int c = reader.read();
         if (c != '\\') {
             write(c);
@@ -142,12 +145,13 @@ public class UnicodeEscapingReader extends Reader {
         }
         int rv = Integer.parseInt(charNum.toString(), 16);
         write(rv);
-        
+
         numUnicodeEscapesFound += 4 + numberOfUChars;
         numUnicodeEscapesFoundOnCurrentLine += 4 + numberOfUChars;
 
         return rv;
     }
+
     private void write(int c) {
         if (sourceBuffer != null) {sourceBuffer.write(c);}
     }
@@ -184,6 +188,7 @@ public class UnicodeEscapingReader extends Reader {
      *
      * @see java.io.Reader#close()
      */
+    @Override
     public void close() throws IOException {
         reader.close();
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/ASTNode.java 
b/src/main/java/org/codehaus/groovy/ast/ASTNode.java
index 598d9af..ed08e9f 100644
--- a/src/main/java/org/codehaus/groovy/ast/ASTNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ASTNode.java
@@ -100,10 +100,10 @@ public class ASTNode {
      * @param node - the node used to configure the position information
      */
     public void setSourcePosition(ASTNode node) {
+        this.lineNumber = node.getLineNumber();
         this.columnNumber = node.getColumnNumber();
         this.lastLineNumber = node.getLastLineNumber();
         this.lastColumnNumber = node.getLastColumnNumber();
-        this.lineNumber = node.getLineNumber();
     }
 
     /**
diff --git a/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java 
b/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
index 8f51f39..e3bb1ac 100644
--- a/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/AnnotatedNode.java
@@ -26,10 +26,11 @@ import java.util.List;
  * Base class for any AST node which is capable of being annotated
  */
 public class AnnotatedNode extends ASTNode {
+
     private List<AnnotationNode> annotations = Collections.emptyList();
+    private boolean hasNoRealSourcePositionFlag;
     private boolean synthetic;
     ClassNode declaringClass;
-    private boolean hasNoRealSourcePositionFlag;
 
     public AnnotatedNode() {
     }
@@ -39,7 +40,7 @@ public class AnnotatedNode extends ASTNode {
     }
 
     public List<AnnotationNode> getAnnotations(ClassNode type) {
-        List<AnnotationNode> ret = new 
ArrayList<AnnotationNode>(annotations.size());
+        List<AnnotationNode> ret = new ArrayList<>(annotations.size());
         for (AnnotationNode node: annotations) {
             if (type.equals(node.getClassNode())) ret.add(node);
         }
@@ -53,7 +54,7 @@ public class AnnotatedNode extends ASTNode {
 
     private void checkInit() {
         if (annotations == Collections.EMPTY_LIST)
-            annotations = new ArrayList<AnnotationNode>(3);
+            annotations = new ArrayList<>(3);
     }
 
     public void addAnnotations(List<AnnotationNode> annotations) {
@@ -63,10 +64,10 @@ public class AnnotatedNode extends ASTNode {
     }
 
     /**
-     * returns true if this node is added by the compiler.
-     * <b>NOTE</b>: 
+     * Returns true if this node is added by the compiler.
+     * <b>NOTE</b>:
      * This method has nothing to do with the synthetic flag
-     * for fields, methods or classes.              
+     * for fields, methods or classes.
      * @return true if this node is added by the compiler
      */
     public boolean isSynthetic() {
@@ -74,10 +75,10 @@ public class AnnotatedNode extends ASTNode {
     }
 
     /**
-     * sets this node as a node added by the compiler.
-     * <b>NOTE</b>: 
+     * Sets this node as a node added by the compiler.
+     * <b>NOTE</b>:
      * This method has nothing to do with the synthetic flag
-     * for fields, methods or classes.              
+     * for fields, methods or classes.
      * @param synthetic - if true this node is marked as
      *                    added by the compiler
      */
@@ -89,16 +90,14 @@ public class AnnotatedNode extends ASTNode {
         return declaringClass;
     }
 
-    /**
-     * @param declaringClass - The declaringClass to set.
-     */
     public void setDeclaringClass(ClassNode declaringClass) {
         this.declaringClass = declaringClass;
     }
 
     /**
-     * Currently only ever returns true for default constructors
-     * added by the compiler. See GROOVY-4161.
+     * Returns true for default constructors added by the compiler.
+     *
+     * @see https://issues.apache.org/jira/browse/GROOVY-4161
      */
     public boolean hasNoRealSourcePosition() {
         return hasNoRealSourcePositionFlag;
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassCodeVisitorSupport.java 
b/src/main/java/org/codehaus/groovy/ast/ClassCodeVisitorSupport.java
index 378d2be..9185b7f 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassCodeVisitorSupport.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassCodeVisitorSupport.java
@@ -38,15 +38,12 @@ import org.codehaus.groovy.ast.stmt.ThrowStatement;
 import org.codehaus.groovy.ast.stmt.TryCatchStatement;
 import org.codehaus.groovy.ast.stmt.WhileStatement;
 import org.codehaus.groovy.control.SourceUnit;
-import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
 import org.codehaus.groovy.syntax.SyntaxException;
 import org.codehaus.groovy.transform.ErrorCollecting;
 
-import java.util.List;
-import java.util.Map;
-
 public abstract class ClassCodeVisitorSupport extends CodeVisitorSupport 
implements ErrorCollecting, GroovyClassVisitor {
 
+    @Override
     public void visitClass(ClassNode node) {
         visitAnnotations(node);
         visitPackage(node.getPackage());
@@ -54,10 +51,10 @@ public abstract class ClassCodeVisitorSupport extends 
CodeVisitorSupport impleme
         node.visitContents(this);
         visitObjectInitializerStatements(node);
     }
-    
+
     protected void visitObjectInitializerStatements(ClassNode node) {
-        for (Statement element : node.getObjectInitializerStatements()) {
-            element.visit(this);
+        for (Statement stmt : node.getObjectInitializerStatements()) {
+            stmt.visit(this);
         }
     }
 
@@ -90,24 +87,19 @@ public abstract class ClassCodeVisitorSupport extends 
CodeVisitorSupport impleme
     }
 
     public void visitAnnotations(AnnotatedNode node) {
-        List<AnnotationNode> annotations = node.getAnnotations();
-        if (annotations.isEmpty()) return;
-        for (AnnotationNode an : annotations) {
-            // skip built-in properties
+        for (AnnotationNode an : node.getAnnotations()) {
+            // skip built-in annotations
             if (an.isBuiltIn()) continue;
-            for (Map.Entry<String, Expression> member : 
an.getMembers().entrySet()) {
-                member.getValue().visit(this);
+
+            for (Expression expr : an.getMembers().values()) {
+                expr.visit(this);
             }
         }
     }
 
-    public void visitBlockStatement(BlockStatement block) {
-        visitStatement(block);
-        super.visitBlockStatement(block);
-    }
-
     protected void visitClassCodeContainer(Statement code) {
-        if (code != null) code.visit(this);
+        if (code != null)
+            code.visit(this);
     }
 
     @Override
@@ -119,119 +111,142 @@ public abstract class ClassCodeVisitorSupport extends 
CodeVisitorSupport impleme
     protected void visitConstructorOrMethod(MethodNode node, boolean 
isConstructor) {
         visitAnnotations(node);
         visitClassCodeContainer(node.getCode());
-        for (Parameter param : node.getParameters()) {
-            visitAnnotations(param);
+        for (Parameter p : node.getParameters()) {
+            visitAnnotations(p);
         }
     }
 
+    @Override
     public void visitConstructor(ConstructorNode node) {
         visitConstructorOrMethod(node, true);
     }
 
+    @Override
     public void visitMethod(MethodNode node) {
         visitConstructorOrMethod(node, false);
     }
 
+    @Override
     public void visitField(FieldNode node) {
         visitAnnotations(node);
         Expression init = node.getInitialExpression();
-        if (init != null) init.visit(this);
+        if (init != null)
+            init.visit(this);
     }
 
+    @Override
     public void visitProperty(PropertyNode node) {
         visitAnnotations(node);
-        Statement statement = node.getGetterBlock();
-        visitClassCodeContainer(statement);
-
-        statement = node.getSetterBlock();
-        visitClassCodeContainer(statement);
-
+        visitClassCodeContainer(node.getGetterBlock());
+        visitClassCodeContainer(node.getSetterBlock());
         Expression init = node.getInitialExpression();
-        if (init != null) init.visit(this);
+        if (init != null)
+            init.visit(this);
     }
 
-    public void addError(String msg, ASTNode expr) {
-        SourceUnit source = getSourceUnit();
-        source.getErrorCollector().addErrorAndContinue(
-                new SyntaxErrorMessage(new SyntaxException(msg + '\n', 
expr.getLineNumber(), expr.getColumnNumber(), expr.getLastLineNumber(), 
expr.getLastColumnNumber()), source)
-        );
+    @Override
+    public void addError(String msg, ASTNode node) {
+        getSourceUnit().addErrorAndContinue(new SyntaxException(msg + '\n', 
node));
     }
 
     protected abstract SourceUnit getSourceUnit();
 
+    // statements:
+
     protected void visitStatement(Statement statement) {
     }
 
+    @Override
     public void visitAssertStatement(AssertStatement statement) {
         visitStatement(statement);
         super.visitAssertStatement(statement);
     }
 
+    @Override
+    public void visitBlockStatement(BlockStatement block) {
+        visitStatement(block);
+        super.visitBlockStatement(block);
+    }
+
+    @Override
     public void visitBreakStatement(BreakStatement statement) {
         visitStatement(statement);
         super.visitBreakStatement(statement);
     }
 
+    @Override
     public void visitCaseStatement(CaseStatement statement) {
         visitStatement(statement);
         super.visitCaseStatement(statement);
     }
 
+    @Override
     public void visitCatchStatement(CatchStatement statement) {
         visitStatement(statement);
         super.visitCatchStatement(statement);
     }
 
+    @Override
     public void visitContinueStatement(ContinueStatement statement) {
         visitStatement(statement);
         super.visitContinueStatement(statement);
     }
 
+    @Override
     public void visitDoWhileLoop(DoWhileStatement loop) {
         visitStatement(loop);
         super.visitDoWhileLoop(loop);
     }
 
+    @Override
     public void visitExpressionStatement(ExpressionStatement statement) {
         visitStatement(statement);
         super.visitExpressionStatement(statement);
     }
 
+    @Override
     public void visitForLoop(ForStatement forLoop) {
         visitStatement(forLoop);
         super.visitForLoop(forLoop);
     }
 
+    @Override
     public void visitIfElse(IfStatement ifElse) {
         visitStatement(ifElse);
         super.visitIfElse(ifElse);
     }
 
+    @Override
     public void visitReturnStatement(ReturnStatement statement) {
         visitStatement(statement);
         super.visitReturnStatement(statement);
     }
 
+    @Override
     public void visitSwitch(SwitchStatement statement) {
         visitStatement(statement);
         super.visitSwitch(statement);
     }
 
+    @Override
     public void visitSynchronizedStatement(SynchronizedStatement statement) {
         visitStatement(statement);
         super.visitSynchronizedStatement(statement);
     }
 
+    @Override
     public void visitThrowStatement(ThrowStatement statement) {
         visitStatement(statement);
         super.visitThrowStatement(statement);
     }
 
+    @Override
     public void visitTryCatchFinally(TryCatchStatement statement) {
         visitStatement(statement);
         super.visitTryCatchFinally(statement);
     }
 
+    @Override
     public void visitWhileLoop(WhileStatement loop) {
         visitStatement(loop);
         super.visitWhileLoop(loop);
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java 
b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
index c2f76ce..f4876f8 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -132,15 +132,13 @@ public class ClassHelper {
     public static final String OBJECT = "java.lang.Object";
 
     public static ClassNode makeCached(Class c) {
-        final SoftReference<ClassNode> classNodeSoftReference = 
ClassHelperCache.classCache.get(c);
         ClassNode classNode;
+        final SoftReference<ClassNode> classNodeSoftReference = 
ClassHelperCache.classCache.get(c);
         if (classNodeSoftReference == null || (classNode = 
classNodeSoftReference.get()) == null) {
             classNode = new ClassNode(c);
             ClassHelperCache.classCache.put(c, new 
SoftReference<ClassNode>(classNode));
-
             
VMPluginFactory.getPlugin().setAdditionalClassInformation(classNode);
         }
-
         return classNode;
     }
 
@@ -205,7 +203,6 @@ public class ClassHelper {
         }
     }
 
-
     /**
      * Creates a ClassNode using a given class.
      * Unlike make(String) this method will not use the cache
@@ -301,7 +298,6 @@ public class ClassHelper {
         return cn;
     }
 
-
     /**
      * Test to determine if a ClassNode is a primitive type.
      * Note: this only works for ClassNodes created using a
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java 
b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 747c566..dff7f64 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -106,6 +106,7 @@ import java.util.Set;
 public class ClassNode extends AnnotatedNode implements Opcodes {
     private static class MapOfLists {
         private Map<Object, List<MethodNode>> map;
+
         public List<MethodNode> get(Object key) {
             return map == null ? null : map.get(key);
         }
@@ -170,18 +171,18 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     // clazz!=null when resolved
     protected Class clazz;
     // only false when this classNode is constructed from a class
-    private volatile boolean lazyInitDone=true;
+    private volatile boolean lazyInitDone = true;
     // not null if if the ClassNode is an array
-    private ClassNode componentType = null;
+    private ClassNode componentType;
     // if not null this instance is handled as proxy
     // for the redirect
-    private ClassNode redirect=null;
+    private ClassNode redirect;
     // flag if the classes or its members are annotated
     private boolean annotated;
 
     // type spec for generics
-    private GenericsType[] genericsTypes=null;
-    private boolean usesGenerics=false;
+    private GenericsType[] genericsTypes;
+    private boolean usesGenerics;
 
     // if set to true the name getGenericsTypes consists
     // of 1 element describing the name of the placeholder
@@ -190,8 +191,8 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     /**
      * Returns the ClassNode this ClassNode is redirecting to.
      */
-    public ClassNode redirect(){
-        if (redirect==null) return this;
+    public ClassNode redirect() {
+        if (redirect == null) return this;
         return redirect.redirect();
     }
 
@@ -257,12 +258,10 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
      * ClassNode will not be a primary ClassNode.
      */
     public ClassNode(Class c) {
-        this(c.getName(), c.getModifiers(), null, null ,MixinNode.EMPTY_ARRAY);
-        clazz=c;
-        lazyInitDone=false;
-        CompileUnit cu = getCompileUnit();
-        if (cu!=null) cu.addClass(this);
-        isPrimaryNode=false;
+        this(c.getName(), c.getModifiers(), null, null, MixinNode.EMPTY_ARRAY);
+        clazz = c;
+        lazyInitDone = false;
+        isPrimaryNode = false;
     }
 
     /**
@@ -364,7 +363,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         if (redirect!=null) return redirect().getFields();
         lazyClassInit();
         if (fields == null)
-            fields = new LinkedList<FieldNode> ();
+            fields = new LinkedList<FieldNode>();
         return fields;
     }
 
@@ -412,20 +411,17 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
                 result.add(method);
             }
         }
-        
-        if (result.isEmpty()) {
-            return null;
-        } else {
+        if (!result.isEmpty()) {
             return result;
         }
-
+        return null;
     }
 
     public List<MethodNode> getAllDeclaredMethods() {
         return new ArrayList<MethodNode>(getDeclaredMethodsMap().values());
     }
 
-    public Set<ClassNode> getAllInterfaces () {
+    public Set<ClassNode> getAllInterfaces() {
         Set<ClassNode> res = new LinkedHashSet<ClassNode>();
         getAllInterfaces(res);
         return res;
@@ -476,7 +472,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     public List<PropertyNode> getProperties() {
         final ClassNode r = redirect();
         if (r.properties == null)
-            r.properties = new ArrayList<PropertyNode> ();
+            r.properties = new ArrayList<PropertyNode>();
         return r.properties;
     }
 
@@ -484,7 +480,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         if (redirect != null) return redirect().getDeclaredConstructors();
         lazyClassInit();
         if (constructors == null)
-            constructors = new ArrayList<ConstructorNode> ();
+            constructors = new ArrayList<ConstructorNode>();
         return constructors;
     }
 
@@ -552,12 +548,8 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
 
     public void addProperty(PropertyNode node) {
         node.setDeclaringClass(redirect());
-        FieldNode field = node.getField();
-        addField(field);
-        final ClassNode r = redirect();
-        if (r.properties == null)
-            r.properties = new ArrayList<PropertyNode> ();
-        r.properties.add(node);
+        getProperties().add(node);
+        addField(node.getField());
     }
 
     public PropertyNode addProperty(String name,
@@ -601,7 +593,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         node.setDeclaringClass(this);
         final ClassNode r = redirect();
         if (r.constructors == null)
-            r.constructors = new ArrayList<ConstructorNode> ();
+            r.constructors = new ArrayList<ConstructorNode>();
         r.constructors.add(node);
     }
 
@@ -712,11 +704,12 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         }
     }
 
-    public boolean equals(Object o) {
-        if (redirect!=null) return redirect().equals(o);
-        if (!(o instanceof ClassNode)) return false;
-        ClassNode cn = (ClassNode) o;
-        return (cn.getText().equals(getText()));
+    public boolean equals(Object that) {
+        if (that == this) return true;
+        if (!(that instanceof ClassNode)) return false;
+        if (redirect != null) return redirect.equals(that);
+        if (componentType != null) return componentType.equals(((ClassNode) 
that).componentType);
+        return ((ClassNode) that).getText().equals(getText()); // arrays could 
be "T[]" or "[LT;"
     }
 
     public int hashCode() {
@@ -812,7 +805,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
 
     public List<Statement> getObjectInitializerStatements() {
         if (objectInitializers == null)
-            objectInitializers = new LinkedList<Statement> ();
+            objectInitializers = new LinkedList<Statement>();
         return objectInitializers;
     }
 
@@ -1112,8 +1105,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         boolean booleanReturnOnly = getterName.startsWith("is");
         for (MethodNode method : getDeclaredMethods(getterName)) {
             if (getterName.equals(method.getName())
-                    && ClassHelper.VOID_TYPE!=method.getReturnType()
-                    && method.getParameters().length == 0
+                    && method.getParameters().length == 0 && 
!method.isVoidMethod()
                     && (!booleanReturnOnly || 
ClassHelper.Boolean_TYPE.equals(ClassHelper.getWrapper(method.getReturnType()))))
 {
                 // GROOVY-7363: There can be multiple matches for a getter 
returning a generic parameter type, due to
                 // the generation of a bridge method. The real getter is 
really the non-bridge, non-synthetic one as it
@@ -1139,14 +1131,13 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     public MethodNode getSetterMethod(String setterName, boolean voidOnly) {
         for (MethodNode method : getDeclaredMethods(setterName)) {
             if (setterName.equals(method.getName())
-                    && (!voidOnly || 
ClassHelper.VOID_TYPE==method.getReturnType())
-                    && method.getParameters().length == 1) {
+                    && method.getParameters().length == 1
+                    && (!voidOnly || method.isVoidMethod())) {
                 return method;
             }
         }
         ClassNode parent = getSuperClass();
-        if (parent!=null) return parent.getSetterMethod(setterName, voidOnly);
-        return null;
+        return (parent != null ? parent.getSetterMethod(setterName, voidOnly) 
: null);
     }
 
     /**
@@ -1312,7 +1303,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     private boolean hasExactMatchingCompatibleType(MethodNode current, 
MethodNode newCandidate, int i) {
         int lastParamIndex = newCandidate.getParameters().length - 1;
         return (i <= lastParamIndex && 
current.getParameters()[i].getType().equals(newCandidate.getParameters()[i].getType()))
-                || (i >= lastParamIndex && isPotentialVarArg(newCandidate, 
lastParamIndex) && 
current.getParameters()[i].getType().equals(newCandidate.getParameters()[lastParamIndex].getType().componentType));
+                || (i >= lastParamIndex && isPotentialVarArg(newCandidate, 
lastParamIndex) && 
current.getParameters()[i].getType().equals(newCandidate.getParameters()[lastParamIndex].getType().getComponentType()));
     }
 
     private boolean hasCompatibleType(TupleExpression args, MethodNode method, 
int i) {
@@ -1341,12 +1332,12 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         return ClassNodeUtils.hasPossibleStaticMethod(this, name, arguments, 
false);
     }
 
-    public boolean isInterface(){
-        return (getModifiers() & Opcodes.ACC_INTERFACE) > 0;
+    public boolean isInterface() {
+        return (getModifiers() & ACC_INTERFACE) != 0;
     }
 
-    public boolean isAbstract(){
-        return (getModifiers() & Opcodes.ACC_ABSTRACT) > 0;
+    public boolean isAbstract() {
+        return (getModifiers() & ACC_ABSTRACT) != 0;
     }
 
     public boolean isResolved() {
@@ -1355,8 +1346,8 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         return componentType != null && componentType.isResolved();
     }
 
-    public boolean isArray(){
-        return componentType!=null;
+    public boolean isArray() {
+        return (componentType != null);
     }
 
     public ClassNode getComponentType() {
@@ -1370,19 +1361,19 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
      * a new class node using {@link #getPlainNodeReference()}.
      * @return the class this classnode relates to. May return null.
      */
-    public Class getTypeClass(){
+    public Class getTypeClass() {
         if (clazz != null) return clazz;
         if (redirect != null) return redirect.getTypeClass();
 
         ClassNode component = redirect().componentType;
-        if (component!=null && component.isResolved()){
+        if (component != null && component.isResolved()) {
             return Array.newInstance(component.getTypeClass(), 0).getClass();
         }
-        throw new GroovyBugError("ClassNode#getTypeClass for "+getName()+" is 
called before the type class is set ");
+        throw new GroovyBugError("ClassNode#getTypeClass for " + getName() + " 
called before the type class is set");
     }
 
-    public boolean hasPackageName(){
-        return redirect().name.indexOf('.')>0;
+    public boolean hasPackageName() {
+        return redirect().name.indexOf('.') > 0;
     }
 
     /**
@@ -1425,18 +1416,17 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
 
     public ClassNode getPlainNodeReference() {
         if (ClassHelper.isPrimitiveType(this)) return this;
-        ClassNode n = new ClassNode(name, modifiers, superClass,null,null);
+        ClassNode n = new ClassNode(name, modifiers, superClass, null, null);
         n.isPrimaryNode = false;
         n.setRedirect(redirect());
         if (isArray()) {
             n.componentType = redirect().getComponentType();
-        } 
+        }
         return n;
     }
 
     public boolean isAnnotationDefinition() {
-        return /* redirect().isPrimaryNode && */
-                isInterface() && (getModifiers() & Opcodes.ACC_ANNOTATION) != 
0;
+        return isInterface() && (getModifiers() & ACC_ANNOTATION) != 0;
     }
 
     public List<AnnotationNode> getAnnotations() {
@@ -1468,25 +1458,25 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     }
 
     public void renameField(String oldName, String newName) {
-        ClassNode r = redirect ();
+        ClassNode r = redirect();
         if (r.fieldIndex == null)
-            r.fieldIndex = new LinkedHashMap<String,FieldNode> ();
+            r.fieldIndex = new LinkedHashMap<String,FieldNode>();
         final Map<String,FieldNode> index = r.fieldIndex;
         index.put(newName, index.remove(oldName));
     }
 
     public void removeField(String oldName) {
-        ClassNode r = redirect ();
+        ClassNode r = redirect();
         if (r.fieldIndex == null)
-            r.fieldIndex = new LinkedHashMap<String,FieldNode> ();
+            r.fieldIndex = new LinkedHashMap<String,FieldNode>();
         final Map<String,FieldNode> index = r.fieldIndex;
         r.fields.remove(index.get(oldName));
         index.remove(oldName);
     }
 
     public boolean isEnum() {
-        return (getModifiers()&Opcodes.ACC_ENUM) != 0;
-     }
+        return (getModifiers() & ACC_ENUM) != 0;
+    }
 
     /**
      * @return iterator of inner classes defined inside this one
@@ -1496,7 +1486,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     }
 
     private Map<CompilePhase, Map<Class<? extends ASTTransformation>, 
Set<ASTNode>>> getTransformInstances() {
-        if(transformInstances == null){
+        if (transformInstances == null) {
             transformInstances = new EnumMap<CompilePhase, Map<Class <? 
extends ASTTransformation>, Set<ASTNode>>>(CompilePhase.class);
             for (CompilePhase phase : CompilePhase.values()) {
                 transformInstances.put(phase, new LinkedHashMap<Class <? 
extends ASTTransformation>, Set<ASTNode>>());
@@ -1506,7 +1496,7 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     }
 
     public boolean isRedirectNode() {
-        return redirect!=null;
+        return (redirect != null);
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java 
b/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
index 3c9d111..0820d55 100644
--- a/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
+++ b/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
@@ -317,12 +317,7 @@ public abstract class CodeVisitorSupport implements 
GroovyCodeVisitor {
     protected void visitListOfExpressions(List<? extends Expression> list) {
         if (list == null) return;
         for (Expression expression : list) {
-            if (expression instanceof SpreadExpression) {
-                Expression spread = ((SpreadExpression) 
expression).getExpression();
-                spread.visit(this);
-            } else {
-                expression.visit(this);
-            }
+            expression.visit(this);
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java 
b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
index 5758fea..84c6be4 100644
--- a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
+++ b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
@@ -20,7 +20,6 @@ package org.codehaus.groovy.ast;
 
 import groovy.lang.GroovyClassLoader;
 import org.codehaus.groovy.GroovyBugError;
-import groovy.transform.Internal;
 import org.codehaus.groovy.control.CompilerConfiguration;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
@@ -46,16 +45,16 @@ import java.util.Map;
  */
 public class CompileUnit {
 
-    private final List<ModuleNode> modules = new ArrayList<ModuleNode>();
-    private final Map<String, ClassNode> classes = new HashMap<String, 
ClassNode>();
+    private final List<ModuleNode> modules = new ArrayList<>();
+    private final Map<String, ClassNode> classes = new HashMap<>();
     private final CompilerConfiguration config;
     private final GroovyClassLoader classLoader;
     private final CodeSource codeSource;
-    private final Map<String, ClassNode> classesToCompile = new 
HashMap<String, ClassNode>();
-    private final Map<String, SourceUnit> classNameToSource = new 
HashMap<String, SourceUnit>();
-    private final Map<String, InnerClassNode> generatedInnerClasses = new 
HashMap();
-    private final Map<String, ConstructedOuterNestedClassNode> 
classesToResolve = new HashMap<>();
-    private ListHashMap metaDataMap = null;
+    private final Map<String, ClassNode> classesToCompile = new HashMap<>();
+    private final Map<String, SourceUnit> classNameToSource = new HashMap<>();
+    private final Map<String, InnerClassNode> generatedInnerClasses = new 
HashMap<>();
+
+    private ListHashMap metaDataMap;
 
     public CompileUnit(GroovyClassLoader classLoader, CompilerConfiguration 
config) {
         this(classLoader, null, config);
@@ -171,49 +170,36 @@ public class CompileUnit {
         classNameToSource.put(node.getName(), location);
     }
 
-    public SourceUnit getScriptSourceLocation(String className) {
-        return classNameToSource.get(className);
+    @Deprecated
+    public Map<String, ClassNode> getClassesToCompile() {
+        return classesToCompile;
+    }
+
+    public Iterator<String> iterateClassNodeToCompile() {
+        return classesToCompile.keySet().iterator();
     }
 
     public boolean hasClassNodeToCompile() {
         return !classesToCompile.isEmpty();
     }
 
-    public Iterator<String> iterateClassNodeToCompile() {
-        return classesToCompile.keySet().iterator();
+    public void addGeneratedInnerClass(InnerClassNode icn) {
+        generatedInnerClasses.put(icn.getName(), icn);
     }
 
     public InnerClassNode getGeneratedInnerClass(String name) {
         return generatedInnerClasses.get(name);
     }
-    
-    public void addGeneratedInnerClass(InnerClassNode icn) {
-        generatedInnerClasses.put(icn.getName(), icn);
-    }
 
     public Map<String, InnerClassNode> getGeneratedInnerClasses() {
         return Collections.unmodifiableMap(generatedInnerClasses);
     }
 
-    public Map<String, ClassNode> getClassesToCompile() {
-        return classesToCompile;
-    }
-
-    public Map<String, ConstructedOuterNestedClassNode> getClassesToResolve() {
-        return classesToResolve;
+    public SourceUnit getScriptSourceLocation(String scriptClassName) {
+        return classNameToSource.get(scriptClassName);
     }
 
     /**
-     * Add a constructed class node as a placeholder to resolve outer nested 
class further.
-     *
-     * @param cn the constructed class node
-     */
-    public void addClassNodeToResolve(ConstructedOuterNestedClassNode cn) {
-        classesToResolve.put(cn.getUnresolvedName(), cn);
-    }
-
-
-    /**
      * Gets the node meta data for the provided key.
      *
      * @param key - the meta data key
@@ -288,12 +274,27 @@ public class CompileUnit {
         return metaDataMap;
     }
 
+    
//--------------------------------------------------------------------------
+
+    private final Map<String, ConstructedOuterNestedClassNode> 
classesToResolve = new HashMap<>();
+
+    /**
+     * Add a constructed class node as a placeholder to resolve outer nested 
class further.
+     *
+     * @param cn the constructed class node
+     */
+    public void addClassNodeToResolve(ConstructedOuterNestedClassNode cn) {
+        classesToResolve.put(cn.getUnresolvedName(), cn);
+    }
 
+    public Map<String, ConstructedOuterNestedClassNode> getClassesToResolve() {
+        return classesToResolve;
+    }
 
     /**
      * Represents a resolved type as a placeholder, SEE GROOVY-7812
      */
-    @Internal
+    @groovy.transform.Internal
     public static class ConstructedOuterNestedClassNode extends ClassNode {
         private final ClassNode enclosingClassNode;
 
diff --git a/src/main/java/org/codehaus/groovy/ast/GenericsType.java 
b/src/main/java/org/codehaus/groovy/ast/GenericsType.java
index 276bfd8..c67db97 100644
--- a/src/main/java/org/codehaus/groovy/ast/GenericsType.java
+++ b/src/main/java/org/codehaus/groovy/ast/GenericsType.java
@@ -36,7 +36,7 @@ import static 
org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE;
  */
 public class GenericsType extends ASTNode {
     public static final GenericsType[] EMPTY_ARRAY = new GenericsType[0];
-    
+
     private final ClassNode[] upperBounds;
     private final ClassNode lowerBound;
     private ClassNode type;
@@ -62,13 +62,12 @@ public class GenericsType extends ASTNode {
         return type;
     }
 
-    public void setType(final ClassNode type) {
-            this.type = type;
+    public void setType(ClassNode type) {
+        this.type = type;
     }
 
     public String toString() {
-        Set<String> visited = new HashSet<String>();
-        return toString(visited);
+        return toString(new HashSet<String>());
     }
 
     private String toString(Set<String> visited) {
@@ -102,7 +101,6 @@ public class GenericsType extends ASTNode {
     }
 
     private String genericsBounds(ClassNode theType, Set<String> visited) {
-
         StringBuilder ret = new StringBuilder();
 
         if (theType.isArray()) {
@@ -344,7 +342,10 @@ public class GenericsType extends ASTNode {
                             // class node are not parameterized. This means 
that we must create a
                             // new class node with the parameterized types 
that the current class node
                             // has defined.
-                            ClassNode node = 
GenericsUtils.parameterizeType(classNode, anInterface);
+                            ClassNode node = anInterface;
+                            if (node.getGenericsTypes() != null) {
+                                node = 
GenericsUtils.parameterizeType(classNode, node);
+                            }
                             return compareGenericsWithBound(node, bound);
                         }
                     }
diff --git a/src/main/java/org/codehaus/groovy/ast/ImportNode.java 
b/src/main/java/org/codehaus/groovy/ast/ImportNode.java
index b011104..df249bb 100644
--- a/src/main/java/org/codehaus/groovy/ast/ImportNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ImportNode.java
@@ -28,7 +28,6 @@ public class ImportNode extends AnnotatedNode implements 
Opcodes {
     private final ClassNode type;
     private final String alias;
     private final String fieldName;
-    // TODO use PackageNode instead here?
     private final String packageName;
     private final boolean isStar;
     private final boolean isStatic;
@@ -104,12 +103,12 @@ public class ImportNode extends AnnotatedNode implements 
Opcodes {
             return "import static " + typeName + ".*";
         }
         if (isStatic) {
-            if (alias != null && alias.length() != 0 && 
!alias.equals(fieldName)) {
+            if (alias != null && !alias.isEmpty() && !alias.equals(fieldName)) 
{
                 return "import static " + typeName + "." + fieldName + " as " 
+ alias;
             }
             return "import static " + typeName + "." + fieldName;
         }
-        if (alias == null || alias.length() == 0) {
+        if (alias == null || alias.isEmpty()) {
             return "import " + typeName;
         }
         return "import " + typeName + " as " + alias;
diff --git a/src/main/java/org/codehaus/groovy/ast/MethodNode.java 
b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
index 8ce5415..aa844b5 100644
--- a/src/main/java/org/codehaus/groovy/ast/MethodNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
@@ -27,7 +27,7 @@ import java.lang.reflect.Modifier;
 import java.util.List;
 
 /**
- * Represents a method declaration
+ * Represents a method declaration.
  */
 public class MethodNode extends AnnotatedNode implements Opcodes {
 
@@ -37,7 +37,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     private boolean syntheticPublic;
     private ClassNode returnType;
     private Parameter[] parameters;
-    private boolean hasDefaultValue = false;
+    private boolean hasDefaultValue;
     private Statement code;
     private boolean dynamicReturnType;
     private VariableScope variableScope;
@@ -45,7 +45,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     private boolean staticConstructor;
 
     // type spec for generics
-    private GenericsType[] genericsTypes = null;
+    private GenericsType[] genericsTypes;
     private boolean hasDefault;
 
     // cached data
@@ -56,12 +56,11 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     public MethodNode(String name, int modifiers, ClassNode returnType, 
Parameter[] parameters, ClassNode[] exceptions, Statement code) {
         this.name = name;
         this.modifiers = modifiers;
+        this.exceptions = exceptions;
         this.code = code;
         setReturnType(returnType);
         setParameters(parameters);
-        this.hasDefault = false;
-        this.exceptions = exceptions;
-        this.staticConstructor = (name != null && name.equals("<clinit>"));
+        this.staticConstructor = "<clinit>".equals(name);
     }
 
     /**
@@ -83,7 +82,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     }
 
     public boolean isVoidMethod() {
-        return returnType == ClassHelper.VOID_TYPE;
+        return ClassHelper.VOID_TYPE.equals(getReturnType());
     }
 
     public Statement getCode() {
@@ -114,6 +113,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     public void setParameters(Parameter[] parameters) {
         invalidateCachedData();
         VariableScope scope = new VariableScope();
+        this.hasDefaultValue = false;
         this.parameters = parameters;
         if (parameters != null && parameters.length > 0) {
             for (Parameter para : parameters) {
@@ -174,7 +174,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
     }
 
     public boolean isPackageScope() {
-        return !(this.isPrivate() || this.isProtected() || this.isPublic());
+        return (modifiers & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED)) == 0;
     }
 
     public boolean hasDefaultValue() {
@@ -193,7 +193,7 @@ public class MethodNode extends AnnotatedNode implements 
Opcodes {
      * @see ModuleNode createStatementsClass().
      */
     public void setIsScriptBody() {
-        setNodeMetaData(SCRIPT_BODY_METHOD_KEY, true);
+        setNodeMetaData(SCRIPT_BODY_METHOD_KEY, Boolean.TRUE);
     }
 
     public String toString() {
diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java 
b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index f5e68c5..88d16c1 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -23,6 +23,7 @@ import org.codehaus.groovy.ast.expr.ArgumentListExpression;
 import org.codehaus.groovy.ast.expr.ClassExpression;
 import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
+import org.codehaus.groovy.ast.expr.StaticMethodCallExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.codehaus.groovy.ast.stmt.ExpressionStatement;
@@ -52,39 +53,32 @@ import java.util.Map;
  */
 public class ModuleNode extends ASTNode implements Opcodes {
 
-    private final BlockStatement statementBlock = new BlockStatement();
-    List<ClassNode> classes = new LinkedList<ClassNode>();
-    private final List<MethodNode> methods = new ArrayList<MethodNode>();
-    private final Map<String, ImportNode> imports = new HashMap<String, 
ImportNode>();
-    private final List<ImportNode> starImports = new ArrayList<ImportNode>();
-    private final Map<String, ImportNode> staticImports = new 
LinkedHashMap<String, ImportNode>();
-    private final Map<String, ImportNode> staticStarImports = new 
LinkedHashMap<String, ImportNode>();
+    private List<ClassNode> classes = new LinkedList<>();
+    private final List<MethodNode> methods = new ArrayList<>();
+    private final Map<String, ImportNode> imports = new HashMap<>();
+    private final List<ImportNode> starImports = new ArrayList<>();
+    private final Map<String, ImportNode> staticImports = new 
LinkedHashMap<>();
+    private final Map<String, ImportNode> staticStarImports = new 
LinkedHashMap<>();
     private CompileUnit unit;
     private PackageNode packageNode;
     private String description;
     private boolean createClassForStatements = true;
     private transient SourceUnit context;
-    private boolean importsResolved = false;
+    private boolean importsResolved;
     private ClassNode scriptDummy;
-    private String mainClassName = null;
+    private String mainClassName;
+    private final BlockStatement statementBlock = new BlockStatement();
+
     private final Parameter[] SCRIPT_CONTEXT_CTOR = {new 
Parameter(ClassHelper.BINDING_TYPE, "context")};
 
-    public ModuleNode (SourceUnit context ) {
+    public ModuleNode(SourceUnit context) {
         this.context = context;
     }
 
-    public ModuleNode (CompileUnit unit) {
+    public ModuleNode(CompileUnit unit) {
         this.unit = unit;
     }
 
-    public BlockStatement getStatementBlock() {
-        return statementBlock;
-    }
-
-    public List<MethodNode> getMethods() {
-        return methods;
-    }
-
     public List<ClassNode> getClasses() {
         if (createClassForStatements && (!statementBlock.isEmpty() || 
!methods.isEmpty() || isPackageInfo())) {
             ClassNode mainClass = createStatementsClass();
@@ -97,25 +91,33 @@ public class ModuleNode extends ASTNode implements Opcodes {
         return classes;
     }
 
-    private boolean isPackageInfo() {
-        return context != null && context.getName() != null && 
context.getName().endsWith("package-info.groovy");
+    public List<MethodNode> getMethods() {
+        return methods;
     }
 
     public List<ImportNode> getImports() {
-        return new ArrayList<ImportNode>(imports.values());
+        return new ArrayList<>(imports.values());
     }
 
     public List<ImportNode> getStarImports() {
         return starImports;
     }
 
+    public Map<String, ImportNode> getStaticImports() {
+        return staticImports;
+    }
+
+    public Map<String, ImportNode> getStaticStarImports() {
+        return staticStarImports;
+    }
+
     /**
      * @param alias the name of interest
-     * @return the class node for the given alias or null if none is available
+     * @return the import type for the given alias or null if none is available
      */
     public ClassNode getImportType(String alias) {
         ImportNode importNode = imports.get(alias);
-        return importNode == null ? null : importNode.getType();
+        return (importNode != null ? importNode.getType() : null);
     }
 
     /**
@@ -127,33 +129,61 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
     }
 
     public void addImport(String alias, ClassNode type) {
-        addImport(alias, type, new ArrayList<AnnotationNode>());
+        addImport(alias, type, Collections.<AnnotationNode>emptyList());
     }
 
     public void addImport(String alias, ClassNode type, List<AnnotationNode> 
annotations) {
         ImportNode importNode = new ImportNode(type, alias);
-        imports.put(alias, importNode);
         importNode.addAnnotations(annotations);
+        imports.put(alias, importNode);
+
         storeLastAddedImportNode(importNode);
     }
 
     public void addStarImport(String packageName) {
-        addStarImport(packageName, new ArrayList<AnnotationNode>());
+        addStarImport(packageName, Collections.<AnnotationNode>emptyList());
     }
 
     public void addStarImport(String packageName, List<AnnotationNode> 
annotations) {
         ImportNode importNode = new ImportNode(packageName);
         importNode.addAnnotations(annotations);
         starImports.add(importNode);
+
         storeLastAddedImportNode(importNode);
     }
 
+    public void addStaticImport(ClassNode type, String fieldName, String 
alias) {
+        addStaticImport(type, fieldName, alias, 
Collections.<AnnotationNode>emptyList());
+    }
+
+    public void addStaticImport(ClassNode type, String fieldName, String 
alias, List<AnnotationNode> annotations) {
+        ImportNode node = new ImportNode(type, fieldName, alias);
+        node.addAnnotations(annotations);
+        ImportNode prev = staticImports.put(alias, node);
+        if (prev != null) staticImports.put(prev.toString(), prev);
+
+        storeLastAddedImportNode(node);
+    }
+
+    public void addStaticStarImport(String name, ClassNode type) {
+        addStaticStarImport(name, type, 
Collections.<AnnotationNode>emptyList());
+    }
+
+    public void addStaticStarImport(String name, ClassNode type, 
List<AnnotationNode> annotations) {
+        ImportNode node = new ImportNode(type);
+        node.addAnnotations(annotations);
+        staticStarImports.put(name, node);
+
+        storeLastAddedImportNode(node);
+    }
+
     public void addStatement(Statement node) {
         statementBlock.addStatement(node);
     }
 
     public void addClass(ClassNode node) {
-        if(classes.isEmpty()) mainClassName = node.getName();
+        if (classes.isEmpty())
+            mainClassName = node.getName();
         classes.add(node);
         node.setModule(this);
         addToCompileUnit(node);
@@ -174,46 +204,41 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
     }
 
     public String getPackageName() {
-        return packageNode == null ? null : packageNode.getName();
+        return (hasPackage() ? packageNode.getName() : null);
     }
 
     public PackageNode getPackage() {
         return packageNode;
     }
 
-    // TODO don't allow override?
     public void setPackage(PackageNode packageNode) {
         this.packageNode = packageNode;
     }
 
-    // TODO don't allow override?
     public void setPackageName(String packageName) {
         this.packageNode = new PackageNode(packageName);
     }
 
-    public boolean hasPackageName(){
-        return packageNode != null && packageNode.getName() != null;
+    public boolean hasPackageName() {
+        return (packageNode != null && packageNode.getName() != null);
     }
 
-    public boolean hasPackage(){
-        return this.packageNode != null;
+    public boolean hasPackage() {
+        return (packageNode != null);
     }
 
-    public SourceUnit getContext() {
-        return context;
+    private boolean isPackageInfo() {
+        return (context != null && context.getName() != null && 
context.getName().endsWith("package-info.groovy"));
     }
 
     /**
      * @return the underlying character stream description
      */
     public String getDescription() {
-        if( context != null )
-        {
+        if (context != null) {
             return context.getName();
-        }
-        else
-        {
-            return this.description;
+        } else {
+            return description;
         }
     }
 
@@ -221,6 +246,10 @@ public class ModuleNode extends ASTNode implements Opcodes 
{
         this.description = description;
     }
 
+    public SourceUnit getContext() {
+        return context;
+    }
+
     public CompileUnit getUnit() {
         return unit;
     }
@@ -230,7 +259,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
     }
 
     public ClassNode getScriptClassDummy() {
-        if (scriptDummy!=null) {
+        if (scriptDummy != null) {
             setScriptBaseClassFromConfig(scriptDummy);
             return scriptDummy;
         }
@@ -275,6 +304,12 @@ public class ModuleNode extends ASTNode implements Opcodes 
{
         }
     }
 
+    private static Parameter[] finalParam(final ClassNode type, final String 
name) {
+        Parameter parameter = new Parameter(type, name);
+        parameter.setModifiers(ACC_FINAL);
+        return new Parameter[]{parameter};
+    }
+
     protected ClassNode createStatementsClass() {
         ClassNode classNode = getScriptClassDummy();
         if (classNode.getName().endsWith("package-info")) {
@@ -283,21 +318,25 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
 
         handleMainMethodIfPresent(methods);
 
-        // return new Foo(new ShellContext(args)).run()
         classNode.addMethod(
             new MethodNode(
                 "main",
                 ACC_PUBLIC | ACC_STATIC,
                 ClassHelper.VOID_TYPE,
-                new Parameter[] { new 
Parameter(ClassHelper.STRING_TYPE.makeArray(), "args")},
+                finalParam(ClassHelper.STRING_TYPE.makeArray(), "args"),
                 ClassNode.EMPTY_ARRAY,
                 new ExpressionStatement(
-                    new MethodCallExpression(
-                        new 
ClassExpression(ClassHelper.make(InvokerHelper.class)),
+                    new StaticMethodCallExpression(
+                        ClassHelper.make(InvokerHelper.class),
                         "runScript",
                         new ArgumentListExpression(
-                                new ClassExpression(classNode),
-                                new VariableExpression("args"))))));
+                            new ClassExpression(classNode),
+                            new VariableExpression("args")
+                        )
+                    )
+                )
+            )
+        );
 
         MethodNode methodNode = new MethodNode("run", ACC_PUBLIC, 
ClassHelper.OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, 
statementBlock);
         methodNode.setIsScriptBody();
@@ -306,12 +345,13 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
         classNode.addConstructor(ACC_PUBLIC, Parameter.EMPTY_ARRAY, 
ClassNode.EMPTY_ARRAY, new BlockStatement());
 
         Statement stmt;
-        // A script's contextual constructor should call it's super class' 
contextual constructor, if it has one.
+        // A script's contextual constructor should call its super class' 
contextual constructor, if it has one.
         // In practice this will always be true because currently this visitor 
is run before the AST transformations
         // (like @BaseScript) that could change this.  But this is cautious 
and anticipates possible compiler changes.
         if 
(classNode.getSuperClass().getDeclaredConstructor(SCRIPT_CONTEXT_CTOR) != null) 
{
             stmt = new ExpressionStatement(
-                    new ConstructorCallExpression(ClassNode.SUPER,
+                    new ConstructorCallExpression(
+                            ClassNode.SUPER,
                             new ArgumentListExpression(
                                     new VariableExpression("context"))));
         } else {
@@ -326,22 +366,16 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
 
         classNode.addConstructor(
             ACC_PUBLIC,
-            new Parameter[] { new Parameter(ClassHelper.make(Binding.class), 
"context")},
+            finalParam(ClassHelper.make(Binding.class), "context"),
             ClassNode.EMPTY_ARRAY,
             stmt);
 
-        for (MethodNode node : methods) {
-            int modifiers = node.getModifiers();
-            if ((modifiers & ACC_ABSTRACT) != 0) {
-                throw new RuntimeException(
-                    "Cannot use abstract methods in a script, they are only 
available inside classes. Method: "
-                        + node.getName());
+        for (MethodNode method : methods) {
+            if (method.isAbstract()) {
+                throw new RuntimeException("Cannot use abstract methods in a 
script" +
+                    ", they are only available inside classes. Method: " + 
method.getName());
             }
-            // br: the old logic seems to add static to all def f().... in a 
script, which makes enclosing
-            // inner classes (including closures) in a def function difficult. 
Comment it out.
-            node.setModifiers(modifiers /*| ACC_STATIC*/);
-
-            classNode.addMethod(node);
+            classNode.addMethod(method);
         }
         return classNode;
     }
@@ -349,11 +383,11 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
     /*
      * If a main method is provided by user, account for it under run() as 
scripts generate their own 'main' so they can run.
      */
-    private void handleMainMethodIfPresent(List methods) {
+    private void handleMainMethodIfPresent(List<MethodNode> methods) {
         boolean found = false;
-        for (Iterator iter = methods.iterator(); iter.hasNext();) {
-            MethodNode node = (MethodNode) iter.next();
-            if(node.getName().equals("main")) {
+        for (Iterator<MethodNode> iter = methods.iterator(); iter.hasNext(); ) 
{
+            MethodNode node = iter.next();
+            if (node.getName().equals("main")) {
                 if (node.isStatic() && node.getParameters().length == 1) {
                     boolean retTypeMatches, argTypeMatches;
                     ClassNode argType = node.getParameters()[0].getType();
@@ -368,7 +402,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
                             found = true;
                         }
                         // if script has both loose statements as well as 
main(), then main() is ignored
-                        if(statementBlock.isEmpty()) {
+                        if (statementBlock.isEmpty()) {
                             addStatement(node.getCode());
                         }
                         iter.remove();
@@ -415,19 +449,18 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
 
     public void sortClasses() {
         if (isEmpty()) return;
-        List<ClassNode> classes = getClasses();
-        LinkedList<ClassNode> sorted = new LinkedList<ClassNode>();
-        int level=1;
-        while (!classes.isEmpty()) {
-            for (Iterator<ClassNode> cni = classes.iterator(); cni.hasNext();) 
{
-                ClassNode cn = cni.next();
-                ClassNode sn = cn;
-                for (int i=0; sn!=null && i<level; i++) sn = 
sn.getSuperClass();
-                if (sn!=null && sn.isPrimaryClassNode()) continue;
-                cni.remove();
-                sorted.addLast(cn);
+        List<ClassNode> sorted = new LinkedList<>(), todo = getClasses();
+        int level = 1;
+        while (!todo.isEmpty()) {
+            for (Iterator<ClassNode> it = todo.iterator(); it.hasNext(); ) {
+                ClassNode cn = it.next(), sc = cn;
+
+                for (int i = 0; sc != null && i < level; i += 1) sc = 
sc.getSuperClass();
+                if (sc != null && sc.isPrimaryClassNode()) continue;
+                sorted.add(cn);
+                it.remove();
             }
-            level++;
+            level += 1;
         }
         this.classes = sorted;
     }
@@ -440,41 +473,10 @@ public class ModuleNode extends ASTNode implements 
Opcodes {
         this.importsResolved = importsResolved;
     }
 
-    public Map<String, ImportNode> getStaticImports() {
-        return staticImports;
-    }
-
-    public Map<String, ImportNode> getStaticStarImports() {
-        return staticStarImports;
-    }
-
-    public void addStaticImport(ClassNode type, String fieldName, String 
alias) {
-        addStaticImport(type, fieldName, alias, 
Collections.<AnnotationNode>emptyList());
-    }
-
-    public void addStaticImport(ClassNode type, String fieldName, String 
alias, List<AnnotationNode> annotations) {
-        ImportNode node = new ImportNode(type, fieldName, alias);
-        node.addAnnotations(annotations);
-        ImportNode prev = staticImports.put(alias, node);
-        if (prev != null) staticImports.put(prev.toString(), prev);
-        storeLastAddedImportNode(node);
-    }
-
-    public void addStaticStarImport(String name, ClassNode type) {
-        addStaticStarImport(name, type, 
Collections.<AnnotationNode>emptyList());
-    }
-
-    public void addStaticStarImport(String name, ClassNode type, 
List<AnnotationNode> annotations) {
-        ImportNode node = new ImportNode(type);
-        node.addAnnotations(annotations);
-        staticStarImports.put(name, node);
-        storeLastAddedImportNode(node);
-    }
-
     // This method only exists as a workaround for GROOVY-6094
     // In order to keep binary compatibility
     private void storeLastAddedImportNode(final ImportNode node) {
-        if (getNodeMetaData(ImportNode.class)==ImportNode.class) {
+        if (getNodeMetaData(ImportNode.class) == ImportNode.class) {
             putNodeMetaData(ImportNode.class, node);
         }
     }
@@ -482,4 +484,8 @@ public class ModuleNode extends ASTNode implements Opcodes {
     public String getMainClassName() {
         return mainClassName;
     }
+
+    public BlockStatement getStatementBlock() {
+        return statementBlock;
+    }
 }
diff --git a/src/main/java/org/codehaus/groovy/ast/Parameter.java 
b/src/main/java/org/codehaus/groovy/ast/Parameter.java
index 102ec47..65bebe1 100644
--- a/src/main/java/org/codehaus/groovy/ast/Parameter.java
+++ b/src/main/java/org/codehaus/groovy/ast/Parameter.java
@@ -20,25 +20,23 @@ package org.codehaus.groovy.ast;
 
 import org.codehaus.groovy.ast.expr.Expression;
 
-
 /**
  * Represents a parameter on a constructor or method call. The type name is
  * optional - it defaults to java.lang.Object if unknown.
  */
 public class Parameter extends AnnotatedNode implements Variable {
 
-    public static final Parameter[] EMPTY_ARRAY = {
-    };
+    public static final Parameter[] EMPTY_ARRAY = {};
 
     private ClassNode type;
     private final String name;
+    private ClassNode originType;
     private boolean dynamicTyped;
+    private boolean closureShare;
     private Expression defaultValue;
     private boolean hasDefaultValue;
     private boolean inStaticContext;
-    private boolean closureShare=false;
     private int modifiers;
-    private ClassNode originType=ClassHelper.DYNAMIC_TYPE;
 
     public Parameter(ClassNode type, String name) {
         this.name = name;
@@ -46,7 +44,7 @@ public class Parameter extends AnnotatedNode implements 
Variable {
         this.originType = type;
         this.hasDefaultValue = false;
     }
-    
+
     public Parameter(ClassNode type, String name, Expression defaultValue) {
         this(type,name);
         this.defaultValue = defaultValue;
@@ -69,11 +67,11 @@ public class Parameter extends AnnotatedNode implements 
Variable {
         this.type = type;
         dynamicTyped |= type==ClassHelper.DYNAMIC_TYPE;
     }
-    
+
     public boolean hasInitialExpression() {
         return this.hasDefaultValue;
     }
-    
+
     /**
      * @return the default value expression for this parameter or null if
      * no default value is specified
@@ -81,16 +79,16 @@ public class Parameter extends AnnotatedNode implements 
Variable {
     public Expression getInitialExpression() {
         return defaultValue;
     }
-    
+
     public void setInitialExpression(Expression init) {
         defaultValue = init;
         hasDefaultValue = defaultValue != null;
     }
-    
+
     public boolean isInStaticContext() {
         return inStaticContext;
     }
-    
+
     public void setInStaticContext(boolean inStaticContext) {
         this.inStaticContext = inStaticContext;
     }
@@ -104,7 +102,7 @@ public class Parameter extends AnnotatedNode implements 
Variable {
     }
 
     public void setClosureSharedVariable(boolean inClosure) {
-        closureShare = inClosure;        
+        closureShare = inClosure;
     }
 
     public int getModifiers() {
@@ -114,7 +112,7 @@ public class Parameter extends AnnotatedNode implements 
Variable {
     public ClassNode getOriginType() {
         return originType;
     }
-    
+
     public void setOriginType(ClassNode cn) {
         originType = cn;
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/expr/ConstantExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/ConstantExpression.java
index 1708c10..c4a7139 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/ConstantExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/ConstantExpression.java
@@ -22,7 +22,7 @@ import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
 
 /**
- * Represents a constant expression such as null, true, false
+ * Represents a constant expression such as null, true, false.
  */
 public class ConstantExpression extends Expression {
     // The following fields are only used internally; every occurrence of a 
user-defined expression of the same kind
@@ -34,12 +34,11 @@ public class ConstantExpression extends Expression {
     public static final ConstantExpression EMPTY_STRING = new 
ConstantExpression("");
     public static final ConstantExpression PRIM_TRUE = new 
ConstantExpression(Boolean.TRUE, true);
     public static final ConstantExpression PRIM_FALSE = new 
ConstantExpression(Boolean.FALSE, true);
-    //public static final Expression EMPTY_ARRAY = new PropertyExpression(new 
ClassExpression(ArgumentListExpression.class.getName()), "EMPTY_ARRAY");
 
     // the following fields are only used internally; there are no 
user-defined expressions of the same kind
     public static final ConstantExpression VOID = new 
ConstantExpression(Void.class);
     public static final ConstantExpression EMPTY_EXPRESSION = new 
ConstantExpression(null);
-    
+
     private final Object value;
     private String constantName;
 
@@ -74,7 +73,7 @@ public class ConstantExpression extends Expression {
     }
 
     public String toString() {
-        return "ConstantExpression[" + value + "]";
+        return super.toString() + "[" + value + "]";
     }
 
     public void visit(GroovyCodeVisitor visitor) {
@@ -87,13 +86,13 @@ public class ConstantExpression extends Expression {
 
     /**
      * @return the value of this constant expression
-     */    
+     */
     public Object getValue() {
         return value;
     }
 
     public String getText() {
-        return (value == null) ? "null" : value.toString();
+        return (value == null ? "null" : value.toString());
     }
 
     public String getConstantName() {
diff --git 
a/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
index cbd5c7b..11512fb 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
@@ -34,6 +34,7 @@ public class ConstructorCallExpression extends Expression 
implements MethodCall
         super.setType(type);
         if (!(arguments instanceof TupleExpression)) {
             this.arguments = new TupleExpression(arguments);
+            this.arguments.setSourcePosition(arguments);
         } else {
             this.arguments = arguments;
         }
diff --git a/src/main/java/org/codehaus/groovy/ast/expr/EmptyExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/EmptyExpression.java
index 21340d8..f5ecea7 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/EmptyExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/EmptyExpression.java
@@ -21,11 +21,12 @@ package org.codehaus.groovy.ast.expr;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
 
 /**
- * This class is a place holder for an empty expression. 
- * Empty expression are used in closures lists like (;). During
- * class Generation this expression should be either ignored or
- * replace with a null value.
- *   
+ * This class is a place holder for an empty expression.
+ * <p>
+ * Empty expressions are used in closures lists like (;). During
+ * class generation this expression should be either ignored or
+ * replaced with a null value.
+ *
  * @see org.codehaus.groovy.ast.stmt.EmptyStatement
  */
 public class EmptyExpression extends Expression {
diff --git a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
index f0c362a..eb109f3 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
@@ -29,53 +29,59 @@ public class FieldExpression extends Expression {
 
     private final FieldNode field;
     private boolean useRef;
-    
-    public FieldExpression(FieldNode field) {
+
+    public FieldExpression(final FieldNode field) {
         this.field = field;
     }
-    
-    public void visit(GroovyCodeVisitor visitor) {
+
+    @Override
+    public void visit(final GroovyCodeVisitor visitor) {
         visitor.visitFieldExpression(this);
     }
 
-    public Expression transformExpression(ExpressionTransformer transformer) {
+    @Override
+    public Expression transformExpression(final ExpressionTransformer 
transformer) {
         return this;
     }
-    
-    public String getFieldName() {
-        return field.getName();
-    }
 
     public FieldNode getField() {
         return field;
     }
 
+    public String getFieldName() {
+        return field.getName();
+    }
+
+    @Override
     public String getText() {
-        return "this." + field.getName();
+        return "this." + getFieldName();
     }
 
-    public boolean isDynamicTyped() {
-        return field.isDynamicTyped();
+    @Override
+    public ClassNode getType() {
+        return field.getType();
     }
 
-    public void setType(ClassNode type) {
+    @Override
+    public void setType(final ClassNode type) {
         super.setType(type);
         field.setType(type);
     }
-    
-    public ClassNode getType() {
-        return field.getType();
-    }
-    
-    public void setUseReferenceDirectly(boolean useRef) {
-        this.useRef = useRef;        
+
+    public boolean isDynamicTyped() {
+        return field.isDynamicTyped();
     }
-    
+
     public boolean isUseReferenceDirectly() {
         return useRef;
     }
-    
+
+    public void setUseReferenceDirectly(final boolean useRef) {
+        this.useRef = useRef;
+    }
+
+    @Override
     public String toString() {
-        return "field("+getType()+" "+getFieldName()+")";
+        return "field(" + getType() + " " + getFieldName() + ")";
     }
 }
diff --git 
a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
index f0250a8..e7a6fd5 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
@@ -32,27 +32,27 @@ public class MethodCallExpression extends Expression 
implements MethodCall {
     private Expression objectExpression;
     private Expression method;
     private Expression arguments;
-    private boolean spreadSafe = false;
-    private boolean safe = false;
+    private boolean safe;
+    private boolean spreadSafe;
     private boolean implicitThis;
-
+    private boolean usesGenerics;
     // type spec for generics
-    private GenericsType[] genericsTypes = null;
-    private boolean usesGenerics = false;
+    private GenericsType[] genericsTypes;
 
     private MethodNode target;
 
     public static final Expression NO_ARGUMENTS = new TupleExpression();
 
     public MethodCallExpression(Expression objectExpression, String method, 
Expression arguments) {
-        this(objectExpression,new ConstantExpression(method),arguments);
+        this(objectExpression, new ConstantExpression(method), arguments);
     }
 
     public MethodCallExpression(Expression objectExpression, Expression 
method, Expression arguments) {
         this.objectExpression = objectExpression;
         this.method = method;
-        if (!(arguments instanceof TupleExpression)){
+        if (!(arguments instanceof TupleExpression)) {
             this.arguments = new TupleExpression(arguments);
+            this.arguments.setSourcePosition(arguments);
         } else {
             this.arguments = arguments;
         }
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java 
b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index feacc0d..b42d95f 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -87,7 +87,7 @@ public class GeneralUtils {
     public static final Token AND = Token.newSymbol(Types.LOGICAL_AND, -1, -1);
     public static final Token OR = Token.newSymbol(Types.LOGICAL_OR, -1, -1);
     public static final Token CMP = Token.newSymbol(Types.COMPARE_TO, -1, -1);
-    private static final Token INSTANCEOF = 
Token.newSymbol(Types.KEYWORD_INSTANCEOF, -1, -1);
+    public static final Token INSTANCEOF = 
Token.newSymbol(Types.KEYWORD_INSTANCEOF, -1, -1);
     private static final Token PLUS = Token.newSymbol(Types.PLUS, -1, -1);
     private static final Token INDEX = Token.newSymbol("[", -1, -1);
 
@@ -743,6 +743,14 @@ public class GeneralUtils {
         return new TryCatchStatement(tryStatement, finallyStatement);
     }
 
+    public static TryCatchStatement tryCatchS(final Statement tryStatement, 
final Statement finallyStatement, final CatchStatement... catchStatements) {
+        TryCatchStatement result = new TryCatchStatement(tryStatement, 
finallyStatement);
+        for (CatchStatement catchStatement : catchStatements) {
+            result.addCatch(catchStatement);
+        }
+        return result;
+    }
+
     public static VariableExpression varX(final String name) {
         return new VariableExpression(name);
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java 
b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index cdd3bb4..7bf9c84 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -57,7 +57,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.codehaus.groovy.ast.GenericsType.GenericsTypeName;
 import static org.codehaus.groovy.runtime.DefaultGroovyMethods.plus;
 import static 
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.getCorrectedClassNode;
 import static 
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf;
@@ -67,7 +66,7 @@ import static 
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implem
  */
 public class GenericsUtils {
     public static final GenericsType[] EMPTY_GENERICS_ARRAY = 
GenericsType.EMPTY_ARRAY;
-    public static final String JAVA_LANG_OBJECT = "java.lang.Object";
+    public static final String JAVA_LANG_OBJECT = ClassHelper.OBJECT;
 
     /**
      * Given a parameterized type and a generic type information, aligns 
actual type parameters. For example, if a
@@ -145,8 +144,8 @@ public class GenericsUtils {
         return gt;
     }
 
-    public static Map<GenericsTypeName, GenericsType> 
extractPlaceholders(ClassNode cn) {
-        Map<GenericsTypeName, GenericsType> ret = new 
HashMap<GenericsTypeName, GenericsType>();
+    public static Map<GenericsType.GenericsTypeName, GenericsType> 
extractPlaceholders(ClassNode cn) {
+        Map<GenericsType.GenericsTypeName, GenericsType> ret = new HashMap<>();
         extractPlaceholders(cn, ret);
         return ret;
     }
@@ -158,7 +157,7 @@ public class GenericsUtils {
      * @param node the class node to check
      * @param map the generics type information collector
      */
-    public static void extractPlaceholders(ClassNode node, 
Map<GenericsTypeName, GenericsType> map) {
+    public static void extractPlaceholders(ClassNode node, 
Map<GenericsType.GenericsTypeName, GenericsType> map) {
         if (node == null) return;
 
         if (node.isArray()) {
@@ -184,7 +183,7 @@ public class GenericsUtils {
         for (int i = 0; i < redirectGenericsTypes.length; i++) {
             GenericsType redirectType = redirectGenericsTypes[i];
             if (redirectType.isPlaceholder()) {
-                GenericsTypeName name = new 
GenericsTypeName(redirectType.getName());
+                GenericsType.GenericsTypeName name = new 
GenericsType.GenericsTypeName(redirectType.getName());
                 if (!map.containsKey(name)) {
                     GenericsType value = parameterized[i];
                     map.put(name, value);
@@ -321,7 +320,7 @@ public class GenericsUtils {
         if (type.isArray()) {
             return makeClassSafeWithGenerics(type.getComponentType(), 
genericTypes).makeArray();
         }
-        GenericsType[] gtypes = GenericsType.EMPTY_ARRAY;
+        GenericsType[] gtypes = EMPTY_GENERICS_ARRAY;
         if (genericTypes != null) {
             gtypes = new GenericsType[genericTypes.length];
             System.arraycopy(genericTypes, 0, gtypes, 0, gtypes.length);
@@ -377,7 +376,7 @@ public class GenericsUtils {
         }
         if (type == null) type = ClassHelper.OBJECT_TYPE;
         GenericsType[] oldgTypes = type.getGenericsTypes();
-        GenericsType[] newgTypes = GenericsType.EMPTY_ARRAY;
+        GenericsType[] newgTypes = EMPTY_GENERICS_ARRAY;
         if (oldgTypes != null) {
             newgTypes = new GenericsType[oldgTypes.length];
             for (int i = 0; i < newgTypes.length; i++) {
@@ -433,9 +432,8 @@ public class GenericsUtils {
         return type;
     }
 
-    @SuppressWarnings("unchecked")
     public static Map<String, ClassNode> createGenericsSpec(ClassNode current) 
{
-        return createGenericsSpec(current, Collections.EMPTY_MAP);
+        return createGenericsSpec(current, 
Collections.<String,ClassNode>emptyMap());
     }
 
     public static Map<String, ClassNode> createGenericsSpec(ClassNode current, 
Map<String, ClassNode> oldSpec) {
@@ -665,8 +663,9 @@ public class GenericsUtils {
     }
 
     /**
-     * transforms generics types from an old context to a new context using 
the given spec. This method assumes
-     * all generics types will be placeholders. WARNING: The resulting 
generics types may or may not be placeholders
+     * Transforms generics types from an old context to a new context using the
+     * given spec. This method assumes all generics types will be placeholders.
+     * WARNING: The resulting generics types may or may not be placeholders
      * after the transformation.
      *
      * @param genericsSpec    the generics context information spec
@@ -714,9 +713,7 @@ public class GenericsUtils {
         return newTypes;
     }
 
-    private static final String TRUE_STR = "true";
-    private static final boolean PARAMETERIZED_TYPE_CACHE_ENABLED =
-            
TRUE_STR.equals(SystemUtil.getSystemPropertySafe("groovy.enable.parameterized.type.cache",
 TRUE_STR));
+    private static final boolean PARAMETERIZED_TYPE_CACHE_ENABLED = 
Boolean.parseBoolean(SystemUtil.getSystemPropertySafe("groovy.enable.parameterized.type.cache",
 "true"));
 
     /**
      * Try to get the parameterized type from the cache.
@@ -853,11 +850,11 @@ public class GenericsUtils {
     }
 
     /**
-     * Backported from 3.0.0
-     *
      * The method is similar with {@link 
GenericsUtils#makeDeclaringAndActualGenericsTypeMap(ClassNode, ClassNode)},
      * The main difference is that the method will try to map all placeholders 
found to the relevant exact types,
      * but the other will not try even if the parameterized type has 
placeholders
+     * <p>
+     * Backported from 3.0.0
      *
      * @param declaringClass the generics class node declaring the generics 
types
      * @param actualReceiver the sub-class class node
@@ -888,12 +885,11 @@ public class GenericsUtils {
     private static Tuple2<Map<GenericsType, GenericsType>, ClassNode> 
doMakeDeclaringAndActualGenericsTypeMap(ClassNode declaringClass, ClassNode 
actualReceiver, boolean tryToFindExactType) {
         ClassNode parameterizedType = 
findParameterizedTypeFromCache(declaringClass, actualReceiver, 
tryToFindExactType);
 
-        if (null == parameterizedType) {
+        if (parameterizedType == null) {
             return new 
Tuple2<>(Collections.<GenericsType,GenericsType>emptyMap(), parameterizedType);
         }
 
         Map<GenericsType, GenericsType> result = new LinkedHashMap<>();
-
         result.putAll(makePlaceholderAndParameterizedTypeMap(declaringClass));
         
result.putAll(makePlaceholderAndParameterizedTypeMap(parameterizedType));
 
@@ -936,11 +932,11 @@ public class GenericsUtils {
     }
 
     private static boolean checkPlaceHolders(ClassNode parameterizedType, 
Predicate<GenericsType> p) {
-        if (null == parameterizedType) return false;
+        if (parameterizedType == null) return false;
 
         GenericsType[] genericsTypes = parameterizedType.getGenericsTypes();
 
-        if (null == genericsTypes) return false;
+        if (genericsTypes == null) return false;
 
         for (GenericsType genericsType : genericsTypes) {
             if (p.test(genericsType)) {
@@ -1003,6 +999,7 @@ public class GenericsUtils {
             return genericsClass;
         }
 
+        @SuppressWarnings("unused")
         public void setGenericsClass(ClassNode genericsClass) {
             this.genericsClass = genericsClass;
         }
@@ -1011,6 +1008,7 @@ public class GenericsUtils {
             return actualType;
         }
 
+        @SuppressWarnings("unused")
         public void setActualType(ClassNode actualType) {
             this.actualType = actualType;
         }
diff --git 
a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java 
b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
index 4f3bba6..0bdc015 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
@@ -52,7 +52,7 @@ import static 
org.codehaus.groovy.ast.ClassHelper.isNumberType;
 import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveType;
 import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
-import static org.codehaus.groovy.ast.GenericsType.GenericsTypeName;
+
 /**
  * This class provides helper methods to determine the type from a widening
  * operation for example for a plus operation.
@@ -300,13 +300,13 @@ public class WideningCategories {
         ClassNode superClass = source.getUnresolvedSuperClass();
         // copy generic type information if available
         if (superClass!=null && superClass.isUsingGenerics()) {
-            Map<GenericsTypeName, GenericsType> genericsTypeMap = 
GenericsUtils.extractPlaceholders(source);
+            Map<GenericsType.GenericsTypeName, GenericsType> genericsTypeMap = 
GenericsUtils.extractPlaceholders(source);
             GenericsType[] genericsTypes = superClass.getGenericsTypes();
             if (genericsTypes!=null) {
                 GenericsType[] copyTypes = new 
GenericsType[genericsTypes.length];
                 for (int i = 0; i < genericsTypes.length; i++) {
                     GenericsType genericsType = genericsTypes[i];
-                    GenericsTypeName gtn = new 
GenericsTypeName(genericsType.getName());
+                    GenericsType.GenericsTypeName gtn = new 
GenericsType.GenericsTypeName(genericsType.getName());
                     if (genericsType.isPlaceholder() && 
genericsTypeMap.containsKey(gtn)) {
                         copyTypes[i] = genericsTypeMap.get(gtn);
                     } else {
diff --git a/src/main/java/org/codehaus/groovy/classgen/AnnotationVisitor.java 
b/src/main/java/org/codehaus/groovy/classgen/AnnotationVisitor.java
index 42eb463..3974262 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AnnotationVisitor.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AnnotationVisitor.java
@@ -85,7 +85,7 @@ public class AnnotationVisitor {
         if (!checkIfValidEnumConstsAreUsed(node)) {
             return node;
         }
-        
+
         Map<String, Expression> attributes = node.getMembers();
         for (Map.Entry<String, Expression> entry : attributes.entrySet()) {
             String attrName = entry.getKey();
@@ -97,7 +97,7 @@ public class AnnotationVisitor {
         VMPluginFactory.getPlugin().configureAnnotation(node);
         return this.annotation;
     }
-    
+
     private boolean checkIfValidEnumConstsAreUsed(AnnotationNode node) {
         Map<String, Expression> attributes = node.getMembers();
         for (Map.Entry<String, Expression> entry : attributes.entrySet()) {
@@ -106,7 +106,7 @@ public class AnnotationVisitor {
         }
         return true;
     }
-    
+
     private boolean validateEnumConstant(Expression exp) {
         if (exp instanceof PropertyExpression) {
             PropertyExpression pe = (PropertyExpression) exp;
@@ -154,7 +154,7 @@ public class AnnotationVisitor {
         // if it is an error, we have to test it at another place. But size==0 
is
         // an error, because it means that no such attribute exists.
         if (methods.isEmpty()) {
-            addError("'" + attrName + "'is not part of the annotation " + 
classNode, node);
+            addError("'" + attrName + "'is not part of the annotation " + 
classNode.getNameWithoutPackage(), node);
             return ClassHelper.OBJECT_TYPE;
         }
         MethodNode method = (MethodNode) methods.get(0);
@@ -236,14 +236,11 @@ public class AnnotationVisitor {
         } else {
             addError(base, exp);
         }
-        return ConstantExpression.EMPTY_EXPRESSION;
+        ConstantExpression ret = new ConstantExpression(null);
+        ret.setSourcePosition(exp);
+        return ret;
     }
 
-    /**
-     * @param attrName   the name
-     * @param expression the expression
-     * @param attrType   the type
-     */
     protected void visitAnnotationExpression(String attrName, 
AnnotationConstantExpression expression, ClassNode attrType) {
         AnnotationNode annotationNode = (AnnotationNode) expression.getValue();
         AnnotationVisitor visitor = new AnnotationVisitor(this.source, 
this.errorCollector);
@@ -310,5 +307,4 @@ public class AnnotationVisitor {
             checkCircularReference(searchClass, method.getReturnType(), 
code.getExpression());
         }
     }
-
 }
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index bf9238f..29a88b5 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -225,7 +225,7 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(endLabel);
     }
 
-    /* *
+    /**
      * load a message on the stack and remove it right away. Good for put a 
mark in the generated bytecode for debugging purpose.
      *
      * @param msg
@@ -497,8 +497,7 @@ public class BytecodeHelper implements Opcodes {
      */
     @Deprecated
     public static boolean box(MethodVisitor mv, ClassNode type) {
-        if (type.isPrimaryClassNode()) return false;
-        return box(mv, type.getTypeClass());
+        return ClassHelper.isPrimitiveType(type) && box(mv, 
type.getTypeClass());
     }
 
     
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
index b47ece8..07b8e3a 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -32,7 +32,6 @@ import org.codehaus.groovy.ast.Variable;
 import org.codehaus.groovy.ast.VariableScope;
 import org.codehaus.groovy.ast.expr.ClassExpression;
 import org.codehaus.groovy.ast.expr.ClosureExpression;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.FieldExpression;
@@ -54,6 +53,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorSuperX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
@@ -201,7 +201,7 @@ public class ClosureWriter {
             parameters = Parameter.EMPTY_ARRAY;
         } else if (parameters.length == 0) {
             // let's create a default 'it' parameter
-            Parameter it = param(ClassHelper.OBJECT_TYPE, "it", 
ConstantExpression.NULL);
+            Parameter it = param(ClassHelper.OBJECT_TYPE, "it", nullX());
             parameters = new Parameter[]{it};
             Variable ref = 
expression.getVariableScope().getDeclaredVariable("it");
             if (ref != null) 
it.setClosureSharedVariable(ref.isClosureSharedVariable());
@@ -215,7 +215,6 @@ public class ClosureWriter {
         answer.setSynthetic(true);
         answer.setUsingGenerics(outerClass.isUsingGenerics());
         answer.setSourcePosition(expression);
-
         if (staticMethodOrInStaticClass) {
             answer.setStaticClass(true);
         }
@@ -355,7 +354,7 @@ public class ClosureWriter {
         operandStack.box();
         arguments.getExpression(1).visit(acg);
         operandStack.box();
-        //TODO: replace with normal String, p not needed
+        // TODO: replace with normal String, p not needed
         Parameter p = param(ClassHelper.OBJECT_TYPE, "_p");
         String descriptor = 
BytecodeHelper.getMethodDescriptor(ClassHelper.VOID_TYPE, new Parameter[]{p, 
p});
         mv.visitMethodInsn(INVOKESPECIAL, 
BytecodeHelper.getClassInternalName(callNode), "<init>", descriptor, false);
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/CompileStack.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/CompileStack.java
index 3caafad..d15248b 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/CompileStack.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/CompileStack.java
@@ -25,6 +25,7 @@ import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.Variable;
 import org.codehaus.groovy.ast.VariableScope;
+import org.codehaus.groovy.classgen.AsmClassGenerator;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -38,11 +39,9 @@ import java.util.ListIterator;
 import java.util.Map;
 
 /**
- * This class is a helper for AsmClassGenerator. It manages
- * different aspects of the code of a code block like
- * handling labels, defining variables, and scopes.
- * After a MethodNode is visited clear should be called, for
- * initialization the method init should be used.
+ * Manages different aspects of the code of a code block like handling labels,
+ * defining variables, and scopes. After a MethodNode is visited clear should 
be
+ * called, for initialization the method init should be used.
  * <p>
  * Some Notes:
  * <ul>
@@ -65,17 +64,12 @@ import java.util.Map;
  *      or temporary variable is hidden or even removed.  That must not happen!
  * </ul>
  *
- *
  * @see org.codehaus.groovy.classgen.AsmClassGenerator
  */
 public class CompileStack implements Opcodes {
-    /**
-     * TODO: remove optimization of this.foo -> this.@foo
-     *
-     */
 
     // state flag
-    private boolean clear=true;
+    private boolean clear = true;
     // current scope
     private VariableScope scope;
     // current label for continue
@@ -99,23 +93,22 @@ public class CompileStack implements Opcodes {
     // list containing finally blocks
     // such a block is created by synchronized or finally and
     // must be called for break/continue/return
-    private LinkedList<BlockRecorder> finallyBlocks = new 
LinkedList<BlockRecorder>();
-    private final LinkedList<BlockRecorder> visitedBlocks = new 
LinkedList<BlockRecorder>();
+    private LinkedList<BlockRecorder> finallyBlocks = new LinkedList<>();
+    private final LinkedList<BlockRecorder> visitedBlocks = new LinkedList<>();
 
     private Label thisStartLabel, thisEndLabel;
 
-//    private MethodVisitor mv;
-
     // helper to handle different stack based variables
     private final LinkedList stateStack = new LinkedList();
 
     // handle different states for the implicit "this"
-    private final LinkedList<Boolean> implicitThisStack = new 
LinkedList<Boolean>();
+    private final LinkedList<Boolean> implicitThisStack = new LinkedList<>();
     // handle different states for being on the left hand side
-    private final LinkedList<Boolean> lhsStack = new LinkedList<Boolean>();
+    private final LinkedList<Boolean> lhsStack = new LinkedList<>();
+
     {
-        implicitThisStack.add(false);
-        lhsStack.add(false);
+        implicitThisStack.add(Boolean.FALSE);
+        lhsStack.add(Boolean.FALSE);
     }
 
     // defines the first variable index usable after
@@ -128,8 +121,8 @@ public class CompileStack implements Opcodes {
     // in a loop where foo is a label.
     private final Map namedLoopContinueLabel = new HashMap();
     private String className;
-    private final LinkedList<ExceptionTableEntry> typedExceptions = new 
LinkedList<ExceptionTableEntry>();
-    private final LinkedList<ExceptionTableEntry> untypedExceptions = new 
LinkedList<ExceptionTableEntry>();
+    private final LinkedList<ExceptionTableEntry> typedExceptions = new 
LinkedList<>();
+    private final LinkedList<ExceptionTableEntry> untypedExceptions = new 
LinkedList<>();
     // stores if on left-hand-side during compilation
     private boolean lhs;
     // stores if implicit or explicit this is used.
@@ -147,7 +140,7 @@ public class CompileStack implements Opcodes {
         public Runnable excludedStatement;
         public final LinkedList<LabelRange> ranges;
         public BlockRecorder() {
-            ranges = new LinkedList<LabelRange>();
+            ranges = new LinkedList<>();
         }
         public BlockRecorder(Runnable excludedStatement) {
             this();
@@ -356,58 +349,54 @@ public class CompileStack implements Opcodes {
         }
         clear = true;
         MethodVisitor mv = controller.getMethodVisitor();
-        // br experiment with local var table so debuggers can retrieve 
variable names
-        if (true) {//AsmClassGenerator.CREATE_DEBUG_INFO) {
-            if (thisEndLabel==null) setEndLabels();
+        if (AsmClassGenerator.CREATE_DEBUG_INFO) {
+            if (thisEndLabel == null) setEndLabels();
 
             if (!scope.isInStaticContext()) {
                 // write "this"
                 mv.visitLocalVariable("this", className, null, thisStartLabel, 
thisEndLabel, 0);
             }
 
-            for (Iterator iterator = usedVariables.iterator(); 
iterator.hasNext();) {
+            for (Iterator iterator = usedVariables.iterator(); 
iterator.hasNext(); ) {
                 BytecodeVariable v = (BytecodeVariable) iterator.next();
                 ClassNode t = v.getType();
                 if (v.isHolder()) t = ClassHelper.REFERENCE_TYPE;
                 String type = BytecodeHelper.getTypeDescription(t);
                 Label start = v.getStartLabel();
                 Label end = v.getEndLabel();
-                mv.visitLocalVariable(v.getName(), type, null, start, end, 
v.getIndex());
+                if (start != null && end != null)
+                    mv.visitLocalVariable(v.getName(), type, null, start, end, 
v.getIndex());
             }
         }
 
-        //exception table writing
+        // exception table writing
         for (ExceptionTableEntry ep : typedExceptions) {
             mv.visitTryCatchBlock(ep.start, ep.end, ep.goal, ep.sig);
         }
-        //exception table writing
         for (ExceptionTableEntry ep : untypedExceptions) {
             mv.visitTryCatchBlock(ep.start, ep.end, ep.goal, ep.sig);
         }
 
-
-        pop();
+        popState();
         typedExceptions.clear();
         untypedExceptions.clear();
         stackVariables.clear();
         usedVariables.clear();
-        scope = null;
         finallyBlocks.clear();
         resetVariableIndex(false);
         superBlockNamedLabels.clear();
         currentBlockNamedLabels.clear();
         namedLoopBreakLabel.clear();
         namedLoopContinueLabel.clear();
-        continueLabel=null;
-        breakLabel=null;
-        thisStartLabel=null;
-        thisEndLabel=null;
-        mv = null;
+        breakLabel = null;
+        continueLabel = null;
+        thisStartLabel = null;
+        thisEndLabel = null;
+        className = null;
+        scope = null;
     }
 
-    public void addExceptionBlock (Label start, Label end, Label goal,
-                                   String sig)
-    {
+    public void addExceptionBlock(Label start, Label end, Label goal, String 
sig) {
         // this code is in an extra method to avoid
         // lazy initialization issues
         ExceptionTableEntry ep = new ExceptionTableEntry();
@@ -431,10 +420,10 @@ public class CompileStack implements Opcodes {
      */
     public void init(VariableScope el, Parameter[] parameters) {
         if (!clear) throw new GroovyBugError("CompileStack#init called without 
calling clear before");
-        clear=false;
+        clear = false;
         pushVariableScope(el);
-        defineMethodVariables(parameters,el.isInStaticContext());
-        this.className = 
BytecodeHelper.getTypeDescription(controller.getClassNode());
+        defineMethodVariables(parameters, el.isInStaticContext());
+        className = 
BytecodeHelper.getTypeDescription(controller.getClassNode());
     }
 
     /**
@@ -772,7 +761,6 @@ public class CompileStack implements Opcodes {
         applyBlockRecorder(blocks);
     }
 
-
     private void applyBlockRecorder(List<BlockRecorder> blocks) {
         if (blocks.isEmpty() || blocks.size() == visitedBlocks.size()) return;
 
@@ -828,10 +816,6 @@ public class CompileStack implements Opcodes {
         }
     }
 
-//    public MethodVisitor getMethodVisitor() {
-//        return mv;
-//    }
-
     public boolean isLHS() {
         return lhs;
     }
diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
index 9d442e8..4fc5732 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
@@ -534,7 +534,6 @@ public class InvocationWriter {
                 && (argumentList.size()>para.length || 
argumentList.size()==para.length-1 || !lastIsArray(argumentList, 
para.length-1))) {
             int stackLen = operandStack.getStackLength()+argumentList.size();
             MethodVisitor mv = controller.getMethodVisitor();
-            //mv = new org.objectweb.asm.util.TraceMethodVisitor(mv);
             controller.setMethodVisitor(mv);
             // varg call
             // first parameters as usual
@@ -543,7 +542,7 @@ public class InvocationWriter {
                 operandStack.doGroovyCast(para[i].getType());
             }
             // last parameters wrapped in an array
-            List<Expression> lastParams = new LinkedList<Expression>();
+            List<Expression> lastParams = new LinkedList<>();
             for (int i=para.length-1; i<argumentList.size();i++) {
                 lastParams.add(argumentList.get(i));
             }
diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 93940a9..a677315 100644
--- 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -73,8 +73,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.samePackageName;
 import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE;
-import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE;
-import static org.codehaus.groovy.ast.ClassHelper.getWrapper;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static 
org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys.PRIVATE_BRIDGE_METHODS;
 import static org.objectweb.asm.Opcodes.ACONST_NULL;
@@ -121,12 +119,12 @@ public class StaticInvocationWriter extends 
InvocationWriter {
         if (origin instanceof MethodCallExpression &&
                 receiver instanceof VariableExpression &&
                 ((VariableExpression) receiver).isSuperExpression()) {
-            ClassNode superClass = 
receiver.getNodeMetaData(StaticCompilationMetadataKeys.PROPERTY_OWNER);
-            if (superClass!=null && !controller.getCompileStack().isLHS()) {
-                // GROOVY-7300
-                MethodCallExpression mce = (MethodCallExpression) origin;
-                MethodNode node = 
superClass.getDeclaredMethod(mce.getMethodAsString(), Parameter.EMPTY_ARRAY);
-                mce.setMethodTarget(node);
+            MethodCallExpression mce = (MethodCallExpression) origin; // 
GROOVY-7300
+            if (mce.getMethodTarget() == null && 
!controller.getCompileStack().isLHS()) {
+                ClassNode owner = 
receiver.getNodeMetaData(StaticCompilationMetadataKeys.PROPERTY_OWNER);
+                if (owner != null) {
+                    
mce.setMethodTarget(owner.getDeclaredMethod(mce.getMethodAsString(), 
Parameter.EMPTY_ARRAY));
+                }
             }
         }
         return super.makeDirectCall(origin, receiver, message, arguments, 
adapter, implicitThis, containsSpreadExpression);
@@ -456,7 +454,6 @@ public class StaticInvocationWriter extends 
InvocationWriter {
                 ) {
             int stackLen = operandStack.getStackLength() + argumentListSize;
             MethodVisitor mv = controller.getMethodVisitor();
-            //mv = new org.objectweb.asm.util.TraceMethodVisitor(mv);
             controller.setMethodVisitor(mv);
             // varg call
             // first parameters as usual
diff --git a/src/test/groovy/grape/GrapeClassLoaderTest.groovy 
b/src/test/groovy/grape/GrapeClassLoaderTest.groovy
index d70868c..9ae92ca 100644
--- a/src/test/groovy/grape/GrapeClassLoaderTest.groovy
+++ b/src/test/groovy/grape/GrapeClassLoaderTest.groovy
@@ -17,13 +17,8 @@
  *  under the License.
  */
 package groovy.grape
-/**
- * Created by IntelliJ IDEA.
- * User: Danno
- * Date: Jan 20, 2008
- * Time: 5:14:11 PM
- */
-class GrapeClassLoaderTest extends GroovyTestCase {
+
+final class GrapeClassLoaderTest extends GroovyTestCase {
 
     public GrapeClassLoaderTest() {
         // insure files are installed locally
diff --git 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
index e42f173..46b62d6 100644
--- 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
+++ 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
@@ -43,12 +43,10 @@ class AstNodeToScriptAdapterTest extends GroovyTestCase {
     }
 
     void testScript() {
-
         String result = compileToScript('true')
-
         assert result =~ /public class script[0-9]* extends 
groovy\.lang\.Script \{/
         assert result =~ /public script[0-9]*\(\) \{\s*\}/
-        assert result =~ /public script[0-9]*\(groovy.lang.Binding context\) 
\{\s*super\(context\)\s*\}/
+        assert result =~ /public script[0-9]*\(final groovy.lang.Binding 
context\) \{\s*super\(context\)\s*\}/
         assert result =~ /public java.lang.Object run\(\) \{\s*true\s*\}/
     }
 
diff --git 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
index 7893275..182895c 100644
--- 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
+++ 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
@@ -284,7 +284,7 @@ class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
                         eq('Methods'),
                         eq('MethodNode - main'),
                         startsWith('ExpressionStatement'),  //notice, there is 
only one ExpressionStatement
-                        startsWith('MethodCall'),
+                        startsWith('StaticMethodCall'),
                 ]
         )
     }

Reply via email to