package org.eclipse.dltk.javascript.core.dom.rewrite; import java.util.Iterator; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.javascript.ast.ASTVisitor; import org.eclipse.dltk.javascript.ast.Argument; import org.eclipse.dltk.javascript.ast.ArrayInitializer; import org.eclipse.dltk.javascript.ast.AsteriskExpression; import org.eclipse.dltk.javascript.ast.BinaryOperation; import org.eclipse.dltk.javascript.ast.BooleanLiteral; import org.eclipse.dltk.javascript.ast.BreakStatement; import org.eclipse.dltk.javascript.ast.CallExpression; import org.eclipse.dltk.javascript.ast.CaseClause; import org.eclipse.dltk.javascript.ast.CatchClause; import org.eclipse.dltk.javascript.ast.CommaExpression; import org.eclipse.dltk.javascript.ast.Comment; import org.eclipse.dltk.javascript.ast.ConditionalOperator; import org.eclipse.dltk.javascript.ast.ConstStatement; import org.eclipse.dltk.javascript.ast.ContinueStatement; import org.eclipse.dltk.javascript.ast.DecimalLiteral; import org.eclipse.dltk.javascript.ast.DefaultXmlNamespaceStatement; import org.eclipse.dltk.javascript.ast.DoWhileStatement; import org.eclipse.dltk.javascript.ast.EmptyExpression; import org.eclipse.dltk.javascript.ast.EmptyStatement; import org.eclipse.dltk.javascript.ast.FinallyClause; import org.eclipse.dltk.javascript.ast.ForEachInStatement; import org.eclipse.dltk.javascript.ast.ForInStatement; import org.eclipse.dltk.javascript.ast.ForStatement; import org.eclipse.dltk.javascript.ast.FunctionStatement; import org.eclipse.dltk.javascript.ast.GetAllChildrenExpression; import org.eclipse.dltk.javascript.ast.GetArrayItemExpression; import org.eclipse.dltk.javascript.ast.GetLocalNameExpression; import org.eclipse.dltk.javascript.ast.GetMethod; import org.eclipse.dltk.javascript.ast.Identifier; import org.eclipse.dltk.javascript.ast.IfStatement; import org.eclipse.dltk.javascript.ast.Label; import org.eclipse.dltk.javascript.ast.LabelledStatement; import org.eclipse.dltk.javascript.ast.NewExpression; import org.eclipse.dltk.javascript.ast.NullExpression; import org.eclipse.dltk.javascript.ast.ObjectInitializer; import org.eclipse.dltk.javascript.ast.ObjectInitializerPart; import org.eclipse.dltk.javascript.ast.ParenthesizedExpression; import org.eclipse.dltk.javascript.ast.PropertyExpression; import org.eclipse.dltk.javascript.ast.PropertyInitializer; import org.eclipse.dltk.javascript.ast.RegExpLiteral; import org.eclipse.dltk.javascript.ast.ReturnStatement; import org.eclipse.dltk.javascript.ast.Script; import org.eclipse.dltk.javascript.ast.SetMethod; import org.eclipse.dltk.javascript.ast.StatementBlock; import org.eclipse.dltk.javascript.ast.StringLiteral; import org.eclipse.dltk.javascript.ast.SwitchComponent; import org.eclipse.dltk.javascript.ast.SwitchStatement; import org.eclipse.dltk.javascript.ast.ThisExpression; import org.eclipse.dltk.javascript.ast.ThrowStatement; import org.eclipse.dltk.javascript.ast.TryStatement; import org.eclipse.dltk.javascript.ast.UnaryOperation; import org.eclipse.dltk.javascript.ast.VariableDeclaration; import org.eclipse.dltk.javascript.ast.VariableStatement; import org.eclipse.dltk.javascript.ast.VoidExpression; import org.eclipse.dltk.javascript.ast.WhileStatement; import org.eclipse.dltk.javascript.ast.WithStatement; import org.eclipse.dltk.javascript.ast.XmlAttributeIdentifier; import org.eclipse.dltk.javascript.ast.XmlExpressionFragment; import org.eclipse.dltk.javascript.ast.XmlFragment; import org.eclipse.dltk.javascript.ast.XmlLiteral; import org.eclipse.dltk.javascript.ast.XmlTextFragment; import org.eclipse.dltk.javascript.ast.YieldOperator; import org.eclipse.dltk.javascript.core.dom.ArrayAccessExpression; import org.eclipse.dltk.javascript.core.dom.ArrayLiteral; import org.eclipse.dltk.javascript.core.dom.AttributeIdentifier; import org.eclipse.dltk.javascript.core.dom.BinaryExpression; import org.eclipse.dltk.javascript.core.dom.BinaryOperator; import org.eclipse.dltk.javascript.core.dom.BlockStatement; import org.eclipse.dltk.javascript.core.dom.ConditionalExpression; import org.eclipse.dltk.javascript.core.dom.DescendantAccessExpression; import org.eclipse.dltk.javascript.core.dom.DoStatement; import org.eclipse.dltk.javascript.core.dom.DomFactory; import org.eclipse.dltk.javascript.core.dom.Expression; import org.eclipse.dltk.javascript.core.dom.ExpressionStatement; import org.eclipse.dltk.javascript.core.dom.FunctionExpression; import org.eclipse.dltk.javascript.core.dom.GetterAssignment; import org.eclipse.dltk.javascript.core.dom.IArrayElement; import org.eclipse.dltk.javascript.core.dom.IForInitializer; import org.eclipse.dltk.javascript.core.dom.IProperty; import org.eclipse.dltk.javascript.core.dom.IPropertyName; import org.eclipse.dltk.javascript.core.dom.IPropertySelector; import org.eclipse.dltk.javascript.core.dom.ISelector; import org.eclipse.dltk.javascript.core.dom.IUnqualifiedSelector; import org.eclipse.dltk.javascript.core.dom.LabeledStatement; import org.eclipse.dltk.javascript.core.dom.Node; import org.eclipse.dltk.javascript.core.dom.NumericLiteral; import org.eclipse.dltk.javascript.core.dom.ObjectLiteral; import org.eclipse.dltk.javascript.core.dom.Parameter; import org.eclipse.dltk.javascript.core.dom.PropertyAccessExpression; import org.eclipse.dltk.javascript.core.dom.PropertyAssignment; import org.eclipse.dltk.javascript.core.dom.QualifiedIdentifier; import org.eclipse.dltk.javascript.core.dom.RegularExpressionLiteral; import org.eclipse.dltk.javascript.core.dom.SetterAssignment; import org.eclipse.dltk.javascript.core.dom.SimplePropertyAssignment; import org.eclipse.dltk.javascript.core.dom.Source; import org.eclipse.dltk.javascript.core.dom.Statement; import org.eclipse.dltk.javascript.core.dom.SwitchElement; import org.eclipse.dltk.javascript.core.dom.UnaryExpression; import org.eclipse.dltk.javascript.core.dom.UnaryOperator; import org.eclipse.dltk.javascript.core.dom.VariableReference; import org.eclipse.dltk.javascript.core.dom.XmlInitializer; import org.eclipse.dltk.javascript.parser.JSParser; public class ASTConverter extends ASTVisitor<Node> { private static final DomFactory DOM_FACTORY = DomFactory.eINSTANCE; @Override public Node visit(ASTNode node) { if (node == null) return null; Node res = super.visit(node); if (res != null) { if (res.getBegin() == -1) res.setBegin(node.sourceStart()); res.setEnd(node.sourceEnd()); } return res; } public static Node convert(ASTNode node) { ASTConverter converter = new ASTConverter(); return converter.visit(node); } private org.eclipse.dltk.javascript.core.dom.Label visitLabel(Label label) { if (label == null) return null; org.eclipse.dltk.javascript.core.dom.Label res = DOM_FACTORY .createLabel(); res.setBegin(label.sourceStart()); res.setEnd(label.sourceEnd()); res.setName(label.getText()); return res; } @Override public Node visitArrayInitializer(ArrayInitializer node) { ArrayLiteral res = DOM_FACTORY.createArrayLiteral(); for (ASTNode item : node.getItems()) res.getElements().add((IArrayElement) visit(item)); return res; } @Override public Node visitBinaryOperation(BinaryOperation node) { BinaryExpression res = DOM_FACTORY.createBinaryExpression(); BinaryOperator r = null; switch (node.getOperation()) { case JSParser.ADD: r = BinaryOperator.ADD; break; case JSParser.ADDASS: r = BinaryOperator.ADD_ASSIGN; break; case JSParser.ANDASS: r = BinaryOperator.AND_ASSIGN; break; case JSParser.ASSIGN: r = BinaryOperator.ASSIGN; break; case JSParser.AND: r = BinaryOperator.BW_AND; break; case JSParser.COMMA: r = BinaryOperator.COMMA; break; case JSParser.OR: r = BinaryOperator.BW_OR; break; case JSParser.XOR: r = BinaryOperator.BW_XOR; break; case JSParser.DIV: r = BinaryOperator.DIV; break; case JSParser.DIVASS: r = BinaryOperator.DIV_ASSIGN; break; case JSParser.EQ: r = BinaryOperator.EQ; break; case JSParser.GTE: r = BinaryOperator.GEQ; break; case JSParser.GT: r = BinaryOperator.GREATER; break; case JSParser.IN: r = BinaryOperator.IN; break; case JSParser.INSTANCEOF: r = BinaryOperator.INSTANCEOF; break; case JSParser.LTE: r = BinaryOperator.LEQ; break; case JSParser.LT: r = BinaryOperator.LESS; break; case JSParser.LAND: r = BinaryOperator.LOG_AND; break; case JSParser.LOR: r = BinaryOperator.LOG_OR; break; case JSParser.SHL: r = BinaryOperator.LSH; break; case JSParser.SHLASS: r = BinaryOperator.LSH_ASSIGN; break; case JSParser.MOD: r = BinaryOperator.MOD; break; case JSParser.MODASS: r = BinaryOperator.MOD_ASSIGN; break; case JSParser.MUL: r = BinaryOperator.MUL; break; case JSParser.MULASS: r = BinaryOperator.MUL_ASSIGN; break; case JSParser.NEQ: r = BinaryOperator.NEQ; break; case JSParser.NSAME: r = BinaryOperator.NSAME; break; case JSParser.ORASS: r = BinaryOperator.OR_ASSIGN; break; case JSParser.SHR: r = BinaryOperator.RSH; break; case JSParser.SHRASS: r = BinaryOperator.RSH_ASSIGN; break; case JSParser.SAME: r = BinaryOperator.SAME; break; case JSParser.SUB: r = BinaryOperator.SUB; break; case JSParser.SUBASS: r = BinaryOperator.SUB_ASSIGN; break; case JSParser.SHU: r = BinaryOperator.URSH; break; case JSParser.SHUASS: r = BinaryOperator.URSH_ASSIGN; break; case JSParser.XORASS: r = BinaryOperator.XOR_ASSIGN; break; default: throw new IllegalStateException("Unknown binary operator"); } res.setOperation(r); res.setOperatorPosition(node.getOperationPosition()); res.setLeft((Expression) visit(node.getLeftExpression())); res.setRight((Expression) visit(node.getRightExpression())); return res; } @Override public Node visitBooleanLiteral(BooleanLiteral node) { org.eclipse.dltk.javascript.core.dom.BooleanLiteral res = DOM_FACTORY .createBooleanLiteral(); res.setText(node.getText()); return res; } @Override public Node visitBreakStatement(BreakStatement node) { org.eclipse.dltk.javascript.core.dom.BreakStatement res = DOM_FACTORY .createBreakStatement(); res.setLabel(visitLabel(node.getLabel())); return res; } @Override public Node visitCallExpression(CallExpression node) { org.eclipse.dltk.javascript.core.dom.CallExpression res = DOM_FACTORY .createCallExpression(); res.setApplicant((Expression) visit(node.getExpression())); for (ASTNode arg : node.getArguments()) res.getArguments().add((Expression) visit(arg)); return res; } @Override public Node visitCommaExpression(CommaExpression node) { Iterator<ASTNode> it = node.getItems().iterator(); Expression res = (Expression) visit(it.next()); while (it.hasNext()) { BinaryExpression tmp = DOM_FACTORY.createBinaryExpression(); ; tmp.setOperation(BinaryOperator.COMMA); tmp.setLeft(res); tmp.setRight((Expression) visit(it.next())); if (it.hasNext()) { tmp.setBegin(res.getBegin()); tmp.setEnd(tmp.getRight().getEnd()); } res = tmp; } return res; } @Override public Node visitConditionalOperator(ConditionalOperator node) { ConditionalExpression res = DOM_FACTORY.createConditionalExpression(); res.setPredicate((Expression) visit(node.getCondition())); res.setConsequent((Expression) visit(node.getTrueValue())); res.setAlternative((Expression) visit(node.getFalseValue())); return res; } @Override public Node visitConstDeclaration(ConstStatement node) { org.eclipse.dltk.javascript.core.dom.ConstStatement res = DOM_FACTORY .createConstStatement(); for (VariableDeclaration decl : node.getVariables()) res.getDeclarations().add(createVariableDeclaration(decl)); return res; } @Override public Node visitContinueStatement(ContinueStatement node) { org.eclipse.dltk.javascript.core.dom.ContinueStatement res = DOM_FACTORY .createContinueStatement(); res.setLabel(visitLabel(node.getLabel())); return res; } @Override public Node visitDecimalLiteral(DecimalLiteral node) { NumericLiteral res = DOM_FACTORY.createNumericLiteral(); res.setText(node.getText()); return res; } @Override public Node visitDoWhileStatement(DoWhileStatement node) { DoStatement res = DOM_FACTORY.createDoStatement(); res.setBody((Statement) visit(node.getBody())); res.setCondition((Expression) visit(node.getCondition())); return res; } @Override public Node visitEmptyExpression(EmptyExpression node) { return DOM_FACTORY.createElision(); } @Override public Node visitForStatement(ForStatement node) { org.eclipse.dltk.javascript.core.dom.ForStatement res = DOM_FACTORY .createForStatement(); if (!isEmpty(node.getInitial())) { res.setInitialization((IForInitializer) visit(node.getInitial())); } if (!isEmpty(node.getCondition())) { res.setCondition((Expression) visit(node.getCondition())); } if (!isEmpty(node.getStep())) { res.setIncrement((Expression) visit(node.getStep())); } res.setBody((Statement) visit(node.getBody())); return res; } private boolean isEmpty( org.eclipse.dltk.javascript.ast.Expression expression) { return expression == null || expression instanceof EmptyExpression; } @Override public Node visitForInStatement(ForInStatement node) { org.eclipse.dltk.javascript.core.dom.ForInStatement res = DOM_FACTORY .createForInStatement(); res.setItem((IForInitializer) visit(node.getItem())); res.setCollection((Expression) visit(node.getIterator())); res.setBody((Statement) visit(node.getBody())); return res; } @Override public Node visitForEachInStatement(ForEachInStatement node) { org.eclipse.dltk.javascript.core.dom.ForEachInStatement res = DOM_FACTORY .createForEachInStatement(); res.setItem((IForInitializer) visit(node.getItem())); res.setCollection((Expression) visit(node.getIterator())); res.setBody((Statement) visit(node.getBody())); return res; } private static org.eclipse.dltk.javascript.core.dom.Identifier createIdentifier( Identifier id) { org.eclipse.dltk.javascript.core.dom.Identifier res = DOM_FACTORY .createIdentifier(); res.setName(id.getName()); res.setBegin(id.sourceStart()); res.setEnd(id.sourceEnd()); return res; } @Override public Node visitFunctionStatement(FunctionStatement node) { FunctionExpression res = DOM_FACTORY.createFunctionExpression(); if (node.getName() != null) res.setIdentifier(createIdentifier(node.getName())); Comment docs = node.getDocumentation(); if (docs != null) { org.eclipse.dltk.javascript.core.dom.Comment comment = DOM_FACTORY .createComment(); comment.setText(docs.getText()); comment.setBegin(docs.sourceStart()); comment.setEnd(docs.sourceEnd()); res.setDocumentation(comment); res.setBegin(comment.getBegin()); } for (Argument arg : node.getArguments()) { Parameter prm = DOM_FACTORY.createParameter(); prm.setName(createIdentifier(arg.getIdentifier())); prm.setBegin(arg.sourceStart()); prm.setEnd(arg.sourceEnd()); res.getParameters().add(prm); } res.setBody((org.eclipse.dltk.javascript.core.dom.BlockStatement) visit(node .getBody())); res.setParametersPosition(node.getLP() + 1); return res; } @Override public Node visitGetArrayItemExpression(GetArrayItemExpression node) { ArrayAccessExpression res = DOM_FACTORY.createArrayAccessExpression(); res.setArray((Expression) visit(node.getArray())); res.setIndex((Expression) visit(node.getIndex())); return res; } @Override public Node visitIdentifier(Identifier node) { VariableReference res = DOM_FACTORY.createVariableReference(); res.setVariable(createIdentifier(node)); return res; } @Override public Node visitIfStatement(IfStatement node) { org.eclipse.dltk.javascript.core.dom.IfStatement res = DOM_FACTORY .createIfStatement(); res.setPredicate((Expression) visit(node.getCondition())); res.setConsequent((Statement) visit(node.getThenStatement())); res.setAlternative((Statement) visit(node.getElseStatement())); return res; } @Override public Node visitLabelledStatement(LabelledStatement node) { LabeledStatement res = DOM_FACTORY.createLabeledStatement(); res.setLabel(visitLabel(node.getLabel())); res.setStatement((Statement) visit(node.getStatement())); return res; } @Override public Node visitNewExpression(NewExpression node) { org.eclipse.dltk.javascript.core.dom.NewExpression res = DOM_FACTORY .createNewExpression(); res.setConstructor((Expression) visit(node.getObjectClass())); return res; } @Override public Node visitNullExpression(NullExpression node) { return DOM_FACTORY.createNullLiteral(); } @Override public Node visitObjectInitializer(ObjectInitializer node) { ObjectLiteral res = DOM_FACTORY.createObjectLiteral(); for (ObjectInitializerPart part : node.getInitializers()) { PropertyAssignment cur = null; if (part instanceof PropertyInitializer) { PropertyInitializer pi = (PropertyInitializer) part; SimplePropertyAssignment elem = DOM_FACTORY .createSimplePropertyAssignment(); elem.setName(createPropertyName(pi.getName())); elem.setInitializer((Expression) visit(pi.getValue())); cur = elem; } else if (part instanceof GetMethod) { GetMethod gm = (GetMethod) part; GetterAssignment elem = DOM_FACTORY.createGetterAssignment(); elem.setName(createPropertyName(gm.getName())); elem.setBody((BlockStatement) visit(gm.getBody())); cur = elem; res.getProperties().add(elem); } else if (part instanceof SetMethod) { SetMethod sm = (SetMethod) part; SetterAssignment elem = DOM_FACTORY.createSetterAssignment(); elem.setName(createPropertyName(sm.getName())); elem.setParameter(createIdentifier(sm.getArgument())); elem.setBody((BlockStatement) visit(sm.getBody())); cur = elem; res.getProperties().add(elem); } else throw new UnsupportedOperationException( "Unknown initializer type"); cur.setBegin(part.sourceStart()); cur.setEnd(part.sourceEnd()); res.getProperties().add(cur); } return res; } private IPropertyName createPropertyName( org.eclipse.dltk.javascript.ast.Expression name) { if (name instanceof Identifier) return createIdentifier((Identifier) name); return (IPropertyName) visit(name); } @Override public Node visitParenthesizedExpression(ParenthesizedExpression node) { org.eclipse.dltk.javascript.core.dom.ParenthesizedExpression res = DOM_FACTORY .createParenthesizedExpression(); res.setEnclosed((Expression) visit(node.getExpression())); return res; } @Override public Node visitPropertyExpression(PropertyExpression node) { PropertyAccessExpression res = DOM_FACTORY .createPropertyAccessExpression(); res.setObject((Expression) visit(node.getObject())); if (node.getProperty() instanceof Identifier) res.setProperty(createIdentifier((Identifier) node.getProperty())); else res.setProperty((IProperty) visit(node.getProperty())); return res; } @Override public Node visitRegExpLiteral(RegExpLiteral node) { RegularExpressionLiteral res = DOM_FACTORY .createRegularExpressionLiteral(); res.setText(node.getText()); return res; } @Override public Node visitReturnStatement(ReturnStatement node) { org.eclipse.dltk.javascript.core.dom.ReturnStatement res = DOM_FACTORY .createReturnStatement(); res.setExpression((Expression) visit(node.getValue())); return res; } @Override public Node visitScript(Script node) { Source res = DOM_FACTORY.createSource(); for (org.eclipse.dltk.javascript.ast.Statement stmt : node .getStatements()) res.getStatements().add((Statement) visit(stmt)); final CommentContainer comments = CommentContainer.of(node .getComments()); if (comments != null) { res.eAdapters().add(comments); } return res; } @Override public Node visitStatementBlock(StatementBlock node) { BlockStatement res = DOM_FACTORY.createBlockStatement(); for (org.eclipse.dltk.javascript.ast.Statement stmt : node .getStatements()) res.getStatements().add((Statement) visit(stmt)); return res; } @Override public Node visitStringLiteral(StringLiteral node) { org.eclipse.dltk.javascript.core.dom.StringLiteral res = DOM_FACTORY .createStringLiteral(); res.setText(node.getText()); return res; } @Override public Node visitSwitchStatement(SwitchStatement node) { org.eclipse.dltk.javascript.core.dom.SwitchStatement res = DOM_FACTORY .createSwitchStatement(); res.setSelector((Expression) visit(node.getCondition())); for (SwitchComponent elem : node.getCaseClauses()) { final SwitchElement element; if (elem instanceof CaseClause) { final org.eclipse.dltk.javascript.core.dom.CaseClause caseClause = DOM_FACTORY .createCaseClause(); caseClause.setExpression((Expression) visit(((CaseClause) elem) .getCondition())); element = caseClause; } else { element = DOM_FACTORY.createDefaultClause(); } element.setBegin(elem.sourceStart()); element.setEnd(elem.sourceEnd()); for (org.eclipse.dltk.javascript.ast.Statement statement : elem .getStatements()) { element.getStatements().add((Statement) visit(statement)); } res.getElements().add(element); } return res; } @Override public Node visitThisExpression(ThisExpression node) { return DOM_FACTORY.createThisExpression(); } @Override public Node visitThrowStatement(ThrowStatement node) { org.eclipse.dltk.javascript.core.dom.ThrowStatement res = DOM_FACTORY .createThrowStatement(); res.setException((Expression) visit(node.getException())); return res; } @Override public Node visitTryStatement(TryStatement node) { org.eclipse.dltk.javascript.core.dom.TryStatement res = DOM_FACTORY .createTryStatement(); for (CatchClause cc : node.getCatches()) { org.eclipse.dltk.javascript.core.dom.CatchClause ccr = DOM_FACTORY .createCatchClause(); ccr.setException(createIdentifier(cc.getException())); ccr.setFilter((Expression) visit(cc.getFilterExpression())); ccr.setBody((BlockStatement) visit(cc.getStatement())); ccr.setBegin(cc.sourceStart()); ccr.setEnd(cc.sourceEnd()); res.getCatches().add(ccr); } if (node.getFinally() != null) { FinallyClause fc = node.getFinally(); org.eclipse.dltk.javascript.core.dom.FinallyClause fcr = DOM_FACTORY .createFinallyClause(); fcr.setBody((BlockStatement) visit(fc.getStatement())); fcr.setBegin(fc.sourceStart()); fcr.setEnd(fc.sourceEnd()); res.setFinallyClause(fcr); } return res; } @Override public Node visitUnaryOperation(UnaryOperation node) { UnaryExpression res = DOM_FACTORY.createUnaryExpression(); final UnaryOperator r; switch (node.getOperation()) { case JSParser.INV: r = UnaryOperator.BW_NOT; break; case JSParser.DELETE: r = UnaryOperator.DELETE; break; case JSParser.NOT: r = UnaryOperator.NOT; break; case JSParser.NEG: case JSParser.SUB: r = UnaryOperator.NUM_NEG; break; case JSParser.PDEC: r = UnaryOperator.POSTFIX_DEC; break; case JSParser.PINC: r = UnaryOperator.POSTFIX_INC; break; case JSParser.DEC: r = UnaryOperator.PREFIX_DEC; break; case JSParser.INC: r = UnaryOperator.PREFIX_INC; break; case JSParser.TYPEOF: r = UnaryOperator.TYPEOF; break; case JSParser.POS: case JSParser.ADD: r = UnaryOperator.UNARY_PLUS; break; case JSParser.VOID: r = UnaryOperator.VOID; break; default: throw new IllegalStateException("Unknown binary operator"); } res.setOperation(r); res.setArgument((Expression) visit(node.getExpression())); return res; } @Override public Node visitVariableStatement(VariableStatement node) { org.eclipse.dltk.javascript.core.dom.VariableStatement res = DOM_FACTORY .createVariableStatement(); for (VariableDeclaration decl : node.getVariables()) res.getDeclarations().add(createVariableDeclaration(decl)); return res; } private org.eclipse.dltk.javascript.core.dom.VariableDeclaration createVariableDeclaration( VariableDeclaration decl) { org.eclipse.dltk.javascript.core.dom.VariableDeclaration res = DOM_FACTORY .createVariableDeclaration(); res.setIdentifier(createIdentifier(decl.getIdentifier())); res.setInitializer((Expression) visit(decl.getInitializer())); res.setBegin(decl.sourceStart()); res.setEnd(decl.sourceEnd()); return res; } @Override public Node visitVoidExpression(VoidExpression node) { if (node.getExpression() instanceof VariableStatement) return visit(node.getExpression()); ExpressionStatement res = DOM_FACTORY.createExpressionStatement(); res.setExpression((Expression) visit(node.getExpression())); res.setBegin(res.getExpression().getBegin()); return res; } @Override public Node visitYieldOperator(YieldOperator node) { UnaryExpression res = DOM_FACTORY.createUnaryExpression(); res.setOperation(UnaryOperator.YIELD); res.setArgument((Expression) visit(node.getExpression())); return res; } @Override public Node visitWhileStatement(WhileStatement node) { org.eclipse.dltk.javascript.core.dom.WhileStatement res = DOM_FACTORY .createWhileStatement(); res.setCondition((Expression) visit(node.getCondition())); res.setBody((Statement) visit(node.getBody())); return res; } @Override public Node visitWithStatement(WithStatement node) { org.eclipse.dltk.javascript.core.dom.WithStatement res = DOM_FACTORY .createWithStatement(); res.setExpression((Expression) visit(node.getExpression())); res.setStatement((Statement) visit(node.getStatement())); return res; } @Override public Node visitXmlLiteral(XmlLiteral node) { XmlInitializer res = DOM_FACTORY.createXmlInitializer(); for (XmlFragment fragment : node.getFragments()) { final org.eclipse.dltk.javascript.core.dom.XmlFragment cur; if (fragment instanceof XmlTextFragment) { XmlTextFragment text = (XmlTextFragment) fragment; org.eclipse.dltk.javascript.core.dom.XmlTextFragment elem = DOM_FACTORY .createXmlTextFragment(); elem.setText(text.getXml()); cur = elem; } else { // fragment instanceof XmlExpressionFragment; XmlExpressionFragment expr = (XmlExpressionFragment) fragment; org.eclipse.dltk.javascript.core.dom.XmlExpressionFragment elem = DOM_FACTORY .createXmlExpressionFragment(); elem.setExpression((Expression) visit(expr.getExpression())); cur = elem; } cur.setBegin(fragment.sourceStart()); cur.setEnd(fragment.sourceEnd()); res.getFragments().add(cur); } return res; } @Override public Node visitDefaultXmlNamespace(DefaultXmlNamespaceStatement node) { org.eclipse.dltk.javascript.core.dom.DefaultXmlNamespaceStatement res = DOM_FACTORY .createDefaultXmlNamespaceStatement(); res.setExpression((Expression) visit(node.getValue())); return res; } @Override public Node visitXmlPropertyIdentifier(XmlAttributeIdentifier node) { AttributeIdentifier res = DOM_FACTORY.createAttributeIdentifier(); if (node.getExpression() instanceof Identifier) res.setSelector(createIdentifier((Identifier) node.getExpression())); else res.setSelector((ISelector) visit(node.getExpression())); return res; } @Override public Node visitAsteriskExpression(AsteriskExpression node) { return DOM_FACTORY.createWildcardIdentifier(); } @Override public Node visitGetAllChildrenExpression(GetAllChildrenExpression node) { DescendantAccessExpression res = DOM_FACTORY .createDescendantAccessExpression(); res.setObject((Expression) visit(node.getObject())); if (node.getProperty() instanceof Identifier) res.setProperty(createIdentifier((Identifier) node.getProperty())); else res.setProperty((IProperty) visit(node.getProperty())); return res; } @Override public Node visitGetLocalNameExpression(GetLocalNameExpression node) { QualifiedIdentifier res = DOM_FACTORY.createQualifiedIdentifier(); res.setNamespace((IPropertySelector) visit(node.getNamespace())); res.setMember((IUnqualifiedSelector) visit(node.getLocalName())); return res; } @Override public Node visitEmptyStatement(EmptyStatement node) { return DOM_FACTORY.createEmptyStatement(); } }