package org.rubypeople.rdt.internal.core.parser.warnings; import java.util.List; import org.jruby.ast.HashNode; import org.jruby.ast.ListNode; import org.jruby.ast.Node; import org.jruby.lexer.yacc.IDESourcePosition; import org.jruby.lexer.yacc.ISourcePosition; import org.rubypeople.rdt.core.RubyCore; import org.rubypeople.rdt.core.compiler.IProblem; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; public class Ruby19HashCommaSyntax extends RubyLintVisitor { public Ruby19HashCommaSyntax(String contents) { super(contents); } @Override protected String getOptionKey() { return RubyCore.COMPILER_PB_RUBY_19_HASH_COMMA_SYTNAX; } @Override protected String getSeverity() { // TODO Return error on 1.9! return super.getSeverity(); } @Override public Object visitHashNode(HashNode iVisited) { ListNode list = iVisited.getListNode(); List<Node> children = list.childNodes(); for (int i = 0; i < children.size(); i += 2) { if (children.size() <= (i + 1)) break; Node key = children.get(i); if (key == null) continue; Node value = children.get(i + 1); if (value == null) continue; ISourcePosition pos = key.getPosition(); String between = getSource(pos.getEndOffset(), value.getPosition().getStartOffset()); if (between != null && between.trim().equals(",")) { int start = pos.getEndOffset() + between.indexOf(","); createProblem(new IDESourcePosition("", pos.getEndLine(), pos.getEndLine(), start, start + 1), "',' not allowed to separate keys and values in hashes for Ruby 1.9. Please use '=>'."); } } return super.visitHashNode(iVisited); } @Override protected int getProblemID() { return IProblem.HashCommaSyntax; } }