@Nullable private static CtExpression buildConstructorWithFactory(CtTypeReference type, CtExpression<?>[] expressionsToAvoid) { final List<CtExpression<?>> constructorWithFactoryMethod = generateConstructorUsingFactory(type); if (!constructorWithFactoryMethod.isEmpty()) { CtExpression<?> selectedConstructor = constructorWithFactoryMethod .remove(RandomHelper.getRandom().nextInt(constructorWithFactoryMethod.size())); while (!constructorWithFactoryMethod.isEmpty() && Arrays.stream(expressionsToAvoid).anyMatch(selectedConstructor::equals)) { selectedConstructor = constructorWithFactoryMethod .remove(RandomHelper.getRandom().nextInt(constructorWithFactoryMethod.size())); } final CtTypeReference<?> declaringType = ((CtInvocation<?>) selectedConstructor).getExecutable().getDeclaringType(); ((CtInvocation<?>) selectedConstructor).setTarget(selectedConstructor.getFactory().createTypeAccess(declaringType)); return selectedConstructor; } return type.getFactory().createLiteral(null); }
private static void addTypeCastIfNeeded(CtExpression<?> variableRead, Object value) { if (value instanceof Short) { variableRead.addTypeCast(variableRead.getFactory().Type().shortPrimitiveType()); } else if (value instanceof Integer) { variableRead.addTypeCast(variableRead.getFactory().Type().integerPrimitiveType()); } else if (value instanceof Long) { variableRead.addTypeCast(variableRead.getFactory().Type().longPrimitiveType()); } else if (value instanceof Byte) { variableRead.addTypeCast(variableRead.getFactory().Type().bytePrimitiveType()); } else if (value instanceof Float) { variableRead.addTypeCast(variableRead.getFactory().Type().floatPrimitiveType()); } else if (value instanceof Double) { variableRead.addTypeCast(variableRead.getFactory().Type().doublePrimitiveType()); } else if (value instanceof Character) { variableRead.addTypeCast(variableRead.getFactory().Type().characterPrimitiveType()); } }
private void replaceDouble(CtExpression ctElement) { if (getValue() == null) { CtLocalVariable<Double> evaluation = newLocalVariableDeclaration( ctElement.getFactory(), double.class, "guess_fix", Debug.class.getCanonicalName() + ".makeSymbolicReal(\"guess_fix\")"); CtStatement firstStatement = getFirstStatement(ctElement); if (firstStatement == null) { return; } SpoonStatementLibrary.insertBeforeUnderSameParent(evaluation, firstStatement); // SpoonStatementLibrary.insertAfterUnderSameParent(getFactory().Code().createCodeSnippetStatement("System.out.println(\"guess_fix: \" + guess_fix)"), // getFirstStatement(ctElement)); ctElement.replace(getFactory().Code().createCodeSnippetExpression("guess_fix")); } else { ctElement.replace(getFactory().Code().createCodeSnippetExpression(getValue())); } }
private void replaceInteger(CtExpression ctElement) { if (getValue() == null) { CtLocalVariable<Integer> evaluation = newLocalVariableDeclaration( ctElement.getFactory(), int.class, "guess_fix", Debug.class.getCanonicalName() + ".makeSymbolicInteger(\"guess_fix\")"); CtStatement firstStatement = getFirstStatement(ctElement); if (firstStatement == null) { return; } SpoonStatementLibrary.insertBeforeUnderSameParent(evaluation, firstStatement); // SpoonStatementLibrary.insertAfterUnderSameParent(getFactory().Code().createCodeSnippetStatement("System.out.println(\"guess_fix: \" + guess_fix)"), // getFirstStatement(ctElement)); ctElement.replace(getFactory().Code().createCodeSnippetExpression("guess_fix")); } else { ctElement.replace(getFactory().Code().createCodeSnippetExpression(getValue())); } }
private void replaceBoolean(CtExpression ctElement) { if (getValue() == null) { CtLocalVariable<Boolean> evaluation = newLocalVariableDeclaration( ctElement.getFactory(), boolean.class, "guess_fix", Debug.class.getCanonicalName() + ".makeSymbolicBoolean(\"guess_fix\")"); CtStatement firstStatement = getFirstStatement(ctElement); if (firstStatement == null) { return; } SpoonStatementLibrary.insertBeforeUnderSameParent(evaluation, firstStatement); ctElement.replace(getFactory().Code().createCodeSnippetExpression( "guess_fix")); } else { switch (getValue()) { case "1": ctElement.replace(getFactory().Code().createCodeSnippetExpression("true")); break; case "0": ctElement.replace(getFactory().Code().createCodeSnippetExpression("false")); break; default: ctElement.replace(getFactory().Code().createCodeSnippetExpression(getValue())); break; } } } }