GROOVY-4636: AST Browser does not show object initializer statements (closes 
#473)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/9ae86075
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/9ae86075
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/9ae86075

Branch: refs/heads/parrot
Commit: 9ae860758ff19f01dbc0cc24c05d07907cc86607
Parents: 3e2d5fd
Author: John Wagenleitner <jwagenleit...@apache.org>
Authored: Sat Dec 31 10:47:32 2016 -0800
Committer: John Wagenleitner <jwagenleit...@apache.org>
Committed: Thu Jan 5 20:49:40 2017 -0800

----------------------------------------------------------------------
 .../swingui/AstNodeToScriptAdapter.groovy       | 15 +++++++++++
 .../swingui/ScriptToTreeNodeAdapter.groovy      | 22 +++++++++++++++++
 .../swingui/AstNodeToScriptAdapterTest.groovy   | 18 ++++++++++++++
 .../swingui/ScriptToTreeNodeAdapterTest.groovy  | 26 ++++++++++++++++++++
 4 files changed, 81 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/9ae86075/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
 
b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
index 083adcf..554b953 100644
--- 
a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
+++ 
b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
@@ -288,6 +288,8 @@ class AstNodeToScriptVisitor extends 
PrimaryClassNodeOperation implements Groovy
             printDoubleBreak()
             node?.declaredConstructors?.each { visitConstructor(it) }
             printLineBreak()
+            visitObjectInitializerBlocks(node)
+            printLineBreak()
             node?.methods?.each { visitMethod(it) }
         }
         print '}'
@@ -295,6 +297,19 @@ class AstNodeToScriptVisitor extends 
PrimaryClassNodeOperation implements Groovy
         classNameStack.pop()
     }
 
+    private void visitObjectInitializerBlocks(ClassNode node) {
+        for (Statement stmt : node.getObjectInitializerStatements()) {
+            print '{'
+            printLineBreak()
+            indented {
+                stmt.visit(this)
+            }
+            printLineBreak()
+            print '}'
+            printDoubleBreak()
+        }
+    }
+
     private void visitGenerics(GenericsType[] generics) {
 
         if (generics) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/9ae86075/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
 
b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
index bafab26..be80a59 100644
--- 
a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
+++ 
b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
@@ -238,6 +238,7 @@ class TreeNodeBuildingNodeOperation extends 
PrimaryClassNodeOperation {
         root.add(child)
 
         collectConstructorData(child, 'Constructors', classNode)
+        collectObjectInitializers(child, 'Object Initializers', classNode)
         collectMethodData(child, 'Methods', classNode)
         collectFieldData(child, 'Fields', classNode)
         collectPropertyData(child, 'Properties', classNode)
@@ -261,6 +262,7 @@ class TreeNodeBuildingNodeOperation extends 
PrimaryClassNodeOperation {
             root.add(child)
 
             collectConstructorData(child, 'Constructors', innerClassNode)
+            collectObjectInitializers(child, 'Object Initializers', 
innerClassNode)
             collectMethodData(child, 'Methods', innerClassNode)
             collectFieldData(child, 'Fields', innerClassNode)
             collectPropertyData(child, 'Properties', innerClassNode)
@@ -360,6 +362,26 @@ class TreeNodeBuildingNodeOperation extends 
PrimaryClassNodeOperation {
         }
 
     }
+
+    private void collectObjectInitializers(parent, String name, ClassNode 
node) {
+        List<Statement> initStatements = node.getObjectInitializerStatements()
+        if (!initStatements) {
+            return
+        }
+        def allInitializers = nodeMaker.makeNode(name)
+        parent.add(allInitializers)
+        for (Statement stmt : initStatements) {
+            Statement initBlock = ((BlockStatement)stmt).statements.first()
+            def ggrandchild = adapter.make(initBlock)
+            allInitializers.add(ggrandchild)
+            TreeNodeBuildingVisitor visitor = new 
TreeNodeBuildingVisitor(adapter)
+            initBlock.visit(visitor)
+            if (visitor.currentNode) {
+                ggrandchild.add(visitor.currentNode)
+            }
+        }
+    }
+
 }
 
 /**

http://git-wip-us.apache.org/repos/asf/groovy/blob/9ae86075/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
index 48c0640..c526f17 100644
--- 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
+++ 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/AstNodeToScriptAdapterTest.groovy
@@ -869,4 +869,22 @@ class AstNodeToScriptAdapterTest extends GroovyTestCase {
         assert result.contains("assert this.f([*: ['a': 10, 'b': 20, 'c': 30], 
'e': 50]) == 30 : null")
         assert result.contains("assert this.f(['e': 100, *: ['a': 10, 'b': 20, 
'c': 30]], *[4, 5], 6) == [['e': 100, 'b': 20, 'c': 30, 'a': 10], 4, 5, 6] : 
null")
     }
+
+    // GROOVY-4636
+    void testObjectInitializers() {
+        String script = '''
+            class A {
+                def v
+                A() { v = 1 }
+                { v = 2 }
+            }
+        '''
+
+        String result = compileToScript(script)
+        assert result =~ /\{\s*v = 2\s*\}/
+
+        // During class gen the initializers should have been merged in with 
the ctors
+        result = compileToScript(script, CompilePhase.CLASS_GENERATION)
+        assert result =~ /(?s)public A\(\) \{.*?v = 2\s*v = 1\s*\}/
+    }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/9ae86075/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
index e796ec5..b3196cb 100644
--- 
a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
+++ 
b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
@@ -558,4 +558,30 @@ class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
                 ],
                 adapter)
     }
+
+    // GROOVY-4636
+    void testScriptWithObjectInitializers() {
+        ScriptToTreeNodeAdapter adapter = createAdapter(false, true, true)
+
+        def source = '''
+            class A {
+                int i = 0
+                A() {
+                    i = 5
+                }
+                {
+                    i *= 2
+                }
+            }
+            '''
+
+        assertTreeStructure(source, CompilePhase.CONVERSION,
+                [
+                        startsWith('ClassNode - A'),
+                        eq('Object Initializers')
+                ],
+                adapter)
+
+    }
+
 }

Reply via email to