package org.maziarz.yiiclipse.codegen; import java.util.ArrayList; import java.util.List; import org.eclipse.php.core.compiler.PHPFlags; import org.eclipse.php.internal.core.ast.nodes.AST; import org.eclipse.php.internal.core.ast.nodes.ArrayCreation; import org.eclipse.php.internal.core.ast.nodes.Block; import org.eclipse.php.internal.core.ast.nodes.ClassDeclaration; import org.eclipse.php.internal.core.ast.nodes.Expression; import org.eclipse.php.internal.core.ast.nodes.FunctionDeclaration; import org.eclipse.php.internal.core.ast.nodes.FunctionInvocation; import org.eclipse.php.internal.core.ast.nodes.Identifier; import org.eclipse.php.internal.core.ast.nodes.MethodDeclaration; import org.eclipse.php.internal.core.ast.nodes.MethodInvocation; import org.eclipse.php.internal.core.ast.nodes.SingleFieldDeclaration; import org.eclipse.php.internal.core.ast.nodes.VariableBase; import org.eclipse.php.internal.core.compiler.ast.nodes.Scalar; public class PhpAstHelper { /** * Creates class declaration node * <pre> * class NewClassName extends SuperClass{ * } * </pre> * @param container - owner node * @param newClassName - class name * @param superClass - name of the parent type * @param modifier * @return */ public static ClassDeclaration addClass(AST container, String newClassName, String superClass, int modifier){ Block body = container.newBlock(); ClassDeclaration classDeclaration = container.newClassDeclaration(modifier, newClassName, superClass, new ArrayList<Identifier>(), body); return classDeclaration; } public static SingleFieldDeclaration addField(Block container, String fieldName, String fieldValue){ SingleFieldDeclaration simpleField = container.getAST().newSingleFieldDeclaration(); simpleField.setName(container.getAST().newVariable(fieldName)); if (fieldValue != null) simpleField.setValue(container.getAST().newScalar(fieldValue, Scalar.TYPE_STRING)); return simpleField; } public static FunctionDeclaration addMethod(Block container, String newMethodName, int modifier) { MethodDeclaration md = container.getAST().newMethodDeclaration(); FunctionDeclaration fd = container.getAST().newFunctionDeclaration(); Identifier ident = container.getAST().newIdentifier();ident.setName(newMethodName); fd.setFunctionName(ident); md.setFunction(fd); md.setModifier(modifier); container.statements().add(md); return fd; } public static Block addFunctionsBodyBlock(FunctionDeclaration function) { function.setBody(function.getAST().newBlock()); return function.getBody(); } public static void addAction(Block body, String actionName){ String functionName = "action".concat(actionName.substring(0,1).toUpperCase().concat(actionName.substring(1).toLowerCase())); FunctionDeclaration fd = addMethod(body, functionName, PHPFlags.AccPublic); Block funcBody = addFunctionsBodyBlock(fd); // add render statement VariableBase dispatcher = funcBody.getAST().newVariable("this"); List<Expression> parameters = new ArrayList<Expression>(); parameters.add(funcBody.getAST().newScalar("'"+actionName.toLowerCase()+"'")); parameters.add(funcBody.getAST().newScalar("null")); FunctionInvocation method = funcBody.getAST().newFunctionInvocation(funcBody.getAST().newFunctionName(funcBody.getAST().newScalar("render")), parameters); MethodInvocation mi = funcBody.getAST().newMethodInvocation(dispatcher, method); funcBody.statements().add(funcBody.getAST().newExpressionStatement(mi)); } }