private void inlineLocalVariable(CtMethod<?> amplifiedTestToBeMinimized) { final List<CtLocalVariable> localVariables = amplifiedTestToBeMinimized.getElements(new TypeFilter<>(CtLocalVariable.class)); final List<CtVariableRead> variableReads = localVariables.stream().map(LOCAL_VARIABLE_READ_FILTER::new) .flatMap(filter -> amplifiedTestToBeMinimized.getElements(filter).stream()) .collect(Collectors.toList()); // we can inline all local variables that are used one time and that have been generated by DSpot final List<CtLocalVariable> oneTimeUsedLocalVariable = localVariables.stream() .filter(localVariable -> variableReads.stream() .map(CtVariableRead::getVariable) .filter(variableRead -> variableRead.equals(localVariable.getReference())) .count() == 1 ).collect(Collectors.toList()); oneTimeUsedLocalVariable.stream().map(localVariable -> { DSpotUtils.printProgress(oneTimeUsedLocalVariable.indexOf(localVariable), oneTimeUsedLocalVariable.size()); variableReads.stream() .filter(variableRead -> variableRead.getVariable().equals(localVariable.getReference()) ).findFirst() .get() .replace(localVariable.getAssignment().clone()); return localVariable; }).forEach(amplifiedTestToBeMinimized.getBody()::removeStatement); //TODO we can inline all local variables that are used only in assertion }
private void inlineLocalVariable(CtMethod<?> amplifiedTestToBeMinimized) { final List<CtLocalVariable> localVariables = amplifiedTestToBeMinimized.getElements(new TypeFilter<>(CtLocalVariable.class)); final List<CtVariableRead> variableReads = localVariables.stream().map(LOCAL_VARIABLE_READ_FILTER::new) .flatMap(filter -> amplifiedTestToBeMinimized.getElements(filter).stream()) .collect(Collectors.toList()); // we can inline all local variables that are used one time and that have been generated by DSpot final List<CtLocalVariable> oneTimeUsedLocalVariable = localVariables.stream() .filter(localVariable -> variableReads.stream() .map(CtVariableRead::getVariable) .filter(variableRead -> variableRead.equals(localVariable.getReference())) .count() == 1 ).collect(Collectors.toList()); oneTimeUsedLocalVariable.stream().map(localVariable -> { DSpotUtils.printProgress(oneTimeUsedLocalVariable.indexOf(localVariable), oneTimeUsedLocalVariable.size()); variableReads.stream() .filter(variableRead -> variableRead.getVariable().equals(localVariable.getReference()) ).findFirst() .get() .replace(localVariable.getAssignment().clone()); return localVariable; }).forEach(amplifiedTestToBeMinimized.getBody()::removeStatement); //TODO we can inline all local variables that are used only in assertion }
@SuppressWarnings("unchecked") @Override public Stream<CtMethod<?>> amplify(CtMethod<?> testMethod, int iteration) { return testMethod.getElements(new TypeFilter<CtLocalVariable>(CtLocalVariable.class) { @Override public boolean matches(CtLocalVariable element) { return !element.getSimpleName().contains("DSPOT") && element.getParent() instanceof CtBlock && ValueCreatorHelper.canGenerateAValueForType(element.getType()); } }).stream() .map(ctLocalVariable -> { final CtMethod clone = CloneHelper.cloneTestMethodForAmp(testMethod, "_replacement"); final CtLocalVariable localVariable = clone.getElements(new TypeFilter<>(CtLocalVariable.class)) .stream() .filter(ctLocalVariable1 -> ctLocalVariable1.equals(ctLocalVariable)) .findFirst() .get(); CtExpression<?> ctExpression = ValueCreator.generateRandomValue(ctLocalVariable.getType(), 0, localVariable.getAssignment()); localVariable.setAssignment(ctExpression); return clone; }); }