1 23 package org.hammurapi.inspectors.performance; 24 25 import org.hammurapi.InspectorBase; 26 27 import com.pavelvlasov.jsel.JselException; 28 import com.pavelvlasov.jsel.LanguageElement; 29 import com.pavelvlasov.jsel.VariableDefinition; 30 import com.pavelvlasov.jsel.expressions.Expression; 31 import com.pavelvlasov.jsel.expressions.Parenthesis; 32 import com.pavelvlasov.jsel.expressions.Plus; 33 import com.pavelvlasov.jsel.expressions.PlusAssignment; 34 import com.pavelvlasov.jsel.expressions.StringConstant; 35 import com.pavelvlasov.jsel.expressions.TypeCast; 36 import com.pavelvlasov.review.SourceMarker; 37 38 42 public class StringConcatenationInspector extends InspectorBase { 43 44 public void visit(Plus element) throws JselException { 45 LanguageElement parent = ((LanguageElement) element).getParent(); 46 if (parent instanceof VariableDefinition && ((VariableDefinition) parent).getModifiers().contains("static")) { 47 return; 48 } 49 50 if (element.getTypeSpecification().isKindOf("java.lang.String")) { 51 analyze(element, (Expression) element.getOperand(0), (Expression) element.getOperand(1)); 52 } 53 } 54 55 public void visit(PlusAssignment element) throws JselException { 56 if (((Expression) element.getOperand(0)).getTypeSpecification().isKindOf("java.lang.String")) { 57 analyze(element, (Expression) element.getOperand(0), (Expression) element.getOperand(1)); 58 } 59 } 60 61 private void analyze(Expression e, Expression e1, Expression e2) { 62 if ((e1 instanceof Plus || e2 instanceof Plus) && !(isConstant(e1) && isConstant(e2))) { 65 context.reportViolation((SourceMarker) e); 66 } 67 } 68 69 private boolean isConstant(Expression expr) { 70 return peel(expr) instanceof StringConstant 71 || (peel(expr) instanceof Plus 72 && isConstant(expr.getOperand(0)) 73 && isConstant(expr.getOperand(1))); 74 } 75 76 private Expression peel(Expression expr) { 77 if (expr instanceof TypeCast) { 78 return peel(((TypeCast) expr).getExpression()); 79 } else if (expr instanceof Parenthesis) { 80 return peel((Expression) expr.getOperand(0)); 81 } else { 82 return expr; 83 } 84 } 85 } 86 | Popular Tags |