package com.aptana.rdt.internal.parser.warnings; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jruby.ast.ArgsNode; import org.jruby.ast.DefnNode; import org.jruby.ast.ListNode; import org.jruby.ast.LocalAsgnNode; import org.jruby.ast.LocalVarNode; import org.jruby.ast.Node; import org.jruby.lexer.yacc.IDESourcePosition; import org.jruby.lexer.yacc.ISourcePosition; import org.rubypeople.rdt.core.compiler.IProblem; import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor; import org.rubypeople.rdt.internal.core.util.ASTUtil; import com.aptana.rdt.AptanaRDTPlugin; public class UnusedParameterVisitor extends RubyLintVisitor { private Map<String, Node> declared; private boolean inArgsNode = false; public UnusedParameterVisitor(String contents) { super(AptanaRDTPlugin.getDefault().getOptions(), contents); declared = new HashMap<String, Node>(); } @Override protected String getOptionKey() { return AptanaRDTPlugin.COMPILER_PB_UNUSED_PARAMETER; } public Object visitDefnNode(DefnNode iVisited) { List<Node> args = getArgs(iVisited.getArgsNode()); for (Node arg : args) { declared.put(ASTUtil.getNameReflectively(arg), arg); } return null; } @Override public Object visitArgsNode(ArgsNode visited) { inArgsNode = true; return super.visitArgsNode(visited); } @Override public void exitArgsNode(ArgsNode visited) { inArgsNode = false; super.exitArgsNode(visited); } @Override public Object visitLocalAsgnNode(LocalAsgnNode iVisited) { if (inArgsNode) { declared.put(iVisited.getName(), iVisited); } return super.visitLocalAsgnNode(iVisited); } public void exitDefnNode(DefnNode iVisited) { for (Node unused : declared.values()) { String name = ASTUtil.getNameReflectively(unused); ISourcePosition original = unused.getPosition(); ISourcePosition pos = new IDESourcePosition(original.getFile(), original.getStartLine(), original.getEndLine(), original.getStartOffset(), original.getStartOffset() + name.length()); createProblem(pos, "Unused Method parameter " + name); } declared.clear(); } private void usedParameter(String name) { declared.remove(name); } private List<Node> getArgs(ArgsNode argsNode) { List<Node> arguments = new ArrayList<Node>(); if (argsNode == null) return arguments; ArgsNode args = (ArgsNode) argsNode; ListNode argList = args.getPre(); if (argList == null) return arguments; for (Iterator<Node> iter = argList.childNodes().iterator(); iter.hasNext();) { Node node = iter.next(); arguments.add(node); } return arguments; } public Object visitLocalVarNode(LocalVarNode iVisited) { usedParameter(iVisited.getName()); return super.visitLocalVarNode(iVisited); } @Override protected int getProblemID() { return IProblem.ArgumentIsNeverUsed; } }