1 package example;
2
3 import spoon.processing.AbstractProcessor;
4 import spoon.reflect.code.CtBlock;
5 import spoon.reflect.code.CtExpression;
6 import spoon.reflect.declaration.CtClass;
7 import spoon.reflect.declaration.CtMethod;
8 import spoon.template.Substitution;
9
10 public class CheckBeforeProcessor extends AbstractProcessor<CtMethod<?>> {
11
12 public void process(CtMethod<?> m) {
13 CheckBefore annotation = m.getAnnotation(CheckBefore.class);
14 if (annotation == null) {
15 return;
16 }
17 for(String check : annotation.value()) {
18 CtExpression<Boolean> checkExpr = getFactory().Code().createCodeSnippetExpression(check);
19 CtBlock<?> checkBlock = Substitution.substituteMethodBody(
20 (CtClass<?>) m.getDeclaringType(),
21 new CheckBeforeTemplate(check, checkExpr),
22 "check"
23 );
24 m.getBody().insertBegin(checkBlock);
25 }
26
27 }
28
29 }