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.references.SimpleReference;
import org.eclipse.dltk.ast.statements.Block;
import org.eclipse.dltk.compiler.problem.ProblemSeverities;
import org.eclipse.dltk.core.DLTKCore;
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.ITclCommandProcessor;
import org.eclipse.dltk.tcl.core.ITclParser;
import org.eclipse.dltk.tcl.core.ast.TclPackageDeclaration;
public class TclPackageProcessor extends AbstractTclCommandProcessor implements
ITclCommandProcessor {
public TclPackageProcessor() {
}
public ASTNode process(TclStatement statement, ITclParser parser,
ASTNode parent) {
if (statement.getCount() < 2) {
this.report(parser,
"Syntax error: at least one arguments expected.",
statement, ProblemSeverities.Error);
if (DLTKCore.DEBUG) {
System.err.println("tcl: package argument could incorrect...");
}
return null;
}
Expression nameSpaceArg = statement.getAt(1);
if (nameSpaceArg == null || !(nameSpaceArg instanceof SimpleReference)) {
this
.report(parser,
"Syntax error: package subcommand expected.",
(nameSpaceArg == null ? (ASTNode) nameSpaceArg
: statement), ProblemSeverities.Error);
if (DLTKCore.DEBUG) {
System.err
.println("tcl: package argument is null or not simple reference");
}
return null;
}
String arg = ((SimpleReference) nameSpaceArg).getName();
if (arg.equals("require") || arg.equals("provide")) {
boolean exact = false;
int i = 2;
Expression pkg = statement.getAt(i);
if (arg.equals("require") && pkg instanceof SimpleReference
&& "-exact".equals(((SimpleReference) pkg).getName())) {
i = 3;
pkg = statement.getAt(i);
}
Expression pkgVer = null;
if (statement.getCount() > i + 1
&& statement.getAt(i + 1) instanceof SimpleReference) {
pkgVer = statement.getAt(i + 1);
}
if (pkg != null && pkg instanceof SimpleReference) {
int style = -1;
if (arg.equals("require"))
style = TclPackageDeclaration.STYLE_REQUIRE;
else if (arg.equals("provide"))
style = TclPackageDeclaration.STYLE_PROVIDE;
TclPackageDeclaration st = new TclPackageDeclaration(
(SimpleReference) pkg, pkgVer, style, statement
.sourceStart(), statement.sourceEnd());
st.setExact(exact);
this.addToParent(parent, st);
return st;
}
} else if (arg.equals("ifneeded")) {
Expression pkg = statement.getAt(2);
Expression pkgVer = null;
Expression script = null;
switch (statement.getCount()) {
case 5: {
if (statement.getAt(4) instanceof TclBlockExpression) {
script = statement.getAt(4);
}
if (statement.getAt(4) instanceof Block) {
script = statement.getAt(4);
}
// no break!
}
case 4: {
if (statement.getAt(3) instanceof SimpleReference)
pkgVer = statement.getAt(3);
break;
}
default:
this.report(parser, "Syntax error: 3 or 4 arguments expected.",
statement, ProblemSeverities.Error);
return null;
}
if (pkg != null && pkg instanceof SimpleReference) {
TclPackageDeclaration st = new TclPackageDeclaration(
(SimpleReference) pkg, pkgVer,
TclPackageDeclaration.STYLE_IFNEEDED, statement
.sourceStart(), statement.sourceEnd());
st.setScript(script);
this.addToParent(parent, st);
return st;
}
} else if (arg.equals("forget")) {
}
return null;
}
}