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 2022/01/31 19:44:54 UTC

[groovy] 02/06: GROOVY-9726: Compile error needed for illegal field modifier combination

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

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

commit 836e12ac7c2752a97b792dc52d15e0e499eccade
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Sep 8 21:50:42 2020 +1000

    GROOVY-9726: Compile error needed for illegal field modifier combination
---
 .../org/codehaus/groovy/classgen/ClassCompletionVerifier.java  |  7 +++++++
 .../codehaus/groovy/classgen/ClassCompletionVerifierTest.java  | 10 ++++++++++
 2 files changed, 17 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java b/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
index f120236..5321b31 100644
--- a/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
@@ -522,6 +522,7 @@ public class ClassCompletionVerifier extends ClassCodeVisitorSupport {
             addError("The " + getDescription(node) + " is declared multiple times.", node);
         }
         checkInterfaceFieldModifiers(node);
+        checkInvalidFieldModifiers(node);
         checkGenericsUsage(node, node.getType());
         if (node.getType().equals(VOID_TYPE)) {
             addError("The " + getDescription(node) + " has invalid type void", node);
@@ -561,6 +562,12 @@ public class ClassCompletionVerifier extends ClassCodeVisitorSupport {
         }
     }
 
+    private void checkInvalidFieldModifiers(FieldNode node) {
+        if ((node.getModifiers() & (ACC_FINAL | ACC_VOLATILE)) == (ACC_FINAL | ACC_VOLATILE)) {
+            addError("Illegal combination of modifiers, final and volatile, for field '" + node.getName() + "'", node);
+        }
+    }
+
     public void visitBinaryExpression(BinaryExpression expression) {
         if (expression.getOperation().getType() == Types.LEFT_SQUARE_BRACKET &&
                 expression.getRightExpression() instanceof MapEntryExpression) {
diff --git a/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java b/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
index 4de5012..937e95d 100644
--- a/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
+++ b/src/test/org/codehaus/groovy/classgen/ClassCompletionVerifierTest.java
@@ -20,6 +20,7 @@ package org.codehaus.groovy.classgen;
 
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.control.SourceUnit;
@@ -175,6 +176,15 @@ public class ClassCompletionVerifierTest extends TestSupport {
         checkErrorCount(0);
     }
 
+    public void testDetectsInvalidFieldModifiers() {
+        ClassNode foo = new ClassNode("foo", ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
+        FieldNode bar = new FieldNode("bar", (ACC_FINAL | ACC_VOLATILE), ClassHelper.STRING_TYPE, foo, null);
+        foo.addField(bar);
+        verifier.visitClass(foo);
+        checkErrorCount(1);
+        checkErrorMessage("Illegal combination of modifiers, final and volatile, for field 'bar'");
+    }
+
     private void addDummyConstructor(ClassNode node) {
         // constructors should not be treated as errors (they have no real meaning for interfaces anyway)
         node.addMethod(new MethodNode("<clinit>", ACC_PUBLIC | ACC_STATIC, ClassHelper.OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, null));