All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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