/bundles/plugins-trunk/RubyPlugin/src/org/jedit/ruby/ast/Member.java

# · Java · 318 lines · 208 code · 53 blank · 57 comment · 38 complexity · 9eecb4f613a5b3f8735dd63793e90b45 MD5 · raw file

  1. /*
  2. * Member.java - Ruby file structure member
  3. *
  4. * Copyright 2005 Robert McKinnon
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19. */
  20. package org.jedit.ruby.ast;
  21. import java.util.*;
  22. /**
  23. * Ruby file structure member
  24. *
  25. * @author robmckinnon at users.sourceforge.net
  26. */
  27. public abstract class Member implements Comparable<Member> {
  28. protected static final String SELF = "self";
  29. private static final Member[] EMPTY_MEMBER_ARRAY = new Member[0];
  30. private List<Member> parentPath;
  31. private int parentCount;
  32. private String parentMemberName;
  33. private Member parentMember;
  34. private List<Member> childMembers;
  35. private String shortName;
  36. private String lowerCaseName;
  37. private String name;
  38. private String namespace;
  39. private String compositeNamespace;
  40. private String documentation;
  41. private int startOuterOffset;
  42. private int startOffset;
  43. private int endOffset;
  44. public Member(String name) {
  45. parentCount = -1;
  46. setName(name);
  47. boolean noParameters = name.indexOf("(") == -1;
  48. shortName = noParameters ? name : (new StringTokenizer(name, " (")).nextToken();
  49. }
  50. public int compareTo(Member member) {
  51. return getFullName().compareTo(member.getFullName());
  52. }
  53. public final void setStartOuterOffset(int outerOffset) {
  54. startOuterOffset = outerOffset;
  55. }
  56. public final void setStartOffset(int startOffset) {
  57. this.startOffset = startOffset;
  58. }
  59. public final void setEndOffset(int endOffset) {
  60. this.endOffset = endOffset;
  61. }
  62. public abstract void accept(MemberVisitor visitor);
  63. final void visitChildren(MemberVisitor visitor) {
  64. if (hasChildMembers()) {
  65. for (Member member : getChildMembersAsList()) {
  66. member.accept(visitor);
  67. }
  68. }
  69. }
  70. public final String getNamespace() {
  71. return namespace;
  72. }
  73. public final void setCompositeNamespace(String namespace) {
  74. compositeNamespace = namespace;
  75. }
  76. public final void setNamespace(String namespace) {
  77. this.namespace = namespace;
  78. }
  79. /**
  80. * Returns member name including any
  81. * namespace prefix.
  82. */
  83. public String getFullName() {
  84. if (namespace == null) {
  85. return name;
  86. } else {
  87. return namespace + name;
  88. }
  89. }
  90. public String getDisplayName() {
  91. return getFullName();
  92. }
  93. /**
  94. * Returns composite name for members
  95. * that have been defined in code
  96. * in the form
  97. * module Www::Xxx or class Yyy::Zzz.
  98. */
  99. public final String getCompositeName() {
  100. if (compositeNamespace == null) {
  101. return name;
  102. } else {
  103. return compositeNamespace + name;
  104. }
  105. }
  106. /**
  107. * Returns member name excluding
  108. * any namespace or receiver prefix.
  109. */
  110. public String getName() {
  111. return name;
  112. }
  113. void setName(String name) {
  114. this.name = name;
  115. }
  116. /**
  117. * Returns member name excluding
  118. * any namespace and excluding
  119. * any parameter list or class
  120. * extended from.
  121. */
  122. public String getShortName() {
  123. return shortName;
  124. }
  125. protected void setShortName(String name) {
  126. shortName = name;
  127. }
  128. public final String getLowerCaseName() {
  129. if (lowerCaseName == null) {
  130. String lowerCase = name.toLowerCase();
  131. if (name.equals(lowerCase)) {
  132. lowerCaseName = name;
  133. } else {
  134. lowerCaseName = lowerCase;
  135. }
  136. }
  137. return lowerCaseName;
  138. }
  139. public final int getStartOuterOffset() {
  140. return startOuterOffset;
  141. }
  142. public int getStartOffset() {
  143. return startOffset;
  144. }
  145. public int getEndOffset() {
  146. return endOffset;
  147. }
  148. /**
  149. * Returns true if supplied object
  150. * is a member with the same display name
  151. * and parent member as this member.
  152. */
  153. public boolean equals(Object obj) {
  154. boolean equal = false;
  155. if (obj instanceof Member) {
  156. Member member = ((Member)obj);
  157. boolean displayNamesEqual = getFullName().equals(member.getFullName());
  158. if (displayNamesEqual) {
  159. equal = !hasParentMember() || parentMember.equals(member.parentMember);
  160. }
  161. }
  162. return equal;
  163. }
  164. public int hashCode() {
  165. int code = getFullName().hashCode();
  166. if (hasParentMember()) {
  167. code += getParentMember().hashCode();
  168. }
  169. return code;
  170. }
  171. public final String toString() {
  172. return getFullName();
  173. }
  174. public final boolean hasChildMembers() {
  175. return childMembers != null;
  176. }
  177. public final Member[] getChildMembers() {
  178. if (hasChildMembers()) {
  179. return childMembers.size() == 0 ? EMPTY_MEMBER_ARRAY : childMembers.toArray(new Member[childMembers.size()]);
  180. } else {
  181. return null;
  182. }
  183. }
  184. public final List<Member> getChildMembersAsList() {
  185. return childMembers;
  186. }
  187. public final void addChildMember(Member member) {
  188. if (childMembers == null) {
  189. childMembers = new ArrayList<Member>();
  190. }
  191. childMembers.add(member);
  192. member.setParentMember(this);
  193. }
  194. public final boolean hasParentMember() {
  195. return parentMember != null && !(parentMember instanceof Root);
  196. }
  197. public final Member getTopMostParent() {
  198. if (hasParentMember()) {
  199. return getTopMostParentOrSelf(getParentMember());
  200. } else {
  201. return null;
  202. }
  203. }
  204. private Member getTopMostParentOrSelf(Member member) {
  205. if (member.hasParentMember()) {
  206. return getTopMostParentOrSelf(member.getParentMember());
  207. } else {
  208. return member;
  209. }
  210. }
  211. /**
  212. * Returns list of member parent hierarchy
  213. * starting with top most parent, ending
  214. * with the member itself.
  215. * <p/>
  216. * If this member has no parent, the list only
  217. * contains this member.
  218. */
  219. public final List<Member> getMemberPath() {
  220. if (parentPath == null) {
  221. List<Member> path = new ArrayList<Member>();
  222. Member current = this;
  223. path.add(current);
  224. while (current.hasParentMember()) {
  225. current = current.getParentMember();
  226. path.add(current);
  227. }
  228. Collections.reverse(path);
  229. parentPath = path;
  230. }
  231. return parentPath;
  232. }
  233. public final int getParentCount() {
  234. if (parentCount == -1) {
  235. parentCount = getMemberPath().size() - 1;
  236. }
  237. return parentCount;
  238. }
  239. public final Member getParentMember() {
  240. return parentMember;
  241. }
  242. public final boolean hasParentMemberName() {
  243. return parentMemberName != null && parentMemberName.length() > 0;
  244. }
  245. public final String getParentMemberName() {
  246. return parentMemberName;
  247. }
  248. public final void setParentMemberName(String parentClass) {
  249. this.parentMemberName = parentClass;
  250. }
  251. public final void setParentMember(Member parentMember) {
  252. this.parentMember = parentMember;
  253. }
  254. public final void setDocumentationComment(String documentation) {
  255. int index = documentation.indexOf("|lt;");
  256. while (index != -1) {
  257. documentation = documentation.substring(0, index) + "&lt;" + documentation.substring(index+4);
  258. index = documentation.indexOf("|lt;");
  259. }
  260. this.documentation = documentation;
  261. }
  262. public String getDocumentation() {
  263. return documentation;
  264. }
  265. }