package org.radrails.rails.internal.parser.warnings;
import org.jruby.ast.ClassNode;
import org.jruby.ast.Colon3Node;
import org.jruby.ast.InstVarNode;
import org.jruby.ast.RootNode;
import org.radrails.rails.core.IDeprecationProblems;
import org.radrails.rails.internal.core.RailsPlugin;
import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor;
public class InternalInstanceVariableReference extends RubyLintVisitor {
private boolean inController = false;
private final static String[] DEPRECATED = new String[] { "@params", "@session", "@flash", "@request", "@cookies", "@headers", "@response"};
public InternalInstanceVariableReference() {
super(RailsPlugin.getInstance().getOptions(), "");
}
@Override
public Object visitRootNode(RootNode visited)
{
inController = false;
return super.visitRootNode(visited);
}
@Override
protected int getProblemID() {
return IDeprecationProblems.DeprecatedInstanceVariableReferences;
}
@Override
protected String getOptionKey() {
return RailsPlugin.RAILS_DEPRECATION_INSTANCE_VARIABLES;
}
@Override
public Object visitClassNode(ClassNode iVisited) {
Colon3Node node = iVisited.getCPath();
String name = node.getName();
if (name.endsWith("Controller")) {
inController = true;
}
return super.visitClassNode(iVisited);
}
@Override
public void exitClassNode(ClassNode iVisited) {
inController = false;
super.exitClassNode(iVisited);
}
@Override
public Object visitInstVarNode(InstVarNode iVisited) {
if (inController) {
String name = iVisited.getName();
for (int i = 0; i < DEPRECATED.length; i++) {
if (!name.equals(DEPRECATED[i])) continue;
createProblem(iVisited.getPosition(),
"Rails Deprecation notice: change references from " + DEPRECATED[i] + " to " + DEPRECATED[i].substring(1));
break;
}
}
return super.visitInstVarNode(iVisited);
}
}