Added 'buffered writing' ability to Doc Emitters

Because of two-stage handling in FlexJS MXML emitter the 'doc' emitters need 
the ability to write their output to a buffer instead of directly to the output 
stream, similar to how the various JS emitters handle this.

Signed-off-by: Erik de Bruin <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/43e9b3c6
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/43e9b3c6
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/43e9b3c6

Branch: refs/heads/develop
Commit: 43e9b3c67afcc08f9e33ef1b4324f8f2a3b2ead1
Parents: e432023
Author: Erik de Bruin <[email protected]>
Authored: Wed Mar 27 16:20:41 2013 +0100
Committer: Erik de Bruin <[email protected]>
Committed: Wed Mar 27 16:29:59 2013 +0100

----------------------------------------------------------------------
 .../apache/flex/compiler/codegen/IDocEmitter.java  |    4 +
 .../compiler/internal/codegen/js/JSDocEmitter.java |   76 +++++++++++----
 2 files changed, 61 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/43e9b3c6/compiler.jx/src/org/apache/flex/compiler/codegen/IDocEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/codegen/IDocEmitter.java 
b/compiler.jx/src/org/apache/flex/compiler/codegen/IDocEmitter.java
index f6edcc6..f71ae5e 100644
--- a/compiler.jx/src/org/apache/flex/compiler/codegen/IDocEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/codegen/IDocEmitter.java
@@ -28,5 +28,9 @@ public interface IDocEmitter
 {
     void begin();
 
+    String flushBuffer();
+    
+    void setBufferWrite(boolean value);
+    
     void end();
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/43e9b3c6/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSDocEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSDocEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSDocEmitter.java
index 5dca90a..6984f46 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSDocEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSDocEmitter.java
@@ -32,6 +32,42 @@ public class JSDocEmitter implements IDocEmitter, IEmitter
 
     private int currentIndent = 0;
 
+    private IEmitter emitter;
+
+    private StringBuilder builder;
+
+    protected StringBuilder getBuilder()
+    {
+        return builder;
+    }
+
+    private boolean bufferWrite;
+
+    public boolean isBufferWrite()
+    {
+        return bufferWrite;
+    }
+
+    public void setBufferWrite(boolean value)
+    {
+        bufferWrite = value;
+    }
+
+    public String flushBuffer()
+    {
+        setBufferWrite(false);
+        String result = builder.toString();
+        builder.setLength(0);
+        return result;
+    }
+
+    public JSDocEmitter(IJSEmitter emitter)
+    {
+        this.emitter = (IEmitter) emitter;
+        
+        builder = new StringBuilder();
+    }
+
     @Override
     public void indentPush()
     {
@@ -53,66 +89,69 @@ public class JSDocEmitter implements IDocEmitter, IEmitter
     @Override
     public void write(String value)
     {
-        emitter.write(value);
+        if (!bufferWrite)
+            emitter.write(value);
+        else
+            builder.append(value);
     }
 
     @Override
     public void writeNewline()
     {
-        emitter.writeNewline();
+        write(ASEmitterTokens.NEW_LINE);
     }
 
     @Override
     public void writeNewline(String value)
     {
-        emitter.writeNewline(value);
+        write(value);
+        writeNewline();
     }
 
     @Override
     public void writeNewline(IEmitterTokens value)
     {
-        emitter.writeNewline(value);
+        writeNewline(value.getToken());
     }
 
     @Override
     public void writeNewline(String value, boolean pushIndent)
     {
-        emitter.writeNewline(value, pushIndent);
+        if (pushIndent)
+            indentPush();
+        else
+            indentPop();
+        write(value);
+        writeNewline();
     }
 
     @Override
     public void writeNewline(IEmitterTokens value, boolean pushIndent)
     {
-        emitter.writeNewline(value, pushIndent);
+        writeNewline(value.getToken(), pushIndent);
     }
 
     @Override
     public void writeToken(IEmitterTokens value)
     {
-        emitter.writeToken(value);
+        writeToken(value.getToken());
     }
 
     @Override
     public void writeToken(String value)
     {
-        emitter.writeToken(value);
+        write(value);
+        write(ASEmitterTokens.SPACE);
     }
 
     public void writeBlockClose()
     {
-        emitter.write(ASEmitterTokens.BLOCK_CLOSE);
+        write(ASEmitterTokens.BLOCK_CLOSE);
     }
 
     public void writeBlockOpen()
     {
-        emitter.write(ASEmitterTokens.BLOCK_OPEN);
-    }
-
-    private IEmitter emitter;
-
-    public JSDocEmitter(IJSEmitter emitter)
-    {
-        this.emitter = (IEmitter) emitter;
+        write(ASEmitterTokens.BLOCK_OPEN);
     }
 
     @Override
@@ -131,7 +170,6 @@ public class JSDocEmitter implements IDocEmitter, IEmitter
     @Override
     public String stringifyNode(IASNode node)
     {
-        return "";
+        return null;
     }
-    
 }

Reply via email to