/* * Copyright (C) 2009-2011 Mathias Doenitz * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.fge.grappa.transform.process; import com.google.common.collect.ImmutableList; import com.github.fge.grappa.transform.generate.ActionClassGenerator; import com.github.fge.grappa.transform.TestParser; import com.github.fge.grappa.transform.generate.VarInitClassGenerator; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.util.List; import static com.github.fge.grappa.transform.AsmTestUtils.getMethodInstructionList; import static org.testng.Assert.assertEquals; public class RuleMethodRewriterTest extends TransformationTest { private final List<RuleMethodProcessor> processors = ImmutableList.of( new UnusedLabelsRemover(), new ReturnInstructionUnifier(), new InstructionGraphCreator(), new ImplicitActionsConverter(), new InstructionGroupCreator(), new InstructionGroupPreparer(), new ActionClassGenerator(true), new VarInitClassGenerator(true), new RuleMethodRewriter(), new VarFramingGenerator() ); @BeforeClass public void setup() throws IOException { setup(TestParser.class); } @Test public void testRuleMethodRewriting() throws Exception { assertEquals(getMethodInstructionList(processMethod("RuleWithIndirectImplicitAction", processors)) .replaceAll("(?<=\\$)[A-Za-z0-9]{16}", "XXXXXXXXXXXXXXXX"), "" + "Method 'RuleWithIndirectImplicitAction':\n" + " 0 ALOAD 0\n" + " 1 BIPUSH 97\n" + " 2 INVOKESTATIC java/lang/Character.valueOf (C)Ljava/lang/Character;\n" + " 3 BIPUSH 98\n" + " 4 INVOKESTATIC java/lang/Character.valueOf (C)Ljava/lang/Character;\n" + " 5 ICONST_1\n" + " 6 ANEWARRAY java/lang/Object\n" + " 7 DUP\n" + " 8 ICONST_0\n" + " 9 NEW com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX\n" + "10 DUP\n" + "11 LDC \"RuleWithIndirectImplicitAction_Action1\"\n" + "12 INVOKESPECIAL com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.<init> (Ljava/lang/String;)V\n" + "13 DUP\n" + "14 ALOAD 0\n" + "15 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$0 : Lcom/github/fge/grappa/transform/TestParser$$grappa;\n" + "16 AASTORE\n" + "17 INVOKEVIRTUAL com/github/fge/grappa/transform/TestParser.sequence (Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lcom/github/fge/grappa/rules/Rule;\n" + "18 ARETURN\n"); assertEquals(getMethodInstructionList(processMethod("RuleWithComplexActionSetup", processors)) .replaceAll("(?<=\\$)[A-Za-z0-9]{16}", "XXXXXXXXXXXXXXXX"), "" + "Method 'RuleWithComplexActionSetup':\n" + " 0 BIPUSH 26\n" + " 1 ISTORE 2\n" + " 2 BIPUSH 18\n" + " 3 ISTORE 3\n" + " 4 NEW com/github/fge/grappa/support/Var\n" + " 5 DUP\n" + " 6 NEW com/github/fge/grappa/transform/VarInit$XXXXXXXXXXXXXXXX\n" + " 7 DUP\n" + " 8 LDC \"RuleWithComplexActionSetup_VarInit1\"\n" + " 9 INVOKESPECIAL com/github/fge/grappa/transform/VarInit$XXXXXXXXXXXXXXXX.<init> (Ljava/lang/String;)V\n" + "10 INVOKESPECIAL com/github/fge/grappa/support/Var.<init> (Ljava/util/function/Supplier;)V\n" + "11 ASTORE 4\n" + "12 ILOAD 2\n" + "13 ILOAD 1\n" + "14 IADD\n" + "15 ISTORE 2\n" + "16 ILOAD 3\n" + "17 ILOAD 2\n" + "18 ISUB\n" + "19 ISTORE 3\n" + "20 ALOAD 0\n" + "21 BIPUSH 97\n" + "22 ILOAD 2\n" + "23 IADD\n" + "24 INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;\n" + "25 NEW com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX\n" + "26 DUP\n" + "27 LDC \"RuleWithComplexActionSetup_Action1\"\n" + "28 INVOKESPECIAL com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.<init> (Ljava/lang/String;)V\n" + "29 DUP\n" + "30 ILOAD 2\n" + "31 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$0 : I\n" + "32 DUP\n" + "33 ILOAD 1\n" + "34 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$1 : I\n" + "35 DUP\n" + "36 ILOAD 3\n" + "37 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$2 : I\n" + "38 ICONST_2\n" + "39 ANEWARRAY java/lang/Object\n" + "40 DUP\n" + "41 ICONST_0\n" + "42 ALOAD 4\n" + "43 AASTORE\n" + "44 DUP\n" + "45 ICONST_1\n" + "46 NEW com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX\n" + "47 DUP\n" + "48 LDC \"RuleWithComplexActionSetup_Action2\"\n" + "49 INVOKESPECIAL com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.<init> (Ljava/lang/String;)V\n" + "50 DUP\n" + "51 ALOAD 0\n" + "52 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$0 : Lcom/github/fge/grappa/transform/TestParser$$grappa;\n" + "53 DUP\n" + "54 ILOAD 1\n" + "55 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$1 : I\n" + "56 DUP\n" + "57 ALOAD 4\n" + "58 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$2 : Lcom/github/fge/grappa/support/Var;\n" + "59 DUP\n" + "60 ILOAD 2\n" + "61 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$3 : I\n" + "62 DUP\n" + "63 ILOAD 3\n" + "64 PUTFIELD com/github/fge/grappa/transform/Action$XXXXXXXXXXXXXXXX.field$4 : I\n" + "65 AASTORE\n" + "66 INVOKEVIRTUAL com/github/fge/grappa/transform/TestParser.sequence (Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lcom/github/fge/grappa/rules/Rule;\n" + "67 NEW com/github/fge/grappa/matchers/wrap/VarFramingMatcher\n" + "68 DUP_X1\n" + "69 SWAP\n" + "70 BIPUSH 1\n" + "71 ANEWARRAY com/github/fge/grappa/support/Var\n" + "72 DUP\n" + "73 BIPUSH 0\n" + "74 ALOAD 4\n" + "75 DUP\n" + "76 LDC \"RuleWithComplexActionSetup:string\"\n" + "77 INVOKEVIRTUAL com/github/fge/grappa/support/Var.setName (Ljava/lang/String;)V\n" + "78 AASTORE\n" + "79 INVOKESPECIAL com/github/fge/grappa/matchers/wrap/VarFramingMatcher.<init> (Lcom/github/fge/grappa/rules/Rule;[Lcom/github/fge/grappa/support/Var;)V\n" + "80 ARETURN\n"); } }