diff --git a/runtime/Java/pom.xml b/runtime/Java/pom.xml index 918673472..fb0fcac8d 100644 --- a/runtime/Java/pom.xml +++ b/runtime/Java/pom.xml @@ -11,14 +11,6 @@ ANTLR 4 Runtime The ANTLR 4 Runtime - - - org.abego.treelayout - org.abego.treelayout.core - 1.0.1 - - - src @@ -38,7 +30,7 @@ - + org.apache.felix maven-bundle-plugin 2.5.4 @@ -46,7 +38,7 @@ bundle-manifest process-classes - + org.antlr.antlr4-runtime-osgi ANTLR 4 Runtime @@ -55,19 +47,19 @@ ${project.version} - + manifest - + - + maven-jar-plugin 2.4 - + ${project.build.outputDirectory}/META-INF/MANIFEST.MF - + @@ -78,14 +70,14 @@ package - ${project.build.directory}/dependency-reduced-pom.xml - + ${project.build.directory}/dependency-reduced-pom.xml + shade - + diff --git a/runtime/Java/src/org/antlr/v4/runtime/RuleContext.java b/runtime/Java/src/org/antlr/v4/runtime/RuleContext.java index d2f9ea70e..6cde47e67 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/RuleContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/RuleContext.java @@ -34,7 +34,6 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeVisitor; import org.antlr.v4.runtime.tree.RuleNode; import org.antlr.v4.runtime.tree.Trees; -import org.antlr.v4.runtime.tree.gui.TreeViewer; import javax.print.PrintException; import javax.swing.*; @@ -183,49 +182,6 @@ public class RuleContext implements RuleNode { @Override public T accept(ParseTreeVisitor visitor) { return visitor.visitChildren(this); } - /** Call this method to view a parse tree in a dialog box visually. */ - public Future inspect(Parser parser) { - List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; - return inspect(ruleNames); - } - - public Future inspect(List ruleNames) { - TreeViewer viewer = new TreeViewer(ruleNames, this); - return viewer.open(); - } - - /** Save this tree in a postscript file */ - public void save(Parser parser, String fileName) - throws IOException, PrintException - { - List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; - save(ruleNames, fileName); - } - - /** Save this tree in a postscript file using a particular font name and size */ - public void save(Parser parser, String fileName, - String fontName, int fontSize) - throws IOException - { - List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; - save(ruleNames, fileName, fontName, fontSize); - } - - /** Save this tree in a postscript file */ - public void save(List ruleNames, String fileName) - throws IOException, PrintException - { - Trees.writePS(this, ruleNames, fileName); - } - - /** Save this tree in a postscript file using a particular font name and size */ - public void save(List ruleNames, String fileName, - String fontName, int fontSize) - throws IOException - { - Trees.writePS(this, ruleNames, fileName, fontName, fontSize); - } - /** Print out a whole tree, not just a node, in LISP format * (root child1 .. childN). Print just a node if this is a leaf. * We have to know the recognizer so we can get rule names. diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java b/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java index 153e6178b..c58ee3dbe 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/Trees.java @@ -37,12 +37,7 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.misc.Predicate; import org.antlr.v4.runtime.misc.Utils; -import org.antlr.v4.runtime.tree.gui.TreePostScriptGenerator; -import org.antlr.v4.runtime.tree.gui.TreeTextProvider; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -51,41 +46,6 @@ import java.util.List; /** A set of utility routines useful for all kinds of ANTLR trees. */ public class Trees { - - public static String getPS(Tree t, List ruleNames, - String fontName, int fontSize) - { - TreePostScriptGenerator psgen = - new TreePostScriptGenerator(ruleNames, t, fontName, fontSize); - return psgen.getPS(); - } - - public static String getPS(Tree t, List ruleNames) { - return getPS(t, ruleNames, "Helvetica", 11); - } - - public static void writePS(Tree t, List ruleNames, - String fileName, - String fontName, int fontSize) - throws IOException - { - String ps = getPS(t, ruleNames, fontName, fontSize); - FileWriter f = new FileWriter(fileName); - BufferedWriter bw = new BufferedWriter(f); - try { - bw.write(ps); - } - finally { - bw.close(); - } - } - - public static void writePS(Tree t, List ruleNames, String fileName) - throws IOException - { - writePS(t, ruleNames, fileName, "Helvetica", 11); - } - /** Print out a whole tree in LISP form. {@link #getNodeText} is used on the * node payloads to get the text for the nodes. Detect * parse trees and extract data appropriately. @@ -104,38 +64,23 @@ public class Trees { return toStringTree(t, ruleNamesList); } - /** Print out a whole tree in LISP form. Arg nodeTextProvider is used on the - * node payloads to get the text for the nodes. - * - * @since 4.5.1 - */ - public static String toStringTree(Tree t, TreeTextProvider nodeTextProvider) { - if ( t==null ) return "null"; - String s = Utils.escapeWhitespace(nodeTextProvider.getText(t), false); - if ( t.getChildCount()==0 ) return s; - StringBuilder buf = new StringBuilder(); - buf.append("("); - s = Utils.escapeWhitespace(nodeTextProvider.getText(t), false); - buf.append(s); - buf.append(' '); - for (int i = 0; i0 ) buf.append(' '); - buf.append(toStringTree(t.getChild(i), nodeTextProvider)); - } - buf.append(")"); - return buf.toString(); - } - /** Print out a whole tree in LISP form. {@link #getNodeText} is used on the * node payloads to get the text for the nodes. */ public static String toStringTree(final Tree t, final List ruleNames) { - return toStringTree(t, new TreeTextProvider() { - @Override - public String getText(Tree node) { - return getNodeText(node, ruleNames); - } - }); + String s = Utils.escapeWhitespace(getNodeText(t, ruleNames), false); + if ( t.getChildCount()==0 ) return s; + StringBuilder buf = new StringBuilder(); + buf.append("("); + s = Utils.escapeWhitespace(getNodeText(t, ruleNames), false); + buf.append(s); + buf.append(' '); + for (int i = 0; i0 ) buf.append(' '); + buf.append(toStringTree(t.getChild(i), ruleNames)); + } + buf.append(")"); + return buf.toString(); } public static String getNodeText(Tree t, Parser recog) { @@ -204,7 +149,7 @@ public class Trees { if ( t==null || u==null || t.getParent()==null ) return false; Tree p = u.getParent(); while ( p!=null ) { - if ( t == p ) return true; + if ( t==p ) return true; p = p.getParent(); } return false; diff --git a/tool-testsuite/test/org/antlr/v4/test/tool/InterpreterTreeTextProvider.java b/tool-testsuite/test/org/antlr/v4/test/tool/InterpreterTreeTextProvider.java index 96bdc7c0f..1a555c4ed 100644 --- a/tool-testsuite/test/org/antlr/v4/test/tool/InterpreterTreeTextProvider.java +++ b/tool-testsuite/test/org/antlr/v4/test/tool/InterpreterTreeTextProvider.java @@ -3,7 +3,7 @@ package org.antlr.v4.test.tool; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.Tree; import org.antlr.v4.runtime.tree.Trees; -import org.antlr.v4.runtime.tree.gui.TreeTextProvider; +import org.antlr.v4.gui.TreeTextProvider; import org.antlr.v4.tool.GrammarInterpreterRuleContext; import java.util.Arrays; diff --git a/tool-testsuite/test/org/antlr/v4/test/tool/TestAmbigParseTrees.java b/tool-testsuite/test/org/antlr/v4/test/tool/TestAmbigParseTrees.java index 148cfc2e2..992b11679 100644 --- a/tool-testsuite/test/org/antlr/v4/test/tool/TestAmbigParseTrees.java +++ b/tool-testsuite/test/org/antlr/v4/test/tool/TestAmbigParseTrees.java @@ -14,7 +14,7 @@ import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.atn.RuleStartState; import org.antlr.v4.runtime.atn.Transition; import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.Trees; +import org.antlr.v4.gui.Trees; import org.antlr.v4.tool.Grammar; import org.antlr.v4.tool.GrammarParserInterpreter; import org.antlr.v4.tool.LexerGrammar; diff --git a/tool-testsuite/test/org/antlr/v4/test/tool/TestGrammarParserInterpreter.java b/tool-testsuite/test/org/antlr/v4/test/tool/TestGrammarParserInterpreter.java index aa28877e2..d2afde633 100644 --- a/tool-testsuite/test/org/antlr/v4/test/tool/TestGrammarParserInterpreter.java +++ b/tool-testsuite/test/org/antlr/v4/test/tool/TestGrammarParserInterpreter.java @@ -34,7 +34,7 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.InterpreterRuleContext; import org.antlr.v4.runtime.LexerInterpreter; import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.Trees; +import org.antlr.v4.gui.Trees; import org.antlr.v4.tool.Grammar; import org.antlr.v4.tool.GrammarParserInterpreter; import org.antlr.v4.tool.LexerGrammar; diff --git a/tool-testsuite/test/org/antlr/v4/test/tool/TestLookaheadTrees.java b/tool-testsuite/test/org/antlr/v4/test/tool/TestLookaheadTrees.java index be047ac9c..36c816340 100644 --- a/tool-testsuite/test/org/antlr/v4/test/tool/TestLookaheadTrees.java +++ b/tool-testsuite/test/org/antlr/v4/test/tool/TestLookaheadTrees.java @@ -7,7 +7,7 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.atn.DecisionInfo; import org.antlr.v4.runtime.atn.LookaheadEventInfo; import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.Trees; +import org.antlr.v4.gui.Trees; import org.antlr.v4.tool.Grammar; import org.antlr.v4.tool.GrammarParserInterpreter; import org.antlr.v4.tool.LexerGrammar; diff --git a/tool/pom.xml b/tool/pom.xml index 1ef4c1032..890f70bf5 100644 --- a/tool/pom.xml +++ b/tool/pom.xml @@ -46,6 +46,11 @@ 4.0.8 compile + + org.abego.treelayout + org.abego.treelayout.core + 1.0.1 + @@ -93,14 +98,14 @@ package - ${project.build.directory}/dependency-reduced-pom.xml - + ${project.build.directory}/dependency-reduced-pom.xml + shade - + diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/BasicFontMetrics.java b/tool/src/org/antlr/v4/gui/BasicFontMetrics.java similarity index 98% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/BasicFontMetrics.java rename to tool/src/org/antlr/v4/gui/BasicFontMetrics.java index e280aaf99..b424a003a 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/BasicFontMetrics.java +++ b/tool/src/org/antlr/v4/gui/BasicFontMetrics.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; /** Font metrics. The only way to generate accurate images * in any format that contain text is to know the font metrics. diff --git a/runtime/Java/src/org/antlr/v4/runtime/misc/GraphicsSupport.java b/tool/src/org/antlr/v4/gui/GraphicsSupport.java similarity index 99% rename from runtime/Java/src/org/antlr/v4/runtime/misc/GraphicsSupport.java rename to tool/src/org/antlr/v4/gui/GraphicsSupport.java index a35c17cc1..eb9546dc8 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/misc/GraphicsSupport.java +++ b/tool/src/org/antlr/v4/gui/GraphicsSupport.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.misc; +package org.antlr.v4.gui; import javax.imageio.ImageIO; import javax.print.DocFlavor; diff --git a/runtime/Java/src/org/antlr/v4/runtime/misc/JFileChooserConfirmOverwrite.java b/tool/src/org/antlr/v4/gui/JFileChooserConfirmOverwrite.java similarity index 98% rename from runtime/Java/src/org/antlr/v4/runtime/misc/JFileChooserConfirmOverwrite.java rename to tool/src/org/antlr/v4/gui/JFileChooserConfirmOverwrite.java index 302274de9..59cbb69c2 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/misc/JFileChooserConfirmOverwrite.java +++ b/tool/src/org/antlr/v4/gui/JFileChooserConfirmOverwrite.java @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.misc; +package org.antlr.v4.gui; import javax.swing.*; import java.io.File; diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/PostScriptDocument.java b/tool/src/org/antlr/v4/gui/PostScriptDocument.java similarity index 99% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/PostScriptDocument.java rename to tool/src/org/antlr/v4/gui/PostScriptDocument.java index 13832d425..7faf2db3a 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/PostScriptDocument.java +++ b/tool/src/org/antlr/v4/gui/PostScriptDocument.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import java.awt.*; import java.util.HashMap; diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/SystemFontMetrics.java b/tool/src/org/antlr/v4/gui/SystemFontMetrics.java similarity index 98% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/SystemFontMetrics.java rename to tool/src/org/antlr/v4/gui/SystemFontMetrics.java index a3447d306..fb2b17aaf 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/SystemFontMetrics.java +++ b/tool/src/org/antlr/v4/gui/SystemFontMetrics.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import java.awt.*; import java.awt.font.FontRenderContext; diff --git a/runtime/Java/src/org/antlr/v4/runtime/misc/TestRig.java b/tool/src/org/antlr/v4/gui/TestRig.java similarity index 98% rename from runtime/Java/src/org/antlr/v4/runtime/misc/TestRig.java rename to tool/src/org/antlr/v4/gui/TestRig.java index 6c35a9028..4812e5cc6 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/misc/TestRig.java +++ b/tool/src/org/antlr/v4/gui/TestRig.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.misc; +package org.antlr.v4.gui; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CharStream; @@ -252,10 +252,10 @@ public class TestRig { System.out.println(tree.toStringTree(parser)); } if ( gui ) { - tree.inspect(parser); + Trees.inspect(tree, parser); } if ( psFile!=null ) { - tree.save(parser, psFile); // Generate postscript + Trees.save(tree, parser, psFile); // Generate postscript } } catch (NoSuchMethodException nsme) { diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeLayoutAdaptor.java b/tool/src/org/antlr/v4/gui/TreeLayoutAdaptor.java similarity index 99% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeLayoutAdaptor.java rename to tool/src/org/antlr/v4/gui/TreeLayoutAdaptor.java index deb9658a2..6024e3b69 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeLayoutAdaptor.java +++ b/tool/src/org/antlr/v4/gui/TreeLayoutAdaptor.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import org.abego.treelayout.TreeForTreeLayout; import org.antlr.v4.runtime.tree.Tree; diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreePostScriptGenerator.java b/tool/src/org/antlr/v4/gui/TreePostScriptGenerator.java similarity index 99% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreePostScriptGenerator.java rename to tool/src/org/antlr/v4/gui/TreePostScriptGenerator.java index fc7e83e25..d78a1c873 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreePostScriptGenerator.java +++ b/tool/src/org/antlr/v4/gui/TreePostScriptGenerator.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import org.abego.treelayout.Configuration; import org.abego.treelayout.NodeExtentProvider; diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeTextProvider.java b/tool/src/org/antlr/v4/gui/TreeTextProvider.java similarity index 97% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeTextProvider.java rename to tool/src/org/antlr/v4/gui/TreeTextProvider.java index c73037418..9a88fc083 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeTextProvider.java +++ b/tool/src/org/antlr/v4/gui/TreeTextProvider.java @@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import org.antlr.v4.runtime.tree.Tree; diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeViewer.java b/tool/src/org/antlr/v4/gui/TreeViewer.java similarity index 99% rename from runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeViewer.java rename to tool/src/org/antlr/v4/gui/TreeViewer.java index 273ec8324..0ca15f303 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/gui/TreeViewer.java +++ b/tool/src/org/antlr/v4/gui/TreeViewer.java @@ -28,15 +28,13 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.antlr.v4.runtime.tree.gui; +package org.antlr.v4.gui; import org.abego.treelayout.NodeExtentProvider; import org.abego.treelayout.TreeForTreeLayout; import org.abego.treelayout.TreeLayout; import org.abego.treelayout.util.DefaultConfiguration; import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.misc.GraphicsSupport; -import org.antlr.v4.runtime.misc.JFileChooserConfirmOverwrite; import org.antlr.v4.runtime.misc.Utils; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.Tree; diff --git a/tool/src/org/antlr/v4/gui/Trees.java b/tool/src/org/antlr/v4/gui/Trees.java new file mode 100644 index 000000000..53796ab23 --- /dev/null +++ b/tool/src/org/antlr/v4/gui/Trees.java @@ -0,0 +1,120 @@ +package org.antlr.v4.gui; + +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.misc.Utils; +import org.antlr.v4.runtime.tree.Tree; + +import javax.print.PrintException; +import javax.swing.*; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Future; + +public class Trees { + /** Call this method to view a parse tree in a dialog box visually. */ + public static Future inspect(Tree t, List ruleNames) { + TreeViewer viewer = new TreeViewer(ruleNames, t); + return viewer.open(); + } + + /** Call this method to view a parse tree in a dialog box visually. */ + public static Future inspect(Tree t, Parser parser) { + List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; + return inspect(t, ruleNames); + } + + /** Save this tree in a postscript file */ + public static void save(Tree t, Parser parser, String fileName) + throws IOException, PrintException + { + List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; + save(t, ruleNames, fileName); + } + + /** Save this tree in a postscript file using a particular font name and size */ + public static void save(Tree t, Parser parser, String fileName, + String fontName, int fontSize) + throws IOException + { + List ruleNames = parser != null ? Arrays.asList(parser.getRuleNames()) : null; + save(t, ruleNames, fileName, fontName, fontSize); + } + + /** Save this tree in a postscript file */ + public static void save(Tree t, List ruleNames, String fileName) + throws IOException, PrintException + { + writePS(t, ruleNames, fileName); + } + + /** Save this tree in a postscript file using a particular font name and size */ + public static void save(Tree t, + List ruleNames, String fileName, + String fontName, int fontSize) + throws IOException + { + writePS(t, ruleNames, fileName, fontName, fontSize); + } + + public static String getPS(Tree t, List ruleNames, + String fontName, int fontSize) + { + TreePostScriptGenerator psgen = + new TreePostScriptGenerator(ruleNames, t, fontName, fontSize); + return psgen.getPS(); + } + + public static String getPS(Tree t, List ruleNames) { + return getPS(t, ruleNames, "Helvetica", 11); + } + + public static void writePS(Tree t, List ruleNames, + String fileName, + String fontName, int fontSize) + throws IOException + { + String ps = getPS(t, ruleNames, fontName, fontSize); + FileWriter f = new FileWriter(fileName); + BufferedWriter bw = new BufferedWriter(f); + try { + bw.write(ps); + } + finally { + bw.close(); + } + } + + public static void writePS(Tree t, List ruleNames, String fileName) + throws IOException + { + writePS(t, ruleNames, fileName, "Helvetica", 11); + } + + /** Print out a whole tree in LISP form. Arg nodeTextProvider is used on the + * node payloads to get the text for the nodes. + * + * @since 4.5.1 + */ + public static String toStringTree(Tree t, TreeTextProvider nodeTextProvider) { + if ( t==null ) return "null"; + String s = Utils.escapeWhitespace(nodeTextProvider.getText(t), false); + if ( t.getChildCount()==0 ) return s; + StringBuilder buf = new StringBuilder(); + buf.append("("); + s = Utils.escapeWhitespace(nodeTextProvider.getText(t), false); + buf.append(s); + buf.append(' '); + for (int i = 0; i0 ) buf.append(' '); + buf.append(toStringTree(t.getChild(i), nodeTextProvider)); + } + buf.append(")"); + return buf.toString(); + } + + private Trees() { + } +}