package org.eclipse.dltk.tcl.internal.core.parser.processors.tcl;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.Modifiers;
import org.eclipse.dltk.ast.expressions.Expression;
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.core.AbstractTclCommandProcessor;
import org.eclipse.dltk.tcl.core.ITclParser;
import org.eclipse.dltk.tcl.core.TclParseUtil;
import org.eclipse.dltk.tcl.core.ast.TclGlobalVariableDeclaration;
import org.eclipse.dltk.tcl.internal.core.codeassist.TclVisibilityUtils;
public class TclGlobalVariableProcessor extends AbstractTclCommandProcessor {
public TclGlobalVariableProcessor() {
}
public ASTNode process(TclStatement statement, ITclParser parser,
ASTNode parent) {
int statementsCount = statement.getCount();
if (statementsCount < 2) {
this.report(parser,
"Syntax error: at least one argument expected.", statement,
ProblemSeverities.Error);
return null;
}
ASTNode ret = null;
for (int i = 1; i < statementsCount; i++) {
Expression at = statement.getAt(i);
Expression variableName = at;
if (variableName != null) {
SimpleReference variable = TclParseUtil
.makeVariable(variableName);
if (variable != null) {
TclGlobalVariableDeclaration var = new TclGlobalVariableDeclaration(
variable, at.sourceStart(), at.sourceEnd());
if (TclVisibilityUtils.isPrivate(variable.getName())) {
var.setModifier(Modifiers.AccPrivate);
} else {
var.setModifier(Modifiers.AccPublic);
}
var.setModifier(Modifiers.AccGlobal);
if (ret == null) {
ret = var;
} else {
if (!(ret instanceof Block)) {
Block list = new Block();
list.addStatement(ret);
list.setStart(ret.sourceStart());
list.setEnd(ret.sourceEnd());
ret = list;
}
((Block) ret).addStatement(var);
((Block) ret).setEnd(var.sourceEnd());
}
}
} else {
report(parser, "Incorect global variable", statement,
ProblemSeverities.Error);
}
}
if (ret != null) {
addToParent(parent, ret);
}
return ret;
}
}