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/11/01 16:45:38 UTC

[groovy] branch GROOVY_3_0_X updated (84f2067 -> fff9c5e)

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

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


    from 84f2067  Add a test for GROOVY-8223 (#1055)
     new 2f14a77  sync with groovy-eclipse
     new 5d2294a  GROOVY-8517: add getNodeMetaData(Object,Function)
     new feaf682  GROOVY-9297: Bump javaparser to 3.15.3
     new 7772bd2  refactor @NotYetImplemented AST transform
     new 8a5e319  GROOVY-9257: ZipException, FNFE -> IOException, InvalidPathException
     new dd3a64f  GROOVY-8457: use ClassHelper.make(Class) for resolved exception type
     new 32a198b  java 8 refacotor
     new 1aacc92  GROOVY-9298: Eliminate some illegal access warnings when indy is enabled (#1058)
     new fff9c5e  Show illegal access warnings without detailed messages.

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 build.gradle                                       |   2 +-
 .../groovy/grape/GrabAnnotationTransformation.java |  11 +-
 src/main/java/groovy/lang/GroovyClassLoader.java   |  56 +++---
 .../java/org/codehaus/groovy/ast/CompileUnit.java  |  22 +--
 .../org/codehaus/groovy/ast/GroovyCodeVisitor.java |  10 +-
 .../java/org/codehaus/groovy/ast/ImportNode.java   |   5 +-
 .../java/org/codehaus/groovy/ast/MethodNode.java   |   3 +-
 .../java/org/codehaus/groovy/ast/ModuleNode.java   |  98 +++++-----
 .../codehaus/groovy/ast/NodeMetaDataHandler.java   |  42 +++--
 .../java/org/codehaus/groovy/ast/Parameter.java    |  21 +--
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |   9 +
 .../groovy/classgen/asm/ClosureWriter.java         |   6 +-
 .../classgen/asm/sc/StaticInvocationWriter.java    |  30 ++-
 .../groovy/control/CompilerConfiguration.java      | 151 ++++-----------
 .../codehaus/groovy/reflection/CachedClass.java    |  22 +--
 .../org/codehaus/groovy/reflection/ClassInfo.java  |   6 +-
 .../reflection/ClassLoaderForClassArtifacts.java   |   6 +-
 .../groovy/runtime/DefaultGroovyMethods.java       |   8 +-
 .../groovy/runtime/metaclass/ClosureMetaClass.java |  44 ++---
 .../org/codehaus/groovy/vmplugin/v7/Selector.java  |  15 +-
 .../org/codehaus/groovy/vmplugin/v9/Java9.java     |  37 ++--
 src/test/groovy/bugs/groovy9081/Groovy9081.groovy  |  16 +-
 .../groovy/groovysh/util/PackageHelperImpl.groovy  | 119 +++++-------
 .../NotYetImplementedASTTransformation.java        |  64 ++-----
 .../NotYetImplementedTransformTest.groovy          | 210 +++++++++++++--------
 25 files changed, 458 insertions(+), 555 deletions(-)


[groovy] 03/09: GROOVY-9297: Bump javaparser to 3.15.3

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit feaf68295776c215991d2ea6b21911ee8241017a
Author: Daniel Sun <su...@apache.org>
AuthorDate: Thu Oct 31 22:11:13 2019 +0800

    GROOVY-9297: Bump javaparser to 3.15.3
    
    (cherry picked from commit 409f66ebdea4fd797e80e8796af066c958d56e13)
---
 build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.gradle b/build.gradle
index 852d3c56..9dd0898 100644
--- a/build.gradle
+++ b/build.gradle
@@ -147,7 +147,7 @@ ext {
     ivyVersion = '2.5.0'
     jansiVersion = '1.18'
     jarjarVersion = '1.7.2'
-    javaParserVersion = '3.15.2'
+    javaParserVersion = '3.15.3'
     jlineVersion = '2.14.6'
     jmockVersion = '1.2.0'
     logbackVersion = '1.1.7'


[groovy] 09/09: Show illegal access warnings without detailed messages.

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fff9c5e4c22892a5e9cf0d3c96ea628203b53ccf
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Nov 2 00:36:44 2019 +0800

    Show illegal access warnings without detailed messages.
    
    The remaining illegal access warnings should be fixed by modifying test code as they are truely illegal
    
    (cherry picked from commit 160ea6899d8d84b18b5e667834242e025d48c2b2)
---
 gradle/test.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gradle/test.gradle b/gradle/test.gradle
index e9257b3..4d3d282 100644
--- a/gradle/test.gradle
+++ b/gradle/test.gradle
@@ -19,8 +19,8 @@
 allprojects {
     tasks.withType(Test) {
         def jdk8 = ['-XX:+UseConcMarkSweepGC']
-//        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI']
-        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI', '--illegal-access=debug']
+        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI']
+//        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI', '--illegal-access=debug']
         def common = ['-ea', "-Xms${groovyJUnit_ms}", "-Xmx${groovyJUnit_mx}", "-Duser.language=en" ]
         if (JavaVersion.current().isJava9Compatible()) {
             jvmArgs (*common, *jdk9)


[groovy] 05/09: GROOVY-9257: ZipException, FNFE -> IOException, InvalidPathException

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8a5e319f98d4b0258b29b7982aef2bec38dbb591
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 12:21:09 2019 -0500

    GROOVY-9257: ZipException, FNFE -> IOException, InvalidPathException
    
    (cherry picked from commit e88c66296ea5950ee54907ec47594f7219aa762d)
---
 .../groovy/groovysh/util/PackageHelperImpl.groovy  | 119 ++++++++-------------
 1 file changed, 46 insertions(+), 73 deletions(-)

diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
index 36d16d24..cd4e85b 100644
--- a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
+++ b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy
@@ -18,52 +18,55 @@
  */
 package org.apache.groovy.groovysh.util
 
+import groovy.transform.AutoFinal
 import groovy.transform.CompileDynamic
 import groovy.transform.CompileStatic
 import org.codehaus.groovy.tools.shell.util.Logger
 import org.codehaus.groovy.tools.shell.util.Preferences
 
+import java.nio.file.InvalidPathException
 import java.util.jar.JarEntry
 import java.util.jar.JarFile
 import java.util.prefs.PreferenceChangeEvent
 import java.util.prefs.PreferenceChangeListener
 import java.util.regex.Pattern
-import java.util.zip.ZipException
 
 /**
  * Helper class that crawls all items of the classpath for packages.
  * Retrieves from those sources the list of subpackages and classes on demand.
  */
-@CompileStatic
+@AutoFinal @CompileStatic
 class PackageHelperImpl implements PreferenceChangeListener, PackageHelper {
 
-    // Pattern for regular Classnames
+    protected static final Logger LOG = Logger.create(PackageHelperImpl)
+
+    /** Pattern for regular class names. */
     public static final Pattern NAME_PATTERN = ~('^[A-Z][^.\$_]+\$')
 
     private static final String CLASS_SUFFIX = '.class'
-    protected static final Logger LOG = Logger.create(PackageHelperImpl)
 
-    Map<String, CachedPackage> rootPackages = null
+    Map<String, CachedPackage> rootPackages
     final ClassLoader groovyClassLoader
 
-    PackageHelperImpl(final ClassLoader groovyClassLoader=null) {
+    PackageHelperImpl(ClassLoader groovyClassLoader = null) {
         this.groovyClassLoader = groovyClassLoader
         initializePackages()
         Preferences.addChangeListener(this)
     }
 
+    @Override
     void reset() {
         initializePackages()
     }
 
     private void initializePackages() {
-        if (! Boolean.valueOf(Preferences.get(IMPORT_COMPLETION_PREFERENCE_KEY))) {
+        if (!Boolean.valueOf(Preferences.get(IMPORT_COMPLETION_PREFERENCE_KEY))) {
             rootPackages = getPackages(this.groovyClassLoader)
         }
     }
 
     @Override
-    void preferenceChange(final PreferenceChangeEvent evt) {
+    void preferenceChange(PreferenceChangeEvent evt) {
         if (evt.key == IMPORT_COMPLETION_PREFERENCE_KEY) {
             if (Boolean.valueOf(evt.getNewValue())) {
                 rootPackages = null
@@ -73,9 +76,9 @@ class PackageHelperImpl implements PreferenceChangeListener, PackageHelper {
         }
     }
 
-    private static Map<String, CachedPackage> getPackages(final ClassLoader groovyClassLoader) throws IOException {
+    private static Map<String, CachedPackage> getPackages(ClassLoader groovyClassLoader) throws IOException {
         Map<String, CachedPackage> rootPackages = new HashMap()
-        Set<URL> urls = new HashSet<URL>()
+        Set<URL> urls = new HashSet<>()
 
         // classes in CLASSPATH
         for (ClassLoader loader = groovyClassLoader; loader != null; loader = loader.parent) {
@@ -88,11 +91,11 @@ class PackageHelperImpl implements PreferenceChangeListener, PackageHelper {
         }
 
         // System classes
-        Class[] systemClasses = [String, javax.swing.JFrame, GroovyObject] as Class[]
+        Class<?>[] systemClasses = [String, javax.swing.JFrame, GroovyObject] as Class[]
         boolean jigsaw = false
         systemClasses.each { Class systemClass ->
             // normal slash even in Windows
-            String classfileName = systemClass.name.replace('.', '/') + '.class'
+            String classfileName = systemClass.name.replace('.', '/') + CLASS_SUFFIX
             URL classURL = systemClass.getResource(classfileName)
             if (classURL == null) {
                 // this seems to work on Windows better than the earlier approach
@@ -138,10 +141,9 @@ class PackageHelperImpl implements PreferenceChangeListener, PackageHelper {
     }
 
     /**
-     * This method returns packages or classes listed from Jigsaw modules.
-     * It makes use of a GroovyShell in order to avoid a hard dependency
-     * to JDK 7+ when building the Groovysh module (uses nio2)
-     * @return
+     * Returns packages or classes listed from Jigsaw modules. It makes use of a
+     * GroovyShell in order to avoid a hard dependency to JDK 7+ when building
+     * the Groovysh module (uses nio2).
      */
     private static Set<String> getPackagesAndClassesFromJigsaw(URL jigsawURL, Closure<Boolean> predicate) {
         def shell = new GroovyShell()
@@ -200,8 +202,7 @@ Files.walkFileTree(fs.getPath('modules'),
         jigsawPackages
     }
 
-    static mergeNewPackages(final Collection<String> packageNames, final URL url,
-                            final Map<String, CachedPackage> rootPackages) {
+    static mergeNewPackages(Collection<String> packageNames, URL url, Map<String, CachedPackage> rootPackages) {
         StringTokenizer tokenizer
         packageNames.each { String packname ->
             tokenizer = new StringTokenizer(packname, '.')
@@ -239,46 +240,34 @@ Files.walkFileTree(fs.getPath('modules'),
     }
 
     /**
-     * Returns all packagenames found at URL, accepts jar files and folders
-     * @param url
-     * @return
+     * Returns all package names found at URL; accepts jar files and folders.
      */
-    static Collection<String> getPackageNames(final URL url) {
-        //log.debug(url)
-        String path = URLDecoder.decode(url.getFile(), 'UTF-8')
-        File urlfile = new File(path)
-        if (urlfile.isDirectory()) {
-            Set<String> packnames = new HashSet<String>()
-            collectPackageNamesFromFolderRecursive(urlfile, '', packnames)
-            return packnames
+    static Collection<String> getPackageNames(URL url) {
+        File urlFile = new File(URLDecoder.decode(url.file, 'UTF-8'))
+
+        if (urlFile.isDirectory()) {
+            return new HashSet<>().tap {
+                collectPackageNamesFromFolderRecursive(urlFile, '', it)
+            }
         }
 
-        if (urlfile.path.endsWith('.jar')) {
+        if (urlFile.path.endsWith('.jar')) {
             try {
-                JarFile jf = new JarFile(urlfile)
-                return getPackageNamesFromJar(jf)
-            } catch(ZipException ze) {
-                if (LOG.debugEnabled) {
-                    ze.printStackTrace()
-                }
-                LOG.debug("Error opening zipfile : '${url.getFile()}',  ${ze.toString()}")
-            } catch (FileNotFoundException fnfe) {
-                LOG.debug("Error opening file : '${url.getFile()}',  ${fnfe.toString()}")
+                JarFile jarFile = new JarFile(urlFile)
+                return getPackageNamesFromJar(jarFile)
+            } catch (IOException | InvalidPathException e) {
+                if (LOG.isDebugEnabled()) e.printStackTrace()
+                LOG.warn("Error opening jar file : '${url.file}' : ${e.toString()}")
             }
         }
+
         return []
     }
 
     /**
      * Crawls a folder, iterates over subfolders, looking for class files.
-     * @param directory
-     * @param prefix
-     * @param packnames
-     * @return
      */
-    static Collection<String> collectPackageNamesFromFolderRecursive(final File directory, final String prefix,
-                                                                     final Set<String> packnames) {
-        //log.debug(directory)
+    static Collection<String> collectPackageNamesFromFolderRecursive(File directory, String prefix, Set<String> packnames) {
         File[] files = directory.listFiles()
         boolean packageAdded = false
 
@@ -300,9 +289,8 @@ Files.walkFileTree(fs.getPath('modules'),
         }
     }
 
-
-    static Collection<String> getPackageNamesFromJar(final JarFile jf) {
-        Set<String> packnames = new HashSet<String>()
+    static Collection<String> getPackageNamesFromJar(JarFile jf) {
+        Set<String> packnames = new HashSet<>()
         for (Enumeration e = jf.entries(); e.hasMoreElements();) {
             JarEntry entry = (JarEntry) e.nextElement()
 
@@ -326,27 +314,15 @@ Files.walkFileTree(fs.getPath('modules'),
         return packnames
     }
 
-    // following block does not work, because URLClassLoader.packages only ever returns SystemPackages
-    /*static Collection<String> getPackageNames(URL url) {
-        URLClassLoader urlLoader = new URLClassLoader([url] as URL[])
-        //log.debug(urlLoader.packages.getClass())
-
-        urlLoader.getPackages().collect {Package pack ->
-            pack.name
-        }
-    }*/
-
     /**
-     * returns the names of Classes and direct subpackages contained in a package
-     * @param packagename
-     * @return
+     * Returns the names of Classes and direct subpackages contained in a package.
      */
-    @CompileStatic
-    Set<String> getContents(final String packagename) {
-        if (! rootPackages) {
+    @Override
+    Set<String> getContents(String packagename) {
+        if (!rootPackages) {
             return [] as Set
         }
-        if (! packagename) {
+        if (!packagename) {
             return rootPackages.collect { String key, CachedPackage v -> key } as Set
         }
         String sanitizedPackageName
@@ -389,13 +365,10 @@ Files.walkFileTree(fs.getPath('modules'),
     }
 
     /**
-     * Copied from JLine 1.0 ClassNameCompletor
-     * @param urls
-     * @param packagename
-     * @return
+     * Copied from JLine 1.0 ClassNameCompletor.
      */
-    static Set<String> getClassnames(final Set<URL> urls, final String packagename) {
-        Set<String> classes = new TreeSet<String>()
+    static Set<String> getClassnames(Set<URL> urls, String packagename) {
+        Set<String> classes = new TreeSet<>()
         // normal slash even in Windows
         String pathname = packagename.replace('.', '/')
         for (Iterator<URL> it = urls.iterator(); it.hasNext();) {
@@ -481,7 +454,7 @@ class CachedPackage {
     Set<URL> sources
 
     CachedPackage(String name, Set<URL> sources) {
-        this.sources = sources
         this.name = name
+        this.sources = sources
     }
 }


[groovy] 02/09: GROOVY-8517: add getNodeMetaData(Object,Function)

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5d2294a725a541512601dfe9ca8f14a2c6688df9
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 08:39:05 2019 -0500

    GROOVY-8517: add getNodeMetaData(Object,Function)
    
    (cherry picked from commit 5c81d14da2ae050a1bda2d0e986831275da3ef14)
---
 .../codehaus/groovy/ast/NodeMetaDataHandler.java   | 42 +++++++++++++++-------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/NodeMetaDataHandler.java b/src/main/java/org/codehaus/groovy/ast/NodeMetaDataHandler.java
index 280cd6b..8bfa8f0 100644
--- a/src/main/java/org/codehaus/groovy/ast/NodeMetaDataHandler.java
+++ b/src/main/java/org/codehaus/groovy/ast/NodeMetaDataHandler.java
@@ -23,30 +23,49 @@ import org.codehaus.groovy.util.ListHashMap;
 
 import java.util.Collections;
 import java.util.Map;
+import java.util.function.Function;
 
 /**
- * An interface to mark a node being able to handle metadata
+ * An interface to mark a node being able to handle metadata.
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public interface NodeMetaDataHandler {
     /**
      * Gets the node meta data.
      *
-     * @param key - the meta data key
+     * @param key the meta data key
      * @return the node meta data value for this key
      */
     default <T> T getNodeMetaData(Object key) {
-        Map<?, ?> metaDataMap = this.getMetaDataMap();
-
+        Map metaDataMap = this.getMetaDataMap();
         if (metaDataMap == null) {
-            return (T) null;
+            return null;
         }
         return (T) metaDataMap.get(key);
     }
 
     /**
+     * Gets the node meta data.
+     *
+     * @param key the meta data key
+     * @param valFn the meta data value supplier
+     * @return the node meta data value for this key
+     */
+    default <T> T getNodeMetaData(Object key, Function<?, ? extends T> valFn) {
+        if (key == null) throw new GroovyBugError("Tried to get/set meta data with null key on " + this + ".");
+
+        Map metaDataMap = this.getMetaDataMap();
+        if (metaDataMap == null) {
+            metaDataMap = new ListHashMap();
+            this.setMetaDataMap(metaDataMap);
+        }
+        return (T) metaDataMap.computeIfAbsent(key, valFn);
+    }
+
+    /**
      * Copies all node meta data from the other node to this one
      *
-     * @param other - the other node
+     * @param other the other node
      */
     default void copyNodeMetaData(NodeMetaDataHandler other) {
         Map otherMetaDataMap = other.getMetaDataMap();
@@ -65,8 +84,8 @@ public interface NodeMetaDataHandler {
     /**
      * Sets the node meta data.
      *
-     * @param key   - the meta data key
-     * @param value - the meta data value
+     * @param key   the meta data key
+     * @param value the meta data value
      * @throws GroovyBugError if key is null or there is already meta
      *                        data under that key
      */
@@ -85,8 +104,8 @@ public interface NodeMetaDataHandler {
     /**
      * Sets the node meta data but allows overwriting values.
      *
-     * @param key   - the meta data key
-     * @param value - the meta data value
+     * @param key   the meta data key
+     * @param value the meta data value
      * @return the old node meta data value for this key
      * @throws GroovyBugError if key is null
      */
@@ -104,7 +123,7 @@ public interface NodeMetaDataHandler {
     /**
      * Removes a node meta data entry.
      *
-     * @param key - the meta data key
+     * @param key the meta data key
      * @throws GroovyBugError if the key is null
      */
     default void removeNodeMetaData(Object key) {
@@ -124,7 +143,6 @@ public interface NodeMetaDataHandler {
      */
     default Map<?, ?> getNodeMetaData() {
         Map metaDataMap = this.getMetaDataMap();
-
         if (metaDataMap == null) {
             return Collections.emptyMap();
         }


[groovy] 07/09: java 8 refacotor

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 32a198bf487c94be0e2c4a0fb73a006411ebe818
Author: mattisonchao <ma...@gmail.com>
AuthorDate: Fri Nov 1 13:34:16 2019 +0800

    java 8 refacotor
    
    I found several code again that can be changed to a lambda expression.
    
    (cherry picked from commit 77c2dd4d4b21df580b04ec6d68054c2b560e5a71)
---
 src/main/java/groovy/lang/GroovyClassLoader.java   | 56 +++++++++-------------
 .../groovy/classgen/asm/ClosureWriter.java         |  6 +--
 .../codehaus/groovy/reflection/CachedClass.java    | 22 ++++-----
 .../org/codehaus/groovy/reflection/ClassInfo.java  |  6 +--
 .../reflection/ClassLoaderForClassArtifacts.java   |  6 +--
 .../groovy/runtime/DefaultGroovyMethods.java       |  8 ++--
 .../groovy/runtime/metaclass/ClosureMetaClass.java | 44 +++++++----------
 7 files changed, 56 insertions(+), 92 deletions(-)

diff --git a/src/main/java/groovy/lang/GroovyClassLoader.java b/src/main/java/groovy/lang/GroovyClassLoader.java
index 726c5d4..59741fb 100644
--- a/src/main/java/groovy/lang/GroovyClassLoader.java
+++ b/src/main/java/groovy/lang/GroovyClassLoader.java
@@ -109,18 +109,16 @@ public class GroovyClassLoader extends URLClassLoader {
 
     private GroovyResourceLoader resourceLoader = new GroovyResourceLoader() {
         public URL loadGroovySource(final String filename) throws MalformedURLException {
-            return AccessController.doPrivileged(new PrivilegedAction<URL>() {
-                public URL run() {
-                    for (String extension : config.getScriptExtensions()) {
-                        try {
-                            URL ret = getSourceFile(filename, extension);
-                            if (ret != null)
-                                return ret;
-                        } catch (Throwable t) { //
-                        }
+            return AccessController.doPrivileged((PrivilegedAction<URL>) () -> {
+                for (String extension : config.getScriptExtensions()) {
+                    try {
+                        URL ret = getSourceFile(filename, extension);
+                        if (ret != null)
+                            return ret;
+                    } catch (Throwable t) { //
                     }
-                    return null;
                 }
+                return null;
             });
         }
     };
@@ -253,11 +251,7 @@ public class GroovyClassLoader extends URLClassLoader {
      * @return the main class defined in the given script
      */
     public Class parseClass(final String text, final String fileName) throws CompilationFailedException {
-        GroovyCodeSource gcs = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() {
-            public GroovyCodeSource run() {
-                return new GroovyCodeSource(text, fileName, "/groovy/script");
-            }
-        });
+        GroovyCodeSource gcs = AccessController.doPrivileged((PrivilegedAction<GroovyCodeSource>) () -> new GroovyCodeSource(text, fileName, "/groovy/script"));
         gcs.setCachable(false);
         return parseClass(gcs);
     }
@@ -279,14 +273,12 @@ public class GroovyClassLoader extends URLClassLoader {
     }
 
     public Class parseClass(final Reader reader, final String fileName) throws CompilationFailedException {
-        GroovyCodeSource gcs = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() {
-            public GroovyCodeSource run() {
-                try {
-                    String scriptText = IOGroovyMethods.getText(reader);
-                    return new GroovyCodeSource(scriptText, fileName, "/groovy/script");
-                } catch (IOException e) {
-                    throw new RuntimeException("Impossible to read the content of the reader for file named: " + fileName, e);
-                }
+        GroovyCodeSource gcs = AccessController.doPrivileged((PrivilegedAction<GroovyCodeSource>) () -> {
+            try {
+                String scriptText = IOGroovyMethods.getText(reader);
+                return new GroovyCodeSource(scriptText, fileName, "/groovy/script");
+            } catch (IOException e) {
+                throw new RuntimeException("Impossible to read the content of the reader for file named: " + fileName, e);
             }
         });
         return parseClass(gcs);
@@ -301,16 +293,14 @@ public class GroovyClassLoader extends URLClassLoader {
         // For generic input streams, provide a catch-all codebase of GroovyScript
         // Security for these classes can be administered via policy grants with
         // a codebase of file:groovy.script
-        GroovyCodeSource gcs = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() {
-            public GroovyCodeSource run() {
-                try {
-                    String scriptText = config.getSourceEncoding() != null ?
-                            IOGroovyMethods.getText(in, config.getSourceEncoding()) :
-                            IOGroovyMethods.getText(in);
-                    return new GroovyCodeSource(scriptText, fileName, "/groovy/script");
-                } catch (IOException e) {
-                    throw new RuntimeException("Impossible to read the content of the input stream for file named: " + fileName, e);
-                }
+        GroovyCodeSource gcs = AccessController.doPrivileged((PrivilegedAction<GroovyCodeSource>) () -> {
+            try {
+                String scriptText = config.getSourceEncoding() != null ?
+                        IOGroovyMethods.getText(in, config.getSourceEncoding()) :
+                        IOGroovyMethods.getText(in);
+                return new GroovyCodeSource(scriptText, fileName, "/groovy/script");
+            } catch (IOException e) {
+                throw new RuntimeException("Impossible to read the content of the input stream for file named: " + fileName, e);
             }
         });
         return parseClass(gcs);
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 d9a783b..4b6cfc9 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -77,11 +77,7 @@ public class ClosureWriter {
     public ClosureWriter(WriterController wc) {
         this.controller = wc;
         closureClassMap = new HashMap<Expression,ClassNode>();
-        factory = new WriterControllerFactory() {
-            public WriterController makeController(final WriterController normalController) {
-                return controller;
-            }
-        };
+        factory = normalController -> controller;
     }
 
     public void writeClosure(ClosureExpression expression) {
diff --git a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
index 5e4a66e..51c2083 100644
--- a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
+++ b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
@@ -101,19 +101,17 @@ public class CachedClass {
 
         public CachedMethod[] initValue() {
             final Method[] declaredMethods;
-            declaredMethods = AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
-                public Method[] run() {
-                    try {
-                        Method[] dm = getTheClass().getDeclaredMethods();
-                        dm = Arrays.stream(dm)
-                                .filter(m -> checkCanSetAccessible(m, CachedClass.class))
-                                .toArray(Method[]::new);
+            declaredMethods = AccessController.doPrivileged((PrivilegedAction<Method[]>) () -> {
+                try {
+                    Method[] dm = getTheClass().getDeclaredMethods();
+                    dm = Arrays.stream(dm)
+                            .filter(m -> checkCanSetAccessible(m, CachedClass.class))
+                            .toArray(Method[]::new);
 //                           dm = (Method[]) ReflectionUtils.makeAccessible(dm);
-                        return dm;
-                    } catch (Throwable e) {
-                        // Typically, Android can throw ClassNotFoundException
-                        return EMPTY_METHOD_ARRAY;
-                    }
+                    return dm;
+                } catch (Throwable e) {
+                    // Typically, Android can throw ClassNotFoundException
+                    return EMPTY_METHOD_ARRAY;
                 }
             });
             List<CachedMethod> methods = new ArrayList<CachedMethod>(declaredMethods.length);
diff --git a/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java b/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
index 2c4ae9a..c7d1a51 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
@@ -462,11 +462,7 @@ public class ClassInfo implements Finalizable {
         }
 
         public ClassLoaderForClassArtifacts initValue() {
-            return AccessController.doPrivileged(new PrivilegedAction<ClassLoaderForClassArtifacts>() {
-                public ClassLoaderForClassArtifacts run() {
-                    return new ClassLoaderForClassArtifacts(info.classRef.get());
-                }
-            });
+            return AccessController.doPrivileged((PrivilegedAction<ClassLoaderForClassArtifacts>) () -> new ClassLoaderForClassArtifacts(info.classRef.get()));
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
index f8f0dfa..5087a84 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
@@ -75,11 +75,7 @@ public class ClassLoaderForClassArtifacts extends ClassLoader {
     }
 
     public Constructor defineClassAndGetConstructor(final String name, final byte[] bytes) {
-        final Class cls = AccessController.doPrivileged( new PrivilegedAction<Class>(){
-            public Class run() {
-                return define(name, bytes);
-            }
-        });
+        final Class cls = AccessController.doPrivileged((PrivilegedAction<Class>) () -> define(name, bytes));
 
         if (cls != null) {
             try {
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index 69ec742..64b3603 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -451,11 +451,9 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
                     if (groovyObject && field.getName().equals("metaClass")) {
                         continue;
                     }
-                    AccessController.doPrivileged(new PrivilegedAction<Object>() {
-                        public Object run() {
-                            ReflectionUtils.trySetAccessible(field);
-                            return null;
-                        }
+                    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
+                        ReflectionUtils.trySetAccessible(field);
+                        return null;
                     });
                     buffer.append(" ");
                     buffer.append(field.getName());
diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
index bdf8c8d..786a0ba 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
@@ -458,21 +458,17 @@ public final class ClosureMetaClass extends MetaClassImpl {
             int length = c.length;
             if (length == 0) {
                 // no arg method
-                chooser = new MethodChooser() {
-                    public Object chooseMethod(Class[] arguments, boolean coerce) {
-                        if (arguments.length == 0) return doCall;
-                        return null;
-                    }
+                chooser = (arguments, coerce) -> {
+                    if (arguments.length == 0) return doCall;
+                    return null;
                 };
             } else {
                 if (length == 1 && c[0].getTheClass() == Object.class) {
                     // Object fits all, so simple dispatch rule here
-                    chooser = new MethodChooser() {
-                        public Object chooseMethod(Class[] arguments, boolean coerce) {
-                            // <2, because foo() is same as foo(null)
-                            if (arguments.length < 2) return doCall;
-                            return null;
-                        }
+                    chooser = (arguments, coerce) -> {
+                        // <2, because foo() is same as foo(null)
+                        if (arguments.length < 2) return doCall;
+                        return null;
                     };
                 } else {
                     boolean allObject = true;
@@ -484,11 +480,9 @@ public final class ClosureMetaClass extends MetaClassImpl {
                     }
                     if (allObject && c[c.length - 1].getTheClass() == Object.class) {
                         // all arguments are object, so test only if argument number is correct
-                        chooser = new MethodChooser() {
-                            public Object chooseMethod(Class[] arguments, boolean coerce) {
-                                if (arguments.length == c.length) return doCall;
-                                return null;
-                            }
+                        chooser = (arguments, coerce) -> {
+                            if (arguments.length == c.length) return doCall;
+                            return null;
                         };
                     } else {
                         if (allObject && c[c.length - 1].getTheClass() == Object[].class) {
@@ -496,21 +490,17 @@ public final class ClosureMetaClass extends MetaClassImpl {
                             // will fit all, so just test if the number of argument is equal or
                             // more than the parameters we have.
                             final int minimumLength = c.length - 2;
-                            chooser = new MethodChooser() {
-                                public Object chooseMethod(Class[] arguments, boolean coerce) {
-                                    if (arguments.length > minimumLength) return doCall;
-                                    return null;
-                                }
+                            chooser = (arguments, coerce) -> {
+                                if (arguments.length > minimumLength) return doCall;
+                                return null;
                             };
                         } else {
                             // general case for single method
-                            chooser = new MethodChooser() {
-                                public Object chooseMethod(Class[] arguments, boolean coerce) {
-                                    if (doCall.isValidMethod(arguments)) {
-                                        return doCall;
-                                    }
-                                    return null;
+                            chooser = (arguments, coerce) -> {
+                                if (doCall.isValidMethod(arguments)) {
+                                    return doCall;
                                 }
+                                return null;
                             };
                         }
                     }


[groovy] 06/09: GROOVY-8457: use ClassHelper.make(Class) for resolved exception type

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit dd3a64f3a0546f6626982bc5ba8f68e43d27631e
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 20:17:18 2019 -0500

    GROOVY-8457: use ClassHelper.make(Class) for resolved exception type
    
    (cherry picked from commit 1437642286adfc0b892f34abc1ad2738b6ea8595)
---
 .../NotYetImplementedASTTransformation.java        |  3 +-
 .../NotYetImplementedTransformTest.groovy          | 43 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java b/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
index 2b8cba3..7c6250c 100644
--- a/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
+++ b/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
@@ -33,6 +33,7 @@ import org.codehaus.groovy.transform.AbstractASTTransformation;
 import org.codehaus.groovy.transform.GroovyASTTransformation;
 
 import java.util.Arrays;
+import junit.framework.AssertionFailedError;
 
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.block;
@@ -52,7 +53,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.tryCatchS;
 public class NotYetImplementedASTTransformation extends AbstractASTTransformation {
 
     private static final ClassNode CATCH_TYPE = ClassHelper.make(Throwable.class);
-    private static final ClassNode THROW_TYPE = ClassHelper.make("junit.framework.AssertionFailedError"); // TODO: java.lang.AssertionError
+    private static final ClassNode THROW_TYPE = ClassHelper.make(AssertionFailedError.class); // TODO: java.lang.AssertionError
 
     public void visit(ASTNode[] nodes, SourceUnit source) {
         if (!(nodes.length == 2 && nodes[0] instanceof AnnotationNode && nodes[1] instanceof MethodNode)) {
diff --git a/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy b/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
index 99314d9..f6eef26 100644
--- a/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
+++ b/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
@@ -117,6 +117,27 @@ final class NotYetImplementedTransformTest {
         assert output.wasSuccessful() : '@Test method marked with @NotYetImplemented must NOT throw an AssertionFailedError'
     }
 
+    @Test // GROOVY-8457
+    void testNotYetImplementedJUnit4Failure_atCompileStatic()  {
+        def output = shell.evaluate('''
+            import groovy.transform.CompileStatic
+            import groovy.test.NotYetImplemented
+            import org.junit.Test
+            import org.junit.runner.JUnitCore
+
+            @CompileStatic
+            class MyTests {
+                @NotYetImplemented @Test void testThatFails()  {
+                    assert false
+                }
+            }
+
+            new JUnitCore().run(MyTests)
+        ''')
+
+        assert output.wasSuccessful() : '@Test method marked with @CompileStatic and @NotYetImplemented must NOT throw an AssertionFailedError'
+    }
+
     @Test
     void testNotYetImplementedJUnit4Success() {
         def output = shell.evaluate('''
@@ -137,4 +158,26 @@ final class NotYetImplementedTransformTest {
         assert output.failureCount == 1 : '@Test method marked with @NotYetImplemented must throw an AssertionFailedError'
         assert output.failures.first().exception instanceof AssertionFailedError : '@Test method marked with @NotYetImplemented must throw an AssertionFailedError'
     }
+
+    @Test // GROOVY-8457
+    void testNotYetImplementedJUnit4Success_atCompileStatic()  {
+        def output = shell.evaluate('''
+            import groovy.transform.CompileStatic
+            import groovy.test.NotYetImplemented
+            import org.junit.Test
+            import org.junit.runner.JUnitCore
+
+            @CompileStatic
+            class MyTests {
+                @NotYetImplemented @Test void testThatFails()  {
+                    assert true
+                }
+            }
+
+            new JUnitCore().run(MyTests)
+        ''')
+
+        assert output.failureCount == 1 : '@Test method marked with @CompileStatic and @NotYetImplemented must throw an AssertionFailedError'
+        assert output.failures.first().exception instanceof AssertionFailedError : '@Test method marked with @CompileStatic and @NotYetImplemented must throw an AssertionFailedError'
+    }
 }


[groovy] 08/09: GROOVY-9298: Eliminate some illegal access warnings when indy is enabled (#1058)

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1aacc92714292189f165916e01d56549b7bc86cf
Author: Daniel.Sun <su...@apache.org>
AuthorDate: Fri Nov 1 17:12:00 2019 +0800

    GROOVY-9298: Eliminate some illegal access warnings when indy is enabled (#1058)
    
    * Show detailed messages for illegal access warnings
    
    * Fix illegal access warning `java.util.HashMap$Node.toString()`
    
    * Fix illegal access warning `java.math.BigInteger.multiply(long)`
    
    * Fix illegal access warning `java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)`
    
    * Throw GroovyRuntimeException instead
    
    (cherry picked from commit 662e812177efd3182acaae26b6a0f0ad954115cf)
---
 gradle/test.gradle                                 |  4 +--
 .../org/codehaus/groovy/vmplugin/v7/Selector.java  | 15 +++++----
 .../org/codehaus/groovy/vmplugin/v9/Java9.java     | 37 ++++++++++++----------
 src/test/groovy/bugs/groovy9081/Groovy9081.groovy  | 16 +++++++++-
 4 files changed, 46 insertions(+), 26 deletions(-)

diff --git a/gradle/test.gradle b/gradle/test.gradle
index 4d3d282..e9257b3 100644
--- a/gradle/test.gradle
+++ b/gradle/test.gradle
@@ -19,8 +19,8 @@
 allprojects {
     tasks.withType(Test) {
         def jdk8 = ['-XX:+UseConcMarkSweepGC']
-        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI']
-//        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI', '--illegal-access=debug']
+//        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI']
+        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI', '--illegal-access=debug']
         def common = ['-ea', "-Xms${groovyJUnit_ms}", "-Xmx${groovyJUnit_mx}", "-Duser.language=en" ]
         if (JavaVersion.current().isJava9Compatible()) {
             jvmArgs (*common, *jdk9)
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v7/Selector.java b/src/main/java/org/codehaus/groovy/vmplugin/v7/Selector.java
index 225bb5c..c686a78 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v7/Selector.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v7/Selector.java
@@ -50,6 +50,7 @@ import org.codehaus.groovy.runtime.metaclass.NewInstanceMetaMethod;
 import org.codehaus.groovy.runtime.metaclass.NewStaticMetaMethod;
 import org.codehaus.groovy.runtime.metaclass.ReflectionMetaMethod;
 import org.codehaus.groovy.runtime.wrappers.Wrapper;
+import org.codehaus.groovy.vmplugin.VMPluginFactory;
 import org.codehaus.groovy.vmplugin.v7.IndyInterface.CALL_TYPES;
 
 import java.lang.invoke.MethodHandle;
@@ -395,9 +396,10 @@ public abstract class Selector {
          * For a constructor call we always use the static meta class from the registry
          */
         @Override
-        public void getMetaClass() {
+        public MetaClass getMetaClass() {
             Object receiver = args[0];
             mc = GroovySystem.getMetaClassRegistry().getMetaClass((Class) receiver);
+            return mc;
         }
 
         /**
@@ -554,7 +556,7 @@ public abstract class Selector {
         /**
          * Gives the meta class to an Object.
          */
-        public void getMetaClass() {
+        public MetaClass getMetaClass() {
             Object receiver = args[0];
             if (receiver == null) {
                 mc = NullObject.getNullObject().getMetaClass();
@@ -573,6 +575,8 @@ public abstract class Selector {
                 this.cache &= !ClassInfo.getClassInfo(receiver.getClass()).hasPerInstanceMetaClasses();
             }
             mc.initialize();
+
+            return mc;
         }
 
         /**
@@ -606,10 +610,8 @@ public abstract class Selector {
             MetaMethod metaMethod = method;
             isCategoryMethod = method instanceof CategoryMethod;
 
-            if (
-                    metaMethod instanceof NumberNumberMetaMethod ||
-                    (method instanceof GeneratedMetaMethod && (name.equals("next") || name.equals("previous")))
-            ) {
+            if (metaMethod instanceof NumberNumberMetaMethod
+                    || (method instanceof GeneratedMetaMethod && (name.equals("next") || name.equals("previous")))) {
                 if (LOG_ENABLED) LOG.info("meta method is number method");
                 if (IndyMath.chooseMathMethod(this, metaMethod)) {
                     catchException = false;
@@ -632,6 +634,7 @@ public abstract class Selector {
             if (metaMethod instanceof CachedMethod) {
                 if (LOG_ENABLED) LOG.info("meta method is CachedMethod instance");
                 CachedMethod cm = (CachedMethod) metaMethod;
+                cm = (CachedMethod) VMPluginFactory.getPlugin().transformMetaMethod(getMetaClass(), cm, cm.getPT(), Selector.class);
                 isVargs = cm.isVargsMethod();
                 try {
                     Method m = cm.getCachedMethod();
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
index 39c507b..a1970c9 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.vmplugin.v9;
 
+import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaClass;
 import groovy.lang.MetaMethod;
 import groovy.lang.Tuple;
@@ -92,14 +93,15 @@ public class Java9 extends Java8 {
 
     public static MethodHandles.Lookup of(final Class<?> declaringClass) {
         try {
-            if (getPrivateLookup() != null) {
-                return MethodHandles.Lookup.class.cast(getPrivateLookup().invoke(null, declaringClass, MethodHandles.lookup()));
+            final Method privateLookup = getPrivateLookup();
+            if (privateLookup != null) {
+                return (MethodHandles.Lookup) privateLookup.invoke(null, declaringClass, MethodHandles.lookup());
             }
             return getLookupConstructor().newInstance(declaringClass, MethodHandles.Lookup.PRIVATE).in(declaringClass);
         } catch (final IllegalAccessException | InstantiationException e) {
             throw new IllegalArgumentException(e);
         } catch (final InvocationTargetException e) {
-            throw new RuntimeException(e);
+            throw new GroovyRuntimeException(e);
         }
     }
 
@@ -110,15 +112,12 @@ public class Java9 extends Java8 {
 
     @Override
     public Object getInvokeSpecialHandle(Method method, Object receiver) {
-        if (getLookupConstructor() != null) {
-            Class declaringClass = method.getDeclaringClass();
-            try {
-                return of(declaringClass).unreflectSpecial(method, receiver.getClass()).bindTo(receiver);
-            } catch (ReflectiveOperationException e) {
-                throw new GroovyBugError(e);
-            }
+        final Class<?> receiverType = receiver.getClass();
+        try {
+            return of(receiverType).unreflectSpecial(method, receiverType).bindTo(receiver);
+        } catch (ReflectiveOperationException e) {
+            return super.getInvokeSpecialHandle(method, receiver);
         }
-        return super.getInvokeSpecialHandle(method, receiver);
     }
 
     /**
@@ -235,12 +234,16 @@ public class Java9 extends Java8 {
             return metaMethod;
         }
 
-        if (MULTIPLY.equals(metaMethod.getName())
-                && (1 == params.length && (Integer.class == params[0] || Long.class == params[0] || Short.class == params[0]))) {
-            try {
-                return new CachedMethod(BigInteger.class.getDeclaredMethod(MULTIPLY, BigInteger.class));
-            } catch (NoSuchMethodException e) {
-                throw new GroovyBugError("Failed to transform " + MULTIPLY + " method of BigInteger", e);
+        if (1 == params.length && MULTIPLY.equals(metaMethod.getName())) {
+            Class<?> param = params[0];
+            if (Long.class == param || long.class == param
+                    || Integer.class == param || int.class == param
+                    || Short.class == param || short.class == param) {
+                try {
+                    return new CachedMethod(BigInteger.class.getDeclaredMethod(MULTIPLY, BigInteger.class));
+                } catch (NoSuchMethodException e) {
+                    throw new GroovyBugError("Failed to transform " + MULTIPLY + " method of BigInteger", e);
+                }
             }
         }
 
diff --git a/src/test/groovy/bugs/groovy9081/Groovy9081.groovy b/src/test/groovy/bugs/groovy9081/Groovy9081.groovy
index 0eb8666..4762d24 100644
--- a/src/test/groovy/bugs/groovy9081/Groovy9081.groovy
+++ b/src/test/groovy/bugs/groovy9081/Groovy9081.groovy
@@ -19,7 +19,6 @@
 package groovy.bugs.groovy9081
 
 import groovy.bugs.groovy9081.somepkg.ProtectedConstructor
-import org.junit.Ignore
 import org.junit.Test
 
 import java.awt.Font
@@ -69,4 +68,19 @@ final class Groovy9081 {
     void testAsType2() {
         [run: {}] as ProtectedConstructor
     }
+
+    @Test
+    void testAccessPackagePrivateInnerClassMember() {
+        def m = new HashMap()
+        m.a = 69
+        m.entrySet().iterator().next().toString()
+    }
+
+    @Test
+    void testAccessPackagePrivateMethod() {
+        BigInteger a = 333
+        int b = 2
+        BigDecimal c = a * b
+        assert c == 666
+    }
 }


[groovy] 01/09: sync with groovy-eclipse

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2f14a777bc2a00f15af772734f8c05f633711d4b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 08:38:13 2019 -0500

    sync with groovy-eclipse
    
    (cherry picked from commit 37c2db46c7b7a96d95a6cd33178f4c5d44c167dc)
---
 .../groovy/grape/GrabAnnotationTransformation.java |  11 +-
 .../java/org/codehaus/groovy/ast/CompileUnit.java  |  22 +--
 .../org/codehaus/groovy/ast/GroovyCodeVisitor.java |  10 +-
 .../java/org/codehaus/groovy/ast/ImportNode.java   |   5 +-
 .../java/org/codehaus/groovy/ast/MethodNode.java   |   3 +-
 .../java/org/codehaus/groovy/ast/ModuleNode.java   |  98 ++++++-------
 .../java/org/codehaus/groovy/ast/Parameter.java    |  21 ++-
 .../classgen/asm/sc/StaticInvocationWriter.java    |  30 ++--
 .../groovy/control/CompilerConfiguration.java      | 151 +++++----------------
 9 files changed, 128 insertions(+), 223 deletions(-)

diff --git a/src/main/java/groovy/grape/GrabAnnotationTransformation.java b/src/main/java/groovy/grape/GrabAnnotationTransformation.java
index eac9e2c..d30430a 100644
--- a/src/main/java/groovy/grape/GrabAnnotationTransformation.java
+++ b/src/main/java/groovy/grape/GrabAnnotationTransformation.java
@@ -58,6 +58,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -201,9 +202,9 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
             }
         }
 
-        List<Map<String,Object>> grabMaps = new ArrayList<Map<String,Object>>();
-        List<Map<String,Object>> grabMapsInit = new ArrayList<Map<String,Object>>();
-        List<Map<String,Object>> grabExcludeMaps = new ArrayList<Map<String,Object>>();
+        Collection<Map<String,Object>> grabMaps = new LinkedHashSet<>();
+        Collection<Map<String,Object>> grabMapsInit = new ArrayList<>();
+        Collection<Map<String,Object>> grabExcludeMaps = new ArrayList<>();
 
         for (ClassNode classNode : sourceUnit.getAST().getClasses()) {
             grabAnnotations = new ArrayList<AnnotationNode>();
@@ -387,7 +388,7 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
         }
     }
 
-    private void callGrabAsStaticInitIfNeeded(ClassNode classNode, ClassNode grapeClassNode, List<Map<String,Object>> grabMapsInit, List<Map<String, Object>> grabExcludeMaps) {
+    private void callGrabAsStaticInitIfNeeded(ClassNode classNode, ClassNode grapeClassNode, Collection<Map<String,Object>> grabMapsInit, Collection<Map<String, Object>> grabExcludeMaps) {
         List<Statement> grabInitializers = new ArrayList<Statement>();
         MapExpression basicArgs = new MapExpression();
         if (autoDownload != null)  {
@@ -400,7 +401,7 @@ public class GrabAnnotationTransformation extends ClassCodeVisitorSupport implem
 
         if (systemProperties != null && !systemProperties.isEmpty()) {
             BlockStatement block = new BlockStatement();
-            for(Map.Entry e : systemProperties.entrySet()) {
+            for(Map.Entry<String, String> e : systemProperties.entrySet()) {
                 block.addStatement(stmt(callX(SYSTEM_CLASSNODE, "setProperty", args(constX(e.getKey()), constX(e.getValue())))));
             }
             StaticMethodCallExpression enabled = callX(SYSTEM_CLASSNODE, "getProperty", args(constX("groovy.grape.enable"), constX("true")));
diff --git a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
index 656cc23..4344b46 100644
--- a/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
+++ b/src/main/java/org/codehaus/groovy/ast/CompileUnit.java
@@ -24,8 +24,6 @@ import org.codehaus.groovy.control.CompilerConfiguration;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
 import org.codehaus.groovy.syntax.SyntaxException;
-import org.codehaus.groovy.util.ListHashMap;
-import org.objectweb.asm.Opcodes;
 
 import java.security.CodeSource;
 import java.util.ArrayList;
@@ -55,7 +53,7 @@ public class CompileUnit implements NodeMetaDataHandler {
     private final Map<String, SourceUnit> classNameToSource = new LinkedHashMap<>();
     private final Map<String, InnerClassNode> generatedInnerClasses = new LinkedHashMap<>();
     private final Map<String, ConstructedOuterNestedClassNode> classesToResolve = new LinkedHashMap<>();
-    private Map metaDataMap = null;
+    private Map metaDataMap;
 
     public CompileUnit(GroovyClassLoader classLoader, CompilerConfiguration config) {
         this(classLoader, null, config);
@@ -214,8 +212,8 @@ public class CompileUnit implements NodeMetaDataHandler {
     }
 
     @Override
-    public ListHashMap getMetaDataMap() {
-        return (ListHashMap) metaDataMap;
+    public Map<?, ?> getMetaDataMap() {
+        return metaDataMap;
     }
 
     @Override
@@ -224,7 +222,9 @@ public class CompileUnit implements NodeMetaDataHandler {
     }
 
     /**
-     * Represents a resolved type as a placeholder, SEE GROOVY-7812
+     * Represents a resolved type as a placeholder.
+     *
+     * @see GROOVY-7812
      */
     @Internal
     public static class ConstructedOuterNestedClassNode extends ClassNode {
@@ -232,11 +232,15 @@ public class CompileUnit implements NodeMetaDataHandler {
         private final List<BiConsumer<ConstructedOuterNestedClassNode, ClassNode>> setRedirectListenerList = new ArrayList<>();
 
         public ConstructedOuterNestedClassNode(ClassNode outer, String innerClassName) {
-            super(innerClassName, Opcodes.ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
+            super(innerClassName, ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
             this.enclosingClassNode = outer;
             this.isPrimaryNode = false;
         }
 
+        public ClassNode getEnclosingClassNode() {
+            return enclosingClassNode;
+        }
+
         @Override
         public void setRedirect(ClassNode cn) {
             for (BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener : setRedirectListenerList) {
@@ -245,10 +249,6 @@ public class CompileUnit implements NodeMetaDataHandler {
             super.setRedirect(cn);
         }
 
-        public ClassNode getEnclosingClassNode() {
-            return enclosingClassNode;
-        }
-
         public void addSetRedirectListener(BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener) {
             setRedirectListenerList.add(setRedirectListener);
         }
diff --git a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
index d807e60..be45610 100644
--- a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
+++ b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
@@ -199,14 +199,6 @@ public interface GroovyCodeVisitor {
     default void visitEmptyExpression(EmptyExpression expression) {}
 
     default 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);
-            }
-        }
+        if (list != null) list.forEach(expr -> expr.visit(this));
     }
 }
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 b05888b..a9da877 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.util.List;
 import java.util.Optional;
 
 /**
- * Represents a method declaration
+ * Represents a method declaration.
  */
 public class MethodNode extends AnnotatedNode implements Opcodes {
 
@@ -103,6 +103,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) {
diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index 54f7e16..7033169 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -37,6 +37,7 @@ import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -51,21 +52,21 @@ 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 ) {
@@ -87,7 +88,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
     public List<ClassNode> getClasses() {
         if (createClassForStatements && (!statementBlock.isEmpty() || !methods.isEmpty() || isPackageInfo())) {
             ClassNode mainClass = createStatementsClass();
-            mainClassName = mainClass.getName(); 
+            mainClassName = mainClass.getName();
             createClassForStatements = false;
             classes.add(0, mainClass);
             mainClass.setModule(this);
@@ -101,7 +102,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
     }
 
     public List<ImportNode> getImports() {
-        return new ArrayList<ImportNode>(imports.values());
+        return new ArrayList<>(imports.values());
     }
 
     public List<ImportNode> getStarImports() {
@@ -126,7 +127,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
     }
 
     public void addImport(String alias, ClassNode type) {
-        addImport(alias, type, new ArrayList<AnnotationNode>());
+        addImport(alias, type, new ArrayList<>());
     }
 
     public void addImport(String alias, ClassNode type, List<AnnotationNode> annotations) {
@@ -137,7 +138,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
     }
 
     public void addStarImport(String packageName) {
-        addStarImport(packageName, new ArrayList<AnnotationNode>());
+        addStarImport(packageName, Collections.emptyList());
     }
 
     public void addStarImport(String packageName, List<AnnotationNode> annotations) {
@@ -147,6 +148,32 @@ public class ModuleNode extends ASTNode implements Opcodes {
         storeLastAddedImportNode(importNode);
     }
 
+    public void addStaticImport(ClassNode type, String fieldName, String alias) {
+        addStaticImport(type, fieldName, alias, Collections.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);
+            staticImports.put(alias, staticImports.remove(alias));
+        }
+        storeLastAddedImportNode(node);
+    }
+
+    public void addStaticStarImport(String name, ClassNode type) {
+        addStaticStarImport(name, type, Collections.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);
     }
@@ -206,12 +233,9 @@ public class ModuleNode extends ASTNode implements Opcodes {
      * @return the underlying character stream description
      */
     public String getDescription() {
-        if( context != null )
-        {
+        if (context != null) {
             return context.getName();
-        }
-        else
-        {
+        } else {
             return this.description;
         }
     }
@@ -233,7 +257,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
             setScriptBaseClassFromConfig(scriptDummy);
             return scriptDummy;
         }
-        
+
         String name = getPackageName();
         if (name == null) {
             name = "";
@@ -273,13 +297,13 @@ public class ModuleNode extends ASTNode implements Opcodes {
             }
         }
     }
-    
+
     protected ClassNode createStatementsClass() {
         ClassNode classNode = getScriptClassDummy();
         if (classNode.getName().endsWith("package-info")) {
             return classNode;
         }
-        
+
         handleMainMethodIfPresent(methods);
 
         // return new Foo(new ShellContext(args)).run()
@@ -346,7 +370,7 @@ 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.  
+     * 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) {
         boolean found = false;
@@ -360,7 +384,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
 
                     argTypeMatches = (argType.equals(ClassHelper.OBJECT_TYPE) || argType.getName().contains("String[]"));
                     retTypeMatches = (retType == ClassHelper.VOID_TYPE || retType == ClassHelper.OBJECT_TYPE);
-                    
+
                     if(retTypeMatches && argTypeMatches) {
                         if(found) {
                             throw new RuntimeException("Repetitive main method found.");
@@ -412,11 +436,11 @@ public class ModuleNode extends ASTNode implements Opcodes {
     public boolean isEmpty() {
         return classes.isEmpty() && statementBlock.getStatements().isEmpty();
     }
-    
+
     public void sortClasses(){
         if (isEmpty()) return;
         List<ClassNode> classes = getClasses();
-        LinkedList<ClassNode> sorted = new LinkedList<ClassNode>();
+        LinkedList<ClassNode> sorted = new LinkedList<>();
         int level=1;
         while (!classes.isEmpty()) {
             for (Iterator<ClassNode> cni = classes.iterator(); cni.hasNext();) {
@@ -448,32 +472,10 @@ public class ModuleNode extends ASTNode implements Opcodes {
         return staticStarImports;
     }
 
-    public void addStaticImport(ClassNode type, String fieldName, String alias) {
-        addStaticImport(type, fieldName, alias, new ArrayList<AnnotationNode>());
-    }
-
-    public void addStaticImport(ClassNode type, String fieldName, String alias, List<AnnotationNode> annotations) {
-        ImportNode node = new ImportNode(type, fieldName, alias);
-        node.addAnnotations(annotations);
-        staticImports.put(alias, node);
-        storeLastAddedImportNode(node);
-    }
-
-    public void addStaticStarImport(String name, ClassNode type) {
-        addStaticStarImport(name, type, new ArrayList<AnnotationNode>());
-    }
-
-    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);
         }
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/Parameter.java b/src/main/java/org/codehaus/groovy/ast/Parameter.java
index b1fe29d..36d4967 100644
--- a/src/main/java/org/codehaus/groovy/ast/Parameter.java
+++ b/src/main/java/org/codehaus/groovy/ast/Parameter.java
@@ -20,7 +20,6 @@ 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.
@@ -31,13 +30,13 @@ public class Parameter extends AnnotatedNode implements Variable {
 
     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;
@@ -45,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;
@@ -68,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
@@ -80,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;
     }
@@ -103,7 +102,7 @@ public class Parameter extends AnnotatedNode implements Variable {
     }
 
     public void setClosureSharedVariable(boolean inClosure) {
-        closureShare = inClosure;        
+        closureShare = inClosure;
     }
 
     public int getModifiers() {
@@ -113,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/classgen/asm/sc/StaticInvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 1d0c6e7..42f2fa4 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
@@ -456,17 +456,11 @@ 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
             for (int i = 0; i < para.length - 1; i++) {
-                Expression expression = argumentList.get(i);
-                expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
-                expression.visit(acg);
-                if (!isNullConstant(expression)) {
-                    operandStack.doGroovyCast(para[i].getType());
-                }
+                visitArgument(argumentList.get(i), para[i].getType());
             }
             // last parameters wrapped in an array
             List<Expression> lastParams = new LinkedList<Expression>();
@@ -487,12 +481,7 @@ public class StaticInvocationWriter extends InvocationWriter {
             }
         } else if (argumentListSize == para.length) {
             for (int i = 0; i < argumentListSize; i++) {
-                Expression expression = argumentList.get(i);
-                expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
-                expression.visit(acg);
-                if (!isNullConstant(expression)) {
-                    operandStack.doGroovyCast(para[i].getType());
-                }
+                visitArgument(argumentList.get(i), para[i].getType());
             }
         } else {
             // method call with default arguments
@@ -519,16 +508,19 @@ public class StaticInvocationWriter extends InvocationWriter {
                 }
             }
             for (int i = 0; i < arguments.length; i++) {
-                Expression expression = arguments[i];
-                expression.putNodeMetaData(PARAMETER_TYPE, para[i].getType());
-                expression.visit(acg);
-                if (!isNullConstant(expression)) {
-                    operandStack.doGroovyCast(para[i].getType());
-                }
+                visitArgument(arguments[i], para[i].getType());
             }
         }
     }
 
+    private void visitArgument(Expression argumentExpr, ClassNode parameterType) {
+        argumentExpr.putNodeMetaData(PARAMETER_TYPE, parameterType);
+        argumentExpr.visit(controller.getAcg());
+        if (!isNullConstant(argumentExpr)) {
+            controller.getOperandStack().doGroovyCast(parameterType);
+        }
+    }
+
     private static boolean isNullConstant(final Expression expression) {
         return (expression instanceof ConstantExpression && ((ConstantExpression) expression).getValue() == null);
     }
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 265ebbd..f30b3b6 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -35,6 +35,7 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
@@ -55,30 +56,30 @@ public class CompilerConfiguration {
     /** This (<code>"runtimeGroovydoc"</code>) is the Optimization Option value for enabling attaching {@link groovy.lang.Groovydoc} annotation. */
     public static final String RUNTIME_GROOVYDOC = "runtimeGroovydoc";
 
-    /** This (<code>"memStub"</code>) is the Joint Compilation Option value for enabling generating stubs in memory. .*/
+    /** This (<code>"memStub"</code>) is the Joint Compilation Option value for enabling generating stubs in memory. */
     public static final String MEM_STUB = "memStub";
 
-    /** This (<code>"1.4"</code>) is the value for targetBytecode to compile for a JDK 1.4. **/
+    /** This (<code>"1.4"</code>) is the value for targetBytecode to compile for a JDK 1.4. */
     public static final String JDK4 = "1.4";
-    /** This (<code>"1.5"</code>) is the value for targetBytecode to compile for a JDK 1.5. **/
+    /** This (<code>"1.5"</code>) is the value for targetBytecode to compile for a JDK 1.5. */
     public static final String JDK5 = "1.5";
-    /** This (<code>"1.6"</code>) is the value for targetBytecode to compile for a JDK 1.6. **/
+    /** This (<code>"1.6"</code>) is the value for targetBytecode to compile for a JDK 1.6. */
     public static final String JDK6 = "1.6";
-    /** This (<code>"1.7"</code>) is the value for targetBytecode to compile for a JDK 1.7. **/
+    /** This (<code>"1.7"</code>) is the value for targetBytecode to compile for a JDK 1.7. */
     public static final String JDK7 = "1.7";
-    /** This (<code>"1.8"</code>) is the value for targetBytecode to compile for a JDK 1.8. **/
+    /** This (<code>"1.8"</code>) is the value for targetBytecode to compile for a JDK 1.8. */
     public static final String JDK8 = "1.8";
-    /** This (<code>"9"</code>) is the value for targetBytecode to compile for a JDK 9. **/
+    /** This (<code>"9"</code>) is the value for targetBytecode to compile for a JDK 9. */
     public static final String JDK9 = "9";
-    /** This (<code>"10"</code>) is the value for targetBytecode to compile for a JDK 10. **/
+    /** This (<code>"10"</code>) is the value for targetBytecode to compile for a JDK 10. */
     public static final String JDK10 = "10";
-    /** This (<code>"11"</code>) is the value for targetBytecode to compile for a JDK 11. **/
+    /** This (<code>"11"</code>) is the value for targetBytecode to compile for a JDK 11. */
     public static final String JDK11 = "11";
-    /** This (<code>"12"</code>) is the value for targetBytecode to compile for a JDK 12. **/
+    /** This (<code>"12"</code>) is the value for targetBytecode to compile for a JDK 12. */
     public static final String JDK12 = "12";
-    /** This (<code>"13"</code>) is the value for targetBytecode to compile for a JDK 13. **/
+    /** This (<code>"13"</code>) is the value for targetBytecode to compile for a JDK 13. */
     public static final String JDK13 = "13";
-    /** This (<code>"14"</code>) is the value for targetBytecode to compile for a JDK 14. **/
+    /** This (<code>"14"</code>) is the value for targetBytecode to compile for a JDK 14. */
     public static final String JDK14 = "14";
 
     /**
@@ -86,7 +87,7 @@ public class CompilerConfiguration {
      * @deprecated
      */
     @Deprecated
-    public static final String POST_JDK5 = JDK5; // for backwards compatibility
+    public static final String POST_JDK5 = JDK5;
 
     /**
      * This constant is for comparing targetBytecode to ensure it is set to an earlier value than JDK 1.5.
@@ -112,10 +113,8 @@ public class CompilerConfiguration {
             JDK14, Opcodes.V14
     );
 
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-    /** An array of the valid targetBytecode values */
-    public static final String[] ALLOWED_JDKS = JDK_TO_BYTECODE_VERSION_MAP.keySet().toArray(EMPTY_STRING_ARRAY);
+    /** The valid targetBytecode values. */
+    public static final String[] ALLOWED_JDKS = JDK_TO_BYTECODE_VERSION_MAP.keySet().toArray(new String[JDK_TO_BYTECODE_VERSION_MAP.size()]);
 
     /**
      * The default source encoding
@@ -126,7 +125,7 @@ public class CompilerConfiguration {
      *  A convenience for getting a default configuration.  Do not modify it!
      *  See {@link #CompilerConfiguration(Properties)} for an example on how to
      *  make a suitable copy to modify.  But if you're really starting from a
-     *  default context, then you probably just want <code>new CompilerConfiguration()</code>. 
+     *  default context, then you probably just want <code>new CompilerConfiguration()</code>.
      */
     public static final CompilerConfiguration DEFAULT = new CompilerConfiguration() {
         @Override
@@ -280,7 +279,6 @@ public class CompilerConfiguration {
         }
     };
 
-
     /**
      * See {@link WarningMessage} for levels.
      */
@@ -319,7 +317,7 @@ public class CompilerConfiguration {
     /**
      * If true, generates metadata for reflection on method parameters
      */
-    private boolean parameters = false;
+    private boolean parameters;
 
     /**
      * The number of non-fatal errors to allow before bailing
@@ -925,7 +923,6 @@ public class CompilerConfiguration {
         return defaultScriptExtension;
     }
 
-
     public void setDefaultScriptExtension(String defaultScriptExtension) {
         this.defaultScriptExtension = defaultScriptExtension;
     }
@@ -947,8 +944,8 @@ public class CompilerConfiguration {
     }
 
     /**
-     * Allow setting the bytecode compatibility level. The parameter can take
-     * one of the values in {@link #ALLOWED_JDKS}.
+     * Sets the bytecode compatibility level. The parameter can take one of the values
+     * in {@link #ALLOWED_JDKS}.
      *
      * @param version the bytecode compatibility level
      */
@@ -963,9 +960,8 @@ public class CompilerConfiguration {
     }
 
     /**
-     * Retrieves the compiler bytecode compatibility level.
-     * Defaults to the minimum officially supported bytecode
-     * version for any particular Groovy version.
+     * Retrieves the compiler bytecode compatibility level. Defaults to the minimum
+     * officially supported bytecode version for any particular Groovy version.
      *
      * @return bytecode compatibility level
      */
@@ -1088,111 +1084,34 @@ public class CompilerConfiguration {
     }
 
     /**
-     * Check whether invoke dynamic enabled
-     * @return the result
+     * Checks if invoke dynamic is enabled.
      */
     public boolean isIndyEnabled() {
-        Boolean indyEnabled = this.getOptimizationOptions().get(INVOKEDYNAMIC);
-
-        if (null == indyEnabled) {
-            return false;
-        }
-
-        return indyEnabled;
+        Boolean indyEnabled = getOptimizationOptions().get(INVOKEDYNAMIC);
+        return Optional.ofNullable(indyEnabled).orElse(Boolean.FALSE).booleanValue();
     }
 
     /**
-     * Check whether groovydoc enabled
-     * @return the result
+     * Checks if groovydoc is enabled.
      */
     public boolean isGroovydocEnabled() {
-        Boolean groovydocEnabled = this.getOptimizationOptions().get(GROOVYDOC);
-
-        if (null == groovydocEnabled) {
-            return false;
-        }
-
-        return groovydocEnabled;
+        Boolean groovydocEnabled = getOptimizationOptions().get(GROOVYDOC);
+        return Optional.ofNullable(groovydocEnabled).orElse(Boolean.FALSE).booleanValue();
     }
 
     /**
-     * Check whether runtime groovydoc enabled
-     * @return the result
+     * Checks if runtime groovydoc is enabled.
      */
     public boolean isRuntimeGroovydocEnabled() {
-        Boolean runtimeGroovydocEnabled = this.getOptimizationOptions().get(RUNTIME_GROOVYDOC);
-
-        if (null == runtimeGroovydocEnabled) {
-            return false;
-        }
-
-        return runtimeGroovydocEnabled;
+        Boolean runtimeGroovydocEnabled = getOptimizationOptions().get(RUNTIME_GROOVYDOC);
+        return Optional.ofNullable(runtimeGroovydocEnabled).orElse(Boolean.FALSE).booleanValue();
     }
 
     /**
-     * Check whether mem stub enabled
-     * @return the result
+     * Checks if in-memory stub creation is enabled.
      */
     public boolean isMemStubEnabled() {
-        Object memStubEnabled = this.getJointCompilationOptions().get(MEM_STUB);
-
-        if (null == memStubEnabled) {
-            return false;
-        }
-
-        return "true".equals(memStubEnabled.toString());
-    }
-
-
-//       See http://groovy.329449.n5.nabble.com/What-the-static-compile-by-default-tt5750118.html
-//           https://issues.apache.org/jira/browse/GROOVY-8543
-//
-//    {
-//        // this object initializer assures that `enableCompileStaticByDefault` must be invoked no matter which constructor called.
-//        if (getBooleanSafe("groovy.compile.static")) {
-//            enableCompileStaticByDefault();
-//        }
-//    }
-//
-//
-//    private void enableCompileStaticByDefault() {
-//        compilationCustomizers.add(
-//            new CompilationCustomizer(CompilePhase.CONVERSION) {
-//                @Override
-//                public void call(final SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException {
-//                    for (ClassNode cn : source.getAST().getClasses()) {
-//                        newClassCodeVisitor(source).visitClass(cn);
-//                    }
-//                }
-//
-//                private ClassCodeVisitorSupport newClassCodeVisitor(SourceUnit source) {
-//                    return new ClassCodeVisitorSupport() {
-//                        @Override
-//                        public void visitClass(ClassNode node) {
-//                            enableCompileStatic(node);
-//                        }
-//
-//                        private void enableCompileStatic(ClassNode classNode) {
-//                            if (!classNode.getAnnotations(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_STATIC)).isEmpty()) {
-//                                return;
-//                            }
-//                            if (!classNode.getAnnotations(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_DYNAMIC)).isEmpty()) {
-//                                return;
-//                            }
-//
-//                            classNode.addAnnotation(new AnnotationNode(ClassHelper.make(GROOVY_TRANSFORM_COMPILE_STATIC)));
-//                        }
-//
-//                        @Override
-//                        protected SourceUnit getSourceUnit() {
-//                            return source;
-//                        }
-//
-//                        private static final String GROOVY_TRANSFORM_COMPILE_STATIC = "groovy.transform.CompileStatic";
-//                        private static final String GROOVY_TRANSFORM_COMPILE_DYNAMIC = "groovy.transform.CompileDynamic";
-//                    };
-//                }
-//            }
-//        );
-//    }
+        Object memStubEnabled = getJointCompilationOptions().get(MEM_STUB);
+        return Optional.ofNullable(memStubEnabled).map(value -> "true".equals(value.toString())).orElse(Boolean.FALSE).booleanValue();
+    }
 }


[groovy] 04/09: refactor @NotYetImplemented AST transform

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7772bd205774e13d965c1227319bd156c433250a
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Oct 31 18:45:07 2019 -0500

    refactor @NotYetImplemented AST transform
    
    (cherry picked from commit 983071852d8a0a3080fad7f31706e27c00c74b49)
---
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |   9 ++
 .../NotYetImplementedASTTransformation.java        |  63 ++------
 .../NotYetImplementedTransformTest.groovy          | 173 +++++++++++----------
 3 files changed, 112 insertions(+), 133 deletions(-)

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 b970f3d..b7360ba 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -59,6 +59,7 @@ import org.codehaus.groovy.ast.stmt.IfStatement;
 import org.codehaus.groovy.ast.stmt.ReturnStatement;
 import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.ast.stmt.ThrowStatement;
+import org.codehaus.groovy.ast.stmt.TryCatchStatement;
 import org.codehaus.groovy.classgen.Verifier;
 import org.codehaus.groovy.control.io.ReaderSource;
 import org.codehaus.groovy.runtime.GeneratedClosure;
@@ -783,6 +784,14 @@ public class GeneralUtils {
         return new CatchStatement(variable, code);
     }
 
+    public static TryCatchStatement tryCatchS(Statement tryStatement) {
+        return tryCatchS(tryStatement, EmptyStatement.INSTANCE);
+    }
+
+    public static TryCatchStatement tryCatchS(Statement tryStatement, Statement finallyStatement) {
+        return new TryCatchStatement(tryStatement, finallyStatement);
+    }
+
     /**
      * This method is similar to {@link #propX(Expression, Expression)} but will make sure that if the property
      * being accessed is defined inside the classnode provided as a parameter, then a getter call is generated
diff --git a/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java b/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
index 9ff1fb3..2b8cba3 100644
--- a/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
+++ b/subprojects/groovy-test/src/main/java/org/apache/groovy/test/transform/NotYetImplementedASTTransformation.java
@@ -19,22 +19,19 @@
 package org.apache.groovy.test.transform;
 
 import org.codehaus.groovy.ast.ASTNode;
-import org.codehaus.groovy.ast.AnnotatedNode;
 import org.codehaus.groovy.ast.AnnotationNode;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
-import org.codehaus.groovy.ast.stmt.EmptyStatement;
 import org.codehaus.groovy.ast.stmt.ReturnStatement;
-import org.codehaus.groovy.ast.stmt.Statement;
+import org.codehaus.groovy.ast.stmt.ThrowStatement;
 import org.codehaus.groovy.ast.stmt.TryCatchStatement;
 import org.codehaus.groovy.control.CompilePhase;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.transform.AbstractASTTransformation;
 import org.codehaus.groovy.transform.GroovyASTTransformation;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
@@ -44,63 +41,35 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.tryCatchS;
 
 /**
- * Handles generation of code for the {@code @NotYetImplemented} annotation.
- * 
+ * Generates code for the {@code @NotYetImplemented} annotation.
+ *
  * @see groovy.test.NotYetImplemented
  */
 @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
 public class NotYetImplementedASTTransformation extends AbstractASTTransformation {
 
-    private static final ClassNode CATCHED_THROWABLE_TYPE = ClassHelper.make(Throwable.class);
-    private static final ClassNode ASSERTION_FAILED_ERROR_TYPE = ClassHelper.make("junit.framework.AssertionFailedError");
+    private static final ClassNode CATCH_TYPE = ClassHelper.make(Throwable.class);
+    private static final ClassNode THROW_TYPE = ClassHelper.make("junit.framework.AssertionFailedError"); // TODO: java.lang.AssertionError
 
     public void visit(ASTNode[] nodes, SourceUnit source) {
-        if (nodes.length != 2 || !(nodes[0] instanceof AnnotationNode) || !(nodes[1] instanceof AnnotatedNode)) {
-            throw new RuntimeException("Internal error: expecting [AnnotationNode, AnnotatedNode] but got: " + Arrays.asList(nodes));
-        }
-
-        AnnotationNode annotationNode = (AnnotationNode) nodes[0];
-        ASTNode node = nodes[1];
-
-        if (!(node instanceof MethodNode))  {
-            addError("@NotYetImplemented must only be applied on test methods!",node);
-            return;
-        }
-
-        MethodNode methodNode = (MethodNode) node;
-
-        ArrayList<Statement> statements = new ArrayList<Statement>();
-        Statement statement = methodNode.getCode();
-        if (statement instanceof BlockStatement)  {
-            statements.addAll(((BlockStatement) statement).getStatements());
+        if (!(nodes.length == 2 && nodes[0] instanceof AnnotationNode && nodes[1] instanceof MethodNode)) {
+            throw new RuntimeException("Internal error: expecting [AnnotationNode, MethodNode] but got: " + Arrays.toString(nodes));
         }
 
-        if (statements.isEmpty()) return;
-
-        BlockStatement rewrittenMethodCode = new BlockStatement();
-
-        rewrittenMethodCode.addStatement(tryCatchAssertionFailedError(annotationNode, methodNode, statements));
-        rewrittenMethodCode.addStatement(throwAssertionFailedError(annotationNode));
+        MethodNode methodNode = (MethodNode) nodes[1];
 
-        methodNode.setCode(rewrittenMethodCode);
-    }
+        if (methodNode.getCode() instanceof BlockStatement && !((BlockStatement) methodNode.getCode()).isEmpty()) {
+            // wrap code in try/catch with return for failure path followed by throws for success path
 
-    private TryCatchStatement tryCatchAssertionFailedError(AnnotationNode annotationNode, MethodNode methodNode, ArrayList<Statement> statements) {
-        TryCatchStatement tryCatchStatement = new TryCatchStatement(
-                block(methodNode.getVariableScope(), statements),
-                EmptyStatement.INSTANCE);
-        tryCatchStatement.addCatch(catchS(param(CATCHED_THROWABLE_TYPE, "ex"), ReturnStatement.RETURN_NULL_OR_VOID));
-        return tryCatchStatement;
-    }
+            TryCatchStatement tryCatchStatement = tryCatchS(methodNode.getCode());
+            tryCatchStatement.addCatch(catchS(param(CATCH_TYPE, "ignore"), ReturnStatement.RETURN_NULL_OR_VOID));
 
-    private Statement throwAssertionFailedError(AnnotationNode annotationNode) {
-        Statement throwStatement = throwS(
-                ctorX(ASSERTION_FAILED_ERROR_TYPE,
-                        args(constX("Method is marked with @NotYetImplemented but passes unexpectedly"))));
-        throwStatement.setSourcePosition(annotationNode);
+            ThrowStatement throwStatement = throwS(ctorX(THROW_TYPE, args(constX("Method is marked with @NotYetImplemented but passes unexpectedly"))));
 
-        return throwStatement;
+            methodNode.setCode(block(tryCatchStatement, throwStatement));
+        }
     }
 }
diff --git a/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy b/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
index b4ab0da..99314d9 100644
--- a/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
+++ b/subprojects/groovy-test/src/test/groovy/org/apache/groovy/test/transform/NotYetImplementedTransformTest.groovy
@@ -18,122 +18,123 @@
  */
 package org.apache.groovy.test.transform
 
-import groovy.test.GroovyShellTestCase
 import junit.framework.AssertionFailedError
+import org.junit.Test
 
-class NotYetImplementedTransformTest extends GroovyShellTestCase {
+final class NotYetImplementedTransformTest {
 
-    void testNotYetImplemented() {
-        def output = evaluate("""
-              import groovy.test.GroovyTestCase
-              import groovy.test.NotYetImplemented
+    private final GroovyShell shell = new GroovyShell()
 
-              class MyTests extends GroovyTestCase {
-                @NotYetImplemented void testShouldNotFail()  {
-                    assertFalse true
+    @Test
+    void testNotYetImplementedJUnit3Failure() {
+        def output = shell.evaluate('''
+            import groovy.test.GroovyTestCase
+            import groovy.test.NotYetImplemented
+
+            class MyTests extends GroovyTestCase {
+                @NotYetImplemented void testThatFails()  {
+                    assertTrue(false)
                 }
-              }
+            }
 
-              junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
-        """)
+            junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
+        ''')
 
-        assertNotNull output
-        assertTrue "test method marked with @NotYetImplemented must NOT throw an AsssertionFailedError", output.wasSuccessful()
+        assert output.wasSuccessful() : 'test method marked with @NotYetImplemented must NOT throw an AssertionFailedError'
     }
 
-    void testNotYetImplementedWithException() {
-            def output = evaluate("""
-                  import groovy.test.GroovyTestCase
-                  import groovy.test.NotYetImplemented
+    @Test
+    void testNotYetImplementedJUnit3Exception() {
+        def output = shell.evaluate('''
+            import groovy.test.GroovyTestCase
+            import groovy.test.NotYetImplemented
 
-                  class MyTests extends GroovyTestCase {
-                    @NotYetImplemented void testShouldNotFail()  {
-                        'test'.yetUnkownMethod()
-                    }
-                  }
+            class MyTests extends GroovyTestCase {
+                @NotYetImplemented void testThatFails()  {
+                    'test'.missingMethod()
+                }
+            }
 
-                  junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
-            """)
+            junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
+        ''')
 
-            assertNotNull output
-            assertTrue "test method marked with @NotYetImplemented must NOT throw an AsssertionFailedError", output.wasSuccessful()
-        }
+        assert output.wasSuccessful() : 'test method marked with @NotYetImplemented must NOT throw an AssertionFailedError'
+    }
 
-    void testNotYetImplementedPassThrough() {
-        def output = evaluate("""
-              import groovy.test.GroovyTestCase
-              import groovy.test.NotYetImplemented
+    @Test
+    void testNotYetImplementedJunit3PassThrough() {
+        def output = shell.evaluate('''
+            import groovy.test.GroovyTestCase
+            import groovy.test.NotYetImplemented
 
-              class MyTests extends GroovyTestCase {
-                @NotYetImplemented void testShouldFail()  {
-                    assertTrue true
+            class MyTests extends GroovyTestCase {
+                @NotYetImplemented void testThatPasses()  {
+                    assertTrue(true)
                 }
-              }
-
-              junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
-        """)
+            }
 
-        assertNotNull output
+            junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
+        ''')
 
-        assertEquals "test method marked with @NotYetImplemented must throw an AssertionFailedError", 1, output.failureCount()
-        assertEquals "test method marked with @NotYetImplemented must throw an AssertionFailedError", AssertionFailedError, output.failures().nextElement().thrownException().class
+        assert output.failureCount() == 1 : 'test method marked with @NotYetImplemented must throw an AssertionFailedError'
+        assert output.failures().nextElement().thrownException() instanceof AssertionFailedError : 'test method marked with @NotYetImplemented must throw an AssertionFailedError'
     }
 
-    void testEmptyTestMethod() {
-        def output = evaluate("""
-              import groovy.test.GroovyTestCase
-              import groovy.test.NotYetImplemented
+    @Test
+    void testNotYetImplementedJUnit3EmptyMethod() {
+        def output = shell.evaluate('''
+            import groovy.test.GroovyTestCase
+            import groovy.test.NotYetImplemented
 
-              class MyTests extends GroovyTestCase {
-                @NotYetImplemented void testShouldNotFail()  {}
-              }
-
-              junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
-        """)
+            class MyTests extends GroovyTestCase {
+                @NotYetImplemented void testShouldNotFail() {
+                }
+            }
 
-        assertNotNull output
+            junit.textui.TestRunner.run(new junit.framework.TestSuite(MyTests))
+        ''')
 
-        assertTrue "empty test method must not throw an AssertionFailedError", output.wasSuccessful()
+        assert output.wasSuccessful() : 'empty test method must not throw an AssertionFailedError'
     }
 
-    void testNotYetImplementedJUnit4()  {
-
-        def output = evaluate("""
-        import groovy.test.NotYetImplemented
-        import org.junit.Test
-        import org.junit.runner.JUnitCore
-
-        class MyTests {
-            @NotYetImplemented @Test void testShouldNotFail()  {
-                junit.framework.Assert.assertFalse true
+    @Test
+    void testNotYetImplementedJUnit4Failure()  {
+        def output = shell.evaluate('''
+            import groovy.test.NotYetImplemented
+            import org.junit.Assert
+            import org.junit.Test
+            import org.junit.runner.JUnitCore
+
+            class MyTests {
+                @NotYetImplemented @Test void testThatFails()  {
+                    Assert.assertTrue(false)
+                }
             }
-        }
 
-        new JUnitCore().run(MyTests)
-        """)
-
-        assertTrue output.wasSuccessful()
+            new JUnitCore().run(MyTests)
+        ''')
 
+        assert output.wasSuccessful() : '@Test method marked with @NotYetImplemented must NOT throw an AssertionFailedError'
     }
 
-    void testNotYetImplementedPassThroughJUnit4() {
-        def output = evaluate("""
-              import groovy.test.NotYetImplemented
-              import org.junit.Test
-              import org.junit.runner.JUnitCore
-
-              class MyTests {
-                @NotYetImplemented @Test void shouldFail()  {
-                    junit.framework.Assert.assertTrue true
+    @Test
+    void testNotYetImplementedJUnit4Success() {
+        def output = shell.evaluate('''
+            import groovy.test.NotYetImplemented
+            import org.junit.Assert
+            import org.junit.Test
+            import org.junit.runner.JUnitCore
+
+            class MyTests {
+                @NotYetImplemented @Test void testThatPasses()  {
+                    Assert.assertTrue(true)
                 }
-              }
-
-              new JUnitCore().run(MyTests)
-        """)
+            }
 
-        assertNotNull output
+            new JUnitCore().run(MyTests)
+        ''')
 
-        assertEquals "test method marked with @NotYetImplemented must throw an AssertionFailedError", 1, output.failureCount
-        assertEquals "test method marked with @NotYetImplemented must throw an AssertionFailedError", AssertionFailedError, output.failures.first().exception.class
+        assert output.failureCount == 1 : '@Test method marked with @NotYetImplemented must throw an AssertionFailedError'
+        assert output.failures.first().exception instanceof AssertionFailedError : '@Test method marked with @NotYetImplemented must throw an AssertionFailedError'
     }
-}
\ No newline at end of file
+}