package com.aptana.rdt.internal.parser.warnings; import java.util.HashSet; import java.util.Set; import org.jruby.ast.HashNode; import org.jruby.ast.ListNode; import org.jruby.ast.Node; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import org.rubypeople.rdt.internal.core.util.ASTUtil; import com.aptana.rdt.AptanaRDTPlugin; public class DuplicateHashKeyVisitor extends RubyLintVisitor { public DuplicateHashKeyVisitor(String code) { super(AptanaRDTPlugin.getDefault().getOptions(), code); } @Override protected String getOptionKey() { return AptanaRDTPlugin.COMPILER_PB_DUPLICATE_HASH_KEY; } @Override public Object visitHashNode(HashNode visited) { ListNode list = visited.getListNode(); Set<String> keys = new HashSet<String>(); for (int i = 0; i < list.size(); i++) { if (i % 2 != 0) continue; Node node = list.get(i); String name = ASTUtil.stringValue(node); if (name == null) continue; if (keys.contains(name)) { // FIXME Include the value in position too, need to merge start of key with end of value to generate // proper position. createProblem(node.getPosition(), "Duplicate hash key definition: '" + name + "'"); } keys.add(name); } return super.visitHashNode(visited); } }