package org.eclipse.dltk.xotcl.internal.core.parser.processors.xotcl; import java.util.List; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ast.declarations.Argument; import org.eclipse.dltk.ast.declarations.TypeDeclaration; import org.eclipse.dltk.ast.expressions.Expression; import org.eclipse.dltk.ast.references.SimpleReference; 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.internal.parser.OldTclParserUtils; import org.eclipse.dltk.xotcl.core.IXOTclModifiers; import org.eclipse.dltk.xotcl.core.ast.xotcl.XOTclClassParameterDeclaration; public class XOTclClassProcessor extends AbstractTclCommandProcessor { public ASTNode process(TclStatement statement, ITclParser parser, ASTNode parent) { if (statement.getCount() < 2) { this.report(parser, "Incorrect XOTcl class declaration", statement, ProblemSeverities.Error); return null; } int startIndex = 2; SimpleReference name = null; Expression nameExpr = statement.getAt(1); if (nameExpr instanceof SimpleReference) { if (((SimpleReference) nameExpr).getName().equals("create")) { // Skip create command. Possibly could not pressent startIndex = 3; Expression ex = statement.getAt(2); if (ex instanceof SimpleReference) { name = (SimpleReference) ex; } else { this.report(parser, "A name expected.", statement, ProblemSeverities.Error); return null; } } else { name = (SimpleReference) nameExpr; } } else { this.report(parser, "A name or 'create' command expected.", nameExpr, ProblemSeverities.Error); return null; } TypeDeclaration type = new TypeDeclaration(name.getName(), name .sourceStart(), name.sourceEnd(), statement.sourceStart(), statement.sourceEnd()); // process operations for (int i = startIndex; i < statement.getCount(); i++) { Expression at = statement.getAt(i); if (at instanceof SimpleReference) { String value = ((SimpleReference) at).getName(); if (value.equals("-superclass")) { Expression sc = statement.getAt(i + 1); if (sc instanceof SimpleReference) { type.addSuperClass(sc); } else if (sc instanceof TclBlockExpression) { String bl = ((TclBlockExpression) sc).getBlock(); type.addSuperClass(new SimpleReference( sc.sourceStart() + 1, sc.sourceEnd() - 1, bl.substring(1, bl.length() - 1).trim())); } i += 1; } else if (value.equals("-parameter")) { Expression sc = statement.getAt(i + 1); if (sc instanceof TclBlockExpression) { List/* < Statement > */st = null; st = ((TclBlockExpression) sc).parseBlockSimple(); List arguments = OldTclParserUtils.parseArguments(st); // Lets add all arguments as variable declarations for // selected class. for (int j = 0; j < arguments.size(); j++) { Argument e = (Argument) arguments.get(j); SimpleReference ref = e.getRef(); XOTclClassParameterDeclaration decl = new XOTclClassParameterDeclaration( ref, (Expression) e.getInitialization(), e .sourceStart(), e.sourceEnd()); type.getStatements().add(decl); } } i += 1; } else if (value.equals("-")) { // TODO ? } } } type.setModifiers(IXOTclModifiers.AccXOTcl); this.addToParent(parent, type); return type; } }