![JAR search and dependency download from the Maven repository](/logo.png)
spoon.examples.pathanalysis.processing.WriterProcessor Maven / Gradle / Ivy
The newest version!
package spoon.examples.pathanalysis.processing;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import spoon.processing.AbstractProcessor;
import spoon.processing.Severity;
import spoon.reflect.code.CtNewClass;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.eval.SymbolicEvaluationPath;
import spoon.reflect.eval.SymbolicEvaluationStep;
import spoon.reflect.eval.SymbolicInstance;
import spoon.reflect.reference.CtExecutableReference;
/**
* This example processor reports warnings when a java.io.Writer is not closed
* or is closed twice within a given execution path. Execution paths are
* calculated by the symbolic evaluator (still beta).
*/
public class WriterProcessor extends AbstractProcessor> {
public void process(CtNewClass newWriter) {
if (Writer.class.isAssignableFrom(newWriter.getType().getActualClass())) {
CtMethod> method = newWriter.getParent(CtMethod.class);
// this creates the possible execution paths for the given method
Map, Collection> paths = getFactory()
.Eval().createSymbolicEvaluationPaths(
Arrays.asList(new CtMethod>[] { method }));
// for each path
for (SymbolicEvaluationPath path : paths.get(method)) {
SymbolicInstance> opened = null;
boolean closed = false;
// for each step
for (SymbolicEvaluationStep step : path.getEnterSteps()
.getSteps()) {
CtExecutableReference> e = step.getFrame().getExecutable();
// construction of a java.io.Writer
if (newWriter.equals(step.getFrame().getInvocation())) {
// memorize the (symbolic) instance of java.io.Writer
opened = step.getFrame().getThis();
}
if (Writer.class.isAssignableFrom(e.getDeclaringType()
.getActualClass())) {
// is the previously opened writer being closes?
if (step.getFrame().getThis().equals(opened)
&& e.getSimpleName().equals("close")) {
if (closed) {
// report pb is already closed
getEnvironment().report(
this,
Severity.WARNING,
step.getFrame().getInvocation(),
"the writer created at "
+ newWriter.getPosition()
+ " may be already closed");
return;
}
// memorize the fact that it is closed
closed = true;
}
}
}
// if it has been opened and not closed for this path, we report
// a pb
if (opened != null && !closed) {
getEnvironment().report(this, Severity.WARNING, newWriter,
"this writer is not always closed");
return;
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy