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