/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.plsql.ast;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
public class DumpFacade extends PLSQLParserVisitorAdapter {
private PrintWriter writer;
private boolean recurse;
public void initializeWith(Writer writer, String prefix, boolean recurse, PLSQLNode node) {
this.writer = writer instanceof PrintWriter ? (PrintWriter) writer : new PrintWriter(writer);
this.recurse = recurse;
this.visit(node, prefix);
try {
writer.flush();
} catch (IOException e) {
throw new RuntimeException("Problem flushing PrintWriter.", e);
}
}
@Override
public Object visit(PLSQLNode node, Object data) {
dump(node, (String) data);
if (recurse) {
return super.visit(node, data + " ");
} else {
return data;
}
}
private void dump(PLSQLNode node, String prefix) {
//
// Dump format is generally composed of the following items...
//
// 1) Dump prefix
writer.print(prefix);
// 2) JJT Name of the Node
writer.print(node.toString());
//
// If there are any additional details, then:
// 1) A colon
// 2) The Node.getImage() if it is non-empty
// 3) Extras in parentheses
//
// Standard image handling
String image = node.getImage();
// Special image handling (e.g. Nodes with normally null images)
if (node instanceof ASTBooleanLiteral) {
image = node.getImage();
} else if (node instanceof ASTPrimaryPrefix) {
String result = null;
/*
* if (primaryPrefix.usesSuperModifier()) { result = "super"; } else
* if (primaryPrefix.usesThisModifier()) { result = "this"; }
*/
if (image != null) {
result += "." + image;
}
image = result;
} else if (node instanceof ASTPrimarySuffix) {
ASTPrimarySuffix primarySuffix = (ASTPrimarySuffix) node;
if (primarySuffix.isArrayDereference()) {
if (image == null) {
image = "[";
} else {
image = "[" + image;
}
}
}
// Extras
List<String> extras = new ArrayList<>();
// Output image and extras
if (image != null || !extras.isEmpty()) {
writer.print(':');
if (image != null) {
writer.print(image);
}
for (String extra : extras) {
writer.print('(');
writer.print(extra);
writer.print(')');
}
}
writer.println();
}
}