/* * @(#)MethodSubWriter.java 1.27 00/02/02 * * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. * * This software is the proprietary information of Sun Microsystems, Inc. * Use is subject to license terms. * */ package com.sun.tools.doclets.standard; import java.util.*; import com.sun.tools.doclets.*; import com.sun.javadoc.*; /** * * @author Robert Field * @author Atul M Dambalkar */ public class MethodSubWriter extends ExecutableMemberSubWriter { public MethodSubWriter(SubWriterHolderWriter writer, ClassDoc classdoc) { super(writer, classdoc); } public MethodSubWriter(SubWriterHolderWriter writer) { super(writer); } public int getMemberKind() { return VisibleMemberMap.METHODS; } public void printSummaryLabel(ClassDoc cd) { writer.boldText("doclet.Method_Summary"); } public void printSummaryAnchor(ClassDoc cd) { writer.anchor("method_summary"); } public void printInheritedSummaryAnchor(ClassDoc cd) { writer.anchor("methods_inherited_from_class_" + cd.qualifiedName()); } public void printInheritedSummaryLabel(ClassDoc cd) { String classlink = writer.getPreQualifiedClassLink(cd); writer.bold(); writer.printText(cd.isClass()? "doclet.Methods_Inherited_From_Class": "doclet.Methods_Inherited_From_Interface", classlink); writer.boldEnd(); } protected void printSummaryType(ProgramElementDoc member) { MethodDoc meth = (MethodDoc)member; printModifierAndType(meth, meth.returnType()); } protected void printReturnTag(Tag[] returns) { if (returns.length > 0) { writer.dt(); writer.boldText("doclet.Returns"); writer.dd(); writer.printInlineComment(returns[0]); } } protected void printOverridden(ClassDoc overridden, MethodDoc method) { if (overridden != null) { String overriddenclasslink = writer.codeText( writer.getClassLink(overridden)); String methlink = ""; String name = method.name(); writer.dt(); writer.boldText("doclet.Overrides"); writer.dd(); methlink = writer.codeText(writer.getClassLink(overridden, name + method.signature(), name, false)); writer.printText("doclet.in_class", methlink, overriddenclasslink); } } protected void printTags(ProgramElementDoc member) { MethodDoc method = (MethodDoc)member; ParamTag[] params = method.paramTags(); Tag[] returns = method.tags("return"); Tag[] sinces = method.tags("since"); ThrowsTag[] thrown = method.throwsTags(); SeeTag[] sees = method.seeTags(); ClassDoc[] intfacs = member.containingClass().interfaces(); ClassDoc overridden = method.overriddenClass(); if (intfacs.length > 0 || overridden != null) { printTagsInfoHeader(); printImplementsInfo(method); printOverridden(overridden, method); printTagsInfoFooter(); } if (params.length + returns.length + thrown.length + sinces.length + sees.length > 0) { printTagsInfoHeader(); printParamTags(params); printReturnTag(returns); printThrowsTags(thrown); writer.printSinceTag(method); writer.printSeeTags(method); printTagsInfoFooter(); } else { // no tags are specified MethodDoc taggedMeth = new TaggedMethodFinder(). search(method.containingClass(), method); if (taggedMeth != null) { printTagsFromTaggedMethod(taggedMeth); } } } /** * Print @param, @return, @throws and @see tags only. */ protected void printTagsFromTaggedMethod(MethodDoc method) { ParamTag[] params = method.paramTags(); Tag[] returns = method.tags("return"); ThrowsTag[] thrown = method.throwsTags(); SeeTag[] sees = method.seeTags(); ClassDoc cd = method.containingClass(); String classname = writer.codeText(cd.qualifiedName()); writer.dd(); writer.printText(cd.isClass()? "doclet.Following_From_Class": "doclet.Following_From_Interface", classname); writer.ddEnd(); printTagsInfoHeader(); printParamTags(params); printReturnTag(returns); printThrowsTags(thrown); writer.printSeeTags(method); printTagsInfoFooter(); } protected void printTagsInfoHeader() { writer.dd(); writer.dl(); } protected void printTagsInfoFooter() { writer.dlEnd(); writer.ddEnd(); } protected void printImplementsInfo(MethodDoc method) { ClassDoc[] implIntfacs = method.containingClass().interfaces(); if (implIntfacs.length > 0) { MethodDoc implementedMeth = implementedMethod(implIntfacs, method); if (implementedMeth != null) { ClassDoc intfac = implementedMeth.containingClass(); String methlink = ""; String intfaclink = writer.codeText( writer.getClassLink(intfac)); writer.dt(); writer.boldText("doclet.Specified_By"); writer.dd(); methlink = writer.codeText(writer.getDocLink(implementedMeth, implementedMeth.name())); writer.printText("doclet.in_interface", methlink, intfaclink); } } } protected MethodDoc implementedMethod(ClassDoc[] intfacs, MethodDoc method) { for (int i = 0; i < intfacs.length; i++) { MethodDoc found = Util.findMethod(intfacs[i], method); if (found != null) { return found; } ClassDoc[] iin = intfacs[i].interfaces(); found = implementedMethod(iin, method); if (found != null) { return found; } } return null; } protected void printSignature(ExecutableMemberDoc member) { writer.displayLength = 0; writer.pre(); printModifiers(member); printReturnType((MethodDoc)member); bold(member.name()); printParameters(member); printExceptions(member); writer.preEnd(); } protected void printComment(ProgramElementDoc member) { if (member.inlineTags().length > 0) { writer.dd(); writer.printInlineComment(member); } else { MethodDoc method = new CommentedMethodFinder(). search(member.containingClass(), (MethodDoc)member); printCommentFromCommentedMethod(method); } } protected void printCommentFromCommentedMethod(MethodDoc method) { if (method == null) { return; } ClassDoc cd = method.containingClass(); String classlink = writer.codeText(writer.getClassLink(cd)); writer.dd(); writer.boldText(cd.isClass()? "doclet.Description_From_Class": "doclet.Description_From_Interface", classlink); writer.ddEnd(); writer.dd(); writer.printInlineComment(method); } public void printMembersSummary() { List members = new ArrayList(members(classdoc)); if (members.size() > 0) { Collections.sort(members); printSummaryHeader(classdoc); for (int i = 0; i < members.size(); ++i) { MethodDoc member = (MethodDoc)members.get(i); boolean commentChanged = false; String prevRawComment = ""; Tag[] tags = member.inlineTags(); if (tags.length == 0) { prevRawComment = member.getRawCommentText(); MethodDoc meth = new CommentedMethodFinder().search(classdoc, member); if (meth != null) { //set raw comment text for now. member.setRawCommentText(meth.commentText()); commentChanged = true; } } printSummaryMember(classdoc, member); if (commentChanged) { // reset it to prevRawComment. member.setRawCommentText(prevRawComment); } } printSummaryFooter(classdoc); } } protected void printReturnType(MethodDoc method) { Type type = method.returnType(); if (type != null) { printTypeLink(type); print(' '); } } protected void printHeader(ClassDoc cd) { writer.anchor("method_detail"); writer.printTableHeadingBackground(writer. getText("doclet.Method_Detail")); } protected void printNavSummaryLink(ClassDoc cd, boolean link) { if (link) { writer.printHyperLink("", (cd == null)? "method_summary": "methods_inherited_from_class_" + cd.qualifiedName(), writer.getText("doclet.navMethod")); } else { writer.printText("doclet.navMethod"); } } protected void printNavDetailLink(boolean link) { if (link) { writer.printHyperLink("", "method_detail", writer.getText("doclet.navMethod")); } else { writer.printText("doclet.navMethod"); } } }