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.TclForeachStatement; public class TclForeachCommandProcessor extends AbstractTclCommandProcessor { private static final int MIN_ARG_NUMBER = 3; public ASTNode process(TclStatement statement, ITclParser parser, ASTNode parent) { TclForeachStatement foreach = new TclForeachStatement(statement .sourceStart(), statement.sourceEnd()); this.addToParent(parent, foreach); if (statement.getCount() % 2 != 0 || statement.getCount() < MIN_ARG_NUMBER + 1) { this.report(parser, "Syntax error: wrong number of arguments", statement, ProblemSeverities.Error); } else { // foreach.setArguments(null); Expression procCode = statement.getAt(statement.getCount() - 1); if (procCode instanceof Block) { foreach.acceptBlock((Block) procCode); } else 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); } foreach.acceptBlock(block); parser.parse(content, procCode.sourceStart() + 1- parser.getStartPos(), block); } } return foreach; } }