You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/06/05 01:25:34 UTC

[groovy] branch master updated: Refactor and allow default CompilerConfiguration as parent allows

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4b497ea  Refactor and allow default CompilerConfiguration as parent allows
4b497ea is described below

commit 4b497ea2be8688a0807fb3c39d6dc80ef90fc018
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu May 30 12:54:00 2019 -0500

    Refactor and allow default CompilerConfiguration as parent allows
---
 .../codehaus/groovy/control/CompilationUnit.java   | 125 +++++++++------------
 .../tools/javac/JavaAwareCompilationUnit.java      |  39 ++++---
 .../tools/javac/JavaStubCompilationUnit.java       |   8 +-
 3 files changed, 79 insertions(+), 93 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
index 205431c..8e67cc7 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
@@ -54,6 +54,7 @@ import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
 
 import javax.tools.JavaFileObject;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -64,6 +65,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -77,7 +79,6 @@ import java.util.Set;
  * You can also add PhaseOperations to this compilation using the addPhaseOperation method.
  * This is commonly used when you want to wire a new AST Transformation into the compilation.
  */
-
 public class CompilationUnit extends ProcessingUnit {
 
     //---------------------------------------------------------------------------
@@ -89,7 +90,6 @@ public class CompilationUnit extends ProcessingUnit {
     protected Map summariesBySourceName;      // Summary of each SourceUnit
     protected Map summariesByPublicClassName;       // Summary of each SourceUnit
     protected Map classSourcesByPublicClassName;    // Summary of each Class
-    protected List<String> names;      // Names for each SourceUnit in sources.
     protected LinkedList<SourceUnit> queuedSources;
 
     protected CompileUnit ast;        // The overall AST for this CompilationUnit.
@@ -112,7 +112,6 @@ public class CompilationUnit extends ProcessingUnit {
 
     private Set<JavaFileObject> javaCompilationUnitSet = new HashSet<>();
 
-
     /**
      * Initializes the CompilationUnit with defaults.
      */
@@ -120,7 +119,6 @@ public class CompilationUnit extends ProcessingUnit {
         this(null, null, null);
     }
 
-
     /**
      * Initializes the CompilationUnit with defaults except for class loader.
      */
@@ -128,7 +126,6 @@ public class CompilationUnit extends ProcessingUnit {
         this(null, null, loader);
     }
 
-
     /**
      * Initializes the CompilationUnit with no security considerations.
      */
@@ -162,15 +159,14 @@ public class CompilationUnit extends ProcessingUnit {
         super(configuration, loader, null);
 
         this.astTransformationsContext = new ASTTransformationsContext(this, transformLoader);
-        this.names = new ArrayList<String>();
-        this.queuedSources = new LinkedList<SourceUnit>();
-        this.sources = new HashMap<String, SourceUnit>();
-        this.summariesBySourceName = new HashMap();
-        this.summariesByPublicClassName = new HashMap();
-        this.classSourcesByPublicClassName = new HashMap();
+        this.queuedSources = new LinkedList<>();
+        this.sources = new LinkedHashMap<>();
+        this.summariesBySourceName = new HashMap<>();
+        this.summariesByPublicClassName = new HashMap<>();
+        this.classSourcesByPublicClassName = new HashMap<>();
 
         this.ast = new CompileUnit(this.classLoader, security, this.configuration);
-        this.generatedClasses = new ArrayList<GroovyClass>();
+        this.generatedClasses = new ArrayList<>();
 
         this.verifier = new Verifier();
         this.resolveVisitor = new ResolveVisitor(this);
@@ -180,7 +176,7 @@ public class CompilationUnit extends ProcessingUnit {
         initPhaseOperations();
         addPhaseOperations();
 
-        applyCompilationCustomizers(configuration);
+        applyCompilationCustomizers();
 
         this.classgenCallback = null;
         this.classNodeResolver = new ClassNodeResolver();
@@ -191,19 +187,21 @@ public class CompilationUnit extends ProcessingUnit {
         phaseOperations = new LinkedList[cnt];
         newPhaseOperations = new LinkedList[cnt];
         for (int i = 0; i < phaseOperations.length; i++) {
-            phaseOperations[i] = new LinkedList();
-            newPhaseOperations[i] = new LinkedList();
+            phaseOperations[i] = new LinkedList<>();
+            newPhaseOperations[i] = new LinkedList<>();
         }
     }
 
     private void addPhaseOperations() {
         addPhaseOperation(new SourceUnitOperation() {
+            @Override
             public void call(SourceUnit source) throws CompilationFailedException {
                 source.parse();
             }
         }, Phases.PARSING);
         addPhaseOperation(convert, Phases.CONVERSION);
         addPhaseOperation(new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context,
                              ClassNode classNode) throws CompilationFailedException {
                 EnumVisitor ev = new EnumVisitor(CompilationUnit.this, source);
@@ -231,6 +229,7 @@ public class CompilationUnit extends ProcessingUnit {
             }
         }, Phases.SEMANTIC_ANALYSIS);
         addPhaseOperation(new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context,
                              ClassNode classNode) throws CompilationFailedException {
                 TraitComposer.doExtendTraits(classNode, source, CompilationUnit.this);
@@ -238,6 +237,7 @@ public class CompilationUnit extends ProcessingUnit {
         }, Phases.CANONICALIZATION);
         addPhaseOperation(compileCompleteCheck, Phases.CANONICALIZATION);
         addPhaseOperation(classgen, Phases.CLASS_GENERATION);
+
         addPhaseOperation(output);
 
         addPhaseOperation(new PrimaryClassNodeOperation() {
@@ -266,6 +266,7 @@ public class CompilationUnit extends ProcessingUnit {
             }
         }, Phases.CANONICALIZATION);
         addPhaseOperation(new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context,
                              ClassNode classNode) throws CompilationFailedException {
                 EnumCompletionVisitor ecv = new EnumCompletionVisitor(CompilationUnit.this, source);
@@ -285,16 +286,12 @@ public class CompilationUnit extends ProcessingUnit {
         }, Phases.INSTRUCTION_SELECTION);
     }
 
-    private void applyCompilationCustomizers(CompilerConfiguration configuration) {
-        // apply configuration customizers if any
-        if (configuration != null) {
-            final List<CompilationCustomizer> customizers = configuration.getCompilationCustomizers();
-            for (CompilationCustomizer customizer : customizers) {
-                if (customizer instanceof CompilationUnitAware) {
-                    ((CompilationUnitAware) customizer).setCompilationUnit(this);
-                }
-                addPhaseOperation(customizer, customizer.getPhase().getPhaseNumber());
+    private void applyCompilationCustomizers() {
+        for (CompilationCustomizer customizer : configuration.getCompilationCustomizers()) {
+            if (customizer instanceof CompilationUnitAware) {
+                ((CompilationUnitAware) customizer).setCompilationUnit(this);
             }
+            addPhaseOperation(customizer, customizer.getPhase().getPhaseNumber());
         }
     }
 
@@ -306,7 +303,6 @@ public class CompilationUnit extends ProcessingUnit {
         return astTransformationsContext.getTransformLoader() == null ? getClassLoader() : astTransformationsContext.getTransformLoader();
     }
 
-
     public void addPhaseOperation(SourceUnitOperation op, int phase) {
         validatePhase(phase);
         phaseOperations[phase].add(op);
@@ -339,9 +335,10 @@ public class CompilationUnit extends ProcessingUnit {
      * Configures its debugging mode and classloader classpath from a given compiler configuration.
      * This cannot be done more than once due to limitations in {@link java.net.URLClassLoader URLClassLoader}.
      */
+    @Override
     public void configure(CompilerConfiguration configuration) {
         super.configure(configuration);
-        this.debug = configuration.getDebug();
+        this.debug = this.configuration.getDebug();
         this.configured = true;
     }
 
@@ -374,7 +371,7 @@ public class CompilationUnit extends ProcessingUnit {
     /**
      * Get the GroovyClasses generated by compile().
      */
-    public List getClasses() {
+    public List<GroovyClass> getClasses() {
         return generatedClasses;
     }
 
@@ -390,8 +387,9 @@ public class CompilationUnit extends ProcessingUnit {
      * Convenience routine to get the named ClassNode.
      */
     public ClassNode getClassNode(final String name) {
-        final ClassNode[] result = new ClassNode[]{null};
+        final ClassNode[] result = new ClassNode[1];
         PrimaryClassNodeOperation handler = new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context, ClassNode classNode) {
                 if (classNode.getName().equals(name)) {
                     result[0] = classNode;
@@ -417,7 +415,6 @@ public class CompilationUnit extends ProcessingUnit {
     //---------------------------------------------------------------------------
     // SOURCE CREATION
 
-
     /**
      * Adds a set of file paths to the unit.
      */
@@ -427,7 +424,6 @@ public class CompilationUnit extends ProcessingUnit {
         }
     }
 
-
     /**
      * Adds a set of source files to the unit.
      */
@@ -437,7 +433,6 @@ public class CompilationUnit extends ProcessingUnit {
         }
     }
 
-
     /**
      * Adds a source file to the unit.
      */
@@ -452,7 +447,6 @@ public class CompilationUnit extends ProcessingUnit {
         return addSource(new SourceUnit(url, configuration, classLoader, getErrorCollector()));
     }
 
-
     /**
      * Adds a InputStream source to the unit.
      */
@@ -478,30 +472,28 @@ public class CompilationUnit extends ProcessingUnit {
         return source;
     }
 
-
     /**
      * Returns an iterator on the unit's SourceUnits.
      */
     public Iterator<SourceUnit> iterator() {
         return new Iterator<SourceUnit>() {
-            Iterator<String> nameIterator = names.iterator();
-
+            Iterator<String> nameIterator = sources.keySet().iterator();
+            @Override
             public boolean hasNext() {
                 return nameIterator.hasNext();
             }
-
+            @Override
             public SourceUnit next() {
                 String name = nameIterator.next();
                 return sources.get(name);
             }
-
+            @Override
             public void remove() {
                 throw new UnsupportedOperationException();
             }
         };
     }
 
-
     /**
      * Adds a ClassNode directly to the unit (ie. without source).
      * WARNING: the source is needed for error reporting, using
@@ -517,48 +509,48 @@ public class CompilationUnit extends ProcessingUnit {
     //---------------------------------------------------------------------------
     // EXTERNAL CALLBACKS
 
-
     /**
      * A callback interface you can use to "accompany" the classgen()
      * code as it traverses the ClassNode tree.  You will be called-back
      * for each primary and inner class.  Use setClassgenCallback() before
      * running compile() to set your callback.
      */
+    // TODO: Convert to functional interface?
     public abstract static class ClassgenCallback {
         public abstract void call(ClassVisitor writer, ClassNode node) throws CompilationFailedException;
     }
 
     /**
      * Sets a ClassgenCallback.  You can have only one, and setting
-     * it to null removes any existing setting.
+     * it to {@code null} removes any existing setting.
      */
     public void setClassgenCallback(ClassgenCallback visitor) {
         this.classgenCallback = visitor;
     }
 
+    public ClassgenCallback getClassgenCallback() {
+        return classgenCallback;
+    }
+
     /**
      * A callback interface you can use to get a callback after every
      * unit of the compile process.  You will be called-back with a
      * ProcessingUnit and a phase indicator.  Use setProgressCallback()
      * before running compile() to set your callback.
      */
+    // TODO: Convert to functional interface?
     public abstract static class ProgressCallback {
-
         public abstract void call(ProcessingUnit context, int phase) throws CompilationFailedException;
     }
 
     /**
      * Sets a ProgressCallback.  You can have only one, and setting
-     * it to null removes any existing setting.
+     * it to {@code null} removes any existing setting.
      */
     public void setProgressCallback(ProgressCallback callback) {
         this.progressCallback = callback;
     }
 
-    public ClassgenCallback getClassgenCallback() {
-        return classgenCallback;
-    }
-
     public ProgressCallback getProgressCallback() {
         return progressCallback;
     }
@@ -566,7 +558,6 @@ public class CompilationUnit extends ProcessingUnit {
     //---------------------------------------------------------------------------
     // ACTIONS
 
-
     /**
      * Synonym for compile(Phases.ALL).
      */
@@ -632,7 +623,6 @@ public class CompilationUnit extends ProcessingUnit {
             recordPhaseOpsInAllOtherPhases(currPhase);
             currentPhaseNewOps = newPhaseOperations[currPhase];
         }
-
     }
 
     private void doPhaseOperation(Object operation) {
@@ -661,7 +651,6 @@ public class CompilationUnit extends ProcessingUnit {
         }
     }
 
-
     /**
      * Dequeues any source units add through addSource and resets the compiler phase
      * to initialization.
@@ -677,7 +666,6 @@ public class CompilationUnit extends ProcessingUnit {
         while (!queuedSources.isEmpty()) {
             SourceUnit su = queuedSources.removeFirst();
             String name = su.getName();
-            names.add(name);
             sources.put(name, su);
         }
         if (dequeue) {
@@ -756,8 +744,8 @@ public class CompilationUnit extends ProcessingUnit {
             List<ClassNode> classes = source.ast.getClasses();
             for (ClassNode node : classes) {
                 CompileUnit cu = node.getCompileUnit();
-                for (Iterator iter = cu.iterateClassNodeToCompile(); iter.hasNext();) {
-                    String name = (String) iter.next();
+                for (Iterator<String> iter = cu.iterateClassNodeToCompile(); iter.hasNext();) {
+                    String name = iter.next();
                     SourceUnit su = ast.getScriptSourceLocation(name);
                     List<ClassNode> classesInSourceUnit = su.ast.getClasses();
                     StringBuilder message = new StringBuilder();
@@ -790,17 +778,16 @@ public class CompilationUnit extends ProcessingUnit {
         }
     };
 
-
     /**
      * Runs classgen() on a single ClassNode.
      */
     private final PrimaryClassNodeOperation classgen = new PrimaryClassNodeOperation() {
+        @Override
         public boolean needSortedInput() {
             return true;
         }
-
+        @Override
         public void call(SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException {
-
             optimizer.visitClass(classNode, source); // GROOVY-4272: repositioned it here from staticImport
 
             //
@@ -833,14 +820,12 @@ public class CompilationUnit extends ProcessingUnit {
             // Prep the generator machinery
             //
             ClassVisitor visitor = createClassVisitor();
-            
+
             String sourceName = (source == null ? classNode.getModule().getDescription() : source.getName());
             // only show the file name and its extension like javac does in its stacktraces rather than the full path
             // also takes care of both \ and / depending on the host compiling environment
             if (sourceName != null)
                 sourceName = sourceName.substring(Math.max(sourceName.lastIndexOf('\\'), sourceName.lastIndexOf('/')) + 1);
-            //TraceClassVisitor tracer = new TraceClassVisitor(visitor, new PrintWriter(System.err,true));
-            //AsmClassGenerator generator = new AsmClassGenerator(source, context, tracer, sourceName);
             AsmClassGenerator generator = new AsmClassGenerator(source, context, visitor, sourceName);
 
             //
@@ -861,9 +846,9 @@ public class CompilationUnit extends ProcessingUnit {
             //
             // Recurse for inner classes
             //
-            LinkedList innerClasses = generator.getInnerClasses();
+            LinkedList<ClassNode> innerClasses = generator.getInnerClasses();
             while (!innerClasses.isEmpty()) {
-                classgen.call(source, context, (ClassNode) innerClasses.removeFirst());
+                classgen.call(source, context, innerClasses.removeFirst());
             }
         }
     };
@@ -871,8 +856,7 @@ public class CompilationUnit extends ProcessingUnit {
     protected ClassVisitor createClassVisitor() {
         CompilerConfiguration config = getConfiguration();
         int computeMaxStackAndFrames = ClassWriter.COMPUTE_MAXS;
-        if (CompilerConfiguration.isPostJDK7(config.getTargetBytecode())
-                || Boolean.TRUE.equals(config.getOptimizationOptions().get("indy"))) {
+        if (CompilerConfiguration.isPostJDK7(config.getTargetBytecode()) || config.isIndyEnabled()) {
             computeMaxStackAndFrames += ClassWriter.COMPUTE_FRAMES;
         }
         return new ClassWriter(computeMaxStackAndFrames) {
@@ -900,14 +884,13 @@ public class CompilationUnit extends ProcessingUnit {
             }
             @Override
             protected String getCommonSuperClass(String arg1, String arg2) {
-                ClassNode a = getClassNode(arg1.replace('/', '.')); 
+                ClassNode a = getClassNode(arg1.replace('/', '.'));
                 ClassNode b = getClassNode(arg2.replace('/', '.'));
                 return getCommonSuperClassNode(a,b).getName().replace('.','/');
             }
-
         };
     }
-    
+
     //---------------------------------------------------------------------------
     // PHASE HANDLING
 
@@ -918,7 +901,6 @@ public class CompilationUnit extends ProcessingUnit {
         applyToSourceUnits(mark);
     }
 
-
     /**
      * Marks a single SourceUnit with the current phase,
      * if it isn't already there yet.
@@ -938,7 +920,6 @@ public class CompilationUnit extends ProcessingUnit {
     //---------------------------------------------------------------------------
     // LOOP SIMPLIFICATION FOR SourceUnit OPERATIONS
 
-
     /**
      * An callback interface for use in the applyToSourceUnits loop driver.
      */
@@ -946,14 +927,13 @@ public class CompilationUnit extends ProcessingUnit {
         public abstract void call(SourceUnit source) throws CompilationFailedException;
     }
 
-
     /**
      * A loop driver for applying operations to all SourceUnits.
      * Automatically skips units that have already been processed
      * through the current phase.
      */
     public void applyToSourceUnits(SourceUnitOperation body) throws CompilationFailedException {
-        for (String name : names) {
+        for (String name : sources.keySet()) {
             SourceUnit source = sources.get(name);
             if ((source.phase < phase) || (source.phase == phase && !source.phaseComplete)) {
                 try {
@@ -971,14 +951,12 @@ public class CompilationUnit extends ProcessingUnit {
             }
         }
 
-
         getErrorCollector().failIfErrors();
     }
 
     //---------------------------------------------------------------------------
     // LOOP SIMPLIFICATION FOR PRIMARY ClassNode OPERATIONS
 
-
     /**
      * An callback interface for use in the applyToPrimaryClassNodes loop driver.
      */
@@ -1081,7 +1059,7 @@ public class CompilationUnit extends ProcessingUnit {
             } catch (CompilationFailedException e) {
                 // fall through, getErrorReporter().failIfErrors() will trigger
             } catch (NullPointerException npe) {
-                GroovyBugError gbe = new GroovyBugError("unexpected NullpointerException", npe);
+                GroovyBugError gbe = new GroovyBugError("unexpected NullPointerException", npe);
                 changeBugText(gbe, context);
                 throw gbe;
             } catch (GroovyBugError e) {
@@ -1144,12 +1122,11 @@ public class CompilationUnit extends ProcessingUnit {
     private void changeBugText(GroovyBugError e, SourceUnit context) {
         e.setBugText("exception in phase '" + getPhaseDescription() + "' in source unit '" + ((context != null) ? context.getName() : "?") + "' " + e.getBugText());
     }
-    
+
     public ClassNodeResolver getClassNodeResolver() {
         return classNodeResolver;
     }
 
-
     public void setClassNodeResolver(ClassNodeResolver classNodeResolver) {
         this.classNodeResolver = classNodeResolver;
     }
diff --git a/src/main/java/org/codehaus/groovy/tools/javac/JavaAwareCompilationUnit.java b/src/main/java/org/codehaus/groovy/tools/javac/JavaAwareCompilationUnit.java
index dccc80d..de646aa 100644
--- a/src/main/java/org/codehaus/groovy/tools/javac/JavaAwareCompilationUnit.java
+++ b/src/main/java/org/codehaus/groovy/tools/javac/JavaAwareCompilationUnit.java
@@ -41,14 +41,18 @@ import java.util.Map;
  * Compilation Unit capable of compiling Java source files.
  */
 public class JavaAwareCompilationUnit extends CompilationUnit {
-    private final List<String> javaSources;
+
     private final JavaStubGenerator stubGenerator;
+    private final List<String> javaSources = new LinkedList<String>();
     private JavaCompilerFactory compilerFactory = new JavacCompilerFactory();
     private final File generationGoal;
     private final boolean keepStubs;
-    private final CompilerConfiguration configuration;
     private final boolean memStubEnabled;
 
+    public JavaAwareCompilationUnit() {
+        this(null, null, null);
+    }
+
     public JavaAwareCompilationUnit(CompilerConfiguration configuration) {
         this(configuration, null, null);
     }
@@ -60,18 +64,19 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
     public JavaAwareCompilationUnit(CompilerConfiguration configuration, GroovyClassLoader groovyClassLoader,
                                     GroovyClassLoader transformClassLoader) {
         super(configuration, null, groovyClassLoader, transformClassLoader);
-        this.configuration = configuration;
-        this.memStubEnabled = configuration.isMemStubEnabled();
-        this.javaSources = new LinkedList<String>();
-        Map options = configuration.getJointCompilationOptions();
+
+        this.memStubEnabled = this.configuration.isMemStubEnabled();
+        Map<String, Object> options = this.configuration.getJointCompilationOptions();
         this.generationGoal = memStubEnabled ? null : (File) options.get("stubDir");
-        boolean useJava5 = CompilerConfiguration.isPostJDK5(configuration.getTargetBytecode());
-		String encoding = configuration.getSourceEncoding();
+
+        boolean useJava5 = CompilerConfiguration.isPostJDK5(this.configuration.getTargetBytecode());
+        String encoding = this.configuration.getSourceEncoding();
 
         this.stubGenerator = new JavaStubGenerator(generationGoal, false, useJava5, encoding);
         this.keepStubs = Boolean.TRUE.equals(options.get("keepStubs"));
 
         addPhaseOperation(new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context, ClassNode node) throws CompilationFailedException {
                 if (!javaSources.isEmpty()) {
                     VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(source);
@@ -83,6 +88,7 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
             }
         }, Phases.CONVERSION);
         addPhaseOperation(new CompilationUnit.PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException {
                 ASTTransformationCollectorCodeVisitor collector =
                         new ASTTransformationCollectorCodeVisitor(source, JavaAwareCompilationUnit.this.getTransformLoader());
@@ -91,6 +97,7 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
         }, Phases.CONVERSION);
 
         addPhaseOperation(new PrimaryClassNodeOperation() {
+            @Override
             public void call(SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException {
                 try {
                     if (!javaSources.isEmpty()) stubGenerator.generateClass(classNode);
@@ -101,6 +108,7 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
         }, Phases.CONVERSION);
     }
 
+    @Override
     public void gotoPhase(int phase) throws CompilationFailedException {
         super.gotoPhase(phase);
         // compile Java and clean up
@@ -109,9 +117,8 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
                 module.setImportsResolved(false);
             }
             try {
-                this.addJavaCompilationUnits(stubGenerator.getJavaStubCompilationUnitSet()); // add java stubs
-
-                JavaCompiler compiler = compilerFactory.createCompiler(getConfiguration());
+                addJavaCompilationUnits(stubGenerator.getJavaStubCompilationUnitSet()); // add java stubs
+                JavaCompiler compiler = compilerFactory.createCompiler(configuration);
                 compiler.compile(javaSources, this);
             } finally {
                 if (!keepStubs) stubGenerator.clean();
@@ -120,10 +127,11 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
         }
     }
 
+    @Override
     public void configure(CompilerConfiguration configuration) {
         super.configure(configuration);
         // GroovyClassLoader should be able to find classes compiled from java sources
-        File targetDir = configuration.getTargetDirectory();
+        File targetDir = this.configuration.getTargetDirectory();
         if (targetDir != null) {
             final String classOutput = targetDir.getAbsolutePath();
             getClassLoader().addClasspath(classOutput);
@@ -139,12 +147,14 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
         javaSources.add(path);
     }
 
+    @Override
     public void addSources(String[] paths) {
         for (String path : paths) {
             addJavaOrGroovySource(new File(path));
         }
     }
 
+    @Override
     public void addSources(File[] files) {
         for (File file : files) {
             addJavaOrGroovySource(file);
@@ -152,10 +162,11 @@ public class JavaAwareCompilationUnit extends CompilationUnit {
     }
 
     private void addJavaOrGroovySource(File file) {
-        if (file.getName().endsWith(".java"))
+        if (file.getName().endsWith(".java")) {
             addJavaSource(file);
-        else
+        } else {
             addSource(file);
+        }
     }
 
     public JavaCompilerFactory getCompilerFactory() {
diff --git a/src/main/java/org/codehaus/groovy/tools/javac/JavaStubCompilationUnit.java b/src/main/java/org/codehaus/groovy/tools/javac/JavaStubCompilationUnit.java
index ea38520..e5aefae 100644
--- a/src/main/java/org/codehaus/groovy/tools/javac/JavaStubCompilationUnit.java
+++ b/src/main/java/org/codehaus/groovy/tools/javac/JavaStubCompilationUnit.java
@@ -37,7 +37,6 @@ import java.util.Map;
  * Compilation unit to only generate stubs.
  */
 public class JavaStubCompilationUnit extends CompilationUnit {
-    private static final String DOT_GROOVY = ".groovy";
 
     private final JavaStubGenerator stubGenerator;
 
@@ -45,14 +44,13 @@ public class JavaStubCompilationUnit extends CompilationUnit {
 
     public JavaStubCompilationUnit(final CompilerConfiguration config, final GroovyClassLoader gcl, File destDir) {
         super(config, null, gcl);
-        assert config != null;
 
-        Map options = config.getJointCompilationOptions();
         if (destDir == null) {
+            Map<String, Object> options = configuration.getJointCompilationOptions();
             destDir = (File) options.get("stubDir");
         }
         boolean useJava5 = CompilerConfiguration.isPostJDK5(configuration.getTargetBytecode());
-		String encoding = configuration.getSourceEncoding();
+        String encoding = configuration.getSourceEncoding();
         stubGenerator = new JavaStubGenerator(destDir, false, useJava5, encoding);
 
         addPhaseOperation(new PrimaryClassNodeOperation() {
@@ -94,7 +92,7 @@ public class JavaStubCompilationUnit extends CompilationUnit {
     public void configure(final CompilerConfiguration config) {
         super.configure(config);
         // GroovyClassLoader should be able to find classes compiled from java sources
-        File targetDir = config.getTargetDirectory();
+        File targetDir = configuration.getTargetDirectory();
         if (targetDir != null) {
             final String classOutput = targetDir.getAbsolutePath();
             getClassLoader().addClasspath(classOutput);