package org.whole.examples.lang.imp.codebase;
import org.whole.examples.lang.imp.builders.IImpBuilder;
import org.whole.examples.lang.imp.model.FunctionDeclaration;
import org.whole.examples.lang.imp.reflect.ImpLanguageKit;
import org.whole.lang.builders.IBuilderOperation;
import org.whole.lang.commons.builders.ICommonsBuilder;
import org.whole.lang.commons.reflect.CommonsLanguageKit;
import org.whole.lang.templates.AbstractTemplateFactory;
/**
* @generator Whole
*/
public class Factorial extends AbstractTemplateFactory<FunctionDeclaration> {
public void apply(IBuilderOperation op) {
IImpBuilder b0 = (IImpBuilder) op.wGetBuilder(ImpLanguageKit.URI);
ICommonsBuilder cb = (ICommonsBuilder) op.wGetBuilder(CommonsLanguageKit.URI);
b0.FunctionDeclaration_();
b0.PrimitiveType("void");
b0.Name("testFactorial");
cb.Resolver();
b0.BlockStatement_(4);
b0.FunctionDeclaration_();
b0.PrimitiveType("int");
b0.Name("ifact");
b0.Parameters_(1);
b0.Parameter_();
b0.PrimitiveType("int");
b0.Name("n");
b0._Parameter();
b0._Parameters();
b0.BlockStatement_(3);
b0.VariableDeclaration_();
b0.PrimitiveType("int");
b0.Name("result");
b0.IntLiteral(1);
b0._VariableDeclaration();
b0.WhileStatement_();
b0.GreaterThan_();
b0.NameExpression("n");
b0.IntLiteral(0);
b0._GreaterThan();
b0.BlockStatement_(2);
b0.ExpressionStatement_();
b0.AssignmentExpression_();
b0.Name("result");
b0.Multiplication_();
b0.NameExpression("result");
b0.NameExpression("n");
b0._Multiplication();
b0._AssignmentExpression();
b0._ExpressionStatement();
b0.ExpressionStatement_();
b0.AssignmentExpression_();
b0.Name("n");
b0.Subtraction_();
b0.NameExpression("n");
b0.IntLiteral(1);
b0._Subtraction();
b0._AssignmentExpression();
b0._ExpressionStatement();
b0._BlockStatement();
b0._WhileStatement();
b0.ReturnStatement_();
b0.NameExpression("result");
b0._ReturnStatement();
b0._BlockStatement();
b0._FunctionDeclaration();
b0.FunctionDeclaration_();
b0.PrimitiveType("int");
b0.Name("rfact");
b0.Parameters_(1);
b0.Parameter_();
b0.PrimitiveType("int");
b0.Name("n");
b0._Parameter();
b0._Parameters();
b0.IfElseStatement_();
b0.LessOrEquals_();
b0.NameExpression("n");
b0.IntLiteral(1);
b0._LessOrEquals();
b0.ReturnStatement_();
b0.IntLiteral(1);
b0._ReturnStatement();
b0.ReturnStatement_();
b0.Multiplication_();
b0.NameExpression("n");
b0.FunctionInvocationExpression_();
b0.NameExpression("rfact");
b0.Arguments_(1);
b0.Subtraction_();
b0.NameExpression("n");
b0.IntLiteral(1);
b0._Subtraction();
b0._Arguments();
b0._FunctionInvocationExpression();
b0._Multiplication();
b0._ReturnStatement();
b0._IfElseStatement();
b0._FunctionDeclaration();
b0.PrintlnStatement_();
b0.FunctionInvocationExpression_();
b0.NameExpression("ifact");
b0.Arguments_(1);
b0.IntLiteral(4);
b0._Arguments();
b0._FunctionInvocationExpression();
b0._PrintlnStatement();
b0.PrintlnStatement_();
b0.FunctionInvocationExpression_();
b0.NameExpression("rfact");
b0.Arguments_(1);
b0.IntLiteral(3);
b0._Arguments();
b0._FunctionInvocationExpression();
b0._PrintlnStatement();
b0._BlockStatement();
b0._FunctionDeclaration();
}
}