From 6ace924532897a32e2d55241b5fd230bed33a521 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Thu, 22 Oct 2015 09:48:48 -0700
Subject: [PATCH] fix bug for length 0/1 blocks deparse

---
 .../truffle/r/nodes/control/BlockNode.java       | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/BlockNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/BlockNode.java
index d6be70e150..9f0e489030 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/BlockNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/BlockNode.java
@@ -79,7 +79,8 @@ public class BlockNode extends SequenceNode implements RSyntaxNode, VisibilityCo
     @Override
     public void deparseImpl(RDeparse.State state) {
         state.startNodeDeparse(this);
-        if (sequence.length > 1) {
+        // empty deparses as {}
+        if (sequence.length != 1) {
             state.writeOpenCurlyNLIncIndent();
         }
         for (int i = 0; i < sequence.length; i++) {
@@ -91,7 +92,7 @@ public class BlockNode extends SequenceNode implements RSyntaxNode, VisibilityCo
                 state.mark(); // in case last
             }
         }
-        if (sequence.length > 1) {
+        if (sequence.length != 1) {
             state.decIndentWriteCloseCurly();
         }
         state.endNodeDeparse(this);
@@ -138,10 +139,15 @@ public class BlockNode extends SequenceNode implements RSyntaxNode, VisibilityCo
         /*
          * We can't get this completely compatible with GnuR without knowing if the source had a "{"
          * or not. However, semantically what really matters is that if the length is > 1, there
-         * *must* have been a "{", so we fabricate it.
+         * *must* have been a "{", so we fabricate it. Furthermore, if length==1, then we must
+         * delegate to the underlying node
          */
         int len = getSequence().length;
-        return len == 1 ? 1 : len + 1;
+        if (len == 1) {
+            return getSequence()[0].asRSyntaxNode().getRlengthImpl();
+        } else {
+            return len + 1;
+        }
     }
 
     @Override
@@ -156,7 +162,7 @@ public class BlockNode extends SequenceNode implements RSyntaxNode, VisibilityCo
                     return RASTUtils.createLanguageElement(seq[index - 1]);
             }
         } else {
-            return RASTUtils.createLanguageElement(seq[0]);
+            return getSequence()[0].asRSyntaxNode().getRelementImpl(index);
         }
     }
 
-- 
GitLab