package org.eclipse.dltk.tcl.internal.core.parser.processors.tcl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.Modifiers;
import org.eclipse.dltk.ast.declarations.Argument;
import org.eclipse.dltk.ast.declarations.MethodDeclaration;
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.ast.expressions.TclExecuteExpression;
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.internal.core.codeassist.TclVisibilityUtils;
import org.eclipse.dltk.tcl.internal.parser.OldTclParserUtils;
public class TclProcProcessor extends AbstractTclCommandProcessor {
public ASTNode process(TclStatement statement, ITclParser parser,
ASTNode parent) {
if (statement.getCount() < 4) {
this.report(parser,
Messages.TclProcProcessor_Wrong_Number_of_Arguments,
statement.sourceStart(), statement.sourceEnd(),
ProblemSeverities.Error);
return null;
}
Expression procName = statement.getAt(1);
String sName = null;
if (procName instanceof SimpleReference) {
sName = ((SimpleReference) procName).getName();
} else if (procName instanceof TclBlockExpression) {
sName = TclParseUtil.extractBraces(((TclBlockExpression) procName)
.getBlock());
} else if (procName instanceof TclExecuteExpression) {
sName = ((TclExecuteExpression) procName).getExpression();
} else if (procName instanceof StringLiteral) {
sName = ((StringLiteral) procName).getValue();
sName = sName.substring(1, sName.length() - 1);
}
if (sName == null || sName.length() == 0) {
this.report(parser, Messages.TclProcProcessor_Empty_Proc_Name,
statement.sourceStart(), statement.sourceEnd(),
ProblemSeverities.Error);
return null;
}
Expression procArguments = statement.getAt(2);
Expression procCode = statement.getAt(3);
List arguments = null;
if (procArguments instanceof TclBlockExpression) {
List/* < Statement > */st = null;
st = ((TclBlockExpression) procArguments).parseBlockSimple(false);
arguments = OldTclParserUtils.parseArguments(st);
}
if (procArguments instanceof SimpleReference) {
arguments = new ArrayList();
Argument a = new Argument((SimpleReference) procArguments,
procArguments.sourceStart(), null, 0);
arguments.add(a);
}
MethodDeclaration method = new MethodDeclaration(statement
.sourceStart(), statement.sourceEnd());
method.setName(sName);
method.setNameStart(procName.sourceStart());
method.setNameEnd(procName.sourceEnd());
method.acceptArguments(arguments);
if (TclVisibilityUtils.isPrivate(sName)) {
method.setModifier(Modifiers.AccPrivate);
} else {
method.setModifier(Modifiers.AccPublic);
}
if (procCode instanceof Block) {
method.acceptBody((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);
}
method.acceptBody(block);
parser.parse(content, procCode.sourceStart() + 1
- parser.getStartPos(), block);
}
this.addToParent(parent, method);
String methodFQN = TclParseUtil.getElementFQN(method, "::",
getModuleDeclaration());
int pos = methodFQN.lastIndexOf("::");
if (pos != -1) {
methodFQN = methodFQN.substring(0, pos);
method.setDeclaringTypeName(methodFQN);
}
return method;
}
}