package sharpen.xobotos.api.templates;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclaration;
import sharpen.core.csharp.ast.CSMethodBase;
import sharpen.xobotos.api.TemplateVisitor;
import sharpen.xobotos.api.TemplateVisitor.VisitMode;
import sharpen.xobotos.api.bindings.MethodBinding;
import sharpen.xobotos.config.LocationFilter.Match;
import java.util.List;
public abstract class AbstractMethodTemplate<T extends CSMethodBase> extends MemberTemplate<MethodDeclaration, T> {
@XStreamAlias("binding")
private MethodBinding _binding;
@XStreamImplicit(itemFieldName = "variable")
private List<VariableTemplate> _variables;
@XStreamImplicit(itemFieldName = "parameter")
private List<ParameterTemplate> _parameters;
public List<VariableTemplate> getVariables() {
return unmodifiableOrEmpty(_variables);
}
public List<ParameterTemplate> getParameters() {
return unmodifiableOrEmpty(_parameters);
}
@Override
public MethodBinding getBinding() {
return _binding;
}
public ParameterTemplate findParameterTemplate(int pos) {
if (_parameters == null)
return null;
int index = 0;
for (final ParameterTemplate template : _parameters) {
if (template.getIndex() > 0)
index = template.getIndex();
if (pos == index)
return template;
index++;
}
return null;
}
public VariableTemplate findVariableTemplate(VariableDeclaration node) {
if (_variables == null)
return null;
for (final VariableTemplate template : _variables) {
Match match = template.matches(node);
if (match == Match.POSITIVE)
return template;
else if (match == Match.NEGATIVE)
return null;
}
return null;
}
@Override
public void visit(TemplateVisitor visitor, VisitMode mode) {
super.visit(visitor, mode);
for (final VariableTemplate template : getVariables())
template.visit(visitor, mode);
for (final ParameterTemplate template : getParameters())
template.visit(visitor, mode);
}
}