package com.aptana.rdt.internal.parser.warnings; import java.util.Map; import org.jruby.ast.DefnNode; import org.jruby.ast.DefsNode; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import org.rubypeople.rdt.internal.core.util.ASTUtil; import com.aptana.rdt.AptanaRDTPlugin; public class TooManyArgumentsVisitor extends RubyLintVisitor { public static final int DEFAULT_MAX_ARGS = 5; private int maxArgLength; public TooManyArgumentsVisitor(String contents) { this(AptanaRDTPlugin.getDefault().getOptions(), contents); } public TooManyArgumentsVisitor(Map<String, String> options, String contents) { super(options, contents); maxArgLength = getInt(AptanaRDTPlugin.COMPILER_PB_MAX_ARGUMENTS, DEFAULT_MAX_ARGS); } 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_ARGUMENTS; } @Override public Object visitDefsNode(DefsNode iVisited) { String[] args = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope()); if (args != null && args.length > maxArgLength) { createProblem(iVisited.getArgsNode().getPosition(), "Too many method arguments: " + args.length); } return super.visitDefsNode(iVisited); } @Override public Object visitDefnNode(DefnNode iVisited) { String[] args = ASTUtil.getArgs(iVisited.getArgsNode(), iVisited.getScope()); if (args != null && args.length > maxArgLength) { createProblem(iVisited.getArgsNode().getPosition(), "Too many method arguments: " + args.length); } return super.visitDefnNode(iVisited); } }