1 23 package org.hammurapi.inspectors; 24 25 import java.util.Iterator ; 26 import java.util.LinkedList ; 27 import java.util.List ; 28 29 import org.hammurapi.InspectorBase; 30 import org.hammurapi.HammurapiException; 31 32 import com.pavelvlasov.jsel.statements.ReturnStatement; 33 import com.pavelvlasov.jsel.statements.TryBlock; 34 import com.pavelvlasov.review.SourceMarker; 35 import com.pavelvlasov.util.AccumulatingVisitorExceptionSink; 36 import com.pavelvlasov.util.DispatchingVisitor; 37 import com.pavelvlasov.util.Visitable; 38 39 44 public class ReturnFromFinallyRule extends InspectorBase { 45 46 50 public static class ReturnSnooper { 51 54 List returns=new LinkedList (); 55 56 60 public void visit(ReturnStatement statement) { 61 returns.add(statement); 62 } 63 } 64 65 66 73 public void visit(TryBlock tryBlock) throws HammurapiException { 74 if (tryBlock.getFinallyClause()!=null) { 75 AccumulatingVisitorExceptionSink es=new AccumulatingVisitorExceptionSink(); 76 ReturnSnooper rs=new ReturnSnooper(); 77 ((Visitable) tryBlock.getFinallyClause()).accept(new DispatchingVisitor(rs, es)); 78 79 Iterator it=rs.returns.iterator(); 80 while (it.hasNext()) { 81 context.reportViolation((SourceMarker) it.next()); 82 } 83 84 if (!es.getExceptions().isEmpty()) { 85 es.dump(); 86 throw new HammurapiException("There have been exceptions (see above)"); 87 } 88 } 89 } 90 } 91 | Popular Tags |