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) {