src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java

Fri, 03 Dec 2010 20:31:57 -0800

author
mfang
date
Fri, 03 Dec 2010 20:31:57 -0800
changeset 762
4f086529d05c
parent 554
9d9f26857129
child 766
90af8d87741f
permissions
-rw-r--r--

6522789: [zh_CN] translation of "enclosing class" in doclet is incorrect
Reviewed-by: yhuang

duke@1 1 /*
ohair@554 2 * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@554 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@554 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@554 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 22 * or visit www.oracle.com if you need additional information or have any
ohair@554 23 * questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.doclets.formats.html;
duke@1 27
bpatel@233 28 import java.lang.reflect.Modifier;
bpatel@233 29 import java.util.*;
bpatel@233 30
bpatel@233 31 import com.sun.javadoc.*;
duke@1 32 import com.sun.tools.doclets.internal.toolkit.util.*;
duke@1 33 import com.sun.tools.doclets.internal.toolkit.taglets.*;
duke@1 34
duke@1 35 /**
duke@1 36 * The base class for member writers.
duke@1 37 *
duke@1 38 * @author Robert Field
duke@1 39 * @author Atul M Dambalkar
duke@1 40 * @author Jamie Ho (Re-write)
bpatel@233 41 * @author Bhavesh Patel (Modified)
duke@1 42 */
duke@1 43 public abstract class AbstractMemberWriter {
duke@1 44
duke@1 45 protected boolean printedSummaryHeader = false;
duke@1 46 protected final SubWriterHolderWriter writer;
duke@1 47 protected final ClassDoc classdoc;
duke@1 48 public final boolean nodepr;
duke@1 49
duke@1 50 public AbstractMemberWriter(SubWriterHolderWriter writer,
duke@1 51 ClassDoc classdoc) {
duke@1 52 this.writer = writer;
duke@1 53 this.nodepr = configuration().nodeprecated;
duke@1 54 this.classdoc = classdoc;
duke@1 55 }
duke@1 56
duke@1 57 public AbstractMemberWriter(SubWriterHolderWriter writer) {
duke@1 58 this(writer, null);
duke@1 59 }
duke@1 60
duke@1 61 /*** abstracts ***/
duke@1 62
bpatel@243 63 public abstract void printSummaryLabel();
bpatel@243 64
bpatel@243 65 public abstract void printTableSummary();
bpatel@243 66
bpatel@243 67 public abstract void printSummaryTableHeader(ProgramElementDoc member);
duke@1 68
duke@1 69 public abstract void printInheritedSummaryLabel(ClassDoc cd);
duke@1 70
duke@1 71 public abstract void printSummaryAnchor(ClassDoc cd);
duke@1 72
duke@1 73 public abstract void printInheritedSummaryAnchor(ClassDoc cd);
duke@1 74
duke@1 75 protected abstract void printSummaryType(ProgramElementDoc member);
duke@1 76
duke@1 77 protected void writeSummaryLink(ClassDoc cd, ProgramElementDoc member) {
duke@1 78 writeSummaryLink(LinkInfoImpl.CONTEXT_MEMBER, cd, member);
duke@1 79 }
duke@1 80
duke@1 81 protected abstract void writeSummaryLink(int context,
duke@1 82 ClassDoc cd,
duke@1 83 ProgramElementDoc member);
duke@1 84
duke@1 85 protected abstract void writeInheritedSummaryLink(ClassDoc cd,
duke@1 86 ProgramElementDoc member);
duke@1 87
duke@1 88 protected abstract void writeDeprecatedLink(ProgramElementDoc member);
duke@1 89
duke@1 90 protected abstract void printNavSummaryLink(ClassDoc cd, boolean link);
duke@1 91
duke@1 92 protected abstract void printNavDetailLink(boolean link);
duke@1 93
duke@1 94 /*** ***/
duke@1 95
duke@1 96 protected void print(String str) {
duke@1 97 writer.print(str);
duke@1 98 writer.displayLength += str.length();
duke@1 99 }
duke@1 100
duke@1 101 protected void print(char ch) {
duke@1 102 writer.print(ch);
duke@1 103 writer.displayLength++;
duke@1 104 }
duke@1 105
bpatel@182 106 protected void strong(String str) {
bpatel@182 107 writer.strong(str);
duke@1 108 writer.displayLength += str.length();
duke@1 109 }
duke@1 110
duke@1 111 /**
duke@1 112 * Return a string describing the access modifier flags.
duke@1 113 * Don't include native or synchronized.
duke@1 114 *
duke@1 115 * The modifier names are returned in canonical order, as
duke@1 116 * specified by <em>The Java Language Specification</em>.
duke@1 117 */
duke@1 118 protected String modifierString(MemberDoc member) {
duke@1 119 int ms = member.modifierSpecifier();
duke@1 120 int no = Modifier.NATIVE | Modifier.SYNCHRONIZED;
duke@1 121 return Modifier.toString(ms & ~no);
duke@1 122 }
duke@1 123
duke@1 124 protected String typeString(MemberDoc member) {
duke@1 125 String type = "";
duke@1 126 if (member instanceof MethodDoc) {
duke@1 127 type = ((MethodDoc)member).returnType().toString();
duke@1 128 } else if (member instanceof FieldDoc) {
duke@1 129 type = ((FieldDoc)member).type().toString();
duke@1 130 }
duke@1 131 return type;
duke@1 132 }
duke@1 133
duke@1 134 protected void printModifiers(MemberDoc member) {
duke@1 135 String mod = modifierString(member);
duke@1 136 // According to JLS, we should not be showing public modifier for
duke@1 137 // interface methods.
duke@1 138 if ((member.isField() || member.isMethod()) &&
duke@1 139 writer instanceof ClassWriterImpl &&
duke@1 140 ((ClassWriterImpl) writer).getClassDoc().isInterface()) {
duke@1 141 mod = Util.replaceText(mod, "public", "").trim();
duke@1 142 }
duke@1 143 if(mod.length() > 0) {
duke@1 144 print(mod);
duke@1 145 print(' ');
duke@1 146 }
duke@1 147 }
duke@1 148
duke@1 149 protected String makeSpace(int len) {
duke@1 150 if (len <= 0) {
duke@1 151 return "";
duke@1 152 }
duke@1 153 StringBuffer sb = new StringBuffer(len);
duke@1 154 for(int i = 0; i < len; i++) {
duke@1 155 sb.append(' ');
duke@1 156 }
duke@1 157 return sb.toString();
duke@1 158 }
duke@1 159
duke@1 160 /**
duke@1 161 * Print 'static' if static and type link.
duke@1 162 */
duke@1 163 protected void printStaticAndType(boolean isStatic, Type type) {
duke@1 164 writer.printTypeSummaryHeader();
duke@1 165 if (isStatic) {
duke@1 166 print("static");
duke@1 167 }
duke@1 168 writer.space();
duke@1 169 if (type != null) {
duke@1 170 writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER,
duke@1 171 type));
duke@1 172 }
duke@1 173 writer.printTypeSummaryFooter();
duke@1 174 }
duke@1 175
duke@1 176 /**
duke@1 177 * Print the modifier and type for the member in the member summary.
duke@1 178 *
duke@1 179 * @param member the member to print the type for.
duke@1 180 * @param type the type to print.
duke@1 181 */
duke@1 182 protected void printModifierAndType(ProgramElementDoc member, Type type) {
duke@1 183 writer.printTypeSummaryHeader();
duke@1 184 printModifier(member);
duke@1 185 if (type == null) {
duke@1 186 writer.space();
duke@1 187 if (member.isClass()) {
duke@1 188 print("class");
duke@1 189 } else {
duke@1 190 print("interface");
duke@1 191 }
duke@1 192 } else {
duke@1 193 if (member instanceof ExecutableMemberDoc &&
duke@1 194 ((ExecutableMemberDoc) member).typeParameters().length > 0) {
duke@1 195 //Code to avoid ugly wrapping in member summary table.
duke@1 196 writer.table(0,0,0);
duke@1 197 writer.trAlignVAlign("right", "");
duke@1 198 writer.tdNowrap();
duke@1 199 writer.font("-1");
duke@1 200 writer.code();
duke@1 201 int displayLength = ((AbstractExecutableMemberWriter) this).
duke@1 202 writeTypeParameters((ExecutableMemberDoc) member);
duke@1 203 if (displayLength > 10) {
duke@1 204 writer.br();
duke@1 205 }
duke@1 206 writer.printLink(new LinkInfoImpl(
duke@1 207 LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type));
duke@1 208 writer.codeEnd();
duke@1 209 writer.fontEnd();
duke@1 210 writer.tdEnd();
duke@1 211 writer.trEnd();
duke@1 212 writer.tableEnd();
duke@1 213 } else {
duke@1 214 writer.space();
duke@1 215 writer.printLink(new LinkInfoImpl(
duke@1 216 LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type));
duke@1 217 }
duke@1 218
duke@1 219 }
duke@1 220 writer.printTypeSummaryFooter();
duke@1 221 }
duke@1 222
duke@1 223 private void printModifier(ProgramElementDoc member) {
duke@1 224 if (member.isProtected()) {
duke@1 225 print("protected ");
duke@1 226 } else if (member.isPrivate()) {
duke@1 227 print("private ");
duke@1 228 } else if (!member.isPublic()) { // Package private
duke@1 229 writer.printText("doclet.Package_private");
duke@1 230 print(" ");
duke@1 231 }
duke@1 232 if (member.isMethod() && ((MethodDoc)member).isAbstract()) {
duke@1 233 print("abstract ");
duke@1 234 }
duke@1 235 if (member.isStatic()) {
duke@1 236 print("static");
duke@1 237 }
duke@1 238 }
duke@1 239
bpatel@233 240 /**
bpatel@233 241 * Print the deprecated output for the given member.
bpatel@233 242 *
bpatel@233 243 * @param member the member being documented.
bpatel@233 244 */
bpatel@233 245 protected void printDeprecated(ProgramElementDoc member) {
bpatel@233 246 String output = (new DeprecatedTaglet()).getTagletOutput(member,
bpatel@233 247 writer.getTagletWriterInstance(false)).toString().trim();
bpatel@233 248 if (!output.isEmpty()) {
bpatel@233 249 writer.printMemberDetailsListStartTag();
bpatel@233 250 writer.print(output);
bpatel@233 251 }
bpatel@233 252 }
bpatel@233 253
duke@1 254 protected void printComment(ProgramElementDoc member) {
duke@1 255 if (member.inlineTags().length > 0) {
bpatel@233 256 writer.printMemberDetailsListStartTag();
duke@1 257 writer.dd();
duke@1 258 writer.printInlineComment(member);
bpatel@233 259 writer.ddEnd();
duke@1 260 }
duke@1 261 }
duke@1 262
duke@1 263 protected String name(ProgramElementDoc member) {
duke@1 264 return member.name();
duke@1 265 }
duke@1 266
duke@1 267 protected void printHead(MemberDoc member) {
duke@1 268 writer.h3();
duke@1 269 writer.print(member.name());
duke@1 270 writer.h3End();
duke@1 271 }
duke@1 272
duke@1 273 protected void printFullComment(ProgramElementDoc member) {
duke@1 274 if(configuration().nocomment){
duke@1 275 return;
duke@1 276 }
duke@1 277 writer.dl();
duke@1 278 print(((TagletOutputImpl)
duke@1 279 (new DeprecatedTaglet()).getTagletOutput(member,
duke@1 280 writer.getTagletWriterInstance(false))).toString());
duke@1 281 printCommentAndTags(member);
duke@1 282 writer.dlEnd();
duke@1 283 }
duke@1 284
duke@1 285 protected void printCommentAndTags(ProgramElementDoc member) {
duke@1 286 printComment(member);
duke@1 287 writer.printTags(member);
duke@1 288 }
duke@1 289
duke@1 290 /**
bpatel@233 291 * Write the member footer.
bpatel@233 292 */
bpatel@233 293 protected void printMemberFooter() {
bpatel@233 294 writer.printMemberDetailsListEndTag();
bpatel@233 295 assert !writer.getMemberDetailsListPrinted();
bpatel@233 296 }
bpatel@233 297
bpatel@233 298 /**
duke@1 299 * Forward to containing writer
duke@1 300 */
duke@1 301 public void printSummaryHeader(ClassDoc cd) {
duke@1 302 printedSummaryHeader = true;
duke@1 303 writer.printSummaryHeader(this, cd);
duke@1 304 }
duke@1 305
duke@1 306 /**
duke@1 307 * Forward to containing writer
duke@1 308 */
duke@1 309 public void printInheritedSummaryHeader(ClassDoc cd) {
duke@1 310 writer.printInheritedSummaryHeader(this, cd);
duke@1 311 }
duke@1 312
duke@1 313 /**
duke@1 314 * Forward to containing writer
duke@1 315 */
duke@1 316 public void printInheritedSummaryFooter(ClassDoc cd) {
duke@1 317 writer.printInheritedSummaryFooter(this, cd);
duke@1 318 }
duke@1 319
duke@1 320 /**
duke@1 321 * Forward to containing writer
duke@1 322 */
duke@1 323 public void printSummaryFooter(ClassDoc cd) {
duke@1 324 writer.printSummaryFooter(this, cd);
duke@1 325 }
duke@1 326
duke@1 327 /**
duke@1 328 * Return true if the given <code>ProgramElement</code> is inherited
duke@1 329 * by the class that is being documented.
duke@1 330 *
duke@1 331 * @param ped The <code>ProgramElement</code> being checked.
duke@1 332 * return true if the <code>ProgramElement</code> is being inherited and
duke@1 333 * false otherwise.
duke@1 334 */
duke@1 335 protected boolean isInherited(ProgramElementDoc ped){
duke@1 336 if(ped.isPrivate() || (ped.isPackagePrivate() &&
duke@1 337 ! ped.containingPackage().equals(classdoc.containingPackage()))){
duke@1 338 return false;
duke@1 339 }
duke@1 340 return true;
duke@1 341 }
duke@1 342
duke@1 343
duke@1 344 /**
duke@1 345 * Generate the code for listing the deprecated APIs. Create the table
duke@1 346 * format for listing the API. Call methods from the sub-class to complete
duke@1 347 * the generation.
duke@1 348 */
bpatel@243 349 protected void printDeprecatedAPI(List<Doc> deprmembers, String headingKey, String tableSummary, String[] tableHeader) {
duke@1 350 if (deprmembers.size() > 0) {
bpatel@243 351 writer.tableIndexSummary(tableSummary);
bpatel@243 352 writer.tableCaptionStart();
bpatel@243 353 writer.printText(headingKey);
bpatel@243 354 writer.tableCaptionEnd();
bpatel@243 355 writer.summaryTableHeader(tableHeader, "col");
duke@1 356 for (int i = 0; i < deprmembers.size(); i++) {
duke@1 357 ProgramElementDoc member =(ProgramElementDoc)deprmembers.get(i);
duke@1 358 writer.trBgcolorStyle("white", "TableRowColor");
duke@1 359 writer.summaryRow(0);
duke@1 360 writeDeprecatedLink(member);
duke@1 361 writer.br();
duke@1 362 writer.printNbsps();
duke@1 363 if (member.tags("deprecated").length > 0)
duke@1 364 writer.printInlineDeprecatedComment(member, member.tags("deprecated")[0]);
duke@1 365 writer.space();
duke@1 366 writer.summaryRowEnd();
duke@1 367 writer.trEnd();
duke@1 368 }
duke@1 369 writer.tableEnd();
duke@1 370 writer.space();
duke@1 371 writer.p();
duke@1 372 }
duke@1 373 }
duke@1 374
duke@1 375 /**
duke@1 376 * Print use info.
duke@1 377 */
bpatel@243 378 protected void printUseInfo(List<? extends ProgramElementDoc> mems, String heading, String tableSummary) {
duke@1 379 if (mems == null) {
duke@1 380 return;
duke@1 381 }
jjg@74 382 List<? extends ProgramElementDoc> members = mems;
bpatel@243 383 boolean printedUseTableHeader = false;
duke@1 384 if (members.size() > 0) {
bpatel@243 385 writer.tableIndexSummary(tableSummary);
bpatel@243 386 writer.tableSubCaptionStart();
duke@1 387 writer.print(heading);
bpatel@243 388 writer.tableCaptionEnd();
jjg@74 389 for (Iterator<? extends ProgramElementDoc> it = members.iterator(); it.hasNext(); ) {
jjg@74 390 ProgramElementDoc pgmdoc = it.next();
duke@1 391 ClassDoc cd = pgmdoc.containingClass();
bpatel@243 392 if (!printedUseTableHeader) {
bpatel@243 393 // Passing ProgramElementDoc helps decides printing
bpatel@243 394 // interface or class header in case of nested classes.
bpatel@243 395 this.printSummaryTableHeader(pgmdoc);
bpatel@243 396 printedUseTableHeader = true;
bpatel@243 397 }
duke@1 398
duke@1 399 writer.printSummaryLinkType(this, pgmdoc);
duke@1 400 if (cd != null && !(pgmdoc instanceof ConstructorDoc)
duke@1 401 && !(pgmdoc instanceof ClassDoc)) {
duke@1 402 // Add class context
bpatel@182 403 writer.strong(cd.name() + ".");
duke@1 404 }
duke@1 405 writeSummaryLink(
duke@1 406 pgmdoc instanceof ClassDoc ?
duke@1 407 LinkInfoImpl.CONTEXT_CLASS_USE : LinkInfoImpl.CONTEXT_MEMBER,
duke@1 408 cd, pgmdoc);
duke@1 409 writer.printSummaryLinkComment(this, pgmdoc);
duke@1 410 }
duke@1 411 writer.tableEnd();
duke@1 412 writer.space();
duke@1 413 writer.p();
duke@1 414 }
duke@1 415 }
duke@1 416
mcimadamore@184 417 protected void navDetailLink(List<?> members) {
duke@1 418 printNavDetailLink(members.size() > 0? true: false);
duke@1 419 }
duke@1 420
duke@1 421
mcimadamore@184 422 protected void navSummaryLink(List<?> members,
duke@1 423 VisibleMemberMap visibleMemberMap) {
duke@1 424 if (members.size() > 0) {
duke@1 425 printNavSummaryLink(null, true);
duke@1 426 return;
duke@1 427 } else {
duke@1 428 ClassDoc icd = classdoc.superclass();
duke@1 429 while (icd != null) {
mcimadamore@184 430 List<?> inhmembers = visibleMemberMap.getMembersFor(icd);
duke@1 431 if (inhmembers.size() > 0) {
duke@1 432 printNavSummaryLink(icd, true);
duke@1 433 return;
duke@1 434 }
duke@1 435 icd = icd.superclass();
duke@1 436 }
duke@1 437 }
duke@1 438 printNavSummaryLink(null, false);
duke@1 439 }
duke@1 440
duke@1 441 protected void serialWarning(SourcePosition pos, String key, String a1, String a2) {
duke@1 442 if (configuration().serialwarn) {
duke@1 443 ConfigurationImpl.getInstance().getDocletSpecificMsg().warning(pos, key, a1, a2);
duke@1 444 }
duke@1 445 }
duke@1 446
duke@1 447 public ProgramElementDoc[] eligibleMembers(ProgramElementDoc[] members) {
duke@1 448 return nodepr? Util.excludeDeprecatedMembers(members): members;
duke@1 449 }
duke@1 450
duke@1 451 public ConfigurationImpl configuration() {
duke@1 452 return writer.configuration;
duke@1 453 }
duke@1 454
duke@1 455 /**
duke@1 456 * {@inheritDoc}
duke@1 457 */
duke@1 458 public void writeMemberSummary(ClassDoc classDoc, ProgramElementDoc member,
duke@1 459 Tag[] firstSentenceTags, boolean isFirst, boolean isLast) {
duke@1 460 writer.printSummaryLinkType(this, member);
duke@1 461 writeSummaryLink(classDoc, member);
duke@1 462 writer.printSummaryLinkComment(this, member, firstSentenceTags);
duke@1 463 }
duke@1 464 }

mercurial