/* * @(#)ExecutableMemberSubWriter.java 1.25 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 com.sun.tools.doclets.*; import com.sun.javadoc.*; /** * Print method and constructor info. * * @author Robert Field * @author Atul M Dambalkar */ public abstract class ExecutableMemberSubWriter extends AbstractSubWriter { public ExecutableMemberSubWriter(SubWriterHolderWriter writer, ClassDoc classdoc) { super(writer, classdoc); } public ExecutableMemberSubWriter(SubWriterHolderWriter writer) { super(writer); } protected void printSignature(ExecutableMemberDoc member) { writer.displayLength = 0; writer.pre(); printModifiers(member); bold(member.name()); printParameters(member); printExceptions(member); writer.preEnd(); } protected void printDeprecatedLink(ProgramElementDoc member) { ExecutableMemberDoc emd = (ExecutableMemberDoc)member; writer.printClassLink(emd.containingClass(), emd.name() + emd.signature(), emd.qualifiedName() + emd.flatSignature()); } protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) { ExecutableMemberDoc emd = (ExecutableMemberDoc)member; String name = emd.name(); writer.bold(); writer.printClassLink(cd, name + emd.signature(), name, false); writer.boldEnd(); writer.displayLength = name.length(); printParameters(emd); } protected void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member) { ExecutableMemberDoc emd = (ExecutableMemberDoc)member; String name = emd.name(); writer.printClassLink(cd, name + emd.signature(), name, false); } protected void printParam(Parameter param) { printTypedName(param.type(), param.name()); } protected void printParameters(ExecutableMemberDoc member) { int paramstart = 0; print('('); Parameter[] params = member.parameters(); String indent = makeSpace(writer.displayLength); while (paramstart < params.length) { Parameter param = params[paramstart++]; if (!param.name().startsWith("this$")) { printParam(param); break; } } for (int i = paramstart; i < params.length; i++) { writer.print(','); writer.print('\n'); writer.print(indent); printParam(params[i]); } writer.print(')'); } protected void printExceptions(ExecutableMemberDoc member) { ClassDoc[] except = member.thrownExceptions(); if(except.length > 0) { int retlen = getReturnTypeLength(member); String indent = makeSpace(modifierString(member).length() + member.name().length() + retlen - 4); writer.print('\n'); writer.print(indent); writer.print("throws "); indent += " "; writer.printClassLink(except[0]); for(int i = 1; i < except.length; i++) { writer.print(",\n"); writer.print(indent); writer.printClassLink(except[i]); } } } protected int getReturnTypeLength(ExecutableMemberDoc member) { if (member instanceof MethodDoc) { MethodDoc method = (MethodDoc)member; Type rettype = method.returnType(); ClassDoc cd = rettype.asClassDoc(); if (cd == null) { return rettype.typeName().length() + rettype.dimension().length(); } else { return rettype.dimension().length() + ((writer.isCrossClassIncluded(cd))? cd.name().length(): cd.qualifiedName().length()); } } else { // it's a constructordoc return -1; } } protected ClassDoc implementsMethodInIntfac(MethodDoc method, ClassDoc[] intfacs) { for (int i = 0; i < intfacs.length; i++) { MethodDoc[] methods = intfacs[i].methods(); if (methods.length > 0) { for (int j = 0; j < methods.length; j++) { if (methods[j].name().equals(method.name()) && methods[j].signature().equals(method.signature())) { return intfacs[i]; } } } } return null; } protected void printParamTags(ParamTag[] params) { if (params.length > 0) { writer.dt(); writer.boldText("doclet.Parameters"); for (int i = 0; i < params.length; ++i) { ParamTag pt = params[i]; writer.dd(); writer.code(); print(pt.parameterName()); writer.codeEnd(); print(" - "); writer.printInlineComment(pt); } } } protected void printThrowsTags(ThrowsTag[] thrown) { if (thrown.length > 0) { writer.dt(); writer.boldText("doclet.Throws"); for (int i = 0; i < thrown.length; ++i) { ThrowsTag tt = thrown[i]; writer.dd(); ClassDoc cd = tt.exception(); if (cd == null) { writer.print(writer.codeText(tt.exceptionName())); } else { writer.print(writer.codeText(writer.getClassLink(cd))); } print(" - "); writer.printInlineComment(tt); } } } protected String name(ProgramElementDoc member) { return member.name() + "()"; } protected void printBodyHtmlEnd(ClassDoc cd) { } protected void printMember(ProgramElementDoc member) { ExecutableMemberDoc emd = (ExecutableMemberDoc)member; String name = emd.name(); writer.anchor(name + emd.signature()); printHead(emd); printSignature(emd); printFullComment(emd); } }