/* * 03/21/2010 * * Copyright (C) 2010 Robert Futrell * robert_futrell at users.sourceforge.net * http://fifesoft.com/rsyntaxtextarea * * This library is distributed under a modified BSD license. See the included * RSTALanguageSupport.License.txt file for details. */ package org.fife.rsta.ac.java.rjc.ast; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.fife.rsta.ac.java.rjc.lang.Modifiers; import org.fife.rsta.ac.java.rjc.lexer.Offset; public abstract class AbstractTypeDeclarationNode extends AbstractASTNode implements TypeDeclaration { private Package pkg; private Modifiers modifiers; private TypeDeclaration parentType; private List childTypes; private Offset bodyStartOffs; private Offset bodyEndOffs; private boolean deprecated; private String docComment; // --- "ClassBody"/"InterfaceBody"/EnumConstant fields --- private List memberList; public AbstractTypeDeclarationNode(String name, Offset start) { super(name, start); init(); } public AbstractTypeDeclarationNode(String name, Offset start, Offset end) { super(name, start, end); init(); } public void addMember(Member member) { member.setParentTypeDeclaration(this); memberList.add(member); } public void addTypeDeclaration(TypeDeclaration type) { if (childTypes==null) { childTypes = new ArrayList(1); // Usually small } type.setParentType(this); childTypes.add(type); } public boolean getBodyContainsOffset(int offs) { return offs>=getBodyStartOffset() && offs<getBodyEndOffset(); } public int getBodyEndOffset() { return bodyEndOffs!=null ? bodyEndOffs.getOffset() : Integer.MAX_VALUE; } public int getBodyStartOffset() { return bodyStartOffs==null ? 0 : bodyStartOffs.getOffset(); } public TypeDeclaration getChildType(int index) { return (TypeDeclaration)childTypes.get(index); } /** * {@inheritDoc} */ public TypeDeclaration getChildTypeAtOffset(int offs) { TypeDeclaration typeDec = null; for (int i=0; i<getChildTypeCount(); i++) { TypeDeclaration td = getChildType(i); if (td.getBodyContainsOffset(offs)) { typeDec = td; break; } } return typeDec; } public int getChildTypeCount() { return childTypes==null ? 0 : childTypes.size(); } public String getDocComment() { return docComment; } /** * {@inheritDoc} */ public Iterator getFieldIterator() { List fields = new ArrayList(); for (Iterator i=getMemberIterator(); i.hasNext(); ) { Member member = (Member)i.next(); if (member instanceof Field) { fields.add(member); } } return fields.iterator(); } public Member getMember(int index) { return (Member)memberList.get(index); } public int getMemberCount() { return memberList.size(); } /** * {@inheritDoc} */ public Iterator getMemberIterator() { return memberList.iterator(); } /** * {@inheritDoc} */ public Iterator getMethodIterator() { List methods = new ArrayList(); for (Iterator i=getMemberIterator(); i.hasNext(); ) { Member member = (Member)i.next(); if (member instanceof Method) { methods.add(member); } } return methods.iterator(); } /** * {@inheritDoc} */ public List getMethodsByName(String name) { List methods = new ArrayList(); for (Iterator i=getMemberIterator(); i.hasNext(); ) { Member member = (Member)i.next(); if (member instanceof Method && name.equals(member.getName())) { methods.add(member); } } return methods; } public Modifiers getModifiers() { return modifiers; } /** * {@inheritDoc} */ public String getName(boolean fullyQualified) { String name = getName(); if (fullyQualified) { Package pkg = getPackage(); if (pkg!=null) { name = pkg.getName() + "." + name; } } return name; } /** * {@inheritDoc} */ public Package getPackage() { return pkg; } /** * {@inheritDoc} */ public TypeDeclaration getParentType() { return parentType; } private void init() { memberList = new ArrayList(); } public boolean isDeprecated() { return deprecated; } /** * {@inheritDoc} */ public boolean isStatic() { return modifiers==null ? false : modifiers.isStatic(); } public void setBodyEndOffset(Offset end) { bodyEndOffs = end; } public void setBodyStartOffset(Offset start) { bodyStartOffs = start; } public void setDeprecated(boolean deprecated) { this.deprecated = deprecated; } public void setDocComment(String comment) { docComment = comment; } public void setModifiers(Modifiers modifiers) { this.modifiers = modifiers; } /** * Sets the package this type is in. * * @param pkg The package, or <code>null</code> if this is in the * default package. * @see #getPackage() */ public void setPackage(Package pkg) { this.pkg = pkg; } /** * {@inheritDoc} */ public void setParentType(TypeDeclaration parentType) { this.parentType = parentType; } public String toString() { StringBuffer sb = new StringBuffer(); if (modifiers!=null) { sb.append(modifiers.toString()).append(' '); } sb.append(getTypeString()).append(' '); sb.append(getName()); return sb.toString(); } }