package com.aptana.rdt.core.rspec;
import java.util.ArrayList;
import java.util.List;
import org.jruby.ast.FCallNode;
import org.rubypeople.rdt.internal.core.parser.InOrderVisitor;
import org.rubypeople.rdt.internal.core.util.ASTUtil;
public class RSpecStructureCreator extends InOrderVisitor
{
private List<Behavior> behaviors = new ArrayList<Behavior>();
public Object visitFCallNode(FCallNode visited)
{
if (visited.getName().equals("describe"))
{ // start of a behavior
List<String> args = ASTUtil.getArgumentsFromFunctionCall(visited);
String className = args.get(0);
int start = visited.getPosition().getStartOffset();
push(visited, className, start);
}
else if (visited.getName().equals("it"))
{ // start of example for behavior
List<String> args = ASTUtil.getArgumentsFromFunctionCall(visited);
String description = args.get(0);
if (description.startsWith("'") || description.startsWith("\""))
description = description.substring(1);
if (description.endsWith("'") || description.endsWith("\""))
description = new String(description.substring(0, description.length() - 1));
int start = visited.getPosition().getStartOffset();
peek().addExample(new Example(description, start, visited.getPosition().getEndOffset() - start));
}
else if (visited.getName().equals("shared_examples_for"))
{ // start of shared example
List<String> args = ASTUtil.getArgumentsFromFunctionCall(visited);
String description = args.get(0);
int start = visited.getPosition().getStartOffset();
push(visited, description, start);
}
return super.visitFCallNode(visited);
}
private Behavior peek()
{
return behaviors.get(behaviors.size() - 1);
}
private void push(FCallNode visited, String className, int start)
{
behaviors.add(new Behavior(className, start, visited.getPosition().getEndOffset() - start));
}
public Object[] getBehaviors()
{
return behaviors.toArray(new Object[behaviors.size()]);
}
}