package sharpen.xobotos.generator; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import sharpen.core.CSharpBuilder; import sharpen.core.csharp.ast.CSAttribute; import sharpen.core.csharp.ast.CSConstructor; import sharpen.core.csharp.ast.CSMember; import sharpen.core.csharp.ast.CSTypeDeclaration; import sharpen.core.framework.BindingUtils; import sharpen.core.framework.CSharpDriver.IBuilderDelegate; import sharpen.core.framework.CSharpDriver.ITypeBuilderDelegate; import sharpen.xobotos.api.templates.AbstractMethodTemplate; import sharpen.xobotos.api.templates.EnumTemplate; import sharpen.xobotos.api.templates.ExtractedEnumTemplate; import sharpen.xobotos.api.templates.MethodTemplate; import sharpen.xobotos.api.templates.TypeTemplate; import sharpen.xobotos.output.OutputMode; import sharpen.xobotos.output.OutputType; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ExtractedEnumBuilder extends MemberBuilder<EnumDeclaration, CSTypeDeclaration, ExtractedEnumTemplate> implements ITypeBuilder { public ExtractedEnumBuilder(EnumTemplate template, OutputType output, EnumDeclaration node) { super(ExtractedEnumTemplate.DEFAULT, CSTypeDeclaration.class, output, node); } @Override public TypeTemplate getTypeTemplate() { return TypeTemplate.DEFAULT; } @Override public AbstractMethodTemplate<?> findMethodTemplate(MethodDeclaration node) { if (node.isConstructor()) return null; else return MethodTemplate.DEFAULT; } @Override public String getNodeName() { return BindingUtils.qualifiedName(getASTNode().resolveBinding()); } @Override protected boolean buildInternal(CSharpBuilder builder, IBuilderDelegate<?> dlg, CSTypeDeclaration type) { ITypeBuilderDelegate delegate = (ITypeBuilderDelegate) dlg; delegate.mapMembers(type, this); if (getOutputMode() == OutputMode.SHARPEN) { // FIXME: Put this back when I'm done. if (!getASTNode().resolveBinding().isNested()) { CSAttribute attr = new CSAttribute("Sharpen.Sharpened"); type.addAttribute(attr); } } else if (getOutputMode() == OutputMode.STUB) { CSAttribute attr = new CSAttribute("Sharpen.Stub"); type.addAttribute(attr); } if (getOutputType().removeStaticConstructor() && type.hasStaticConstructor()) { CSConstructor sctor = type.ensureStaticConstructor(); stubBlock(sctor.body()); sctor.setStub(); } return true; } @Override public void addMember(CSMember member) { getMember().addMember(member); } @Override protected boolean applyActions(CSTypeDeclaration type) { return true; } @Override public <T extends BodyDeclaration> List<T> getBodyDeclarations(Class<T> klass) { List<T> list = new ArrayList<T>(); for (final Object o : getASTNode().bodyDeclarations()) { if (klass.isInstance(o)) list.add(klass.cast(o)); } return Collections.unmodifiableList(list); } @Override public TypeTemplate findTypeTemplate(TypeDeclaration node) { return null; } @Override public EnumTemplate findEnumTemplate(EnumDeclaration node) { return null; } @Override public boolean includeMember(ASTNode node) { if (getOutputType().getModeForMember(node) == OutputMode.NOTHING) return false; return true; } }