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/05 12:44:15 UTC

[groovy] branch GROOVY_3_0_X updated (b7c783f -> a0d436e)

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 b7c783f  GROOVY-9303: Bump javaparser to 3.15.4
     new d6a3067  GROOVY-8507, GROOVY-9301: support comma on last enum value in more cases
     new ee6b767  Add more tests
     new 708df70  sync with groovy-eclipse
     new a0d436e  refactor code

The 4 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:
 src/main/antlr2/org/codehaus/groovy/antlr/groovy.g |  15 +-
 .../groovy/classgen/AsmClassGenerator.java         |  12 +-
 .../org/codehaus/groovy/classgen/EnumVisitor.java  |   2 -
 .../org/codehaus/groovy/classgen/Verifier.java     |   7 +-
 .../groovy/classgen/asm/BytecodeHelper.java        |   2 +-
 .../groovy/classgen/asm/StatementWriter.java       |   4 +-
 .../codehaus/groovy/control/ProcessingUnit.java    |   7 +-
 .../codehaus/groovy/control/ResolveVisitor.java    |   8 +-
 .../org/codehaus/groovy/control/SourceUnit.java    |   8 +-
 .../groovy/control/StaticImportVisitor.java        |  25 +-
 .../groovy/control/messages/LocatedMessage.java    |  14 +-
 .../org/codehaus/groovy/tools/GroovyClass.java     |  15 +-
 .../transform/AnnotationCollectorTransform.java    |  73 +++---
 src/test/groovy/bugs/Groovy2365Bug.java            |  38 ++-
 .../groovy/antlr/EnumSourceParsingTest.java        | 284 +++++++++++++++++----
 .../groovy/classgen/ReflectorGeneratorTest.java    |   4 +-
 .../{Groovy7300Bug.groovy => Groovy7300.groovy}    |  73 +++---
 .../asm/sc/bugs/support/Groovy7538Support.java     |   4 +-
 .../codehaus/groovy/tools/TestDgmConverter.java    |   6 +-
 .../test/resources/core/EnumDeclaration_02.groovy  |  27 +-
 20 files changed, 406 insertions(+), 222 deletions(-)
 rename src/test/org/codehaus/groovy/classgen/asm/sc/bugs/{Groovy7300Bug.groovy => Groovy7300.groovy} (53%)


[groovy] 02/04: Add more tests

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 ee6b767a755beec2271e2522a769610b32fdb741
Author: Daniel Sun <su...@apache.org>
AuthorDate: Tue Nov 5 02:32:08 2019 +0800

    Add more tests
    
    (cherry picked from commit 502655371ad936ebcf4012195acf4b5e873ed10d)
---
 .../test/resources/core/EnumDeclaration_02.groovy  | 27 +++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy b/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy
index a5768db..b4d8d13 100644
--- a/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy
+++ b/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy
@@ -67,4 +67,29 @@ enum F {
 
 enum G implements I<T> {
 
-}
\ No newline at end of file
+}
+
+enum J {
+    A,
+    B,
+}
+
+enum K {
+    A,
+    B,
+    ;
+}
+
+enum Outer {
+    A, B
+    enum Inner{X, Y}
+}
+
+class TestClass {
+    enum OuterEnum {
+        VALUE,
+        enum InnerEnum {
+            A
+        }
+    }
+}


[groovy] 03/04: 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 708df7004384cc276a4159e74d6cc098f0d2ee48
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Nov 4 14:37:54 2019 -0600

    sync with groovy-eclipse
    
    (cherry picked from commit e8f8f3dbbde12a9701ca236d1ba9c9f5e377d901)
---
 .../groovy/classgen/AsmClassGenerator.java         | 12 ++--
 .../org/codehaus/groovy/classgen/EnumVisitor.java  |  2 -
 .../org/codehaus/groovy/classgen/Verifier.java     |  7 +--
 .../groovy/classgen/asm/BytecodeHelper.java        |  2 +-
 .../groovy/classgen/asm/StatementWriter.java       |  4 +-
 .../codehaus/groovy/control/ProcessingUnit.java    |  7 ++-
 .../codehaus/groovy/control/ResolveVisitor.java    |  8 +--
 .../org/codehaus/groovy/control/SourceUnit.java    |  8 +--
 .../groovy/control/StaticImportVisitor.java        | 25 +++++---
 .../groovy/control/messages/LocatedMessage.java    | 14 ++---
 .../org/codehaus/groovy/tools/GroovyClass.java     | 15 ++---
 .../transform/AnnotationCollectorTransform.java    | 73 +++++++++++-----------
 .../{Groovy7300Bug.groovy => Groovy7300.groovy}    | 73 ++++++++++------------
 13 files changed, 118 insertions(+), 132 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 2111e0a..61b6346 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -155,7 +155,6 @@ public class AsmClassGenerator extends ClassGenerator {
     static final MethodCaller spreadMap = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "spreadMap");
     static final MethodCaller despreadList = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "despreadList");
 
-
     // type conversions
     static final MethodCaller createListMethod = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "createList");
     static final MethodCaller createMapMethod = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "createMap");
@@ -2220,16 +2219,14 @@ public class AsmClassGenerator extends ClassGenerator {
     }
 
     public void onLineNumber(ASTNode statement, String message) {
-        MethodVisitor mv = controller.getMethodVisitor();
+        if (statement == null || statement instanceof BlockStatement) return;
 
-        if (statement==null) return;
+        currentASTNode = statement;
         int line = statement.getLineNumber();
-        this.currentASTNode = statement;
-
-        if (line < 0) return;
-        if (!ASM_DEBUG && line==controller.getLineNumber()) return;
+        if (line < 0 || (!ASM_DEBUG && line == controller.getLineNumber())) return;
 
         controller.setLineNumber(line);
+        MethodVisitor mv = controller.getMethodVisitor();
         if (mv != null) {
             Label l = new Label();
             mv.visitLabel(l);
@@ -2255,5 +2252,4 @@ public class AsmClassGenerator extends ClassGenerator {
         mn.getUnit().addGeneratedInnerClass((InnerClassNode)innerClass);
         return innerClasses.add(innerClass);
     }
-
 }
diff --git a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
index 208a34e..86d1a29 100644
--- a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
+++ b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
@@ -72,7 +72,6 @@ public class EnumVisitor extends ClassCodeVisitorSupport {
 
     private final SourceUnit sourceUnit;
 
-
     public EnumVisitor(CompilationUnit cu, SourceUnit su) {
         sourceUnit = su;
     }
@@ -442,5 +441,4 @@ public class EnumVisitor extends ClassCodeVisitorSupport {
         InnerClassNode ic = (InnerClassNode) enumClass;
         return ic.getVariableScope() == null;
     }
-
 }
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index bb0402e..204e443 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -332,13 +332,10 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
     protected void addDefaultConstructor(ClassNode node) {
         if (!node.getDeclaredConstructors().isEmpty()) return;
 
-        BlockStatement empty = new BlockStatement();
-        empty.setSourcePosition(node);
-        ConstructorNode constructor = new ConstructorNode(ACC_PUBLIC, empty);
-        constructor.setSourcePosition(node);
+        ConstructorNode constructor = new ConstructorNode(ACC_PUBLIC, new BlockStatement());
         constructor.setHasNoRealSourcePosition(true);
-        node.addConstructor(constructor);
         markAsGenerated(node, constructor);
+        node.addConstructor(constructor);
     }
 
     private void addStaticMetaClassField(final ClassNode node, final String classInternalName) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
index c50f4bc..7491ca8 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BytecodeHelper.java
@@ -234,7 +234,7 @@ public class BytecodeHelper implements Opcodes {
         mv.visitLabel(endLabel);
     }
 
-    /* *
+    /**
      * load a message on the stack and remove it right away. Good for put a mark in the generated bytecode for debugging purpose.
      *
      * @param msg
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
index ad37efb..072d9ed 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
@@ -215,7 +215,9 @@ public class StatementWriter {
 
         // visit increment
         mv.visitLabel(continueLabel);
-        for (int i = condIndex + 1; i < size; i++) {
+        // fix for being on the wrong line when debugging for loop
+        controller.getAcg().onLineNumber(loop, "increment condition");
+        for (int i = condIndex + 1; i < size; i += 1) {
             visitExpressionOfLoopStatement(expressions.get(i));
         }
 
diff --git a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
index 83146cf..af3f7c3 100644
--- a/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/ProcessingUnit.java
@@ -23,6 +23,8 @@ import groovy.lang.GroovyClassLoader;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A base class for data structures that can collect messages and errors
  * during processing.
@@ -58,8 +60,7 @@ public abstract class ProcessingUnit {
      * Initializes the ProcessingUnit to the empty state.
      */
     public ProcessingUnit(final CompilerConfiguration configuration, final GroovyClassLoader classLoader, final ErrorCollector errorCollector) {
-        setConfiguration(configuration != null ? configuration : CompilerConfiguration.DEFAULT);
-        setClassLoader(classLoader);
+        setConfiguration(configuration != null ? configuration : CompilerConfiguration.DEFAULT); setClassLoader(classLoader);
         this.errorCollector = errorCollector != null ? errorCollector : new ErrorCollector(getConfiguration());
         configure(getConfiguration());
     }
@@ -82,7 +83,7 @@ public abstract class ProcessingUnit {
      * Sets the CompilerConfiguration for this ProcessingUnit.
      */
     public final void setConfiguration(CompilerConfiguration configuration) {
-        this.configuration = configuration;
+        this.configuration = requireNonNull(configuration);
     }
 
     /**
diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index 7b3fbea..5230044 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -28,9 +28,11 @@ import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.CompileUnit;
+import org.codehaus.groovy.ast.CompileUnit.ConstructedOuterNestedClassNode;
 import org.codehaus.groovy.ast.DynamicVariable;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.GenericsType;
+import org.codehaus.groovy.ast.GenericsType.GenericsTypeName;
 import org.codehaus.groovy.ast.ImportNode;
 import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.MethodNode;
@@ -84,8 +86,6 @@ import java.util.function.BiConsumer;
 import java.util.function.Predicate;
 
 import static groovy.lang.Tuple.tuple;
-import static org.codehaus.groovy.ast.CompileUnit.ConstructedOuterNestedClassNode;
-import static org.codehaus.groovy.ast.GenericsType.GenericsTypeName;
 import static org.codehaus.groovy.ast.tools.ClosureUtils.getParametersSafe;
 
 /**
@@ -470,7 +470,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         GenericsType genericsType = genericParameterNames.get(new GenericsTypeName(typeName));
         if (genericsType != null) {
             type.setRedirect(genericsType.getType());
-            type.setGenericsTypes(new GenericsType[] {genericsType});
+            type.setGenericsTypes(new GenericsType[]{genericsType});
             type.setGenericsPlaceHolder(true);
             return true;
         }
@@ -1155,7 +1155,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
             return be;
         }
         if (left instanceof ClassExpression && be.getOperation().isOneOf(
-                new int[] {Types.ARRAY_EXPRESSION, Types.SYNTH_LIST, Types.SYNTH_MAP})) {
+                new int[]{Types.ARRAY_EXPRESSION, Types.SYNTH_LIST, Types.SYNTH_MAP})) {
             if (be.getRightExpression() instanceof ListExpression) {
                 ListExpression list = (ListExpression) be.getRightExpression();
                 if (list.getExpressions().isEmpty()) {
diff --git a/src/main/java/org/codehaus/groovy/control/SourceUnit.java b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
index 561f42d..f9b320c 100644
--- a/src/main/java/org/codehaus/groovy/control/SourceUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
@@ -122,7 +122,6 @@ public class SourceUnit extends ProcessingUnit {
         return name;
     }
 
-
     /**
      * Returns the Concrete Syntax Tree produced during parse()ing.
      */
@@ -138,7 +137,6 @@ public class SourceUnit extends ProcessingUnit {
         return this.ast;
     }
 
-
     /**
      * Convenience routine, primarily for use by the InteractiveShell,
      * that returns true if parse() failed with an unexpected EOF.
@@ -174,11 +172,9 @@ public class SourceUnit extends ProcessingUnit {
         return token.getType() == antlr.Token.EOF_TYPE;
     }
 
-
     //---------------------------------------------------------------------------
     // FACTORIES
 
-
     /**
      * A convenience routine to create a standalone SourceUnit on a String
      * with defaults for almost everything that is configurable.
@@ -190,7 +186,6 @@ public class SourceUnit extends ProcessingUnit {
         return new SourceUnit(name, source, configuration, null, new ErrorCollector(configuration));
     }
 
-
     /**
      * A convenience routine to create a standalone SourceUnit on a String
      * with defaults for almost everything that is configurable.
@@ -267,7 +262,8 @@ public class SourceUnit extends ProcessingUnit {
         XStreamUtils.serialize(name, ast);
     }
 
-    //---------------------------------------------------------------------------    // SOURCE SAMPLING
+    //---------------------------------------------------------------------------
+    // SOURCE SAMPLING
 
     /**
      * Returns a sampling of the source at the specified line and column,
diff --git a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
index 92b4c79..7d2db8d 100644
--- a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
@@ -63,7 +63,7 @@ import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.tools.ClosureUtils.getParametersSafe;
 
 /**
- * Visitor to resolve constants and method calls from static Imports
+ * Visitor to resolve constants and method calls from static imports.
  */
 public class StaticImportVisitor extends ClassCodeExpressionTransformer {
     private ClassNode currentClass;
@@ -237,7 +237,6 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
         if (mce.isImplicitThis() || isExplicitThisOrSuper) {
             if (mce.isImplicitThis()) {
                 if (null == currentClass.tryFindPossibleMethod(mce.getMethodAsString(), args)) {
-
                     Expression ret = findStaticMethodImportFromModule(method, args);
                     if (ret != null) {
                         setSourcePosition(ret, mce);
@@ -462,7 +461,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
             if (expression != null) return expression;
             expression = findStaticPropertyAccessorGivenArgs(importNode.getType(), getPropNameForAccessor(importNode.getFieldName()), args);
             if (expression != null) {
-                return new StaticMethodCallExpression(importNode.getType(), importNode.getFieldName(), args);
+                return newStaticMethodCallX(importNode.getType(), importNode.getFieldName(), args);
             }
         }
         // look for one of these:
@@ -478,7 +477,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
                 if (expression != null) return expression;
                 expression = findStaticPropertyAccessorGivenArgs(importClass, importMember, args);
                 if (expression != null) {
-                    return new StaticMethodCallExpression(importClass, prefix(name) + capitalize(importMember), args);
+                    return newStaticMethodCallX(importClass, prefix(name) + capitalize(importMember), args);
                 }
             }
         }
@@ -496,7 +495,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
                 if (expression != null) return expression;
                 expression = findStaticPropertyAccessorGivenArgs(starImportType, getPropNameForAccessor(name), args);
                 if (expression != null) {
-                    return new StaticMethodCallExpression(starImportType, name, args);
+                    return newStaticMethodCallX(starImportType, name, args);
                 }
             }
         }
@@ -525,9 +524,9 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
         if (accessor == null && hasStaticProperty(staticImportType, propName)) {
             // args will be replaced
             if (inLeftExpression)
-                accessor = new StaticMethodCallExpression(staticImportType, accessorName, ArgumentListExpression.EMPTY_ARGUMENTS);
+                accessor = newStaticMethodCallX(staticImportType, accessorName, ArgumentListExpression.EMPTY_ARGUMENTS);
             else
-                accessor = new PropertyExpression(new ClassExpression(staticImportType), propName);
+                accessor = newStaticPropertyX(staticImportType, propName);
         }
         return accessor;
     }
@@ -543,7 +542,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
         if (staticImportType.isPrimaryClassNode() || staticImportType.isResolved()) {
             FieldNode field = getField(staticImportType, fieldName);
             if (field != null && field.isStatic())
-                return new PropertyExpression(new ClassExpression(staticImportType), fieldName);
+                return newStaticPropertyX(staticImportType, fieldName);
         }
         return null;
     }
@@ -551,12 +550,20 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
     private static Expression findStaticMethod(ClassNode staticImportType, String methodName, Expression args) {
         if (staticImportType.isPrimaryClassNode() || staticImportType.isResolved()) {
             if (staticImportType.hasPossibleStaticMethod(methodName, args)) {
-                return new StaticMethodCallExpression(staticImportType, methodName, args);
+                return newStaticMethodCallX(staticImportType, methodName, args);
             }
         }
         return null;
     }
 
+    private static PropertyExpression newStaticPropertyX(ClassNode type, String name) {
+        return new PropertyExpression(new ClassExpression(type), name);
+    }
+
+    private static StaticMethodCallExpression newStaticMethodCallX(ClassNode type, String name, Expression args) {
+        return new StaticMethodCallExpression(type, name, args);
+    }
+
     protected SourceUnit getSourceUnit() {
         return source;
     }
diff --git a/src/main/java/org/codehaus/groovy/control/messages/LocatedMessage.java b/src/main/java/org/codehaus/groovy/control/messages/LocatedMessage.java
index 98c0c5f..773777b 100644
--- a/src/main/java/org/codehaus/groovy/control/messages/LocatedMessage.java
+++ b/src/main/java/org/codehaus/groovy/control/messages/LocatedMessage.java
@@ -24,24 +24,27 @@ import org.codehaus.groovy.syntax.CSTNode;
 
 import java.io.PrintWriter;
 
-
 /**
  * A base class for compilation messages.
  */
 public class LocatedMessage extends SimpleMessage {
-    protected CSTNode context;  // The CSTNode that indicates the location to which the message applies
+
+    /** The CSTNode that indicates the location to which the message applies. */
+    private CSTNode context;
 
     public LocatedMessage(String message, CSTNode context, SourceUnit source) {
         super(message, source);
         this.context = context;
     }
 
-
     public LocatedMessage(String message, Object data, CSTNode context, SourceUnit source) {
         super(message, data, source);
         this.context = context;
     }
 
+    public CSTNode getContext() {
+        return context;
+    }
 
     public void write(PrintWriter writer, Janitor janitor) {
         if (owner instanceof SourceUnit) {
@@ -63,9 +66,4 @@ public class LocatedMessage extends SimpleMessage {
             writer.println("");
         }
     }
-
 }
-
-
-
-
diff --git a/src/main/java/org/codehaus/groovy/tools/GroovyClass.java b/src/main/java/org/codehaus/groovy/tools/GroovyClass.java
index 867181d..4dd12dd 100644
--- a/src/main/java/org/codehaus/groovy/tools/GroovyClass.java
+++ b/src/main/java/org/codehaus/groovy/tools/GroovyClass.java
@@ -18,27 +18,22 @@
  */
 package org.codehaus.groovy.tools;
 
-public class GroovyClass
-{
-    public static final GroovyClass[] EMPTY_ARRAY = new GroovyClass[ 0 ];
+public class GroovyClass {
+    public static final GroovyClass[] EMPTY_ARRAY = {};
 
     private final String name;
     private final byte[] bytes;
 
-    public GroovyClass(String name,
-                       byte[] bytes)
-    {
+    public GroovyClass(String name, byte[] bytes) {
         this.name  = name;
         this.bytes = bytes;
     }
 
-    public String getName()
-    {
+    public String getName() {
         return this.name;
     }
 
-    public byte[] getBytes()
-    {
+    public byte[] getBytes() {
         return this.bytes;
     }
 }
diff --git a/src/main/java/org/codehaus/groovy/transform/AnnotationCollectorTransform.java b/src/main/java/org/codehaus/groovy/transform/AnnotationCollectorTransform.java
index efe75e7..f41feac 100644
--- a/src/main/java/org/codehaus/groovy/transform/AnnotationCollectorTransform.java
+++ b/src/main/java/org/codehaus/groovy/transform/AnnotationCollectorTransform.java
@@ -26,7 +26,6 @@ import org.codehaus.groovy.ast.AnnotationNode;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.InnerClassNode;
-import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.expr.AnnotationConstantExpression;
 import org.codehaus.groovy.ast.expr.ArrayExpression;
@@ -43,6 +42,7 @@ import org.codehaus.groovy.syntax.SyntaxException;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -61,7 +61,7 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
 import static org.objectweb.asm.Opcodes.ACC_STATIC;
 
 /**
- * This class is the base for any annotation alias processor. 
+ * This class is the base for any annotation alias processor.
  * @see AnnotationCollector
  * @see AnnotationCollectorTransform#visit(AnnotationNode, AnnotationNode, AnnotatedNode, SourceUnit)
  */
@@ -86,12 +86,12 @@ public class AnnotationCollectorTransform {
      * modifiers, interfaces and superclasses, as well as adding a static
      * value method returning our serialized version of the data for processing
      * from a pre-compiled state. By doing this the old annotations will be
-     * removed as well 
+     * removed as well
      */
     public static class ClassChanger {
-        
+
         /**
-         * Method to transform the given ClassNode, if it is annotated with 
+         * Method to transform the given ClassNode, if it is annotated with
          * {@link AnnotationCollector}. See class description for what the
          * transformation includes.
          */
@@ -115,7 +115,7 @@ public class AnnotationCollectorTransform {
             ClassNode helper = cn;
             if (legacySerialization) {
                 // force final class, remove interface, annotation, enum and abstract modifiers
-                helper.setModifiers((ACC_FINAL + helper.getModifiers()) & ~(ACC_ENUM | ACC_INTERFACE | ACC_ANNOTATION | ACC_ABSTRACT));
+                helper.setModifiers((ACC_FINAL | helper.getModifiers()) & ~(ACC_ENUM | ACC_INTERFACE | ACC_ANNOTATION | ACC_ABSTRACT));
                 // force Object super class
                 helper.setSuperClass(ClassHelper.OBJECT_TYPE);
                 // force no interfaces implemented
@@ -125,13 +125,12 @@ public class AnnotationCollectorTransform {
                         ACC_PUBLIC | ACC_STATIC | ACC_FINAL, ClassHelper.OBJECT_TYPE.getPlainNodeReference());
                 cn.getModule().addClass(helper);
                 helper.addAnnotation(new AnnotationNode(COMPILESTATIC_CLASSNODE));
-                MethodNode serializeClass = collector.getClassNode().getMethod("serializeClass", Parameter.EMPTY_ARRAY);
                 collector.setMember("serializeClass", new ClassExpression(helper.getPlainNodeReference()));
             }
 
             // add static value():Object[][] method
             List<AnnotationNode> meta = getMeta(cn);
-            List<Expression> outer = new ArrayList<Expression>(meta.size());
+            List<Expression> outer = new ArrayList<>(meta.size());
             for (AnnotationNode an : meta) {
                 Expression serialized = serialize(an);
                 outer.add(serialized);
@@ -139,7 +138,7 @@ public class AnnotationCollectorTransform {
 
             ArrayExpression ae = new ArrayExpression(ClassHelper.OBJECT_TYPE.makeArray(), outer);
             Statement code = new ReturnStatement(ae);
-            helper.addMethod("value", ACC_PUBLIC + ACC_STATIC,
+            helper.addMethod("value", ACC_PUBLIC | ACC_STATIC,
                     ClassHelper.OBJECT_TYPE.makeArray().makeArray(),
                     Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, code);
 
@@ -161,7 +160,7 @@ public class AnnotationCollectorTransform {
                 boolean annotationConstant = false;
                 ListExpression le = (ListExpression) e;
                 List<Expression> list = le.getExpressions();
-                List<Expression> newList = new ArrayList<Expression>(list.size());
+                List<Expression> newList = new ArrayList<>(list.size());
                 for (Expression exp: list) {
                     annotationConstant = annotationConstant || exp instanceof AnnotationConstantExpression;
                     newList.add(serialize(exp));
@@ -174,20 +173,23 @@ public class AnnotationCollectorTransform {
         }
 
         private Expression serialize(AnnotationNode an) {
+            ClassExpression type = new ClassExpression(an.getClassNode());
+            type.setSourcePosition(an.getClassNode());
+
             MapExpression map = new MapExpression();
-            for (String key : an.getMembers().keySet()) {
-                map.addMapEntryExpression(new ConstantExpression(key), serialize(an.getMember(key)));
+            for (Map.Entry<String, Expression> entry : an.getMembers().entrySet()) {
+                Expression key = new ConstantExpression(entry.getKey());
+                Expression val = serialize(entry.getValue());
+                map.addMapEntryExpression(key, val);
             }
-            List<Expression> l = new ArrayList<Expression>(2);
-            l.add(new ClassExpression(an.getClassNode()));
-            l.add(map);
-            return new ArrayExpression(ClassHelper.OBJECT_TYPE, l);
+
+            return new ArrayExpression(ClassHelper.OBJECT_TYPE, Arrays.asList(type, map));
         }
     }
-    
+
     /**
      * Adds a new syntax error to the source unit and then continues.
-     * 
+     *
      * @param message   the message
      * @param node      the node for the error report
      * @param source    the source unit for the error report
@@ -212,7 +214,7 @@ public class AnnotationCollectorTransform {
         if (memberList.isEmpty()) {
             return Collections.emptyList();
         }
-        List<AnnotationNode> ret = new ArrayList<AnnotationNode>();
+        List<AnnotationNode> ret = new ArrayList<>();
         for (Expression e : memberList) {
             AnnotationNode toAdd = new AnnotationNode(e.getType());
             toAdd.setSourcePosition(aliasAnnotationUsage);
@@ -229,7 +231,7 @@ public class AnnotationCollectorTransform {
 
     private static List<AnnotationNode> copy(List<AnnotationNode> orig, AnnotationNode aliasAnnotationUsage) {
         if (orig.isEmpty()) return orig;
-        List<AnnotationNode> ret = new ArrayList<AnnotationNode>(orig.size());
+        List<AnnotationNode> ret = new ArrayList<>(orig.size());
         for (AnnotationNode an : orig) {
             AnnotationNode newAn = new AnnotationNode(an.getClassNode());
             copyMembers(an, newAn);
@@ -244,7 +246,7 @@ public class AnnotationCollectorTransform {
         if (annotations.size() < 2) {
             return Collections.emptyList();
         }
-        List<AnnotationNode> ret = new ArrayList<AnnotationNode>(annotations.size());
+        List<AnnotationNode> ret = new ArrayList<>(annotations.size());
         for (AnnotationNode an : annotations) {
             ClassNode type = an.getClassNode();
             if (type.getName().equals(AnnotationCollector.class.getName()) || "java.lang.annotation".equals(type.getPackageName())) continue;
@@ -299,9 +301,9 @@ public class AnnotationCollectorTransform {
         if (data.length == 0) {
             return Collections.emptyList();
         }
-        List<AnnotationNode> ret = new ArrayList<AnnotationNode>(data.length);
+        List<AnnotationNode> ret = new ArrayList<>(data.length);
         for (Object[] inner : data) {
-            Class<?> anno = (Class) inner[0];
+            Class<?> anno = (Class<?>) inner[0];
             AnnotationNode toAdd = new AnnotationNode(ClassHelper.make(anno));
             ret.add(toAdd);
 
@@ -310,7 +312,7 @@ public class AnnotationCollectorTransform {
             if (member.isEmpty()) {
                 continue;
             }
-            Map<String, Expression> generated = new HashMap<String, Expression>(member.size());
+            Map<String, Expression> generated = new HashMap<>(member.size());
             for (Map.Entry<String, Object> entry : member.entrySet()) {
                 generated.put(entry.getKey(), makeExpression(entry.getValue()));
             }
@@ -321,7 +323,7 @@ public class AnnotationCollectorTransform {
 
     private static Expression makeExpression(Object o) {
         if (o instanceof Class) {
-            return new ClassExpression(ClassHelper.make((Class) o));
+            return new ClassExpression(ClassHelper.make((Class<?>) o));
         }
         //TODO: value as Annotation here!
         if (o instanceof Object[][]) {
@@ -341,11 +343,11 @@ public class AnnotationCollectorTransform {
         }
         return new ConstantExpression(o,true);
     }
-    
+
     /**
-     * Returns a list of AnnotationNodes for the value attribute of the given 
-     * AnnotationNode. 
-     * 
+     * Returns a list of AnnotationNodes for the value attribute of the given
+     * AnnotationNode.
+     *
      * @param collector     the node containing the value member with the list
      * @param source        the source unit for error reporting
      * @return              a list of string constants
@@ -353,25 +355,24 @@ public class AnnotationCollectorTransform {
     protected List<AnnotationNode> getTargetAnnotationList(AnnotationNode collector, AnnotationNode aliasAnnotationUsage, SourceUnit source) {
         List<AnnotationNode> stored     = getStoredTargetList(aliasAnnotationUsage, source);
         List<AnnotationNode> targetList = getTargetListFromValue(collector, aliasAnnotationUsage, source);
-        int size = targetList.size()+stored.size();
+        int size = targetList.size() + stored.size();
         if (size == 0) {
             return Collections.emptyList();
         }
-        List<AnnotationNode> ret = new ArrayList<AnnotationNode>(size);
+        List<AnnotationNode> ret = new ArrayList<>(size);
         ret.addAll(stored);
         ret.addAll(targetList);
-
         return ret;
     }
 
     /**
-     * Implementation method of the alias annotation processor. This method will 
+     * Implementation method of the alias annotation processor. This method will
      * get the list of annotations we aliased from the collector and adds it to
-     * aliasAnnotationUsage. The method will also map all members from 
+     * aliasAnnotationUsage. The method will also map all members from
      * aliasAnnotationUsage to the aliased nodes. Should a member stay unmapped,
      * we will ad an error. Further processing of those members is done by the
      * annotations.
-     * 
+     *
      * @param collector                 reference to the annotation with {@link AnnotationCollector}
      * @param aliasAnnotationUsage      reference to the place of usage of the alias
      * @param aliasAnnotated            reference to the node that has been annotated by the alias
@@ -380,7 +381,7 @@ public class AnnotationCollectorTransform {
      */
     public List<AnnotationNode> visit(AnnotationNode collector, AnnotationNode aliasAnnotationUsage, AnnotatedNode aliasAnnotated, SourceUnit source) {
         List<AnnotationNode> ret =  getTargetAnnotationList(collector, aliasAnnotationUsage, source);
-        Set<String> unusedNames = new HashSet<String>(aliasAnnotationUsage.getMembers().keySet());
+        Set<String> unusedNames = new HashSet<>(aliasAnnotationUsage.getMembers().keySet());
 
         for (AnnotationNode an: ret) {
             for (String name : aliasAnnotationUsage.getMembers().keySet()) {
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300Bug.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
similarity index 53%
rename from src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300Bug.groovy
rename to src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
index 33a3cbd..4cc1598 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300Bug.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
@@ -16,64 +16,59 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
-
-
-
-
-
 package org.codehaus.groovy.classgen.asm.sc.bugs
 
 import groovy.transform.stc.StaticTypeCheckingTestCase
 import org.codehaus.groovy.classgen.asm.sc.StaticCompilationTestSupport
 
-class Groovy7300Bug extends StaticTypeCheckingTestCase implements StaticCompilationTestSupport {
+final class Groovy7300 extends StaticTypeCheckingTestCase implements StaticCompilationTestSupport {
+
     void testShouldNotThrowStackOverflow() {
         assertScript '''
-class A {
-    private String field1 = 'test'
+            class A {
+                private String field1 = 'test'
 
-    String getField1() {
-        return this.field1
-   }
-}
+                String getField1() {
+                    return this.field1
+               }
+            }
 
-class B extends A {
-    @Override
-    String getField1() {
-        super.field1
-    }
-}
+            class B extends A {
+                @Override
+                String getField1() {
+                    super.field1
+                }
+            }
 
-B b = new B()
+            B b = new B()
 
-assert b.field1 == 'test'
-'''
+            assert b.field1 == 'test'
+        '''
     }
 
     void testShouldNotThrowStackOverflowWithSuper() {
         assertScript '''
-class A {
-    private String field1 = 'test'
+            class A {
+                private String field1 = 'test'
 
-    void setField1(String val) { field1 = val }
+                void setField1(String val) { field1 = val }
 
-    String getField1() {
-        return this.field1
-   }
-}
+                String getField1() {
+                    return this.field1
+               }
+            }
 
-class B extends A {
-    @Override
-    String getField1() {
-        super.field1 = 'test 2'
-        super.field1
-    }
-}
+            class B extends A {
+                @Override
+                String getField1() {
+                    super.field1 = 'test 2'
+                    super.field1
+                }
+            }
 
-B b = new B()
+            B b = new B()
 
-assert b.field1 == 'test 2'
-'''
+            assert b.field1 == 'test 2'
+        '''
     }
 }


[groovy] 01/04: GROOVY-8507, GROOVY-9301: support comma on last enum value in more cases

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 d6a306779a2a00520da523b96870d8fcf81c0cdf
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Nov 3 12:15:26 2019 -0600

    GROOVY-8507, GROOVY-9301: support comma on last enum value in more cases
    
    and reduce ambiguity within (antlr2) enumConstants loop
    
    (cherry picked from commit 91a7dfad2583780fcf429fee50764aaee0122bc0)
---
 src/main/antlr2/org/codehaus/groovy/antlr/groovy.g |  15 +-
 .../groovy/antlr/EnumSourceParsingTest.java        | 284 +++++++++++++++++----
 2 files changed, 240 insertions(+), 59 deletions(-)

diff --git a/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g b/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g
index 3f29054..41d5e29 100644
--- a/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g
+++ b/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g
@@ -1128,26 +1128,33 @@ enumBlock  {Token first = LT(1);}
         {#enumBlock = #(create(OBJBLOCK,"OBJBLOCK",first,LT(1)), #enumBlock);}
     ;
 
-/** Guard for enumConstants.  */
+/** Guard for enumConstants. */
 enumConstantsStart
     :   annotationsOpt IDENT (LCURLY | LPAREN | nls (SEMI | COMMA | declarationStart | RCURLY))
     ;
 
-/** Comma-separated list of one or more enum constant definitions.  */
+/** Comma-separated list of one or more enum constant definitions. */
 enumConstants
     :
         enumConstant
         ( options {generateAmbigWarnings=false;} :
-            (nls ( options {generateAmbigWarnings=false;} : SEMI! | RCURLY | declarationStart | constructorStart)) => {break;}
+            (nls (SEMI | enumConstantsEnd)) => {break;} // GROOVY-4438, GROOVY-9184
         |
             nls! COMMA! (
+                (nls enumConstantsEnd) => {break;} // GROOVY-8507, GROOVY-9301
+            |
                 (nls annotationsOpt IDENT) => nls! enumConstant
             |
-                (nls (SEMI! | RCURLY | classField)) => {break;}
+                (nls classField) => {break;}
             )
         )*
     ;
 
+enumConstantsEnd
+    options {generateAmbigWarnings=false;}
+    :   RCURLY | declarationStart | constructorStart | typeDefinitionStart
+    ;
+
 // An annotation field
 annotationField!  {Token first = LT(1);}
     :   mods:modifiersOpt!
diff --git a/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java b/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java
index 8a6d2a3..fd24cb4 100644
--- a/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java
+++ b/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java
@@ -28,93 +28,116 @@ public final class EnumSourceParsingTest extends SourceParserTest {
     public void testParseEnumConstants() {
         parse(getMethodName(), new StringReader(
             "enum E {\n" +
-            "    ONE, TWO, THREE\n" +
-            "}"));
+            "    X, Y, Z\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumConstantsMultiLine() {
         parse(getMethodName(), new StringReader(
             "enum E {\n" +
-            "    ONE,\n" +
-            "    TWO,\n" +
-            "    THREE,\n" +
-            "}"));
+            "    X,\n" +
+            "    Y,\n" +
+            "    Z,\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumConstantsMultiLine2() {
         parse(getMethodName(), new StringReader(
-            "enum ParseCode\n" +
+            "enum E\n" +
             "{\n" +
-            "    COMPLETE,\n" +
-            "    INCOMPLETE,\n" +
-            "    ERROR\n" +
-            "}"));
+            "    X,\n" +
+            "    Y,\n" +
+            "    Z\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumImplementsMultiLine() {
         parse(getMethodName(), new StringReader(
-            "enum ParseCode implements I\n" +
+            "enum E implements I\n" +
             "{\n" +
-            "    COMPLETE,\n" +
-            "    INCOMPLETE,\n" +
-            "    ERROR\n" +
-            "}"));
+            "    X,\n" +
+            "    Y,\n" +
+            "    Z\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumImplementsMultiLine2() {
         parse(getMethodName(), new StringReader(
-            "enum ParseCode\n" +
+            "enum E\n" +
             "implements I\n" +
             "{\n" +
-            "    COMPLETE,\n" +
-            "    INCOMPLETE,\n" +
-            "    ERROR\n" +
-            "}"));
+            "    X,\n" +
+            "    Y,\n" +
+            "    Z\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumConstantsOneLiner() {
         parse(getMethodName(), new StringReader(
-            "enum One { ONE, TWO, THREE }"));
+            "enum E { X, Y, Z }\n")
+        );
     }
 
     public void testParseEnumImplements() {
         parse(getMethodName(), new StringReader(
-            "enum Two implements I1 {\n" +
-            "ONE, TWO, THREE\n" +
-            "}"));
+            "enum E implements I {\n" +
+            "    X, Y, Z\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumWithValues() {
         parse(getMethodName(), new StringReader(
-            "enum Three1 {\n" +
-            "    ONE(1), TWO(2)\n\n" +
-            "    Three1(val) {\n" +
-            "        value = val\n" +
+            "enum E {\n" +
+            "    X(1), Y(2)\n\n" +
+            "    E(value) {\n" +
+            "        this.value = value\n" +
             "    }\n\n" +
-            "    private final int value" +
-            "}"));
+            "    private final int value\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumWithValues2() {
         parse(getMethodName(), new StringReader(
-            "enum Three1 {\n" +
-            "    @Annotation ONE(1), TWO(2)\n\n" +
-            "    Three1(val) {\n" +
-            "        value = val\n" +
+            "enum E {\n" +
+            "    @Annotation X(1), Y(2)\n\n" +
+            "    E(value) {\n" +
+            "        this.value = value\n" +
             "    }\n\n" +
-            "    private final int value" +
-            "}"));
+            "    private final int value\n" +
+            "}\n")
+        );
     }
 
     public void testParseEnumWithValues3() {
         parse(getMethodName(), new StringReader(
-            "enum NonFinal {\n" +
-            "    One(1), Two(2)\n" +
+            "enum E {\n" +
+            "    X(1), Y(2)\n" +
             "    Object value\n" + // different parsing without leading keyword
-            "    NonFinal(value) {\n" +
+            "    E(value) {\n" +
+            "        this.value = value\n" +
+            "    }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-9301
+    public void testParseEnumWithValues3a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X(1), Y(2),\n" + // trailing comma
+            "    Object value\n" +
+            "    E(value) {\n" +
             "        this.value = value\n" +
             "    }\n" +
-            "}\n"));
+            "}\n")
+        );
     }
 
     public void testParseEnumWithValues4() {
@@ -127,26 +150,55 @@ public final class EnumSourceParsingTest extends SourceParserTest {
             "    CLUBS(Color.BLACK),\n" +
             "    DIAMONDS(Color.RED),\n" +
             "    HEARTS(Color.RED),\n" +
-            "    SPADES(Color.BLACK),\n" +
+            "    SPADES(Color.BLACK),\n" + // trailing comma
             "    \n" +
             "    final Color color\n" +
             "    Suit(Color color) {\n" +
             "        this.color = color\n" +
             "    }\n" +
-            "}\n"));
+            "}\n")
+        );
     }
 
-    public void testParseEnumWithMethodDefinitions() {
+    public void testParseEnumWithMethodDefinitions1() {
         parse(getMethodName(), new StringReader(
-            "enum Four {\n" +
-            "    ONE, TWO, THREE\n\n" +
-            "    def someMethod() { }\n" +
+            "enum E {\n" +
+            "    X, Y, Z\n\n" +
+            "    def m1() { }\n" +
             "    public m2(args) { }\n" +
             "    int m3(String arg) { }\n" +
-            "}"));
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithMethodDefinitions2() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n\n" +
+            "    def <T> T m() { }\n" +
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithMethodDefinitions2a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n\n" +
+            "    final <T> T m() { }\n" +
+            "}\n")
+        );
     }
 
-    public void testParseEnumWithAnnotatedMethodDefinition() {
+    public void testParseEnumWithMethodDefinitions2b() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n\n" +
+            "    public <T> T m() { }\n" +
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithAnnotatedMethodDefinition1() {
         parse(getMethodName(), new StringReader(
             "enum Orientation {\n" +
             "    LANDSCAPE, PORTRAIT\n" +
@@ -155,16 +207,138 @@ public final class EnumSourceParsingTest extends SourceParserTest {
             "    String toString() {\n" +
             "        name().toLowerCase().capitalize()\n" +
             "    }\n" +
-            "}\n"));
+            "}\n")
+        );
+    }
+
+    // GROOVY-9301
+    public void testParseEnumWithAnnotatedMethodDefinition2() {
+        parse(getMethodName(), new StringReader(
+            "enum Orientation {\n" +
+            "    LANDSCAPE, PORTRAIT,\n" + // trailing comma
+            "    \n" +
+            "    @Override\n" +
+            "    String toString() {\n" +
+            "        name().toLowerCase().capitalize()\n" +
+            "    }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-9301
+    public void testParseEnumWithAnnotatedMethodDefinition3() {
+        parse(getMethodName(), new StringReader(
+            "enum Orientation {\n" +
+            "    LANDSCAPE, PORTRAIT,\n" + // trailing comma
+            "    \n" +
+            "    @Deprecated <T> T whatever() {\n" +
+            "    }\n" +
+            "}\n")
+        );
     }
 
     public void testParseCompleteEnum() {
         parse(getMethodName(), new StringReader(
-            "enum Five {\n" +
-            "    ONE { double eval(int v) { return (double) v } }, \n" +
-            "    TWO {\n" +
+            "enum E {\n" +
+            "    X { double eval(int v) { return (double) v } }, \n" +
+            "    Y {\n" +
             "        double eval(int v) { return (double) v + 1 }\n" +
-            "    }, THREE\n" +
-            "}"));
+            "    }, Z\n" +
+            "}")
+        );
+    }
+
+    public void testParseEnumWithInnerClass1() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n" +
+            "    class C { }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-8507
+    public void testParseEnumWithInnerClass1a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z,\n" + // trailing comma
+            "    class C { }\n" +
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithInnerClass2() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n" +
+            "    enum E2 { A, B, C }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-8507
+    public void testParseEnumWithInnerClass2a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z,\n" + // trailing comma
+            "    enum Another { A, B, C }\n" +
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithInnerClass3() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n" +
+            "    interface I { }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-8507
+    public void testParseEnumWithInnerClass3a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z,\n" + // trailing comma
+            "    interface I { }\n" +
+            "}\n")
+        );
+    }
+
+    public void _FIXME_testParseEnumWithInnerClass4() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n" +
+            "    @interface A { }\n" +
+            "}\n")
+        );
+    }
+
+    public void _FIXME_testParseEnumWithInnerClass4a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z,\n" + // trailing comma
+            "    @interface A { }\n" +
+            "}\n")
+        );
+    }
+
+    public void testParseEnumWithInnerClass5() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z\n" +
+            "    trait T { }\n" +
+            "}\n")
+        );
+    }
+
+    // GROOVY-8507
+    public void testParseEnumWithInnerClass5a() {
+        parse(getMethodName(), new StringReader(
+            "enum E {\n" +
+            "    X, Y, Z,\n" + // trailing comma
+            "    trait T { }\n" +
+            "}\n")
+        );
     }
 }


[groovy] 04/04: refactor code

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 a0d436e0cdc326a90c29b3719f7cfaea67e9d1e3
Author: mattisonchao <ma...@gmail.com>
AuthorDate: Tue Nov 5 19:50:50 2019 +0800

    refactor code
    
    I refactor some code,the mainly about the new java version,
    the other about some style or performance.
    
    ---Make progress every day!
    
    (cherry picked from commit 871f756094e8759d6142fe8fecfbb6ee72a04e26)
---
 src/test/groovy/bugs/Groovy2365Bug.java            | 38 ++++++++++------------
 .../groovy/classgen/ReflectorGeneratorTest.java    |  4 +--
 .../asm/sc/bugs/support/Groovy7538Support.java     |  4 ++-
 .../codehaus/groovy/tools/TestDgmConverter.java    |  6 +---
 4 files changed, 22 insertions(+), 30 deletions(-)

diff --git a/src/test/groovy/bugs/Groovy2365Bug.java b/src/test/groovy/bugs/Groovy2365Bug.java
index b70aeec..f9350fc 100644
--- a/src/test/groovy/bugs/Groovy2365Bug.java
+++ b/src/test/groovy/bugs/Groovy2365Bug.java
@@ -46,30 +46,26 @@ public class Groovy2365Bug extends Groovy2365Base {
 
                     // thread one: newInstance script foo
                     final boolean completed [] = new boolean[2] ;
-                    Thread thread1 = new Thread() {
-                        public void run() {
-                            try {
-                                Script script = (Script) script1Class.getDeclaredConstructor().newInstance();
-                                script.run();
-                                completed [0] = true;
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                            }
+                    Thread thread1 = new Thread(() -> {
+                        try {
+                            Script script = (Script) script1Class.getDeclaredConstructor().newInstance();
+                            script.run();
+                            completed [0] = true;
+                        } catch (Exception e) {
+                            e.printStackTrace();
                         }
-                    };
+                    });
 
-                    Thread thread2 = new Thread() {
-                        public void run() {
-                            try {
-                                Class cls = groovyLoader.loadClass("Script2", true, true);
-                                Script script = (Script) cls.getDeclaredConstructor().newInstance();
-                                script.run();
-                                completed [1] = true;
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                            }
+                    Thread thread2 = new Thread(() -> {
+                        try {
+                            Class cls = groovyLoader.loadClass("Script2", true, true);
+                            Script script = (Script) cls.getDeclaredConstructor().newInstance();
+                            script.run();
+                            completed [1] = true;
+                        } catch (Exception e) {
+                            e.printStackTrace();
                         }
-                    };
+                    });
 
                     // let's see if we get a deadlock
                     thread2.start();
diff --git a/src/test/org/codehaus/groovy/classgen/ReflectorGeneratorTest.java b/src/test/org/codehaus/groovy/classgen/ReflectorGeneratorTest.java
index 7bc8ee8..c0d16ac 100644
--- a/src/test/org/codehaus/groovy/classgen/ReflectorGeneratorTest.java
+++ b/src/test/org/codehaus/groovy/classgen/ReflectorGeneratorTest.java
@@ -31,9 +31,7 @@ class A_GroovyReflector {
             CachedMethod m = CachedMethod.find(A.class.getDeclaredMethod("protectedMethod", new Class [0] ));
             Object[] arguments = new Object[0];
             m.setAccessible().invoke(new A(), arguments);
-        } catch (NoSuchMethodException e) {
-        } catch (IllegalAccessException e) {
-        } catch (InvocationTargetException e) {
+        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
         }
     }
 
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/support/Groovy7538Support.java b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/support/Groovy7538Support.java
index 0ee598c..d1f42ff 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/support/Groovy7538Support.java
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/support/Groovy7538Support.java
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.classgen.asm.sc.bugs.support;
 
+import java.util.Objects;
+
 /*
  * Test classes extracted and adapted from the AssertJ project.
  */
@@ -85,7 +87,7 @@ public class Groovy7538Support {
         }
 
         private static boolean equal(Object actual, Object other) {
-            return (actual == other) || (actual != null && actual.equals(other));
+            return Objects.equals(actual, other);
         }
     }
 
diff --git a/src/test/org/codehaus/groovy/tools/TestDgmConverter.java b/src/test/org/codehaus/groovy/tools/TestDgmConverter.java
index 393d7d6..26fadf3 100644
--- a/src/test/org/codehaus/groovy/tools/TestDgmConverter.java
+++ b/src/test/org/codehaus/groovy/tools/TestDgmConverter.java
@@ -52,11 +52,7 @@ public class TestDgmConverter extends TestCase {
                     final MetaMethod metaMethod = (MetaMethod) constructor.newInstance(null,null, null, null);
                 } catch (ClassNotFoundException e) {
                     fail("Failed to load " + className);
-                } catch (IllegalAccessException e) {
-                    fail("Failed to instantiate " + className);
-                } catch (InstantiationException e) {
-                    fail("Failed to instantiate " + className);
-                } catch (InvocationTargetException e) {
+                } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
                     fail("Failed to instantiate " + className);
                 }
             }