package com.aptana.rdt.internal.parser.warnings; import org.jruby.ast.AndNode; import org.jruby.ast.Node; import org.jruby.ast.OrNode; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import org.rubypeople.rdt.internal.core.util.ASTUtil; import com.aptana.rdt.AptanaRDTPlugin; public class AndOrUsedOnRighthandAssignment extends RubyLintVisitor { public AndOrUsedOnRighthandAssignment(String contents) { super(AptanaRDTPlugin.getDefault().getOptions(), contents); } @Override protected String getOptionKey() { return AptanaRDTPlugin.COMPILER_PB_ASSIGNMENT_PRECEDENCE; } @Override public Object visitOrNode(OrNode iVisited) { Node leftHand = iVisited.getFirstNode(); if (isAssignment(leftHand)) { createProblem(iVisited.getPosition(), createMessage(iVisited)); } return super.visitOrNode(iVisited); } @Override public Object visitAndNode(AndNode iVisited) { Node leftHand = iVisited.getFirstNode(); if (isAssignment(leftHand)) { createProblem(iVisited.getPosition(), createMessage(iVisited)); } return super.visitAndNode(iVisited); } private String createMessage(Node iVisited) { String type; Node leftHand; Node rightHand; if (iVisited instanceof AndNode) { type = "and"; leftHand = ((AndNode) iVisited).getFirstNode(); rightHand = ((AndNode) iVisited).getSecondNode(); } else { // or type = "or"; leftHand = ((OrNode) iVisited).getFirstNode(); rightHand = ((OrNode) iVisited).getSecondNode(); } StringBuffer message = new StringBuffer(); message.append("Assignment will happen before '"); message.append(type); message.append("' comparison. Assignment looks like: ("); message.append(getSource(leftHand)); message.append(") "); message.append(type); message.append(" ("); message.append(getSource(rightHand)); message.append(")"); return message.toString(); } private boolean isAssignment(Node node) { return ASTUtil.isAssignment(node); } }