package org.whole.examples.lang.imp; import static org.whole.lang.commons.factories.CommonsEntityAdapterFactory.createVariable; import org.junit.BeforeClass; import org.junit.Test; import org.whole.examples.lang.imp.factories.ImpEntityFactory; import org.whole.examples.lang.imp.model.PrimitiveTypeEnum; import org.whole.examples.lang.imp.reflect.ImpEntityDescriptorEnum; import org.whole.examples.lang.imp.reflect.ImpLanguageDeployer; import org.whole.lang.matchers.GenericMatcherFactory; import org.whole.lang.model.IEntity; import org.whole.lang.operations.PrettyPrinterOperation; import org.whole.lang.reflect.ReflectionFactory; import org.whole.lang.visitors.GenericTraversalFactory; import org.whole.lang.visitors.IVisitor; /** * @author Riccardo Solmi */ public class RewriteTest { @BeforeClass public static void init() { ReflectionFactory.deployWholePlatform(); ReflectionFactory.deploy(ImpLanguageDeployer.class); } @Test public void testRewrite() { IEntity program = buildImpProgram(); PrettyPrinterOperation.prettyPrint(program); GenericMatcherFactory mf = GenericMatcherFactory.instance; GenericTraversalFactory tf = GenericTraversalFactory.instance; IVisitor v = tf.innermost(tf.concurrentSome( mf.rewrite(IfElseEmptyPattern(), IfElseEmptyRewrite(), false), mf.rewrite(IfTruePattern(), IfTrueRewrite(), false), mf.rewrite(IfTrueElsePattern(), IfTrueRewrite(), false), mf.rewrite(IfNotPattern(), IfNotRewrite(), false) )); v.visit(program); PrettyPrinterOperation.prettyPrint(program); } public IEntity buildImpProgram() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createFunctionDeclaration( lf.createPrimitiveType(PrimitiveTypeEnum._boolean), lf.createName("fun"), lf.createParameters(0), lf.createBlockStatement( lf.createIfElseStatement( lf.createNot(lf.createBooleanLiteral(true)), lf.createEmptyStatement(), lf.createExpressionStatement( lf.createAssignmentExpression( lf.createName("x"), lf.createAddition( lf.createNameExpression("x"), lf.createIntLiteral(1))))), lf.createIfElseStatement( lf.createNot(lf.createBooleanLiteral(true)), lf.createIfElseStatement( lf.createNot(lf.createBooleanLiteral(true)), lf.createExpressionStatement( lf.createAssignmentExpression( lf.createName("y"), lf.createAddition( lf.createNameExpression("y"), lf.createIntLiteral(1)))), lf.createEmptyStatement()), lf.createExpressionStatement( lf.createAssignmentExpression( lf.createName("z"), lf.createAddition( lf.createNameExpression("z"), lf.createIntLiteral(2))))) )); } public IEntity IfNotPattern() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfElseStatement( lf.createNot(createVariable(ImpEntityDescriptorEnum.Expression, "cond")), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm"), createVariable(ImpEntityDescriptorEnum.Statement, "elseStm")); } public IEntity IfNotRewrite() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfElseStatement( createVariable(ImpEntityDescriptorEnum.Expression, "cond"), createVariable(ImpEntityDescriptorEnum.Statement, "elseStm"), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm")); } public IEntity IfElseEmptyPattern() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfElseStatement( createVariable(ImpEntityDescriptorEnum.Expression, "cond"), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm"), lf.createEmptyStatement()); } public IEntity IfElseEmptyRewrite() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfStatement( createVariable(ImpEntityDescriptorEnum.Expression, "cond"), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm")); } public IEntity IfTruePattern() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfStatement( lf.createBooleanLiteral(true), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm")); } public IEntity IfTrueElsePattern() { ImpEntityFactory lf = ImpEntityFactory.instance; return lf.createIfElseStatement( lf.createBooleanLiteral(true), createVariable(ImpEntityDescriptorEnum.Statement, "thenStm"), createVariable(ImpEntityDescriptorEnum.Statement, "elseStm")); } public IEntity IfTrueRewrite() { return createVariable(ImpEntityDescriptorEnum.Statement, "thenStm"); } }