package org.rubypeople.rdt.internal.core.parser.warnings;
import org.jruby.ast.DefnNode;
import org.jruby.ast.DefsNode;
import org.jruby.ast.IfNode;
import org.jruby.ast.IterNode;
import org.jruby.ast.NilImplicitNode;
import org.jruby.ast.Node;
import org.jruby.ast.WhenNode;
import org.rubypeople.rdt.core.RubyCore;
import org.rubypeople.rdt.core.parser.warnings.RubyLintVisitor;
public class EmptyStatementVisitor extends RubyLintVisitor
{
public EmptyStatementVisitor(String contents)
{
super(contents);
}
@Override
protected String getOptionKey()
{
return RubyCore.COMPILER_PB_EMPTY_STATEMENT;
}
public Object visitIfNode(IfNode iVisited)
{
if (iVisited.getThenBody() == null && iVisited.getElseBody() == null)
{
createProblem(iVisited.getPosition(), "Empty Conditional Body");
return super.visitIfNode(iVisited);
}
String source = getSourceOfKeywordForIf(iVisited);
Node body = null;
if (source != null && source.trim().startsWith("unless"))
{
body = iVisited.getElseBody();
}
else if (source != null && source.trim().startsWith("if"))
{
body = iVisited.getThenBody();
}
if (body == null)
{
createProblem(iVisited.getPosition(), "Empty Conditional Body");
}
return super.visitIfNode(iVisited);
}
private String getSourceOfKeywordForIf(IfNode iVisited)
{
Node conditionNode = iVisited.getCondition();
Node elseBody = iVisited.getElseBody();
if (elseBody == null)
{
Node thenBody = iVisited.getThenBody();
if (thenBody == null)
return null; // FIXME
if (thenBody.getPosition().getEndOffset() > conditionNode.getPosition().getStartOffset())
{ // condition
return getSource(iVisited.getPosition().getStartOffset(), conditionNode.getPosition().getStartOffset());
}
else
{ // modifier
return getSource(thenBody.getPosition().getEndOffset(), conditionNode.getPosition().getStartOffset());
}
}
else
{
if (elseBody.getPosition().getEndOffset() > conditionNode.getPosition().getStartOffset())
{ // unless condition
return getSource(iVisited.getPosition().getStartOffset(), conditionNode.getPosition().getStartOffset());
}
else
{ // unless modifier
return getSource(elseBody.getPosition().getEndOffset(), conditionNode.getPosition().getStartOffset());
}
}
}
public Object visitDefnNode(DefnNode iVisited)
{
if (iVisited.getBodyNode() == null)
{
createProblem(iVisited.getPosition(), "Empty Method Definition");
}
return super.visitDefnNode(iVisited);
}
public Object visitDefsNode(DefsNode iVisited)
{
if (iVisited.getBodyNode() == null)
{
createProblem(iVisited.getPosition(), "Empty Method Definition");
}
return super.visitDefsNode(iVisited);
}
public Object visitWhenNode(WhenNode iVisited)
{
if (iVisited.getBodyNode() == null || iVisited.getBodyNode().equals(NilImplicitNode.NIL))
{
createProblem(iVisited.getPosition(), "Empty When Body");
}
return super.visitWhenNode(iVisited);
}
public Object visitIterNode(IterNode iVisited)
{
if (iVisited.getBodyNode() == null)
{
createProblem(iVisited.getPosition(), "Empty Block");
}
return super.visitIterNode(iVisited);
}
}