/** * Create the content of the condition * * @param ctInvocation * @return */ private CtBlock<Object> createThen(CtInvocation<?> ctInvocation) { CtBlock<Object> thenStatement = ctInvocation.getFactory().Core().createBlock(); thenStatement.addStatement( (getFactory().Code().createCodeSnippetStatement("System.out.println(\"Else...\")"))); thenStatement.addStatement( (getFactory() .Code() .createCodeSnippetStatement( "System.out.println(" + Debug.class.getCanonicalName() + ".getSolvedPC())"))); CtAssert<Object> ctAssert = ctInvocation.getFactory().Core().createAssert(); CtCodeSnippetExpression<Boolean> assertExpression = getFactory().Core().createCodeSnippetExpression(); assertExpression.setValue("false"); ctAssert.setAssertExpression(assertExpression); ctAssert.setExpression( getFactory() .Code() .createCodeSnippetExpression( String.format("\"%s\"", ctInvocation.toString().replaceAll("\"", "'")))); thenStatement.addStatement(ctAssert); return thenStatement; }
private void createExecutionMethod(CtInvocation<?> ctInvocation) { CtClass<?> parent = ctInvocation.getParent(CtClass.class); if (!parent.isTopLevel()) { return; } if (parent.getModifiers().contains(ModifierKind.ABSTRACT)) { return; } CtTypeReference<String[]> typedReference = getFactory().Class().createReference(String[].class); if (parent.getMethod("runJPFTest", typedReference) != null) { return; } CtTypeReference<Object> returntypedReference = getFactory().Class().createReference("void"); Set<ModifierKind> modifiers = new LinkedHashSet<ModifierKind>(2); modifiers.add(ModifierKind.PUBLIC); modifiers.add(ModifierKind.STATIC); String invocation = parent.getQualifiedName() + "("; if (parent.getConstructor() == null) { // CtTypeReference<?> superClass = parent.getSuperclass(); if (parent.getConstructor(ctInvocation.getFactory().Class().STRING) != null) { invocation += "\"" + parent.getSimpleName() + "\""; } else { return; } } invocation += ")"; CtBlock<?> body = getFactory().Core().createBlock(); String bodyString = "for (String method : methods) {\n"; bodyString += "\t\tSystem.out.println(method);\n\t\t"; bodyString += parent.getQualifiedName() + " instance = new " + invocation + ";\n\t\t"; if (parent.getMethod("setUp") != null) { bodyString += "instance.setUp();"; } bodyString += parent.getQualifiedName() + ".class.getMethod(method, null).invoke(instance);\n\t\t"; bodyString += "}\n"; body.addStatement(getFactory().Code().createCodeSnippetStatement(bodyString)); HashSet<CtTypeReference<? extends Throwable>> exceptions = new HashSet<CtTypeReference<? extends Throwable>>(); exceptions.add(getFactory().Class().createReference(Exception.class)); CtMethod<?> method = getFactory() .Method() .create( parent, modifiers, returntypedReference, "runJPFTest", new ArrayList<CtParameter<?>>(), exceptions, body); getFactory().Method().createParameter(method, typedReference, "methods"); }
/** * Replaces the element by an statement list containing all unary operators in the element * * @param element */ private void replaceByUnaryBlock(CtElement element) { CtBlock<CtUnaryOperator> opBlock = new CtBlockImpl<CtUnaryOperator>(); for (CtUnaryOperator s : element.getElements(new TypeFilter<CtUnaryOperator>(CtUnaryOperator.class))) if (s.getKind().compareTo(UnaryOperatorKind.PREINC) >= 0) { s.setParent(null); opBlock.addStatement(s); s.setParent(opBlock); } element.replace(opBlock); }