package com.aptana.rdt.internal.parser.warnings; import java.util.Map; import org.jruby.ast.DefnNode; import org.jruby.ast.DefsNode; import org.jruby.lexer.yacc.ISourcePosition; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import com.aptana.rdt.AptanaRDTPlugin; public class TooManyLinesVisitor extends RubyLintVisitor { public static final int DEFAULT_MAX_LINES = 20; private int maxLines; public TooManyLinesVisitor(String contents) { this(AptanaRDTPlugin.getDefault().getOptions(), contents); } public TooManyLinesVisitor(Map<String, String> options, String contents) { super(options, contents); maxLines = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_LINES, DEFAULT_MAX_LINES); } private int getInt(String key, int defaultValue) { try { return Integer.parseInt((String) fOptions.get(key)); } catch (NumberFormatException e) { return defaultValue; } } @Override protected String getOptionKey() { return AptanaRDTPlugin.COMPILER_PB_CODE_COMPLEXITY_LINES; } @Override public Object visitDefsNode(DefsNode iVisited) { ISourcePosition pos = iVisited.getPosition(); int lines = (pos.getEndLine() - pos.getStartLine()) - 1; if (lines > maxLines) { createProblem(iVisited.getNameNode().getPosition(), "Too many lines in method: " + lines); } return super.visitDefsNode(iVisited); } @Override public Object visitDefnNode(DefnNode iVisited) { ISourcePosition pos = iVisited.getPosition(); int lines = (pos.getEndLine() - pos.getStartLine()) - 1; if (lines > maxLines) { createProblem(iVisited.getNameNode().getPosition(), "Too many lines in method: " + lines); } return super.visitDefnNode(iVisited); } }