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

sunlan pushed a commit to branch danielsun/classnode-position-issue
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 670eaa1b198ecb36b5b87ac8398d67b22f4d7a1b
Author: Daniel Sun <sun...@apache.org>
AuthorDate: Fri Feb 14 22:34:28 2020 +0800

    Try to address classnode position issue - 1
---
 .../java/org/codehaus/groovy/ast/ClassHelper.java  |  8 +++--
 .../java/org/codehaus/groovy/ast/ClassNode.java    | 40 +++++++++++++++++++---
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java 
b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
index 17bcc8d..5d6989f 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -99,7 +99,7 @@ public class ClassHelper {
     };
 
     public static final ClassNode
-            DYNAMIC_TYPE = makeCached(Object.class),
+            DYNAMIC_TYPE = makeCached(Object.class, true),
             OBJECT_TYPE = DYNAMIC_TYPE,
             CLOSURE_TYPE = makeCached(Closure.class),
             GSTRING_TYPE = makeCached(GString.class),
@@ -176,10 +176,14 @@ public class ClassHelper {
     public static final String OBJECT = "java.lang.Object";
 
     public static ClassNode makeCached(Class c) {
+        return makeCached(c, false);
+    }
+
+    public static ClassNode makeCached(Class c, boolean freezePos) {
         final SoftReference<ClassNode> classNodeSoftReference = 
ClassHelperCache.classCache.get(c);
         ClassNode classNode;
         if (classNodeSoftReference == null || (classNode = 
classNodeSoftReference.get()) == null) {
-            classNode = new ClassNode(c);
+            classNode = new ClassNode(c, freezePos);
             ClassHelperCache.classCache.put(c, new 
SoftReference<ClassNode>(classNode));
             
VMPluginFactory.getPlugin().setAdditionalClassInformation(classNode);
         }
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java 
b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 15f6eb0..d0570e1 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -110,6 +110,8 @@ import static java.util.stream.Collectors.joining;
  */
 public class ClassNode extends AnnotatedNode implements Opcodes {
 
+    private boolean freezePos;
+
     private static class MapOfLists {
         Map<Object, List<MethodNode>> map;
 
@@ -247,15 +249,20 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
         this.componentType = componentType;
     }
 
-    /**
-     * Creates a non-primary {@code ClassNode} from a real class.
-     */
-    public ClassNode(Class<?> c) {
+    public ClassNode(Class<?> c, boolean freezePos) {
         this(c.getName(), c.getModifiers(), null, null, MixinNode.EMPTY_ARRAY);
         clazz = c;
         lazyInitDone = false;
         isPrimaryNode = false;
         Optional.ofNullable(getCompileUnit()).ifPresent(cu -> 
cu.addClass(this));
+        this.freezePos = freezePos;
+    }
+
+    /**
+     * Creates a non-primary {@code ClassNode} from a real class.
+     */
+    public ClassNode(Class<?> c) {
+        this(c, false);
     }
 
     /**
@@ -1539,4 +1546,29 @@ public class ClassNode extends AnnotatedNode implements 
Opcodes {
     public String getText() {
         return getName();
     }
+
+
+    public void setLineNumber(int lineNumber) {
+        if (freezePos) throw new GroovyBugError("setLineNumber: " + 
lineNumber);
+
+        super.setLineNumber(lineNumber);
+    }
+
+    public void setColumnNumber(int columnNumber) {
+        if (freezePos) throw new GroovyBugError("setColumnNumber: " + 
columnNumber);
+
+        super.setColumnNumber(columnNumber);
+    }
+
+    public void setLastLineNumber(int lastLineNumber) {
+        if (freezePos) throw new GroovyBugError("setLastLineNumber: " + 
lastLineNumber);
+
+        super.setLastLineNumber(lastLineNumber);
+    }
+
+    public void setLastColumnNumber(int lastColumnNumber) {
+        if (freezePos) throw new GroovyBugError("setLastColumnNumber: " + 
lastColumnNumber);
+
+        super.setLastColumnNumber(lastColumnNumber);
+    }
 }

Reply via email to