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 2023/11/28 15:54:35 UTC

(groovy) 02/02: minor items

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

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

commit 8e0443a364d3bbb69f4253909e24f88cd9903f81
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 28 09:49:59 2023 -0600

    minor items
---
 .../apache/groovy/parser/antlr4/AstBuilder.java    |   2 -
 .../java/org/codehaus/groovy/ast/ModuleNode.java   |   9 +-
 .../org/codehaus/groovy/classgen/Verifier.java     |  11 +-
 .../groovy/classgen/asm/WriterController.java      |   2 +-
 .../codehaus/groovy/control/ProcessingUnit.java    |   1 +
 .../org/codehaus/groovy/runtime/NullObject.java    |   2 +-
 .../groovy/transform/ASTTransformationVisitor.java |   7 +-
 .../transform/trait/SuperCallTraitTransformer.java |   2 +-
 .../transform/trait/TraitASTTransformation.java    |   2 +-
 .../codehaus/groovy/transform/trait/Traits.java    |  17 ++--
 src/spec/test/ClassTest.groovy                     |  29 +++---
 src/test/gls/innerClass/InnerClassTest.groovy      |   4 +-
 .../classgen/ClassCompletionVerifierTest.java      |  16 +--
 .../codehaus/groovy/classgen/InterfaceTest.groovy  | 111 ++++++++++-----------
 .../codehaus/groovy/runtime/NullObjectTest.groovy  |   3 +
 15 files changed, 107 insertions(+), 111 deletions(-)

diff --git a/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index e8e1c56c77..078c46c289 100644
--- a/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -1308,8 +1308,6 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
         if (asBoolean(ctx.TRAIT())) {
             classNode.addAnnotation(makeAnnotationNode(Trait.class));
         }
-
-
         classNode.addAnnotations(modifierManager.getAnnotations());
         if (isRecord && classNode.getAnnotations().stream().noneMatch(a ->
                         a.getClassNode().getName().equals(RECORD_TYPE_NAME))) {
diff --git a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
index abf0f1dcfd..cd20113643 100644
--- a/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ModuleNode.java
@@ -416,8 +416,7 @@ public class ModuleNode extends ASTNode {
             }
         }
 
-        if (existingMain != null && !hasUncontainedStatements) {
-            // this is a JEP-445 compatible class
+        if (existingMain != null && !hasUncontainedStatements) { // JEP 445 main
             ClassNode result = new ClassNode(classNode.getName(), 0, ClassHelper.OBJECT_TYPE);
             result.addAnnotations(existingMain.getAnnotations());
             result.setScriptBody(false);
@@ -513,10 +512,10 @@ public class ModuleNode extends ASTNode {
                     ClassNode argType = numParams > 0 ? node.getParameters()[0].getType() : null;
                     ClassNode retType = node.getReturnType();
 
-                    boolean argTypeMatches = argType == null || ClassHelper.isObjectType(argType) || argType.getName().contains("String[]");
-                    boolean retTypeMatches = ClassHelper.isPrimitiveVoid(retType) || ClassHelper.isObjectType(retType);
+                    boolean argTypeMatches = argType == null || argType.getNameWithoutPackage().equals("Object") || (argType.isArray() && argType.getComponentType().getNameWithoutPackage().equals("String"));
+                    boolean retTypeMatches = ClassHelper.isPrimitiveVoid(retType) || retType.getNameWithoutPackage().equals("Object");
                     if (retTypeMatches && argTypeMatches) {
-                        if ((foundStatic && node.isStatic()) || (foundInstance && !node.isStatic())) {
+                        if (node.isStatic() ? foundStatic : foundInstance) {
                             throw new RuntimeException("Repetitive main method found.");
                         }
                         if (!foundStatic) { // static trumps instance
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index 28338c762c..b93b9e24c0 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -695,7 +695,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
             throw new RuntimeParserException("Found unexpected MOP methods in the class node for " + classNode.getName() + "(" + node.getName() + ")", classNode);
         }
 
-        adjustTypesIfStaticMainMethod(node);
+        adjustTypesIfMainMethod(node);
         this.methodNode = node;
         addReturnIfNeeded(node);
 
@@ -705,15 +705,14 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
         }
     }
 
-    private static void adjustTypesIfStaticMainMethod(final MethodNode node) {
-        if (node.getName().equals("main") && node.isStatic()) {
+    private static void adjustTypesIfMainMethod(final MethodNode node) {
+        if (node.isPublic() && node.isStatic() && node.getName().equals("main")) {
             Parameter[] params = node.getParameters();
             if (params.length == 1) {
                 Parameter param = params[0];
-                if (param.getType() == null || isObjectType(param.getType())) {
+                if (param.getType() == null || (isObjectType(param.getType()) && !param.getType().isGenericsPlaceHolder())) {
                     param.setType(ClassHelper.STRING_TYPE.makeArray());
-                    ClassNode returnType = node.getReturnType();
-                    if (isObjectType(returnType)) {
+                    if (isObjectType(node.getReturnType())) {
                         node.setReturnType(ClassHelper.VOID_TYPE);
                     }
                 }
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index 97b7000f87..d81897aec2 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -355,7 +355,7 @@ public class WriterController {
      *         local variables but are properties
      */
     public boolean isInScriptBody() {
-        return classNode.isScriptBody() || (classNode.isScript() && methodNode != null && methodNode.getName().equals("run"));
+        return classNode.isScriptBody() || (methodNode != null && methodNode.isScriptBody());
     }
 
     public boolean shouldOptimizeForInt() {
diff --git a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
index 0349d7f442..4cec35e950 100644
--- a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
@@ -108,6 +108,7 @@ public abstract class ProcessingUnit {
             return new GroovyClassLoader(parent, getConfiguration());
         });
     }
+
     /**
      * Errors found during the compilation should be reported through the ErrorCollector.
      */
diff --git a/src/main/java/org/codehaus/groovy/runtime/NullObject.java b/src/main/java/org/codehaus/groovy/runtime/NullObject.java
index 0d24a258f0..ef7ee6e485 100644
--- a/src/main/java/org/codehaus/groovy/runtime/NullObject.java
+++ b/src/main/java/org/codehaus/groovy/runtime/NullObject.java
@@ -105,7 +105,7 @@ public class NullObject extends GroovyObjectSupport {
     }
 
     /**
-     * Tries to invoke a method on null, which will always fail.
+     * Tries to invoke a method on null, which fails.
      *
      * @return never
      * @throws NullPointerException
diff --git a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
index 137ae5f815..336bab46c4 100644
--- a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
@@ -131,7 +131,8 @@ public final class ASTTransformationVisitor extends ClassCodeVisitorSupport {
             for (Map.Entry<Class<? extends ASTTransformation>, Set<ASTNode>> entry : baseTransforms.entrySet()) {
                 for (ASTNode node : entry.getValue()) {
                     List<ASTTransformation> list = transforms.computeIfAbsent(node, k -> new ArrayList<>());
-                    list.add(transformInstances.get(entry.getKey()));
+                    ASTTransformation aTransform = transformInstances.get(entry.getKey());
+                    if (aTransform != null) list.add(aTransform);
                 }
             }
 
@@ -385,10 +386,10 @@ public final class ASTTransformationVisitor extends ClassCodeVisitorSupport {
                         + entry.getValue().toExternalForm() + " is not an ASTTransformation.", null));
                 }
             } catch (Exception e) {
-                Throwable effectiveException = e instanceof InvocationTargetException ? e.getCause() : e;
+                Throwable t = e instanceof InvocationTargetException ? e.getCause() : e;
                 compilationUnit.getErrorCollector().addError(new SimpleMessage(
                     "Could not instantiate global transform class " + entry.getKey() + " specified at "
-                    + entry.getValue().toExternalForm() + "  because of exception " + effectiveException.toString(), null));
+                    + entry.getValue().toExternalForm() + "  because of exception " + t.toString(), null));
             }
         }
     }
diff --git a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
index dea2d75d15..dd187c645f 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
@@ -219,7 +219,7 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
             traitType.redirect().setNodeMetaData(UNRESOLVED_HELPER_CLASS, helperType);
             return helperType;
         }
-        return Traits.findHelper(traitType);
+        return Traits.findHelper(traitType).getPlainNodeReference();
     }
 
     private ClassNode getTraitSuperTarget(final Expression exp) {
diff --git a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
index f91c57e6d2..d62afef764 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -591,7 +591,7 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
         FieldNode dummyField = new FieldNode(
                 dummyFieldName,
                 ACC_PUBLIC | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC,
-                field.getOriginType().getPlainNodeReference(),
+                field.getOriginType(),
                 fieldHelper,
                 null
         );
diff --git a/src/main/java/org/codehaus/groovy/transform/trait/Traits.java b/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
index 0804b6dfe4..8a99930e39 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
@@ -47,8 +47,6 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 
-import static org.codehaus.groovy.ast.ClassHelper.isClassType;
-
 /**
  * A collection of utility methods used to deal with traits.
  *
@@ -110,7 +108,7 @@ public abstract class Traits {
     }
 
     private static ClassNode unwrapOwner(ClassNode owner) {
-        if (isClassType(owner) && owner.getGenericsTypes() != null && owner.getGenericsTypes().length == 1) {
+        if (ClassHelper.isClassType(owner) && owner.getGenericsTypes() != null && owner.getGenericsTypes().length == 1) {
             return owner.getGenericsTypes()[0].getType();
         }
         return owner;
@@ -134,22 +132,22 @@ public abstract class Traits {
         ClassNode staticFieldHelperClassNode = null;
         Iterator<InnerClassNode> innerClasses = trait.redirect().getInnerClasses();
         if (innerClasses != null && innerClasses.hasNext()) {
-            // trait defined in same source unit
+            // trait declared in same unit
             while (innerClasses.hasNext()) {
                 ClassNode icn = innerClasses.next();
-                if (icn.getName().endsWith(Traits.FIELD_HELPER)) {
+                if (icn.getName().endsWith(Traits.TRAIT_HELPER)) {
+                    helperClassNode = icn;
+                } else if (icn.getName().endsWith(Traits.FIELD_HELPER)) {
                     fieldHelperClassNode = icn;
                 } else if (icn.getName().endsWith(Traits.STATIC_FIELD_HELPER)) {
                     staticFieldHelperClassNode = icn;
-                } else if (icn.getName().endsWith(Traits.TRAIT_HELPER)) {
-                    helperClassNode = icn;
                 }
             }
         } else {
             // precompiled trait
             try {
-                final ClassLoader classLoader = trait.getTypeClass().getClassLoader();
                 String helperClassName = Traits.helperClassName(trait);
+                ClassLoader classLoader = trait.getTypeClass().getClassLoader();
                 helperClassNode = ClassHelper.make(Class.forName(helperClassName, false, classLoader));
                 try {
                     fieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.fieldHelperClassName(trait)));
@@ -158,7 +156,7 @@ public abstract class Traits {
                     // not a problem, the field helpers may be absent
                 }
             } catch (ClassNotFoundException e) {
-                throw new GroovyBugError("Couldn't find trait helper classes on compile classpath!",e);
+                throw new GroovyBugError("Couldn't find trait helper classes on compile classpath!", e);
             }
         }
         return new TraitHelpersTuple(helperClassNode, fieldHelperClassNode, staticFieldHelperClassNode);
@@ -407,5 +405,4 @@ public abstract class Traits {
          */
         String desc();
     }
-
 }
diff --git a/src/spec/test/ClassTest.groovy b/src/spec/test/ClassTest.groovy
index 61841d2dea..2d4f3146d3 100644
--- a/src/spec/test/ClassTest.groovy
+++ b/src/spec/test/ClassTest.groovy
@@ -222,20 +222,26 @@ class ClassTest extends GroovyTestCase {
             // end::interface_coercion[]
         '''
 
-        def err = shouldFail {
-            assertScript '''
-                // tag::protected_forbidden[]
-                interface Greeter {
-                    protected void greet(String name)           // <1>
-                }
-                // end::protected_forbidden[]
-                1
-            '''
-        }
+        def err = shouldFail '''
+            // tag::protected_forbidden[]
+            interface Greeter {
+                protected void greet(String name)           // <1>
+            }
+            // end::protected_forbidden[]
+        '''
         assert err.contains("Method 'greet' is protected but should be public in interface 'Greeter'")
+/*
+        err = shouldFail '''import groovy.transform.*
+            // tag::package_private_forbidden[]
+            interface Greeter {
+                @PackageScope void greet(String name)
+            }
+            // end::package_private_forbidden[]
+        '''
+        assert err.contains("Method 'greet' is package-private but should be public or private in interface 'Greeter'")
+*/
     }
 
-
     void testFields() {
         assertScript '''
             // tag::field_declaration[]
@@ -383,7 +389,6 @@ class ClassTest extends GroovyTestCase {
         '''
     }
 
-
     void testDefineAnnotation() {
         assertScript '''
             // tag::define_annotation[]
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 96d14f67f5..1e014aaa5f 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -1480,7 +1480,7 @@ final class InnerClassTest {
             new File(parentDir, 'p').mkdir()
             new File(parentDir, 'q').mkdir()
 
-            def a = new File(parentDir, 'p/A.Java')
+            def a = new File(parentDir, 'p/A.java')
             a.write '''
                 package p;
                 public abstract class A {
@@ -1521,7 +1521,7 @@ final class InnerClassTest {
             new File(parentDir, 'p').mkdir()
             new File(parentDir, 'q').mkdir()
 
-            def a = new File(parentDir, 'p/A.Java')
+            def a = new File(parentDir, 'p/A.java')
             a.write '''
                 package p;
                 public abstract class A {
diff --git a/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java b/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
index cf88789e73..d926bc705a 100644
--- a/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
+++ b/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
@@ -43,9 +43,10 @@ public class ClassCompletionVerifierTest extends TestSupport {
             "The method 'java.lang.Object yyy()' from interface 'zzz' must not be static. Only fields may be static in an interface.";
     private static final String EXPECTED_TRANSIENT_CLASS_ERROR_MESSAGE =
             "The class 'DodgyClass' has an incorrect modifier transient.";
-    // can't check synchronized here as it doubles up with ACC_SUPER
-    //private static final String EXPECTED_SYNCHRONIZED_CLASS_ERROR_MESSAGE =
-    //        "The class 'DodgyClass' has an incorrect modifier synchronized.";
+    /* can't check synchronized here as it doubles up with ACC_SUPER
+    private static final String EXPECTED_SYNCHRONIZED_CLASS_ERROR_MESSAGE =
+            "The class 'DodgyClass' has an incorrect modifier synchronized.";
+    */
     private static final String EXPECTED_NATIVE_CLASS_ERROR_MESSAGE =
             "The class 'DodgyClass' has an incorrect modifier native.";
     private static final String EXPECTED_VOLATILE_CLASS_ERROR_MESSAGE =
@@ -54,9 +55,10 @@ public class ClassCompletionVerifierTest extends TestSupport {
             "Repetitive method name/signature for method 'java.lang.Object xxx()' in class 'zzz'.";
     private static final String EXPECTED_DUPLICATE_METHOD_ERROR_INTERFACE_MESSAGE =
             "Repetitive method name/signature for method 'java.lang.Object xxx(java.lang.String)' in interface 'zzz'.";
-    // can't check volatile here as it doubles up with bridge
-    //private static final String EXPECTED_VOLATILE_METHOD_ERROR_MESSAGE =
-    //        "The method 'java.lang.Object vo()' has an incorrect modifier volatile.";
+    /* can't check volatile here as it doubles up with bridge
+    private static final String EXPECTED_VOLATILE_METHOD_ERROR_MESSAGE =
+            "The method 'java.lang.Object vo()' has an incorrect modifier volatile.";
+    */
     private static final String EXPECTED_STRICT_METHOD_ERROR_MESSAGE =
             "The method 'java.lang.Object st()' has an incorrect modifier strictfp.";
     private static final String EXPECTED_NATIVE_METHOD_ERROR_MESSAGE =
@@ -71,8 +73,6 @@ public class ClassCompletionVerifierTest extends TestSupport {
             "The field 'prif' is not 'public static final' but is defined in interface 'zzz'.";
     private static final String EXPECTED_PROTECTED_METHOD_ERROR_MESSAGE =
             "Method 'prom' is protected but should be public in interface 'zzz'.";
-    private static final String EXPECTED_PRIVATE_METHOD_ERROR_MESSAGE =
-            "Method 'prim' is private but should be public in interface 'zzz'.";
     private static final String EXPECTED_ABSTRACT_PRIVATE_METHOD_ERROR_MESSAGE =
             "Method 'y' from class 'X' must not be private as it is declared as an abstract method.";
 
diff --git a/src/test/org/codehaus/groovy/classgen/InterfaceTest.groovy b/src/test/org/codehaus/groovy/classgen/InterfaceTest.groovy
index d5e00b61c6..a1801c1776 100644
--- a/src/test/org/codehaus/groovy/classgen/InterfaceTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/InterfaceTest.groovy
@@ -18,71 +18,64 @@
  */
 package org.codehaus.groovy.classgen
 
-import groovy.test.GroovyTestCase
 import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.tools.FileSystemCompiler
+import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
+import org.junit.Test
 
-class InterfaceTest extends GroovyTestCase {
+final class InterfaceTest {
 
-    void testCompile() {
-        File dir = createTempDir("groovy-src-", "-src")
-        assertNotNull dir
+    @Test
+    void testJavaImplementsGroovyInterface() {
+        def config = new CompilerConfiguration(
+            targetDirectory: File.createTempDir(),
+            jointCompilationOptions: [memStub: true]
+        )
+        def parentDir = File.createTempDir()
+        try {
+            new File(parentDir, 'test').mkdir()
 
-        def fileList = [
-                "GClass.groovy": """
-         package test;
+            def a = new File(parentDir, 'test/GClass.groovy')
+            a.write '''package test
+                class GClass {
+                }
+            '''
+            def b = new File(parentDir, 'test/GInterface.groovy')
+            b.write '''package test
+                interface GInterface {
+                    GClass[] getGC()
+                    default String foo() { 'foo' + GInterface.this.bar() }
+                    private String bar() { 'bar' }
+//                    static  String baz() { 'baz' }
+                }
+            '''
+            def c = new File(parentDir, 'test/JClass.java')
+            c.write '''package test;
+                public class JClass implements GInterface {
+                    public GClass[] getGC() {
+                        return new GClass[0];
+                    }
+                    public String toString() {
+                        return this.foo();
+                    }
+                }
+            '''
+            def d = new File(parentDir, 'Main.groovy')
+            d.write '''
+                def jc = new test.JClass()
+                assert jc.getGC().length == 0
+                assert jc.toString() == 'foobar'
+//                assert test.JClass.baz() == 'baz'
+            '''
 
-         class GClass {}
-    """,
+            def loader = new GroovyClassLoader(this.class.classLoader)
+            def cu = new JavaAwareCompilationUnit(config, loader)
+            cu.addSources(a, b, c, d)
+            cu.compile()
 
-                "GInterface.groovy": """
-         package test;
-
-         interface GInterface {
-            GClass [] get ();
-         }
-    """,
-
-                "JClass.java": """
-         package test;
-
-         public class JClass implements GInterface {
-            public GClass [] get () { return new GClass [0]; };
-         }
-    """,
-        ].collect {
-            name, text ->
-            File file = new File(dir, name)
-            file.write text
-            file
-        }
-
-        CompilerConfiguration config = new CompilerConfiguration()
-        config.targetDirectory = createTempDir("groovy-target-", "-target")
-        config.jointCompilationOptions = [
-                "stubDir": createTempDir("groovy-stub-", "-stub"),
-//            "namedValues" : ["target","1.5","source","1.5"] as String[]
-        ]
-        config.classpath = "build/classes"
-        FileSystemCompiler compiler = new FileSystemCompiler(config)
-        compiler.compile(fileList.toArray(new File[fileList.size()]))
-    }
-
-    private filesToDelete = []
-
-    void tearDown() {
-        filesToDelete.each {file ->
-            if (file instanceof File) {
-                // remember: null instanceof anything is false
-                FileSystemCompiler.deleteRecursive file
-            }
+            loader.loadClass('Main').main()
+        } finally {
+            config.targetDirectory.deleteDir()
+            parentDir.deleteDir()
         }
     }
-
-    private File createTempDir(prefix, suffix) {
-        File tempFile = File.createTempDir(prefix, suffix);
-        tempFile.deleteOnExit()
-        filesToDelete.add(tempFile)
-        return tempFile
-    }
 }
diff --git a/src/test/org/codehaus/groovy/runtime/NullObjectTest.groovy b/src/test/org/codehaus/groovy/runtime/NullObjectTest.groovy
index 26a25d3a9c..946b17a58a 100644
--- a/src/test/org/codehaus/groovy/runtime/NullObjectTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/NullObjectTest.groovy
@@ -25,6 +25,7 @@ import static groovy.test.GroovyAssert.shouldFail
 
 final class NullObjectTest {
 
+    // GROOVY-5769
     @Test
     void testInit1() {
         shouldFail(RuntimeException) {
@@ -32,6 +33,7 @@ final class NullObjectTest {
         }
     }
 
+    // GROOVY-5769
     @Test
     void testInit2() {
         shouldFail(RuntimeException) {
@@ -39,6 +41,7 @@ final class NullObjectTest {
         }
     }
 
+    // GROOVY-5769
     @Test
     void testInit3() {
         shouldFail(NoSuchMethodException) {