1 22 package org.aspectj.tools.doclets.standard; 23 24 import org.aspectj.ajdoc.AdviceDoc; 25 import org.aspectj.ajdoc.AspectDoc; 26 import org.aspectj.tools.ajdoc.Access; 27 28 import com.sun.javadoc.ClassDoc; 29 import com.sun.javadoc.ExecutableMemberDoc; 30 import com.sun.javadoc.MemberDoc; 31 import com.sun.javadoc.ProgramElementDoc; 32 import com.sun.javadoc.Tag; 33 import com.sun.javadoc.Type; 34 import com.sun.tools.doclets.Util; 35 36 import java.util.ArrayList ; 37 import java.util.Collections ; 38 import java.util.HashSet ; 39 import java.util.Iterator ; 40 import java.util.List ; 41 import java.util.Set ; 42 import java.util.TreeMap ; 43 44 public class AdviceSubWriter extends ExecutableMemberSubWriter { 45 46 protected Class delegateClass() { 47 return MethodSubWriter.class; 48 } 49 50 public AdviceSubWriter 51 (com.sun.tools.doclets.standard.SubWriterHolderWriter writer, 52 AspectDoc aspectdoc) 53 { 54 super(writer, aspectdoc); 55 } 56 57 public AdviceSubWriter 58 (com.sun.tools.doclets.standard.SubWriterHolderWriter writer) 59 { 60 super(writer); 61 } 62 63 protected final String keyName() { return "Advice"; } 64 65 protected String where(ProgramElementDoc member) { 66 return getWhere(classdoc, member); 67 } 68 69 public static String getWhere(ClassDoc cd, ProgramElementDoc member) { 70 return getName(cd, (AdviceDoc)member).replace(' ','_').replace('#','-'); 71 } 72 73 protected void printSummaryType(ProgramElementDoc member) { 74 AdviceDoc advice = (AdviceDoc)member; 75 printModifiers(advice); 76 } 77 78 protected void printReturnTag(Tag[] returnsTag) { 79 if (returnsTag.length > 0) { 80 writer.dt(); 81 writer.boldText("doclet.Returns"); 82 writer.dd(); 83 writer.printInlineComment(returnsTag[0]); 84 } 85 } 86 87 protected void printTagsInfoHeader() { 88 writer.dd(); 89 writer.dl(); 90 } 91 92 protected void printTagsInfoFooter() { 93 writer.dlEnd(); 94 writer.ddEnd(); 95 } 96 97 protected void printSignature(ExecutableMemberDoc member) { 98 AdviceDoc advice = (AdviceDoc)member; 99 writer.displayLength = 0; 100 writer.pre(); 101 printReturnType(advice); 102 bold(advice.name()); 103 printParameters(advice); 104 if (advice.isThrowing()) { 105 writer.print(" throwing "); 106 printExtraType(advice.extraType()); 107 } 108 if (advice.isReturning()) { 109 writer.print(" returning "); 110 printExtraType(advice.extraType()); 111 } 112 writer.preEnd(); 113 } 114 115 protected void printExtraType(Type type) { 116 print(' '); 117 print('('); 118 if (type != null) { 119 printTypeLink(type); 120 } 121 print(')'); 122 } 123 124 public static String getName(ClassDoc cd, AdviceDoc advice) { 125 String name = advice.name(); 126 int num = 1; 127 for (Iterator i = staticMembers(cd).iterator(); i.hasNext();) { 128 AdviceDoc ad = (AdviceDoc)i.next(); 129 if (ad.equals(advice)) { 130 break; 131 } 132 if (ad.name().equals(name)) { 133 num++; 134 } 135 } 136 return name + " #" + num; 137 } 138 139 protected String name(ProgramElementDoc member) { 140 return getName(classdoc, (AdviceDoc)member); 141 } 142 143 protected void printParameters(ExecutableMemberDoc member) { 144 Access.printParameters 146 ((com.sun.tools.doclets.standard.ExecutableMemberSubWriter) 147 ((AbstractSubWriter)del()).del(), 148 member); 149 } 150 151 protected void printReturnType(AdviceDoc advice) { 152 Type type = advice.returnType(); 153 if (type != null) { 154 printTypeLink(type); 155 print(' '); 156 } 157 } 158 159 public void nonfinalPrintMember(ProgramElementDoc elem) { 160 AdviceDoc advice = (AdviceDoc)elem; 161 writer.anchor(where(advice)); 162 printHead(advice); 163 printSignature(advice); 164 printFullComment(advice); 165 } 166 167 protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) { 168 ExecutableMemberDoc emd = (ExecutableMemberDoc)member; 169 String name = emd.name(); 170 writer.bold(); 171 writer.printClassLink(cd, where(emd), name, false); 172 writer.boldEnd(); 173 writer.displayLength = name.length(); 174 printParameters(emd); 175 } 176 177 protected void printHead(MemberDoc member) { 178 printHead(name(member)); 179 } 180 181 protected static List staticMembers(ClassDoc classdoc) { 182 if (!(classdoc instanceof AspectDoc)) return Collections.EMPTY_LIST; 183 AdviceDoc[] advice = ((AspectDoc)classdoc).advice(); 184 return advice == null ? Collections.EMPTY_LIST : Util.asList(advice); 185 } 186 187 protected List getMembers(ClassDoc classdoc) { 188 return staticMembers(classdoc); 189 } 190 191 public void printCrosscuts(ClassDoc cd, ProgramElementDoc member) { 192 if (!(cd instanceof AspectDoc)) return; 193 AdviceDoc advice = (AdviceDoc)member; 195 ExecutableMemberDoc[] crosscuts = advice.crosscuts(); 196 if (null != crosscuts && crosscuts.length > 0) { 197 writer.dt(); 198 writer.boldText("doclet.Crosscuts"); 199 Set set = new HashSet (); 200 for (int i = 0; i < crosscuts.length; i++) { 201 set.add(crosscuts[i]); 202 } 203 List list = new ArrayList (set); 204 Collections.sort(list); 205 for (Iterator i = list.iterator(); i.hasNext();) { 206 ExecutableMemberDoc emd = (ExecutableMemberDoc)i.next(); 207 if (null != emd) { 208 writer.dd(); 209 writer.code(); 210 String where = emd instanceof AdviceDoc 211 ? where(emd) 212 : super.where(emd); 213 writer.printClassLink(emd.containingClass(), 214 where, label(emd)); 215 print(" in "); 216 writer.printClassLink(emd.containingClass()); 217 writer.codeEnd(); 218 print('.'); 219 } 220 } 221 } 222 } 223 224 public void printSummaryCrosscuts(ClassDoc cd, 225 ProgramElementDoc member) { 226 227 class CCs extends TreeMap { 228 void add(ExecutableMemberDoc cc) { 229 if (null != cc) { 230 Object o = get(cc.containingClass()); 231 if (o == null) { 232 o = cc; 233 } else if (o instanceof ExecutableMemberDoc) { 234 o = new Integer (2); 235 } else { 236 o = new Integer (((Integer )o).intValue()+1); 237 } 238 put(cc.containingClass(), o); 239 } 240 } 241 } 242 243 ExecutableMemberDoc[] crosscuts = ((AdviceDoc)member).crosscuts(); 244 if (crosscuts.length > 0) { 245 writer.boldText("doclet.Advises"); 246 CCs ccs = new CCs(); 247 for (int i = 0; i < crosscuts.length; i++) { 248 ccs.add(crosscuts[i]); 249 } 250 for (Iterator i = ccs.keySet().iterator(); i.hasNext();) { 251 print(' '); 252 ClassDoc target = (ClassDoc)i.next(); 253 Object o = ccs.get(target); 254 String link; 255 String name = target.name(); 256 if (o instanceof AdviceDoc) { 257 link = where((AdviceDoc)o); 258 } else if (o instanceof ExecutableMemberDoc) { 259 link = super.where((ExecutableMemberDoc)o); 260 } else { 261 link = "method_detail"; 262 name += "(" + o + ")"; 263 } 264 writer.printClassLink(target, link, name); 265 if (i.hasNext()) print(","); 266 } 267 } 268 } 269 270 public boolean hasCrosscuts(ClassDoc classDoc, ProgramElementDoc member) { 271 return true; 272 } 273 } 274 | Popular Tags |