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