You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2020/12/10 20:57:34 UTC

[groovy] branch GROOVY_3_0_X updated (a1becbc -> 1413397)

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

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


    from a1becbc  GROOVY-9762, GROOVY-9803: reduce "? super T" to "T" for return typing
     new f9db0da  refactor shared logic
     new 893bca5  token type should be COMPARE_EQUAL/COMPARE_NOT_EQUAL not COMPARE_TO
     new ef3bd95  disable preview features for expression evaluation
     new 93f773b  fix parameter passing and use map interface
     new 1413397  prevent non-final parameter warnings for script methods

The 5 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:
 .../java/org/codehaus/groovy/ast/ModuleNode.java   |  13 ++-
 .../groovy/classgen/InnerClassVisitorHelper.java   | 118 +++++++++------------
 .../codehaus/groovy/control/ResolveVisitor.java    |  10 +-
 .../sc/transformers/CompareToNullExpression.java   |   7 +-
 .../transform/stc/StaticTypeCheckingSupport.java   |   2 +
 .../console/ui/AstNodeToScriptAdapterTest.groovy   |   7 +-
 .../console/ui/ScriptToTreeNodeAdapterTest.groovy  |   6 +-
 7 files changed, 74 insertions(+), 89 deletions(-)


[groovy] 01/05: refactor shared logic

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

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

commit f9db0da914657386d222907c5ba867da3ff7a02c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Dec 9 10:47:46 2020 -0600

    refactor shared logic
---
 .../groovy/classgen/InnerClassVisitorHelper.java   | 118 +++++++++------------
 1 file changed, 50 insertions(+), 68 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
index bc9292a..d90e159 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
@@ -24,117 +24,99 @@ import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.Parameter;
-import org.codehaus.groovy.ast.expr.ArgumentListExpression;
-import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.GStringExpression;
-import org.codehaus.groovy.ast.expr.MethodCallExpression;
-import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.SpreadExpression;
-import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
-import org.codehaus.groovy.ast.stmt.ExpressionStatement;
-import org.codehaus.groovy.ast.stmt.ReturnStatement;
-import org.codehaus.groovy.syntax.Token;
-import org.codehaus.groovy.syntax.Types;
 import org.objectweb.asm.Opcodes;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 
 public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
 
-    protected static void setPropertyGetterDispatcher(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void addFieldInit(final Parameter p, final FieldNode fn, final BlockStatement block) {
+        block.addStatement(assignS(fieldX(fn), varX(p)));
+    }
+
+    protected static void setPropertyGetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ReturnStatement(
-                        new PropertyExpression(
-                                thiz,
-                                new GStringExpression("$name", gStringStrings, gStringValues)
+                returnS(
+                        propX(
+                                target,
+                                dynName(parameters[0])
                         )
                 )
         );
     }
 
-    protected static void setPropertySetterDispatcher(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void setPropertySetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ExpressionStatement(
-                        new BinaryExpression(
-                                new PropertyExpression(
-                                        thiz,
-                                        new GStringExpression("$name", gStringStrings, gStringValues)
+                stmt(
+                        assignX(
+                                propX(
+                                        target,
+                                        dynName(parameters[0])
                                 ),
-                                Token.newSymbol(Types.ASSIGN, -1, -1),
-                                new VariableExpression(parameters[1])
+                                varX(parameters[1])
                         )
                 )
         );
     }
 
-    protected static void setMethodDispatcherCode(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void setMethodDispatcherCode(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ReturnStatement(
-                        new MethodCallExpression(
-                                thiz,
-                                new GStringExpression("$name", gStringStrings, gStringValues),
-                                new ArgumentListExpression(
-                                        new SpreadExpression(new VariableExpression(parameters[1]))
-                                )
+                returnS(
+                        callX(
+                                target,
+                                dynName(parameters[0]),
+                                args(new SpreadExpression(varX(parameters[1])))
                         )
                 )
         );
     }
 
-    protected static boolean isStatic(InnerClassNode node) {
-        return node.getDeclaredField("this$0") == null;
+    private static Expression dynName(final Parameter p) {
+        List<ConstantExpression> gStringStrings = new ArrayList<>();
+        gStringStrings.add(new ConstantExpression(""));
+        gStringStrings.add(new ConstantExpression(""));
+
+        List<Expression> gStringValues = new ArrayList<>();
+        gStringValues.add(varX(p));
+
+        return new GStringExpression("$name", gStringStrings, gStringValues);
+    }
+
+    protected static boolean isStatic(final InnerClassNode cn) {
+        return cn.getDeclaredField("this$0") == null;
     }
 
-    protected static ClassNode getClassNode(ClassNode node, boolean isStatic) {
-        if (isStatic) node = ClassHelper.CLASS_Type;
-        return node;
+    protected static ClassNode getClassNode(final ClassNode cn, final boolean isStatic) {
+        return isStatic ? ClassHelper.CLASS_Type : cn; // TODO: Set class type parameter?
     }
 
-    protected static int getObjectDistance(ClassNode node) {
+    protected static int getObjectDistance(ClassNode cn) {
         int count = 0;
-        while (node != null && node != ClassHelper.OBJECT_TYPE) {
-            count++;
-            node = node.getSuperClass();
+        while (cn != null && cn != ClassHelper.OBJECT_TYPE) {
+            cn = cn.getSuperClass();
+            count += 1;
         }
         return count;
     }
 
-    protected static void addFieldInit(Parameter p, FieldNode fn, BlockStatement block) {
-        block.addStatement(assignS(fieldX(fn), varX(p)));
-    }
-
-    protected static boolean shouldHandleImplicitThisForInnerClass(ClassNode cn) {
-        if (cn.isEnum() || cn.isInterface()) return false;
-        if ((cn.getModifiers() & Opcodes.ACC_STATIC) != 0) return false;
-
-        if (!(cn instanceof InnerClassNode)) return false;
-        InnerClassNode innerClass = (InnerClassNode) cn;
-        // scope != null means aic, we don't handle that here
-        if (innerClass.getVariableScope() != null) return false;
-        // static inner classes don't need this$0
-        return (innerClass.getModifiers() & Opcodes.ACC_STATIC) == 0;
+    protected static boolean shouldHandleImplicitThisForInnerClass(final ClassNode cn) {
+        final int explicitOrImplicitStatic = Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ENUM;
+        return (cn.getModifiers() & explicitOrImplicitStatic) == 0 && (cn instanceof InnerClassNode && !((InnerClassNode) cn).isAnonymous());
     }
 }


[groovy] 03/05: disable preview features for expression evaluation

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

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

commit ef3bd954cbe88878b44d7a4a11b7e7c46eecd078
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Dec 7 12:03:24 2020 -0600

    disable preview features for expression evaluation
    
    https://github.com/groovy/groovy-eclipse/issues/1167
---
 .../org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java    | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 6efebe7..4e3dedf 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2147,6 +2147,8 @@ public abstract class StaticTypeCheckingSupport {
         ReturnStatement code = new ReturnStatement(expr);
         addGeneratedMethod(node, "eval", Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, code);
         CompilerConfiguration copyConf = new CompilerConfiguration(config);
+        // disable preview features so class can be inspected by this JVM
+        copyConf.setPreviewFeatures(false);
         CompilationUnit cu = new CompilationUnit(copyConf);
         cu.addClassNode(node);
         cu.compile(Phases.CLASS_GENERATION);


[groovy] 02/05: token type should be COMPARE_EQUAL/COMPARE_NOT_EQUAL not COMPARE_TO

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

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

commit 893bca53f183833ffdb0e980d9ae67b2833f3c0d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Dec 8 11:20:50 2020 -0600

    token type should be COMPARE_EQUAL/COMPARE_NOT_EQUAL not COMPARE_TO
    
    https://github.com/groovy/groovy-eclipse/issues/1209
---
 .../groovy/transform/sc/transformers/CompareToNullExpression.java  | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
index 8c4e4f1..8651154 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/CompareToNullExpression.java
@@ -27,7 +27,6 @@ import org.codehaus.groovy.ast.expr.ExpressionTransformer;
 import org.codehaus.groovy.classgen.AsmClassGenerator;
 import org.codehaus.groovy.classgen.asm.WriterController;
 import org.codehaus.groovy.syntax.Token;
-import org.codehaus.groovy.syntax.Types;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -35,10 +34,10 @@ import org.objectweb.asm.Opcodes;
 public class CompareToNullExpression extends BinaryExpression implements Opcodes {
     private final boolean equalsNull;
 
-    public CompareToNullExpression(final Expression objectExpression, final boolean compareToNull) {
-        super(objectExpression, new Token(Types.COMPARE_TO, compareToNull ? "==" : "!=", -1, -1), ConstantExpression.NULL);
+    public CompareToNullExpression(final Expression expression, final boolean equalsNull) {
+        super(expression, Token.newSymbol(equalsNull ? "==" : "!=", -1, -1), ConstantExpression.NULL);
         super.setType(ClassHelper.boolean_TYPE);
-        this.equalsNull = compareToNull;
+        this.equalsNull = equalsNull;
     }
 
     public Expression getObjectExpression() {


[groovy] 04/05: fix parameter passing and use map interface

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

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

commit 93f773bf87ab3c6882efbb472cee08c905f06ca4
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Dec 7 11:44:32 2020 -0600

    fix parameter passing and use map interface
---
 src/main/java/org/codehaus/groovy/control/ResolveVisitor.java | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index 2c05616..adf1a38 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -63,7 +63,6 @@ import org.codehaus.groovy.ast.stmt.CatchStatement;
 import org.codehaus.groovy.ast.stmt.ForStatement;
 import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.control.ClassNodeResolver.LookupResult;
-import org.codehaus.groovy.runtime.memoize.EvictableCache;
 import org.codehaus.groovy.runtime.memoize.UnlimitedConcurrentCache;
 import org.codehaus.groovy.syntax.Types;
 import org.codehaus.groovy.transform.trait.Traits;
@@ -327,7 +326,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
     }
 
     private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node) {
-        resolveOrFail(type, "", node, false);
+        resolveOrFail(type, msg, node, false);
     }
 
     private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node, final boolean preferImports) {
@@ -643,10 +642,9 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         return false;
     }
 
-    private static final EvictableCache<String, Set<String>> DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE = new UnlimitedConcurrentCache<>();
+    private static final Map<String, Set<String>> DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE = new UnlimitedConcurrentCache<>();
     static {
-        Map<String, Set<String>> defaultImportClasses = VMPluginFactory.getPlugin().getDefaultImportClasses(DEFAULT_IMPORTS);
-        DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.putAll(defaultImportClasses);
+        DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.putAll(VMPluginFactory.getPlugin().getDefaultImportClasses(DEFAULT_IMPORTS));
     }
 
     protected boolean resolveFromDefaultImports(final ClassNode type, final String[] packagePrefixes) {
@@ -664,7 +662,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
                 type.setRedirect(tmp.redirect());
 
                 if (DEFAULT_IMPORTS == packagePrefixes) { // Only the non-cached type and packages should be cached
-                    Set<String> packagePrefixSet = DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.getAndPut(typeName, key -> new HashSet<>(2));
+                    Set<String> packagePrefixSet = DEFAULT_IMPORT_CLASS_AND_PACKAGES_CACHE.computeIfAbsent(typeName, key -> new HashSet<>(2));
                     packagePrefixSet.add(packagePrefix);
                 }
 


[groovy] 05/05: prevent non-final parameter warnings for script methods

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

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

commit 1413397f1a3e0bf755ad02f35d61e3f2b0022ae9
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Dec 7 11:22:49 2020 -0600

    prevent non-final parameter warnings for script methods
    
    Conflicts:
    	src/main/java/org/codehaus/groovy/ast/ModuleNode.java
---
 src/main/java/org/codehaus/groovy/ast/ModuleNode.java       | 13 +++++++++----
 .../groovy/console/ui/AstNodeToScriptAdapterTest.groovy     |  7 +++----
 .../groovy/console/ui/ScriptToTreeNodeAdapterTest.groovy    |  6 +++---
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index 23ab7c4..66588dd 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -326,6 +326,12 @@ public class ModuleNode extends ASTNode implements Opcodes {
         }
     }
 
+    private static Parameter[] finalParam(final ClassNode type, final String name) {
+        Parameter parameter = param(type, name);
+        parameter.setModifiers(ACC_FINAL);
+        return params(parameter);
+    }
+
     protected ClassNode createStatementsClass() {
         ClassNode classNode = getScriptClassDummy();
         if (classNode.getName().endsWith("package-info")) {
@@ -339,12 +345,11 @@ public class ModuleNode extends ASTNode implements Opcodes {
                 "main",
                 ACC_PUBLIC | ACC_STATIC,
                 ClassHelper.VOID_TYPE,
-                params(param(ClassHelper.STRING_TYPE.makeArray(), "args")),
+                finalParam(ClassHelper.STRING_TYPE.makeArray(), "args"),
                 ClassNode.EMPTY_ARRAY,
-                // InvokerHelper.runScript(scriptClass, args)
                 stmt(
                     callX(
-                        classX(ClassHelper.make(InvokerHelper.class)),
+                        ClassHelper.make(InvokerHelper.class),
                         "runScript",
                         args(classX(classNode), varX("args"))
                     )
@@ -374,7 +379,7 @@ public class ModuleNode extends ASTNode implements Opcodes {
 
         classNode.addConstructor(
             ACC_PUBLIC,
-            params(param(ClassHelper.make(Binding.class), "context")),
+            finalParam(ClassHelper.make(Binding.class), "context"),
             ClassNode.EMPTY_ARRAY,
             stmt);
 
diff --git a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
index 323a9cf..99cdcdc 100644
--- a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
+++ b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
@@ -31,25 +31,24 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX
 import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt
 
 /**
- * Unit test for ScriptToTreeNodeAdapter.
+ * Unit test for {@link AstNodeToScriptAdapter}.
  *
  * The assertions in this test case often assert against the toString() representation of
  * an object. Normally, this is bad form. However, the class under test is meant to display
  * toString() forms in a user interface. So in this case it is appropriate.
  */
-class AstNodeToScriptAdapterTest extends GroovyTestCase {
+final class AstNodeToScriptAdapterTest extends GroovyTestCase {
 
     private static String compileToScript(String script, CompilePhase phase = CompilePhase.SEMANTIC_ANALYSIS) {
         new AstNodeToScriptAdapter().compileToScript(script, phase.phaseNumber)
     }
 
     void testScript() {
-
         String result = compileToScript('true')
 
         assert result =~ /public class script[0-9]* extends groovy\.lang\.Script \{/
         assert result =~ /public script[0-9]*\(\) \{\s*\}/
-        assert result =~ /public script[0-9]*\(groovy.lang.Binding context\) \{\s*super\(context\)\s*\}/
+        assert result =~ /public script[0-9]*\(final groovy.lang.Binding context\) \{\s*super\(context\)\s*\}/
         assert result =~ /public java.lang.Object run\(\) \{\s*true\s*\}/
     }
 
diff --git a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/ScriptToTreeNodeAdapterTest.groovy b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/ScriptToTreeNodeAdapterTest.groovy
index 7653a81..f566fb0 100644
--- a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/ScriptToTreeNodeAdapterTest.groovy
+++ b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/ScriptToTreeNodeAdapterTest.groovy
@@ -26,13 +26,13 @@ import org.codehaus.groovy.control.Phases
 import javax.swing.tree.TreeNode
 
 /**
- * Unit test for ScriptToTreeNodeAdapter.
+ * Unit test for {@link ScriptToTreeNodeAdapter}.
  *
  * The assertions in this test case often assert against the toString() representation of
  * an object. Normally, this is bad form. However, the class under test is meant to display
  * toString() forms in a user interface. So in this case it is appropriate.
  */
-class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
+final class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
 
      private final classLoader = new GroovyClassLoader()
 
@@ -285,7 +285,7 @@ class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
                         eq('Methods'),
                         eq('MethodNode - main'),
                         startsWith('ExpressionStatement'),  //notice, there is only one ExpressionStatement
-                        startsWith('MethodCall'),
+                        startsWith('StaticMethodCallExpression'),
                 ]
         )
     }