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.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.ast.TclForStatement;
public class TclForCommandProcessor extends AbstractTclCommandProcessor {
public ASTNode process(TclStatement statement, ITclParser parser,
ASTNode parent) {
if (statement.getCount() != 5) {
this.report(parser, "Syntax error: exactly " + (5 - 1)
+ " arguments expected.", statement,
ProblemSeverities.Error);
return null;
}
TclForStatement forStatement = new TclForStatement(statement
.sourceStart(), statement.sourceEnd());
addToParent(parent, forStatement);
Expression procCode = statement.getAt(statement.getCount() - 1);
if (procCode instanceof Block) {
forStatement.acceptBlock((Block) procCode);
}
if (procCode instanceof TclBlockExpression) {
Block block = new Block(procCode.sourceStart(), procCode
.sourceEnd());
String content = ((TclBlockExpression) procCode).getBlock();
if (content.startsWith("{") && content.endsWith("}")) {
content = content.substring(1, content.length() - 1);
}
forStatement.acceptBlock(block);
parser.parse(content, procCode.sourceStart() + 1- parser.getStartPos(), block);
}
return forStatement;
}
}