1 package spoon.examples.resource.processing; 2 3 import java.util.ArrayList ; 4 import java.util.HashMap ; 5 import java.util.List ; 6 import java.util.Map ; 7 import java.util.Map.Entry; 8 9 import spoon.examples.resource.src.Resource; 10 import spoon.processing.AbstractManualProcessor; 11 import spoon.processing.Severity; 12 import spoon.reflect.code.CtAbstractInvocation; 13 import spoon.reflect.eval.StepKind; 14 import spoon.reflect.eval.SymbolicEvaluationPath; 15 import spoon.reflect.eval.SymbolicEvaluationStep; 16 import spoon.reflect.reference.CtExecutableReference; 17 import spoon.reflect.reference.CtTypeReference; 18 19 public class ResourceChecker extends AbstractManualProcessor { 20 21 List <CtAbstractInvocation> reported = new ArrayList <CtAbstractInvocation>(); 22 23 void reportWarning(String msg, CtAbstractInvocation invocation) { 24 if (invocation != null && !reported.contains(invocation)) { 25 reported.add(invocation); 26 getFactory().getEnvironment().report(this, Severity.WARNING, 27 invocation, msg); 28 } 29 } 30 31 public void process() { 32 CtTypeReference<Resource> resourceRef = getFactory().Class() 33 .createReference(Resource.class); 34 CtTypeReference<Void > voidType = getFactory().Type().createReference( 35 void.class); 36 CtExecutableReference open = getFactory().Method().createReference( 37 resourceRef, voidType, "open"); 38 CtExecutableReference close = getFactory().Method().createReference( 39 resourceRef, voidType, "close"); 40 CtExecutableReference read = getFactory().Method().createReference( 41 resourceRef, voidType, "read"); 42 for (List <SymbolicEvaluationPath> paths : getFactory().Eval() 43 .createEvaluationPaths(getFactory().Method().getMainMethods()) 44 .values()) { 45 for (SymbolicEvaluationPath path : paths) { 46 Map <String , CtAbstractInvocation> opened = new HashMap <String , CtAbstractInvocation>(); 48 for (SymbolicEvaluationStep step : path.getSteps()) { 49 if (step.getKind() == StepKind.EXIT) 51 continue; 52 String target = step.getFrame().getThis().getId(); 53 if (open.equals(step.getFrame().getExecutable())) { 54 if (opened.containsKey(target)) { 55 reportWarning( 56 "Resource may already have been opened", 57 step.getFrame().getInvocation()); 58 } 59 opened.put(target, step.getFrame().getInvocation()); 60 } 61 if (close.equals(step.getFrame().getExecutable())) { 62 if (!opened.containsKey(target)) { 63 reportWarning( 64 "Resource may not have been opened or may be already closed", 65 step.getFrame().getInvocation()); 66 } 67 opened.remove(target); 68 } 69 if (read.equals(step.getFrame().getExecutable())) { 70 if (!opened.containsKey(target)) { 71 reportWarning( 72 "Resource may not have been opened or may be already closed", 73 step.getFrame().getInvocation()); 74 } 75 } 76 } 77 for (Entry<String , CtAbstractInvocation> e : opened.entrySet()) { 78 reportWarning("Resource may not have been closed", e 79 .getValue()); 80 81 } 82 } 83 } 84 } 85 } 86 | Popular Tags |