package org.eclipse.dltk.tcl.internal.core.parser.processors.tcl;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.expressions.Expression;
import org.eclipse.dltk.ast.expressions.StringLiteral;
import org.eclipse.dltk.ast.references.SimpleReference;
import org.eclipse.dltk.ast.statements.Block;
import org.eclipse.dltk.compiler.problem.ProblemSeverities;
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.ITclParser;
import org.eclipse.dltk.tcl.core.TclParseUtil;
import org.eclipse.dltk.tcl.core.ast.TclAdvancedExecuteExpression;
import org.eclipse.dltk.tcl.core.ast.TclCatchStatement;
import org.eclipse.dltk.tcl.core.ast.TclVariableDeclaration;
public class TclCatchProcessor extends AbstractTclCommandProcessor {
public TclCatchProcessor() {
}
public ASTNode process(TclStatement statement, ITclParser parser,
ASTNode parent) {
if (statement.getCount() >= 2) {
Expression e = statement.getAt(1);
TclVariableDeclaration variable = null;
if (statement.getCount() > 2) {
Expression variableName = statement.getAt(2);
variable = new TclVariableDeclaration(TclParseUtil
.makeVariable(variableName), null, variableName
.sourceStart(), variableName.sourceEnd());
}
if (e instanceof Block) {
TclCatchStatement catchStatement = new TclCatchStatement(
(Block) e, variable, statement.sourceStart(), statement
.sourceEnd());
// catchStatement.getStatements().addAll(
// ((Block) e).getStatements());
addToParent(parent, catchStatement);
return catchStatement;
} else if (e instanceof TclBlockExpression) {
TclBlockExpression block = (TclBlockExpression) e;
String blockContent = block.getBlock();
blockContent = blockContent.substring(1,
blockContent.length() - 1);
Block bl = new Block(e.sourceStart(), e.sourceEnd());
TclCatchStatement catchStatement = new TclCatchStatement(bl,
variable, statement.sourceStart(), statement
.sourceEnd());
addToParent(parent, catchStatement);
parser.parse(blockContent, block.sourceStart() + 1
- parser.getStartPos(), bl);
return catchStatement;
} else if (e instanceof SimpleReference) {
Block bl = new Block(e.sourceStart(), e.sourceEnd());
TclCatchStatement catchStatement = new TclCatchStatement(bl,
variable, statement.sourceStart(), statement
.sourceEnd());
addToParent(parent, catchStatement);
bl.addStatement(e);
return catchStatement;
} else if (e instanceof StringLiteral) {
Block bl = new Block(e.sourceStart(), e.sourceEnd());
TclCatchStatement catchStatement = new TclCatchStatement(bl,
variable, statement.sourceStart(), statement
.sourceEnd());
addToParent(parent, catchStatement);
bl.addStatement(e);
return catchStatement;
} else if (e instanceof TclAdvancedExecuteExpression) {
TclAdvancedExecuteExpression block = (TclAdvancedExecuteExpression) e;
Block bl = new Block(e.sourceStart(), e.sourceEnd());
TclCatchStatement catchStatement = new TclCatchStatement(bl,
variable, block.sourceStart(), block.sourceEnd());
addToParent(parent, catchStatement);
bl.getStatements().addAll(block.getChilds());
return catchStatement;
}
} else {
this.report(parser,
Messages.TclProcProcessor_Wrong_Number_of_Arguments,
statement, ProblemSeverities.Error);
}
// this.report(parser, "Parsing error.", statement,
// ProblemSeverities.Error); // TODO appropriate message
return null;
}
}