package org.rubypeople.rdt.internal.core.parser.warnings; import org.jruby.ast.NilImplicitNode; import org.jruby.ast.WhenNode; 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 Ruby19WhenStatements extends RubyLintVisitor { public Ruby19WhenStatements(String contents) { super(contents); } @Override protected String getOptionKey() { return RubyCore.COMPILER_PB_RUBY_19_WHEN_STATEMENTS; } @Override public Object visitWhenNode(WhenNode iVisited) { if (iVisited.getExpressionNodes() == null) return super.visitWhenNode(iVisited); if (iVisited.getBodyNode() == null) return super.visitWhenNode(iVisited); if (iVisited.getPosition() == null) return super.visitWhenNode(iVisited); int start = iVisited.getPosition().getStartOffset(); ISourcePosition pos = iVisited.getExpressionNodes().getPosition(); if (pos == null) return super.visitWhenNode(iVisited); if (iVisited.getBodyNode().equals(NilImplicitNode.NIL)) return super.visitWhenNode(iVisited); ISourcePosition bodyPosition = iVisited.getBodyNode().getPosition(); if (bodyPosition == null) return super.visitWhenNode(iVisited); String src = getSource(iVisited); src = src.substring(pos.getEndOffset() - start, bodyPosition.getStartOffset() - start); if (src.trim().equals(":")) { int startOffset = pos.getEndOffset() + src.indexOf(":"); int endOffset = startOffset + 1; ISourcePosition position = new IDESourcePosition("", pos.getEndLine(), pos.getEndLine(), startOffset, endOffset); createProblem(position, "':' not supported for when statements in Ruby 1.9. Please use 'then'."); } return super.visitWhenNode(iVisited); } @Override protected String getSeverity() { // TODO Return error on 1.9! return super.getSeverity(); } @Override protected int getProblemID() { return IProblem.ColonAfterWhenStatement; } }