package sharpen.xobotos.api.actions;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import sharpen.core.csharp.ast.CSMember;
import sharpen.core.csharp.ast.CSTypeDeclaration;
import sharpen.xobotos.api.Filter;
import sharpen.xobotos.api.templates.MemberTemplate;
import sharpen.xobotos.config.LocationFilter.Match;
import sharpen.xobotos.generator.ITypeBuilder;
import sharpen.xobotos.generator.MemberBuilder;
import java.util.List;
public abstract class MemberAction<T extends BodyDeclaration, U extends CSMember, V extends MemberTemplate<T, U>, W extends MemberBuilder<T, U, V>>
extends AbstractAction {
protected abstract Class<T> getNodeType();
protected abstract Class<W> getBuilderType();
@XStreamImplicit(itemFieldName = "filter")
private List<Filter> _filters;
protected Match matchesFilter(T node) {
if (_filters == null)
return Match.POSITIVE;
for (final Filter filter : _filters) {
Match match = filter.matches(node);
if (match != Match.NO_MATCH)
return match;
}
return Match.NO_MATCH;
}
@Override
public void apply(ITypeBuilder parent, CSTypeDeclaration type) {
final Class<T> nodeType = getNodeType();
final Class<W> builderType = getBuilderType();
for (final T member : parent.getBodyDeclarations(nodeType)) {
Match match = matchesFilter(member);
if (match == Match.NEGATIVE)
return;
else if (match != Match.POSITIVE)
continue;
W builder = parent.getMemberBuilder(member, builderType);
if (builder == null)
continue;
apply(parent, builder, member, builder.getMember());
}
}
protected abstract void apply(ITypeBuilder parent, W builder, T node, U member);
}