Index: src/main/groovy/grape/GrabAnnotationTransformation.java =================================================================== --- src/main/groovy/grape/GrabAnnotationTransformation.java (revision 21827) +++ src/main/groovy/grape/GrabAnnotationTransformation.java (working copy) @@ -111,6 +111,10 @@ initContextClassLoader = false; ModuleNode mn = (ModuleNode) nodes[0]; + if (mn==null) { + // If the compilation had earlier problems, there may not be a ModuleNode to process + return; + } allowShortGrab = true; allowShortGrabExcludes = true; Index: src/main/org/codehaus/groovy/ast/VariableScope.java =================================================================== --- src/main/org/codehaus/groovy/ast/VariableScope.java (revision 21827) +++ src/main/org/codehaus/groovy/ast/VariableScope.java (working copy) @@ -50,6 +50,10 @@ return declaredVariables.get(name); } + public Iterator getDeclaredVariablesIterator() { + return declaredVariables.values().iterator(); + } + public boolean isReferencedLocalVariable(String name) { return referencedLocalVariables.containsKey(name); } Index: src/main/org/codehaus/groovy/tools/GroovyClass.java =================================================================== --- src/main/org/codehaus/groovy/tools/GroovyClass.java (revision 21827) +++ src/main/org/codehaus/groovy/tools/GroovyClass.java (working copy) @@ -16,28 +16,39 @@ package org.codehaus.groovy.tools; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.control.SourceUnit; + public class GroovyClass { public static final GroovyClass[] EMPTY_ARRAY = new GroovyClass[ 0 ]; private String name; private byte[] bytes; + private ClassNode classNode; + private SourceUnit source; - public GroovyClass(String name, - byte[] bytes) - { + public GroovyClass(String name, byte[] bytes, ClassNode classNode, SourceUnit source) { this.name = name; this.bytes = bytes; + this.classNode = classNode; + this.source = source; } - public String getName() - { + public String getName() { return this.name; } - public byte[] getBytes() - { + public byte[] getBytes() { return this.bytes; } + + public SourceUnit getSourceUnit() { + return source; + } + + public ClassNode getClassNode() { + return classNode; + } } Index: src/main/org/codehaus/groovy/control/ResolveVisitor.java =================================================================== --- src/main/org/codehaus/groovy/control/ResolveVisitor.java (revision 21827) +++ src/main/org/codehaus/groovy/control/ResolveVisitor.java (working copy) @@ -239,11 +239,11 @@ resolveOrFail(type, "", node); } - private boolean resolve(ClassNode type) { + protected boolean resolve(ClassNode type) { return resolve(type, true, true, true); } - private boolean resolve(ClassNode type, boolean testModuleImports, boolean testDefaultImports, boolean testStaticInnerClasses) { + protected boolean resolve(ClassNode type, boolean testModuleImports, boolean testDefaultImports, boolean testStaticInnerClasses) { resolveGenericsTypes(type.getGenericsTypes()); if (type.isResolved() || type.isPrimaryClassNode()) return true; if (type.isArray()) { @@ -369,8 +369,7 @@ } } - - private boolean resolveToScript(ClassNode type) { + protected boolean resolveToScript(ClassNode type) { String name = type.getName(); if (name.startsWith("java.")) return type.isResolved(); @@ -413,7 +412,7 @@ return name; } - private boolean resolveFromStaticInnerClasses(ClassNode type, boolean testStaticInnerClasses) { + protected boolean resolveFromStaticInnerClasses(ClassNode type, boolean testStaticInnerClasses) { // a class consisting of a vanilla name can never be // a static inner class, because at least one dot is // required for this. Example: foo.bar -> foo$bar @@ -445,7 +444,7 @@ return false; } - private boolean resolveFromDefaultImports(ClassNode type, boolean testDefaultImports) { + protected boolean resolveFromDefaultImports(ClassNode type, boolean testDefaultImports) { // test default imports testDefaultImports &= !type.hasPackageName(); // we do not resolve a vanilla name starting with a lower case letter @@ -480,7 +479,7 @@ return false; } - private boolean resolveFromCompileUnit(ClassNode type) { + protected boolean resolveFromCompileUnit(ClassNode type) { // look into the compile unit if there is a class with that name CompileUnit compileUnit = currentClass.getCompileUnit(); if (compileUnit == null) return false; @@ -573,7 +572,7 @@ return false; } - private boolean resolveFromModule(ClassNode type, boolean testModuleImports) { + protected boolean resolveFromModule(ClassNode type, boolean testModuleImports) { // we decided if we have a vanilla name starting with a lower case // letter that we will not try to resolve this name against .* // imports. Instead a full import is needed for these. @@ -668,7 +667,7 @@ return false; } - private boolean resolveToClass(ClassNode type) { + protected boolean resolveToClass(ClassNode type) { String name = type.getName(); // We use here the class cache cachedClasses to prevent Index: src/main/org/codehaus/groovy/control/CompilationUnit.java =================================================================== --- src/main/org/codehaus/groovy/control/CompilationUnit.java (revision 21827) +++ src/main/org/codehaus/groovy/control/CompilationUnit.java (working copy) @@ -763,7 +763,7 @@ generator.visitClass(classNode); byte[] bytes = ((ClassWriter) visitor).toByteArray(); - generatedClasses.add(new GroovyClass(classNode.getName(), bytes)); + generatedClasses.add(new GroovyClass(classNode.getName(), bytes, classNode, source)); // // Handle any callback that's been set Index: .classpath =================================================================== --- .classpath (revision 21827) +++ .classpath (working copy) @@ -3,18 +3,18 @@ - + - + - - + + @@ -22,9 +22,10 @@ - + + - +