package sharpen.xobotos.api.actions;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import sharpen.core.csharp.ast.CSAttribute;
import sharpen.core.csharp.ast.CSMember;
import sharpen.core.csharp.ast.CSStringLiteralExpression;
import sharpen.xobotos.api.APIDefinition;
import sharpen.xobotos.api.Visibility;
import sharpen.xobotos.api.templates.MemberTemplate;
import sharpen.xobotos.config.ConfigurationException;
import sharpen.xobotos.generator.ITypeBuilder;
import sharpen.xobotos.generator.MemberBuilder;
import java.util.List;
public abstract class ModifyMember<T extends BodyDeclaration, U extends CSMember, V extends MemberTemplate<T, U>, W extends MemberBuilder<T, U, V>>
extends MemberAction<T, U, V, W> {
@XStreamAlias("visibility")
private Visibility _visibility;
@XStreamImplicit(itemFieldName = "comment")
private List<Comment> _comments;
private static class Comment {
@XStreamAsAttribute
@XStreamAlias("text")
private String _text;
private Object readResolve() {
if (_text == null)
throw new ConfigurationException("<comment> requires 'text' attribute");
return this;
}
public String getText() {
return _text;
}
}
@Override
protected final void apply(ITypeBuilder parent, W builder, T node, U member) {
modify(builder, node, member);
}
public void modify(W builder, T node, U member) {
if (_visibility != null)
member.visibility(APIDefinition.mapVisibility(_visibility));
if (_comments != null) {
for (final Comment comment : _comments) {
CSAttribute attr = new CSAttribute("Sharpen.Comment");
String escaped = "@\"" + comment.getText().replace("\"", "\"\"") + "\"";
attr.addArgument(new CSStringLiteralExpression(escaped));
member.addAttribute(attr);
}
}
}
}