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 2020/07/12 06:03:49 UTC

[groovy] 01/01: Trivial tweak: use meta data to mark visited method node

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

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

commit b7e97888cf8a3d8cfde6e84f6967d589a6de8399
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Jul 12 14:03:23 2020 +0800

    Trivial tweak: use meta data to mark visited method node
---
 src/main/java/org/codehaus/groovy/ast/ClassNode.java | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 9eaf47c..a50dcf8 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -110,6 +110,7 @@ import static org.apache.groovy.ast.tools.MethodNodeUtils.getCodeAsBlock;
  * @see org.codehaus.groovy.ast.ClassHelper
  */
 public class ClassNode extends AnnotatedNode implements Opcodes {
+    private static final String VISITED = "_VISITED";
 
     private static class MapOfLists {
         Map<Object, List<MethodNode>> map;
@@ -1098,16 +1099,17 @@ public class ClassNode extends AnnotatedNode implements Opcodes {
         List<MethodNode> methodList = new ArrayList<>(getMethods());
         for (MethodNode mn : methodList) {
             visitor.visitMethod(mn);
+            mn.putNodeMetaData(VISITED, true);
         }
 
         // visit the method nodes added while iterating,
         // e.g. synthetic method for constructor reference
         List<MethodNode> changedMethodList = new ArrayList<>(getMethods());
-        boolean changed = changedMethodList.removeAll(methodList);
-        if (changed) {
-            for (MethodNode mn : changedMethodList) {
-                visitor.visitMethod(mn);
-            }
+        for (MethodNode mn : changedMethodList) {
+            Boolean visited = mn.getNodeMetaData(VISITED);
+            if (null != visited && visited) continue;
+
+            visitor.visitMethod(mn);
         }
     }