You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/04/24 15:40:33 UTC

[groovy] branch master updated: add `GroovyShell#withConfig(Closure)` and refactor some unit tests

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

emilles 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 4964a5e104 add `GroovyShell#withConfig(Closure)` and refactor some unit tests
4964a5e104 is described below

commit 4964a5e104109ca2cdab785f1bb4bbe36c84bb1f
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Apr 24 10:30:25 2022 -0500

    add `GroovyShell#withConfig(Closure)` and refactor some unit tests
---
 .../builder/CompilerCustomizationBuilder.groovy    | 36 ++++-----
 src/main/java/groovy/grape/Grape.java              |  6 +-
 src/main/java/groovy/lang/GroovyShell.java         | 23 +++++-
 .../customizers/builder/CustomizersFactory.java    | 15 ++--
 .../typing/TypeCheckingExtensionSpecTest.groovy    | 14 ++--
 .../bugs/DirectMethodCallWithVargsTest.groovy      | 93 ++++++++--------------
 .../transform/ConditionalInterruptTest.groovy      | 12 ++-
 src/test/groovy/transform/LazyTest.groovy          | 10 +--
 src/test/groovy/transform/ReadWriteLockTest.groovy | 14 ++--
 .../groovy/transform/ThreadInterruptTest.groovy    | 12 ++-
 .../groovy/transform/TimedInterruptTest.groovy     | 14 ++--
 .../groovy/transform/stc/MethodCallsSTCTest.groovy | 15 ++--
 .../groovy/transform/AutoCloneTransformTest.groovy |  8 +-
 .../groovy/transform/AutoFinalTransformTest.groovy |  7 +-
 14 files changed, 123 insertions(+), 156 deletions(-)

diff --git a/src/main/groovy/org/codehaus/groovy/control/customizers/builder/CompilerCustomizationBuilder.groovy b/src/main/groovy/org/codehaus/groovy/control/customizers/builder/CompilerCustomizationBuilder.groovy
index 2ed466d315..c300c50d55 100644
--- a/src/main/groovy/org/codehaus/groovy/control/customizers/builder/CompilerCustomizationBuilder.groovy
+++ b/src/main/groovy/org/codehaus/groovy/control/customizers/builder/CompilerCustomizationBuilder.groovy
@@ -19,6 +19,7 @@
 
 package org.codehaus.groovy.control.customizers.builder
 
+import groovy.transform.AutoFinal
 import groovy.transform.CompileStatic
 import org.codehaus.groovy.control.CompilerConfiguration
 
@@ -27,22 +28,28 @@ import org.codehaus.groovy.control.CompilerConfiguration
  * various compilation customizers by hand, you may use this builder instead, which provides a
  * shorter syntax and removes most of the verbosity.
  */
-@CompileStatic
+@AutoFinal @CompileStatic
 class CompilerCustomizationBuilder extends FactoryBuilderSupport {
-    CompilerCustomizationBuilder() {
-        registerFactories()
-    }
 
-    static CompilerConfiguration withConfig(CompilerConfiguration config,
-                                            @DelegatesTo(type = 'org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder') Closure code) {
-        CompilerCustomizationBuilder builder = new CompilerCustomizationBuilder()
-        config.invokeMethod('addCompilationCustomizers', builder.invokeMethod('customizers', code))
+    static CompilerConfiguration withConfig(CompilerConfiguration config, @DelegatesTo(type='org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder') Closure spec) {
+        config.invokeMethod('addCompilationCustomizers', new CompilerCustomizationBuilder().invokeMethod('customizers', spec))
         config
     }
 
+    //--------------------------------------------------------------------------
+
+    CompilerCustomizationBuilder() {
+        registerFactory('customizers', new CustomizersFactory()) // root
+
+        registerFactory('ast', new ASTTransformationCustomizerFactory())
+        registerFactory('imports', new ImportCustomizerFactory())
+        registerFactory('inline', new InlinedASTCustomizerFactory())
+        registerFactory('secureAst', new SecureASTCustomizerFactory())
+        registerFactory('source', new SourceAwareCustomizerFactory())
+    }
+
     @Override
-    @SuppressWarnings('Instanceof')
-    protected Object postNodeCompletion(final Object parent, final Object node) {
+    protected Object postNodeCompletion(Object parent, Object node) {
         Object value = super.postNodeCompletion(parent, node)
         Object factory = getContextAttribute(CURRENT_FACTORY)
         if (factory instanceof PostCompletionFactory) {
@@ -51,13 +58,4 @@ class CompilerCustomizationBuilder extends FactoryBuilderSupport {
         }
         value
     }
-
-    private void registerFactories() {
-        registerFactory('ast', new ASTTransformationCustomizerFactory())
-        registerFactory('customizers', new CustomizersFactory())
-        registerFactory('imports', new ImportCustomizerFactory())
-        registerFactory('inline', new InlinedASTCustomizerFactory())
-        registerFactory('secureAst', new SecureASTCustomizerFactory())
-        registerFactory('source', new SourceAwareCustomizerFactory())
-    }
 }
diff --git a/src/main/java/groovy/grape/Grape.java b/src/main/java/groovy/grape/Grape.java
index 78e346ba43..5e71bf3b76 100644
--- a/src/main/java/groovy/grape/Grape.java
+++ b/src/main/java/groovy/grape/Grape.java
@@ -18,7 +18,6 @@
  */
 package groovy.grape;
 
-import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.security.PrivilegedAction;
 import java.util.Collections;
@@ -121,10 +120,9 @@ public class Grape {
         if (instance == null) {
             try {
                 // by default use GrapeIvy
-                //TODO META-INF/services resolver?
+                // TODO: META-INF/services resolver?
                 instance = (GrapeEngine) Class.forName("groovy.grape.GrapeIvy").getDeclaredConstructor().newInstance();
-            } catch (InstantiationException | ClassNotFoundException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
-                //LOGME
+            } catch (ReflectiveOperationException ignore) {
             }
         }
         return instance;
diff --git a/src/main/java/groovy/lang/GroovyShell.java b/src/main/java/groovy/lang/GroovyShell.java
index 6630356cc6..e167823d04 100644
--- a/src/main/java/groovy/lang/GroovyShell.java
+++ b/src/main/java/groovy/lang/GroovyShell.java
@@ -39,6 +39,7 @@ import java.security.PrivilegedExceptionAction;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static org.codehaus.groovy.control.ResolveVisitor.EMPTY_STRING_ARRAY;
 import static org.codehaus.groovy.runtime.InvokerHelper.MAIN_METHOD_NAME;
 
 /**
@@ -47,17 +48,35 @@ import static org.codehaus.groovy.runtime.InvokerHelper.MAIN_METHOD_NAME;
 public class GroovyShell extends GroovyObjectSupport {
 
     public static final String DEFAULT_CODE_BASE = "/groovy/shell";
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+    private static final String CONFIGURATION_CUSTOMIZER = "org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder";
 
     private final Binding context;
     private final AtomicInteger counter = new AtomicInteger(0);
     private final CompilerConfiguration config;
     private final GroovyClassLoader loader;
 
-    public static void main(String[] args) {
+    public static void main(final String[] args) {
         GroovyMain.main(args);
     }
 
+    /**
+     * @since 4.0.3
+     */
+    public static GroovyShell withConfig(@DelegatesTo(type = CONFIGURATION_CUSTOMIZER) final Closure<Void> spec) {
+        //TODO return new GroovyShell(CompilerCustomizationBuilder.withConfig(new CompilerConfiguration(), spec));
+        CompilerConfiguration config = new CompilerConfiguration();
+        try {
+            Class.forName(CONFIGURATION_CUSTOMIZER)
+                .getDeclaredMethod("withConfig", CompilerConfiguration.class, Closure.class)
+                .invoke(null, config, spec);
+        } catch (ReflectiveOperationException e) {
+            throw new GroovyRuntimeException(e);
+        }
+        return new GroovyShell(config);
+    }
+
+    //--------------------------------------------------------------------------
+
     public GroovyShell() {
         this(null, new Binding());
     }
diff --git a/src/main/java/org/codehaus/groovy/control/customizers/builder/CustomizersFactory.java b/src/main/java/org/codehaus/groovy/control/customizers/builder/CustomizersFactory.java
index 4f86a90156..c9b512acd4 100644
--- a/src/main/java/org/codehaus/groovy/control/customizers/builder/CustomizersFactory.java
+++ b/src/main/java/org/codehaus/groovy/control/customizers/builder/CustomizersFactory.java
@@ -22,9 +22,8 @@ import groovy.util.AbstractFactory;
 import groovy.util.FactoryBuilderSupport;
 import org.codehaus.groovy.control.customizers.CompilationCustomizer;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -32,29 +31,25 @@ import java.util.Map;
  *
  * @since 2.1.0
  */
+@SuppressWarnings({"unchecked","rawtypes"})
 public class CustomizersFactory extends AbstractFactory implements PostCompletionFactory {
-    private static final CompilationCustomizer[] EMPTY_COMPILATIONCUSTOMIZER_ARRAY = new CompilationCustomizer[0];
 
     @Override
     public Object newInstance(final FactoryBuilderSupport builder, final Object name, final Object value, final Map attributes) throws InstantiationException, IllegalAccessException {
-        return new LinkedList();
+        return new ArrayList();
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setChild(final FactoryBuilderSupport builder, final Object parent, final Object child) {
         if (parent instanceof Collection && child instanceof CompilationCustomizer) {
             ((Collection) parent).add(child);
         }
     }
 
-
     @Override
-    @SuppressWarnings("unchecked")
     public Object postCompleteNode(final FactoryBuilderSupport factory, final Object parent, final Object node) {
-        if (node instanceof List) {
-            List col = (List) node;
-            return col.toArray(EMPTY_COMPILATIONCUSTOMIZER_ARRAY);
+        if (node instanceof Collection) {
+            return ((Collection) node).toArray(new CompilationCustomizer[0]);
         }
         return node;
     }
diff --git a/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy b/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
index 56e19d3262..7da5b6ff7f 100644
--- a/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
+++ b/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
@@ -22,13 +22,11 @@ import groovy.test.GroovyAssert
 import groovy.test.GroovyTestCase
 import groovy.transform.TypeChecked
 import groovy.xml.MarkupBuilder
-import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.control.MultipleCompilationErrorsException
-import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
 
 import static asciidoctor.Utils.stripAsciidocMarkup
 
-class TypeCheckingExtensionSpecTest extends GroovyTestCase {
+final class TypeCheckingExtensionSpecTest extends GroovyTestCase {
 
     void testIntro() {
         def out = new PrintWriter(new ByteArrayOutputStream())
@@ -613,13 +611,11 @@ new DelegateTest().delegate()
     }
 
     private def assertScriptWithExtension(String extensionName, String code, Closure<Void> configurator=null) {
-        def config = new CompilerConfiguration()
-        config.addCompilationCustomizers(
-                new ASTTransformationCustomizer(TypeChecked, extensions:[extensionName]))
-        def binding = new Binding()
-        def shell = new GroovyShell(binding,config)
+        def shell = GroovyShell.withConfig {
+            ast(TypeChecked, extensions: [extensionName])
+        }
         if (configurator) {
-            configurator.call(binding)
+            configurator.call(shell.context)
         }
         shell.evaluate(code)
     }
diff --git a/src/test/groovy/bugs/DirectMethodCallWithVargsTest.groovy b/src/test/groovy/bugs/DirectMethodCallWithVargsTest.groovy
index bbdd658c97..1abd390f12 100644
--- a/src/test/groovy/bugs/DirectMethodCallWithVargsTest.groovy
+++ b/src/test/groovy/bugs/DirectMethodCallWithVargsTest.groovy
@@ -18,29 +18,23 @@
  */
 package groovy.bugs
 
-import groovy.test.GroovyTestCase
 import org.codehaus.groovy.ast.ClassCodeVisitorSupport
-import org.codehaus.groovy.control.SourceUnit
-import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.MethodNode
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.CompilationCustomizer
-import org.codehaus.groovy.control.CompilePhase
-import org.codehaus.groovy.classgen.GeneratorContext
-import org.codehaus.groovy.ast.ClassNode
+import org.codehaus.groovy.ast.expr.MethodCallExpression
+import org.codehaus.groovy.control.SourceUnit
+import org.junit.Test
+
+import static groovy.test.GroovyAssert.assertScript
 
-class DirectMethodCallWithVargsTest extends GroovyTestCase {
+final class DirectMethodCallWithVargsTest {
 
+    @Test
     void testDirectMethodCallWithVargs() {
-        def config = new CompilerConfiguration()
-        config.addCompilationCustomizers(
-                new MyCustomizer()
-        )
-        GroovyShell shell = new GroovyShell(config)
-        shell.evaluate '''
+        assertScript shell, '''
             def foo(String... args) {
                 (args as List).join(',')
             }
+
             assert foo() == ''
             assert foo('1') == '1'
             assert foo('1','2','3') == '1,2,3'
@@ -50,20 +44,16 @@ class DirectMethodCallWithVargsTest extends GroovyTestCase {
             def b = '2'
             def c = '3'
             assert foo(a,b,c) == '1,2,3'
-
         '''
     }
 
+    @Test
     void testDirectMethodCallWithPrimitiveVargs() {
-        def config = new CompilerConfiguration()
-        config.addCompilationCustomizers(
-                new MyCustomizer()
-        )
-        GroovyShell shell = new GroovyShell(config)
-        shell.evaluate '''
+        assertScript shell, '''
             def foo(int... args) {
                 (args as List).join(',')
             }
+
             assert foo() == ''
             assert foo(1) == '1'
             assert foo(1,2,3) == '1,2,3'
@@ -71,16 +61,13 @@ class DirectMethodCallWithVargsTest extends GroovyTestCase {
         '''
     }
 
-    void testDirectMethodCallWithArgPlusVargs() {
-        def config = new CompilerConfiguration()
-        config.addCompilationCustomizers(
-                new MyCustomizer()
-        )
-        GroovyShell shell = new GroovyShell(config)
-        shell.evaluate '''
+    @Test
+    void testDirectMethodCallWithArgumentAndVargs() {
+        assertScript shell, '''
             def foo(String prefix, String... args) {
                 prefix+(args as List).join(',')
             }
+
             assert foo('A') == 'A'
             assert foo('A','1') == 'A1'
             assert foo('A','1','2','3') == 'A1,2,3'
@@ -90,20 +77,16 @@ class DirectMethodCallWithVargsTest extends GroovyTestCase {
             def b = '2'
             def c = '3'
             assert foo('A',a,b,c) == 'A1,2,3'
-
         '''
     }
 
-    void testDirectMethodCallWithPrefixAndPrimitiveVargs() {
-        def config = new CompilerConfiguration()
-        config.addCompilationCustomizers(
-                new MyCustomizer()
-        )
-        GroovyShell shell = new GroovyShell(config)
-        shell.evaluate '''
+    @Test
+    void testDirectMethodCallWithArgumentAndPrimitiveVargs() {
+        assertScript shell, '''
             def foo(int prefix, int... args) {
                 "$prefix"+(args as List).join(',')
             }
+
             assert foo(1) == '1'
             assert foo(1,1) == '11'
             assert foo(1,1,2,3) == '11,2,3'
@@ -111,50 +94,36 @@ class DirectMethodCallWithVargsTest extends GroovyTestCase {
         '''
     }
 
-    private static class MyCustomizer extends CompilationCustomizer {
+    //--------------------------------------------------------------------------
 
-        MyCustomizer() {
-            super(CompilePhase.CANONICALIZATION)
-        }
-
-        @Override
-        void call(final SourceUnit source, final GeneratorContext context, final ClassNode classNode) {
-            def visitor = new MethodCallVisitor(source)
-            classNode.methods.each { visitor.visitMethod(it) }
+    private final GroovyShell shell = GroovyShell.withConfig {
+        inline(phase: 'CANONICALIZATION') { sourceUnit, x, classNode ->
+            def visitor = new MethodCallVisitor(sourceUnit)
+            classNode.methods.each(visitor.&acceptMethod)
             visitor.visitClass(classNode)
         }
     }
 
     private static class MethodCallVisitor extends ClassCodeVisitorSupport {
-        private final SourceUnit unit
         private MethodNode fooMethod
+        final SourceUnit sourceUnit
 
-        MethodCallVisitor(SourceUnit source) {
-            unit = source
-        }
-
-        @Override
-        protected SourceUnit getSourceUnit() {
-            return unit
+        MethodCallVisitor(final SourceUnit unit) {
+            sourceUnit = unit
         }
 
-        @Override
-        void visitMethod(final MethodNode node) {
-            super.visitMethod(node)
-            if (node.name=='foo') {
+        void acceptMethod(final MethodNode node) {
+            if (node.name == 'foo') {
                 fooMethod = node
             }
         }
 
-
         @Override
         void visitMethodCallExpression(final MethodCallExpression call) {
             super.visitMethodCallExpression(call)
-            if (call.methodAsString=='foo') {
+            if (call.methodAsString == 'foo') {
                 call.methodTarget = fooMethod
             }
         }
-
-
     }
 }
diff --git a/src/test/groovy/transform/ConditionalInterruptTest.groovy b/src/test/groovy/transform/ConditionalInterruptTest.groovy
index cb86990292..330c9914a0 100644
--- a/src/test/groovy/transform/ConditionalInterruptTest.groovy
+++ b/src/test/groovy/transform/ConditionalInterruptTest.groovy
@@ -18,8 +18,6 @@
  */
 package groovy.transform
 
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -29,12 +27,12 @@ import static groovy.test.GroovyAssert.assertScript
  */
 final class ConditionalInterruptTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().addCompilationCustomizers(
-        new ImportCustomizer().tap {
-            addStarImports('groovy.transform')
-            addStaticImport('groovy.test.GroovyAssert', 'shouldFail')
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports {
+            star 'groovy.transform'
+            staticMember 'groovy.test.GroovyAssert', 'shouldFail'
         }
-    ))
+    }
 
     @Test
     void testMethodIsVisited_AndExceptionMessage() {
diff --git a/src/test/groovy/transform/LazyTest.groovy b/src/test/groovy/transform/LazyTest.groovy
index bdfc19e059..c16d54f595 100644
--- a/src/test/groovy/transform/LazyTest.groovy
+++ b/src/test/groovy/transform/LazyTest.groovy
@@ -18,8 +18,6 @@
  */
 package groovy.transform
 
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -29,9 +27,11 @@ import static groovy.test.GroovyAssert.assertScript
  */
 final class LazyTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().addCompilationCustomizers(
-        new ImportCustomizer().tap { addStaticStars('java.lang.reflect.Modifier') }
-    ))
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports {
+            staticStar 'java.lang.reflect.Modifier'
+        }
+    }
 
     @Test
     void testLazyPrimitiveWrapping() {
diff --git a/src/test/groovy/transform/ReadWriteLockTest.groovy b/src/test/groovy/transform/ReadWriteLockTest.groovy
index 7a77bb05a9..91e7de5f4e 100644
--- a/src/test/groovy/transform/ReadWriteLockTest.groovy
+++ b/src/test/groovy/transform/ReadWriteLockTest.groovy
@@ -18,8 +18,6 @@
  */
 package groovy.transform
 
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -30,13 +28,13 @@ import static groovy.test.GroovyAssert.shouldFail
  */
 final class ReadWriteLockTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().addCompilationCustomizers(
-        new ImportCustomizer().tap {
-            addStarImports('groovy.transform')
-            addStaticStars('java.lang.reflect.Modifier')
-            addImport('java.util.concurrent.locks.ReentrantReadWriteLock')
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports {
+            star 'groovy.transform'
+            staticStar 'java.lang.reflect.Modifier'
+            normal 'java.util.concurrent.locks.ReentrantReadWriteLock'
         }
-    ))
+    }
 
     @Test
     void testLockFieldDefaultsForReadLock() {
diff --git a/src/test/groovy/transform/ThreadInterruptTest.groovy b/src/test/groovy/transform/ThreadInterruptTest.groovy
index bc7f3a2b22..95cd0242ec 100644
--- a/src/test/groovy/transform/ThreadInterruptTest.groovy
+++ b/src/test/groovy/transform/ThreadInterruptTest.groovy
@@ -20,8 +20,6 @@ package groovy.transform
 
 import groovy.mock.interceptor.StubFor
 import org.codehaus.groovy.ast.MethodNode
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.codehaus.groovy.transform.ThreadInterruptibleASTTransformation
 import org.junit.After
 import org.junit.Before
@@ -39,12 +37,12 @@ import static org.junit.Assume.assumeTrue
  */
 final class ThreadInterruptTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().addCompilationCustomizers(
-        new ImportCustomizer().tap {
-            addStarImports('groovy.transform')
-            addImport('groovy.mock.interceptor.StubFor')
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports {
+            star 'groovy.transform'
+            normal 'groovy.mock.interceptor.StubFor'
         }
-    ))
+    }
     private static final boolean jdk12plus = isAtLeastJdk('12.0')
     private Map<String, MethodNode> oldValues = [:]
 
diff --git a/src/test/groovy/transform/TimedInterruptTest.groovy b/src/test/groovy/transform/TimedInterruptTest.groovy
index b4aadbde3e..2108c83a26 100644
--- a/src/test/groovy/transform/TimedInterruptTest.groovy
+++ b/src/test/groovy/transform/TimedInterruptTest.groovy
@@ -19,9 +19,7 @@
 package groovy.transform
 
 import groovy.mock.interceptor.StubFor
-import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.control.MultipleCompilationErrorsException
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.junit.Test
 
 import java.util.concurrent.TimeoutException
@@ -34,13 +32,13 @@ import static groovy.test.GroovyAssert.shouldFail
  */
 final class TimedInterruptTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().addCompilationCustomizers(
-        new ImportCustomizer().tap {
-            addStarImports('groovy.transform')
-            addStaticStars(TimedInterruptTest.name)
-            addImport('groovy.mock.interceptor.StubFor')
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports {
+            star 'groovy.transform'
+            staticStar TimedInterruptTest.name
+            normal 'groovy.mock.interceptor.StubFor'
         }
-    ))
+    }
 
     @Test
     void testClassMethodIsVisited() {
diff --git a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
index 779c84f4f8..3b11fc9e83 100644
--- a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
@@ -20,7 +20,8 @@ package groovy.transform.stc
 
 import org.codehaus.groovy.control.MultipleCompilationErrorsException
 import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
-import org.codehaus.groovy.control.customizers.ImportCustomizer
+
+import static org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder.withConfig
 
 /**
  * Unit tests for static type checking : method calls.
@@ -29,11 +30,13 @@ class MethodCallsSTCTest extends StaticTypeCheckingTestCase {
 
     @Override
     protected void configure() {
-        config.addCompilationCustomizers(new ImportCustomizer().tap {
-            addImport('A', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass' )
-            addImport('B', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass2')
-            addImport('C', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass3')
-        })
+        withConfig(config) {
+            imports {
+                alias 'A', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass'
+                alias 'B', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass2'
+                alias 'C', 'groovy.transform.stc.MethodCallsSTCTest.MyMethodCallTestClass3'
+            }
+        }
     }
 
     void testMethodCallOnInstance() {
diff --git a/src/test/org/codehaus/groovy/transform/AutoCloneTransformTest.groovy b/src/test/org/codehaus/groovy/transform/AutoCloneTransformTest.groovy
index c0d2674863..81b3d60613 100644
--- a/src/test/org/codehaus/groovy/transform/AutoCloneTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoCloneTransformTest.groovy
@@ -18,8 +18,6 @@
  */
 package org.codehaus.groovy.transform
 
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.customizers.ImportCustomizer
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -30,9 +28,9 @@ import static groovy.test.GroovyAssert.shouldFail
  */
 final class AutoCloneTransformTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().
-        addCompilationCustomizers(new ImportCustomizer().tap { addImports('groovy.transform.AutoClone') })
-    )
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports { normal 'groovy.transform.AutoClone' }
+    }
 
     @Test
     void testBasics() {
diff --git a/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy b/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
index 854b788e6e..99422ffa13 100644
--- a/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
@@ -18,7 +18,6 @@
  */
 package org.codehaus.groovy.transform
 
-import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.control.customizers.*
 import org.junit.Test
 
@@ -30,9 +29,9 @@ import static groovy.test.GroovyAssert.shouldFail
  */
 final class AutoFinalTransformTest {
 
-    private final GroovyShell shell = new GroovyShell(new CompilerConfiguration().
-        addCompilationCustomizers(new ImportCustomizer().tap { addImports('groovy.transform.AutoFinal', 'groovy.transform.ASTTest') })
-    )
+    private final GroovyShell shell = GroovyShell.withConfig {
+        imports { normal 'groovy.transform.AutoFinal', 'groovy.transform.ASTTest' }
+    }
 
     @Test
     void testAutoFinalOnClass() {