package com.aptana.rdt.internal.parser.warnings;
import java.util.List;
import org.jruby.ast.IterNode;
import org.jruby.ast.ListNode;
import org.jruby.ast.LocalAsgnNode;
import org.jruby.ast.MultipleAsgnNode;
import org.jruby.ast.Node;
import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor;
import com.aptana.rdt.AptanaRDTPlugin;
import com.aptana.rdt.IProblem;
public class DynamicVariableAliasesLocal extends RubyLintVisitor {
public DynamicVariableAliasesLocal(String contents) {
super(AptanaRDTPlugin.getDefault().getOptions(), contents);
}
@Override
protected String getOptionKey() {
return AptanaRDTPlugin.COMPILER_PB_DYNAMIC_VARIABLE_ALIASES_LOCAL;
}
@Override
public Object visitIterNode(IterNode iVisited) {
checkNode(iVisited.getVarNode());
return super.visitIterNode(iVisited);
}
@Override
protected int getProblemID() {
return IProblem.DynamicVariableAliasesLocal;
}
private void checkNode(Node varNode) {
if (varNode == null) return;
if (varNode instanceof ListNode) {
checkListNode((ListNode)varNode);
} else if (varNode instanceof MultipleAsgnNode) {
MultipleAsgnNode multi = (MultipleAsgnNode) varNode;
checkList(multi.childNodes());
} else if (varNode instanceof LocalAsgnNode) {
createProblem(varNode.getPosition(), "Dynamic variable aliases local");
}
}
private void checkListNode(ListNode node) {
checkList(node.childNodes());
}
private void checkList(List<Node> list) {
for (Node childNode : list) {
checkNode(childNode);
}
}
}