1 23 package org.hammurapi.inspectors; 24 25 import java.util.Collection ; 26 import java.util.HashSet ; 27 import java.util.Iterator ; 28 29 import org.hammurapi.InspectorBase; 30 import org.hammurapi.HammurapiException; 31 import org.hammurapi.InspectorContext; 32 33 import com.pavelvlasov.jsel.Declaration; 34 import com.pavelvlasov.jsel.VariableDefinition; 35 import com.pavelvlasov.jsel.expressions.AssignmentExpression; 36 import com.pavelvlasov.jsel.expressions.ConditionalExpression; 37 import com.pavelvlasov.jsel.expressions.Expression; 38 import com.pavelvlasov.jsel.expressions.ExpressionList; 39 import com.pavelvlasov.jsel.expressions.Ident; 40 import com.pavelvlasov.jsel.expressions.LogicalOr; 41 import com.pavelvlasov.jsel.statements.ForStatement; 42 import com.pavelvlasov.review.SourceMarker; 43 import com.pavelvlasov.util.AccumulatingVisitorExceptionSink; 44 import com.pavelvlasov.util.DispatchingVisitor; 45 import com.pavelvlasov.util.Visitable; 46 47 54 public class ForLoopControlVariablesRule extends InspectorBase { 55 56 60 public static class Snooper { 61 62 65 private Collection names; 66 private InspectorContext context; 67 68 73 public Snooper(final Collection names, InspectorContext context) { 74 this.names=names; 75 this.context=context; 76 } 77 78 83 public void visit(AssignmentExpression element) { 84 if (!(element instanceof LogicalOr || element instanceof ConditionalExpression)) { 85 if (element.getOperand(0) instanceof Ident) { 86 Ident ident = (Ident) element.getOperand(0); 87 if (names.contains(ident.getText())) { 88 context.reportViolation((SourceMarker) element); 89 } 90 } 91 } 92 } 93 } 94 95 98 private static final String CHAINED_ERRS = "There have been exceptions (see above)"; 99 100 106 public void visit(ForStatement element) throws HammurapiException { 107 Collection names=new HashSet (); 108 if (element.getInitializer()!=null) { 109 if (element.getInitializer() instanceof Declaration) { 110 getNames((Declaration) element.getInitializer(), names); 111 } else if (element.getInitializer() instanceof ExpressionList) { 112 getNames((ExpressionList) element.getInitializer(), names); 113 } 114 } 115 116 if (!names.isEmpty()) { 117 Snooper rs = new Snooper(names, context); 118 AccumulatingVisitorExceptionSink es = new AccumulatingVisitorExceptionSink(); 122 ((Visitable) element.getStatement()).accept(new DispatchingVisitor(rs, es)); 123 124 if (!es.getExceptions().isEmpty()) { 125 es.dump(); 126 throw new HammurapiException(CHAINED_ERRS); 127 } 128 } 129 } 130 131 138 private void getNames(Declaration element, Collection names) { 139 Iterator it=element.iterator(); 140 while (it.hasNext()) { 141 VariableDefinition vd = (VariableDefinition) it.next(); 142 names.add(vd.getName()); 143 } 144 } 145 146 153 private void getNames(ExpressionList element, Collection names) { 154 Iterator it=element.iterator(); 155 while (it.hasNext()) { 156 Object o=it.next(); 157 if (o instanceof AssignmentExpression 158 && !(o instanceof LogicalOr || o instanceof ConditionalExpression) 159 && ((Expression) o).getOperand(0) instanceof Ident) { 160 names.add(((Ident) ((Expression) o).getOperand(0)).getText()); 161 } 162 } 163 } 164 } 165 | Popular Tags |