package org.eclipse.dltk.xotcl.core;
import java.util.Arrays;
import java.util.List;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.ASTVisitor;
import org.eclipse.dltk.ast.statements.Block;
import org.eclipse.dltk.ast.statements.Statement;
import org.eclipse.dltk.compiler.util.Util;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.tcl.ast.TclStatement;
import org.eclipse.dltk.tcl.ast.expressions.TclBlockExpression;
import org.eclipse.dltk.tcl.core.AbstractTclCommandProcessor;
import org.eclipse.dltk.tcl.core.ITclCommandProcessor;
import org.eclipse.dltk.tcl.core.ITclParser;
import org.eclipse.dltk.tcl.core.TclParseUtil;
import org.eclipse.dltk.tcl.internal.parser.raw.SimpleTclParser;
import org.eclipse.dltk.tcl.internal.parser.raw.TclCommand;
import org.eclipse.dltk.tcl.internal.parser.raw.TclParseException;
import org.eclipse.dltk.tcl.internal.parser.raw.TclScript;
import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclDocumentationNode;
public class XOTclDocumentationProcessor extends AbstractTclCommandProcessor
implements ITclCommandProcessor {
public XOTclDocumentationProcessor() {
}
public void preprocessStatement(TclStatement st) {
ASTNode[] nodes = (ASTNode[]) st.getExpressions().toArray(
new ASTNode[st.getCount()]);
for (int i = 0; i < nodes.length; i++) {
if (nodes[i] instanceof TclBlockExpression) {
TclBlockExpression tclExecuteExpression = ((TclBlockExpression) nodes[i]);
String expression = tclExecuteExpression.getBlock();
expression = expression.substring(1, expression.length() - 1);
Block newExpr = new Block();
nodes[i] = newExpr;
st.setExpressions(Arrays.asList(nodes));
try {
TclScript parse = SimpleTclParser.staticParse(expression);
List<TclCommand> commands = parse.getCommands();
for (int j = 0; j < commands.size(); j++) {
TclStatement st2 = TclParseUtil.convertToAST(commands
.get(j), Util.EMPTY_STRING, 0, expression, 0);
newExpr.addStatement(st2);
}
} catch (TclParseException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
}
}
st.setExpressions(Arrays.asList(nodes));
}
public ASTNode process(TclStatement st, ITclParser parser, ASTNode parent) {
// preprocessStatement(st);
final XOTclDocumentationNode doc = new XOTclDocumentationNode();
String objName = TclParseUtil.getNameFromNode(st.getAt(1));
if (objName != null) {
doc.setStart(st.sourceStart());
doc.setEnd(st.sourceEnd());
if ("Class".equals(objName)) {
String name = TclParseUtil.getNameFromNode(st.getAt(2));
if (name != null) {
processAddDescriptions(name, st, doc);
}
} else if ("Object".equals(objName)) {
String name = TclParseUtil.getNameFromNode(st.getAt(2));
if (name != null) {
processAddDescriptions(name, st, doc);
}
} else {
String docCommand = TclParseUtil.getNameFromNode(st.getAt(2));
if (docCommand != null) {
if ("instproc".equals(docCommand)) {
String name = TclParseUtil.getNameFromNode(st.getAt(3));
if (name != null) {
processAddDescriptions(objName + "::" + name, st,
doc);
}
}
}
}
}
this.addToParent(parent, doc);
return doc;
}
private void processAddDescriptions(final String name, TclStatement st,
final XOTclDocumentationNode doc) {
preprocessStatement(st);
try {
st.traverse(new ASTVisitor() {
public boolean visit(Statement s) throws Exception {
if (s instanceof TclStatement) {
TclStatement s2 = (TclStatement) s;
String n = TclParseUtil.getNameFromNode((s2).getAt(0));
if (n != null && n.equals("description")
&& s2.getCount() > 1
&& s2.getAt(1) instanceof TclBlockExpression) {
TclBlockExpression bl = (TclBlockExpression) s2
.getAt(1);
String blvalue = bl.getBlock();
doc.appendDescription(name, blvalue.substring(1,
blvalue.length() - 1));
}
}
return super.visit(s);
}
});
} catch (Exception e) {
}
}
}