You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AdviceSubWriter.java 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /* -*- Mode: JDE; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2. *
  3. * This file is part of the debugger and core tools for the AspectJ(tm)
  4. * programming language; see http://aspectj.org
  5. *
  6. * The contents of this file are subject to the Mozilla Public License
  7. * Version 1.1 (the "License"); you may not use this file except in
  8. * compliance with the License. You may obtain a copy of the License at
  9. * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
  10. *
  11. * Software distributed under the License is distributed on an "AS IS" basis,
  12. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. * for the specific language governing rights and limitations under the
  14. * License.
  15. *
  16. * The Original Code is AspectJ.
  17. *
  18. * The Initial Developer of the Original Code is Xerox Corporation. Portions
  19. * created by Xerox Corporation are Copyright (C) 1999-2002 Xerox Corporation.
  20. * All Rights Reserved.
  21. */
  22. package org.aspectj.tools.doclets.standard;
  23. import org.aspectj.ajdoc.AdviceDoc;
  24. import org.aspectj.ajdoc.AspectDoc;
  25. import org.aspectj.tools.ajdoc.Access;
  26. import com.sun.javadoc.ClassDoc;
  27. import com.sun.javadoc.ExecutableMemberDoc;
  28. import com.sun.javadoc.MemberDoc;
  29. import com.sun.javadoc.ProgramElementDoc;
  30. import com.sun.javadoc.Tag;
  31. import com.sun.javadoc.Type;
  32. import com.sun.tools.doclets.Util;
  33. import java.util.ArrayList;
  34. import java.util.Collections;
  35. import java.util.HashSet;
  36. import java.util.Iterator;
  37. import java.util.List;
  38. import java.util.Set;
  39. import java.util.TreeMap;
  40. public class AdviceSubWriter extends ExecutableMemberSubWriter {
  41. protected Class delegateClass() {
  42. return MethodSubWriter.class;
  43. }
  44. public AdviceSubWriter
  45. (com.sun.tools.doclets.standard.SubWriterHolderWriter writer,
  46. AspectDoc aspectdoc)
  47. {
  48. super(writer, aspectdoc);
  49. }
  50. public AdviceSubWriter
  51. (com.sun.tools.doclets.standard.SubWriterHolderWriter writer)
  52. {
  53. super(writer);
  54. }
  55. protected final String keyName() { return "Advice"; }
  56. protected String where(ProgramElementDoc member) {
  57. return getWhere(classdoc, member);
  58. }
  59. public static String getWhere(ClassDoc cd, ProgramElementDoc member) {
  60. return getName(cd, (AdviceDoc)member).replace(' ','_').replace('#','-');
  61. }
  62. protected void printSummaryType(ProgramElementDoc member) {
  63. AdviceDoc advice = (AdviceDoc)member;
  64. printModifiers(advice);
  65. }
  66. protected void printReturnTag(Tag[] returnsTag) {
  67. if (returnsTag.length > 0) {
  68. writer.dt();
  69. writer.boldText("doclet.Returns");
  70. writer.dd();
  71. writer.printInlineComment(returnsTag[0]);
  72. }
  73. }
  74. protected void printTagsInfoHeader() {
  75. writer.dd();
  76. writer.dl();
  77. }
  78. protected void printTagsInfoFooter() {
  79. writer.dlEnd();
  80. writer.ddEnd();
  81. }
  82. protected void printSignature(ExecutableMemberDoc member) {
  83. AdviceDoc advice = (AdviceDoc)member;
  84. writer.displayLength = 0;
  85. writer.pre();
  86. printReturnType(advice);
  87. bold(advice.name());
  88. printParameters(advice);
  89. if (advice.isThrowing()) {
  90. writer.print(" throwing ");
  91. printExtraType(advice.extraType());
  92. }
  93. if (advice.isReturning()) {
  94. writer.print(" returning ");
  95. printExtraType(advice.extraType());
  96. }
  97. writer.preEnd();
  98. }
  99. protected void printExtraType(Type type) {
  100. print(' ');
  101. print('(');
  102. if (type != null) {
  103. printTypeLink(type);
  104. }
  105. print(')');
  106. }
  107. public static String getName(ClassDoc cd, AdviceDoc advice) {
  108. String name = advice.name();
  109. int num = 1;
  110. for (Iterator i = staticMembers(cd).iterator(); i.hasNext();) {
  111. AdviceDoc ad = (AdviceDoc)i.next();
  112. if (ad.equals(advice)) {
  113. break;
  114. }
  115. if (ad.name().equals(name)) {
  116. num++;
  117. }
  118. }
  119. return name + " #" + num;
  120. }
  121. protected String name(ProgramElementDoc member) {
  122. return getName(classdoc, (AdviceDoc)member);
  123. }
  124. protected void printParameters(ExecutableMemberDoc member) {
  125. //AdviceDoc advice = (AdviceDoc)member;
  126. Access.printParameters
  127. ((com.sun.tools.doclets.standard.ExecutableMemberSubWriter)
  128. ((AbstractSubWriter)del()).del(),
  129. member);
  130. }
  131. protected void printReturnType(AdviceDoc advice) {
  132. Type type = advice.returnType();
  133. if (type != null) {
  134. printTypeLink(type);
  135. print(' ');
  136. }
  137. }
  138. public void nonfinalPrintMember(ProgramElementDoc elem) {
  139. AdviceDoc advice = (AdviceDoc)elem;
  140. writer.anchor(where(advice));
  141. printHead(advice);
  142. printSignature(advice);
  143. printFullComment(advice);
  144. }
  145. protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
  146. ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
  147. String name = emd.name();
  148. writer.bold();
  149. writer.printClassLink(cd, where(emd), name, false);
  150. writer.boldEnd();
  151. writer.displayLength = name.length();
  152. printParameters(emd);
  153. }
  154. protected void printHead(MemberDoc member) {
  155. printHead(name(member));
  156. }
  157. protected static List staticMembers(ClassDoc classdoc) {
  158. if (!(classdoc instanceof AspectDoc)) return Collections.EMPTY_LIST;
  159. AdviceDoc[] advice = ((AspectDoc)classdoc).advice();
  160. return advice == null ? Collections.EMPTY_LIST : Util.asList(advice);
  161. }
  162. protected List getMembers(ClassDoc classdoc) {
  163. return staticMembers(classdoc);
  164. }
  165. public void printCrosscuts(ClassDoc cd, ProgramElementDoc member) {
  166. if (!(cd instanceof AspectDoc)) return;
  167. //AspectDoc ad = (AspectDoc)cd;
  168. AdviceDoc advice = (AdviceDoc)member;
  169. ExecutableMemberDoc[] crosscuts = advice.crosscuts();
  170. if (null != crosscuts && crosscuts.length > 0) {
  171. writer.dt();
  172. writer.boldText("doclet.Crosscuts");
  173. Set set = new HashSet();
  174. for (int i = 0; i < crosscuts.length; i++) {
  175. set.add(crosscuts[i]);
  176. }
  177. List list = new ArrayList(set);
  178. Collections.sort(list);
  179. for (Iterator i = list.iterator(); i.hasNext();) {
  180. ExecutableMemberDoc emd = (ExecutableMemberDoc)i.next();
  181. if (null != emd) {
  182. writer.dd();
  183. writer.code();
  184. String where = emd instanceof AdviceDoc
  185. ? where(emd)
  186. : super.where(emd);
  187. writer.printClassLink(emd.containingClass(),
  188. where, label(emd));
  189. print(" in ");
  190. writer.printClassLink(emd.containingClass());
  191. writer.codeEnd();
  192. print('.');
  193. }
  194. }
  195. }
  196. }
  197. public void printSummaryCrosscuts(ClassDoc cd,
  198. ProgramElementDoc member) {
  199. class CCs extends TreeMap {
  200. void add(ExecutableMemberDoc cc) {
  201. if (null != cc) {
  202. Object o = get(cc.containingClass());
  203. if (o == null) {
  204. o = cc;
  205. } else if (o instanceof ExecutableMemberDoc) {
  206. o = new Integer(2);
  207. } else {
  208. o = new Integer(((Integer)o).intValue()+1);
  209. }
  210. put(cc.containingClass(), o);
  211. }
  212. }
  213. }
  214. ExecutableMemberDoc[] crosscuts = ((AdviceDoc)member).crosscuts();
  215. if (crosscuts.length > 0) {
  216. writer.boldText("doclet.Advises");
  217. CCs ccs = new CCs();
  218. for (int i = 0; i < crosscuts.length; i++) {
  219. ccs.add(crosscuts[i]);
  220. }
  221. for (Iterator i = ccs.keySet().iterator(); i.hasNext();) {
  222. print(' ');
  223. ClassDoc target = (ClassDoc)i.next();
  224. Object o = ccs.get(target);
  225. String link;
  226. String name = target.name();
  227. if (o instanceof AdviceDoc) {
  228. link = where((AdviceDoc)o);
  229. } else if (o instanceof ExecutableMemberDoc) {
  230. link = super.where((ExecutableMemberDoc)o);
  231. } else {
  232. link = "method_detail";
  233. name += "(" + o + ")";
  234. }
  235. writer.printClassLink(target, link, name);
  236. if (i.hasNext()) print(",");
  237. }
  238. }
  239. }
  240. public boolean hasCrosscuts(ClassDoc classDoc, ProgramElementDoc member) {
  241. return true;
  242. }
  243. }