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 634ce6b09da431b0c2df6ff6fa6aad486a6cae43 Author: Eric Milles <[email protected]> AuthorDate: Tue Dec 10 12:37:25 2024 -0600 GROOVY-10811: error for explicit `super(...)` call in `enum` constructor --- src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java | 10 ++++++++++ src/test/gls/enums/EnumTest.groovy | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java index 851ac8c30d..4d5b3dd16d 100644 --- a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java +++ b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java @@ -36,6 +36,7 @@ import org.codehaus.groovy.ast.expr.ListExpression; import org.codehaus.groovy.ast.expr.MapEntryExpression; import org.codehaus.groovy.ast.expr.MethodCallExpression; import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.stmt.Statement; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.SourceUnit; @@ -44,6 +45,7 @@ import org.codehaus.groovy.syntax.SyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod; import static org.codehaus.groovy.ast.ClassHelper.int_TYPE; @@ -118,6 +120,14 @@ public class EnumVisitor extends ClassCodeVisitorSupport { } else if (!ctor.isPrivate()) { addError(ctor, "Illegal modifier for the enum constructor; only private is permitted."); } + if (ctor.firstStatementIsSpecialConstructorCall()) { + var ctorCall = (ConstructorCallExpression) ((ExpressionStatement) ctor.getFirstStatement()).getExpression(); + if (ctorCall.isSuperCall()) { + var spec = new StringJoiner(",", enumClass.getNameWithoutPackage() + "(", ")"); + for (Parameter p : ctor.getParameters()) spec.add(p.getType().getUnresolvedName()); + addError(ctorCall, "Cannot invoke super constructor from enum constructor " + spec); + } + } } // GROOVY-10811: final and abstract are implicit modifiers diff --git a/src/test/gls/enums/EnumTest.groovy b/src/test/gls/enums/EnumTest.groovy index 4d80ac1e0d..ab736d037f 100644 --- a/src/test/gls/enums/EnumTest.groovy +++ b/src/test/gls/enums/EnumTest.groovy @@ -859,6 +859,18 @@ class EnumTest extends CompilableTestSupport { """ } } + + // GROOVY-10811 + void testSuperCtorCall() { + shouldNotCompile ''' + enum E { + FOO; + E() { + super() + } + } + ''' + } } enum UsCoin {
