diff options
Diffstat (limited to 'src/test/java/walter/multiTrig.oj')
-rw-r--r-- | src/test/java/walter/multiTrig.oj | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/test/java/walter/multiTrig.oj b/src/test/java/walter/multiTrig.oj new file mode 100644 index 0000000..18c194a --- /dev/null +++ b/src/test/java/walter/multiTrig.oj @@ -0,0 +1,65 @@ +package walter; + +import io.devnulllabs.openjava.ptree.*; +import io.devnulllabs.openjava.ptree.ModifierList; +import io.devnulllabs.openjava.mop.*; + +public class multiTrig instantiates Metaclass extends OJClass { + + private static final String MULTI_TRIG = "multi_trig"; + private final int triggerValue = 10; + + public static boolean isRegisteredModifier(String keyword) { + if (keyword.equals(MULTI_TRIG)) + return true; + return OJClass.isRegisteredModifier(keyword); + } + + public void translateDefinition() throws MOPException { + OJMethod[] methods = getDeclaredMethods(); + for (int i = 0; i < methods.length; ++i) { + if (!methods[i].getModifiers().has(MULTI_TRIG)) + continue; + String name = methods[i].getName(); // is a multi-trigged method + ModifierList ml = new ModifierList(ModifierList.PRIVATE); + TypeName tn = new TypeName("int"); + /* inserts a field for counting the method calls + private int <method name>Counter = 0 */ + String counterName = name + "Counter"; + VariableInitializer vi = Literal.makeLiteral(0); + FieldDeclaration fd = new FieldDeclaration(ml, tn, counterName, vi); + OJField field = new OJField(getEnvironment(), this, fd); + addField(field); + + /* inserts a field keeping the trigger value + private int <method name>Trigger = 10 */ + String triggerName = name + "Trigger"; + vi = Literal.makeLiteral(triggerValue); + fd = new FieldDeclaration(ml, tn, triggerName, vi); + field = new OJField(getEnvironment(), this, fd); + addField(field); + + /* inserts a precondition on the execution of the method body + if (<method name>Counter == <method name>Trigger) { + and a post action + <method body> + <method name>Counter = 0; + } <method name>Counter++; */ + StatementList newBody = + makeStatementList( + methods[i].getEnvironment(), + "if (" + + counterName + + " == " + + triggerName + + ") {" + + methods[i].getBody().toString() + + counterName + + "=0;}; " + + counterName + + "++;"); + methods[i].setBody(newBody); + } + } + +} |