package sharpen.xobotos.api.interop.glue; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ClassDefinition extends AbstractTypeDefinition { private final List<MemberEntry> _members; public ClassDefinition(String name, Visibility visibility, boolean hasDeclaration) { super(name, visibility); this._members = new ArrayList<MemberEntry>(); if (hasDeclaration) createDeclaration(); } public static class MemberEntry { public final AbstractDefinition Definition; public final AbstractMember Declaration; public final Visibility Visibility; private MemberEntry(AbstractDefinition definition, AbstractMember declaration, Visibility visibility) { this.Definition = definition; this.Declaration = declaration; this.Visibility = visibility; } } public interface MemberFilter { boolean filter(MemberEntry entry); } public static final MemberFilter DEFINITION_FILTER = new MemberFilter() { @Override public boolean filter(MemberEntry entry) { return entry.Definition != null; } }; public static final MemberFilter DECLARATION_FILTER = new MemberFilter() { @Override public boolean filter(MemberEntry entry) { return entry.Declaration != null; } }; private MemberEntry createEntry(AbstractMember member, Visibility visibility) { if (member instanceof AbstractDefinition) { AbstractDefinition definition = (AbstractDefinition) member; if (hasDeclaration()) return new MemberEntry(definition, definition.getDeclaration(), visibility); else return new MemberEntry(definition, null, visibility); } else { return new MemberEntry(null, member, visibility); } } public List<MemberEntry> getMembers(MemberFilter... filters) { List<MemberEntry> retval = new ArrayList<MemberEntry>(); memberLoop: for (MemberEntry entry : _members) { for (MemberFilter filter : filters) { if (filter.filter(entry)) { retval.add(entry); continue memberLoop; } } } return Collections.unmodifiableList(retval); } public void addMember(AbstractMember member) { _members.add(createEntry(member, member.getVisibility())); } @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override protected ClassDeclaration createDeclaration() { return new ClassDeclaration(this); } }