use of spoon.reflect.code.CtTargetedExpression in project Ex2Amplifier by STAMP-project.
the class MainGenerator method removeNonStaticElement.
private static void removeNonStaticElement(final CtMethod<?> mainMethod, final CtType testClass) {
final CtBlock<?> body = mainMethod.getBody();
final Factory factory = mainMethod.getFactory();
// 1 create a local variable of the test class
final CtLocalVariable localVariableOfTestClass = factory.createLocalVariable(testClass.getReference(), Character.toLowerCase(testClass.getSimpleName().charAt(0)) + testClass.getSimpleName().substring(1), factory.createConstructorCall(testClass.getReference()));
// 2 invoke setUp(@Before) at the begin if present
final CtTry wrappedBefore = wrapInTryCatchMethodWithSpecificAnnotation(testClass, factory, localVariableOfTestClass, "org.junit.Before");
if (wrappedBefore != null) {
body.insertBegin(wrappedBefore);
}
// 3 invoke tearDown(@After) at the end of the block
final CtTry wrappedAfter = wrapInTryCatchMethodWithSpecificAnnotation(testClass, factory, localVariableOfTestClass, "org.junit.After");
if (wrappedAfter != null) {
body.insertEnd(wrappedAfter);
}
// 4 replaces all non-static accesses to accesses on the local variable created at the first step
body.getElements(new TypeFilter<CtTargetedExpression>(CtTargetedExpression.class) {
@Override
public boolean matches(CtTargetedExpression element) {
return element.getTarget() instanceof CtThisAccess;
}
}).stream().map(CtTargetedExpression::getTarget).forEach(target -> target.replace(factory.createVariableRead(localVariableOfTestClass.getReference(), false)));
body.insertBegin(localVariableOfTestClass);
}
Aggregations