< prev index next >

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java

Print this page
rev 47482 : 8190295: Introduce a new Table builder class
rev 47486 : 8190821: Introduce a new Links builder class


  23  * questions.
  24  */
  25 
  26 package jdk.javadoc.internal.doclets.formats.html;
  27 
  28 import jdk.javadoc.internal.doclets.formats.html.markup.Table;
  29 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
  30 
  31 import java.util.SortedSet;
  32 import java.util.TreeSet;
  33 
  34 import javax.lang.model.element.Element;
  35 import javax.lang.model.element.ExecutableElement;
  36 import javax.lang.model.element.TypeElement;
  37 import javax.lang.model.type.TypeMirror;
  38 
  39 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
  40 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
  41 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
  42 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;

  43 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
  44 import jdk.javadoc.internal.doclets.toolkit.Content;
  45 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
  46 import jdk.javadoc.internal.doclets.toolkit.MethodWriter;
  47 import jdk.javadoc.internal.doclets.toolkit.util.ImplementedMethods;
  48 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
  49 
  50 /**
  51  * Writes method documentation in HTML format.
  52  *
  53  *  <p><b>This is NOT part of any supported API.
  54  *  If you write code that depends on this, you do so at your own risk.
  55  *  This code and its internal interfaces are subject to change or
  56  *  deletion without notice.</b>
  57  *
  58  * @author Robert Field
  59  * @author Atul M Dambalkar
  60  * @author Jamie Ho (rewrite)
  61  * @author Bhavesh Patel (Modified)
  62  */


  91         Content memberTree = writer.getMemberTreeHeader();
  92         writer.addSummaryHeader(this, typeElement, memberTree);
  93         return memberTree;
  94     }
  95 
  96     /**
  97      * {@inheritDoc}
  98      */
  99     @Override
 100     public void addMemberTree(Content memberSummaryTree, Content memberTree) {
 101         writer.addMemberTree(memberSummaryTree, memberTree);
 102     }
 103 
 104     /**
 105      * {@inheritDoc}
 106      */
 107     @Override
 108     public Content getMethodDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) {
 109         memberDetailsTree.addContent(HtmlConstants.START_OF_METHOD_DETAILS);
 110         Content methodDetailsTree = writer.getMemberTreeHeader();
 111         methodDetailsTree.addContent(writer.getMarkerAnchor(
 112                 SectionName.METHOD_DETAIL));
 113         Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
 114                 contents.methodDetailLabel);
 115         methodDetailsTree.addContent(heading);
 116         return methodDetailsTree;
 117     }
 118 
 119     /**
 120      * {@inheritDoc}
 121      */
 122     @Override
 123     public Content getMethodDocTreeHeader(ExecutableElement method, Content methodDetailsTree) {
 124         String erasureAnchor;
 125         if ((erasureAnchor = getErasureAnchor(method)) != null) {
 126             methodDetailsTree.addContent(writer.getMarkerAnchor((erasureAnchor)));
 127         }
 128         methodDetailsTree.addContent(
 129                 writer.getMarkerAnchor(writer.getAnchor(method)));
 130         Content methodDocTree = writer.getMemberTreeHeader();
 131         Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
 132         heading.addContent(name(method));
 133         methodDocTree.addContent(heading);
 134         return methodDocTree;
 135     }
 136 
 137     /**
 138      * Get the signature for the given method.
 139      *
 140      * @param method the method being documented.
 141      * @return a content object for the signature
 142      */
 143     @Override
 144     public Content getSignature(ExecutableElement method) {
 145         Content pre = new HtmlTree(HtmlTag.PRE);
 146         writer.addAnnotationInfo(method, pre);
 147         int annotationLength = pre.charCount();
 148         addModifiers(method, pre);
 149         addTypeParameters(method, pre);


 269                 .addTab(resources.getText("doclet.Static_Methods"), utils::isStatic)
 270                 .addTab(resources.getText("doclet.Instance_Methods"), e -> !utils.isStatic(e))
 271                 .addTab(resources.getText("doclet.Abstract_Methods"), utils::isAbstract)
 272                 .addTab(resources.getText("doclet.Concrete_Methods"), 
 273                         e -> !utils.isAbstract(e) && !utils.isInterface(e.getEnclosingElement()))
 274                 .addTab(resources.getText("doclet.Default_Methods"), 
 275                         e -> !utils.isAbstract(e) && utils.isInterface(e.getEnclosingElement()))
 276                 .addTab(resources.getText("doclet.Deprecated_Methods"), 
 277                         e -> utils.isDeprecated(e) || utils.isDeprecated(typeElement))
 278                 .setTabScriptVariable("methods")
 279                 .setTabScript(i -> "show(" + i + ");")
 280                 .setUseTBody(false)
 281                 .setPutIdFirst(true);
 282     }
 283 
 284     /**
 285      * {@inheritDoc}
 286      */
 287     @Override
 288     public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
 289         memberTree.addContent(writer.getMarkerAnchor(
 290                 SectionName.METHOD_SUMMARY));
 291     }
 292 
 293     /**
 294      * {@inheritDoc}
 295      */
 296     @Override
 297     public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) {
 298         inheritedTree.addContent(writer.getMarkerAnchor(
 299                 SectionName.METHODS_INHERITANCE, configuration.getClassName(typeElement)));
 300     }
 301 
 302     /**
 303      * {@inheritDoc}
 304      */
 305     @Override
 306     public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) {
 307         Content classLink = writer.getPreQualifiedClassLink(
 308                 LinkInfoImpl.Kind.MEMBER, typeElement, false);
 309         Content label;
 310         if (configuration.summarizeOverriddenMethods) {
 311             label = new StringContent(utils.isClass(typeElement)
 312                     ? configuration.getText("doclet.Methods_Declared_In_Class")
 313                     : configuration.getText("doclet.Methods_Declared_In_Interface"));
 314         } else {
 315             label = new StringContent(utils.isClass(typeElement)
 316                     ? configuration.getText("doclet.Methods_Inherited_From_Class")
 317                     : configuration.getText("doclet.Methods_Inherited_From_Interface"));
 318         }


 354             return;
 355         }
 356         Content label = contents.overridesLabel;
 357         LinkInfoImpl.Kind context = LinkInfoImpl.Kind.METHOD_OVERRIDES;
 358 
 359         if (method != null) {
 360             if (utils.isAbstract(holder) && utils.isAbstract(method)){
 361                 //Abstract method is implemented from abstract class,
 362                 //not overridden
 363                 label = contents.specifiedByLabel;
 364                 context = LinkInfoImpl.Kind.METHOD_SPECIFIED_BY;
 365             }
 366             Content dt = HtmlTree.DT(HtmlTree.SPAN(HtmlStyle.overrideSpecifyLabel, label));
 367             dl.addContent(dt);
 368             Content overriddenTypeLink =
 369                     writer.getLink(new LinkInfoImpl(writer.configuration, context, overriddenType));
 370             Content codeOverridenTypeLink = HtmlTree.CODE(overriddenTypeLink);
 371             Content methlink = writer.getLink(
 372                     new LinkInfoImpl(writer.configuration, LinkInfoImpl.Kind.MEMBER,
 373                     holder)
 374                     .where(writer.getName(writer.getAnchor(method))).label(method.getSimpleName()));
 375             Content codeMethLink = HtmlTree.CODE(methlink);
 376             Content dd = HtmlTree.DD(codeMethLink);
 377             dd.addContent(Contents.SPACE);
 378             dd.addContent(writer.contents.inClass);
 379             dd.addContent(Contents.SPACE);
 380             dd.addContent(codeOverridenTypeLink);
 381             dl.addContent(dd);
 382         }
 383     }
 384 
 385     /**
 386      * {@inheritDoc}
 387      */
 388     protected static void addImplementsInfo(HtmlDocletWriter writer,
 389             ExecutableElement method, Content dl) {
 390         Utils utils = writer.utils;
 391         if (utils.isStatic(method) || writer.configuration.nocomment) {
 392             return;
 393         }
 394         Contents contents = writer.contents;


 424      * @param method the method being documented.
 425      * @param htmltree the content tree to which the return type will be added
 426      */
 427     protected void addReturnType(ExecutableElement method, Content htmltree) {
 428         TypeMirror type = utils.getReturnType(method);
 429         if (type != null) {
 430             Content linkContent = writer.getLink(
 431                     new LinkInfoImpl(configuration, LinkInfoImpl.Kind.RETURN_TYPE, type));
 432             htmltree.addContent(linkContent);
 433             htmltree.addContent(Contents.SPACE);
 434         }
 435     }
 436 
 437     /**
 438      * {@inheritDoc}
 439      */
 440     @Override
 441     protected Content getNavSummaryLink(TypeElement typeElement, boolean link) {
 442         if (link) {
 443             if (typeElement == null) {
 444                 return writer.getHyperLink(
 445                         SectionName.METHOD_SUMMARY,
 446                         contents.navMethod);
 447             } else {
 448                 return writer.getHyperLink(
 449                         SectionName.METHODS_INHERITANCE,
 450                         configuration.getClassName(typeElement), contents.navMethod);
 451             }
 452         } else {
 453             return contents.navMethod;
 454         }
 455     }
 456 
 457     /**
 458      * {@inheritDoc}
 459      */
 460     @Override
 461     protected void addNavDetailLink(boolean link, Content liNav) {
 462         if (link) {
 463             liNav.addContent(writer.getHyperLink(
 464                     SectionName.METHOD_DETAIL, contents.navMethod));
 465         } else {
 466             liNav.addContent(contents.navMethod);
 467         }
 468     }
 469 }


  23  * questions.
  24  */
  25 
  26 package jdk.javadoc.internal.doclets.formats.html;
  27 
  28 import jdk.javadoc.internal.doclets.formats.html.markup.Table;
  29 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
  30 
  31 import java.util.SortedSet;
  32 import java.util.TreeSet;
  33 
  34 import javax.lang.model.element.Element;
  35 import javax.lang.model.element.ExecutableElement;
  36 import javax.lang.model.element.TypeElement;
  37 import javax.lang.model.type.TypeMirror;
  38 
  39 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
  40 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
  41 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
  42 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
  43 import jdk.javadoc.internal.doclets.formats.html.markup.Links;
  44 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
  45 import jdk.javadoc.internal.doclets.toolkit.Content;
  46 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
  47 import jdk.javadoc.internal.doclets.toolkit.MethodWriter;
  48 import jdk.javadoc.internal.doclets.toolkit.util.ImplementedMethods;
  49 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
  50 
  51 /**
  52  * Writes method documentation in HTML format.
  53  *
  54  *  <p><b>This is NOT part of any supported API.
  55  *  If you write code that depends on this, you do so at your own risk.
  56  *  This code and its internal interfaces are subject to change or
  57  *  deletion without notice.</b>
  58  *
  59  * @author Robert Field
  60  * @author Atul M Dambalkar
  61  * @author Jamie Ho (rewrite)
  62  * @author Bhavesh Patel (Modified)
  63  */


  92         Content memberTree = writer.getMemberTreeHeader();
  93         writer.addSummaryHeader(this, typeElement, memberTree);
  94         return memberTree;
  95     }
  96 
  97     /**
  98      * {@inheritDoc}
  99      */
 100     @Override
 101     public void addMemberTree(Content memberSummaryTree, Content memberTree) {
 102         writer.addMemberTree(memberSummaryTree, memberTree);
 103     }
 104 
 105     /**
 106      * {@inheritDoc}
 107      */
 108     @Override
 109     public Content getMethodDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) {
 110         memberDetailsTree.addContent(HtmlConstants.START_OF_METHOD_DETAILS);
 111         Content methodDetailsTree = writer.getMemberTreeHeader();
 112         methodDetailsTree.addContent(links.createAnchor(SectionName.METHOD_DETAIL));

 113         Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
 114                 contents.methodDetailLabel);
 115         methodDetailsTree.addContent(heading);
 116         return methodDetailsTree;
 117     }
 118 
 119     /**
 120      * {@inheritDoc}
 121      */
 122     @Override
 123     public Content getMethodDocTreeHeader(ExecutableElement method, Content methodDetailsTree) {
 124         String erasureAnchor;
 125         if ((erasureAnchor = getErasureAnchor(method)) != null) {
 126             methodDetailsTree.addContent(links.createAnchor((erasureAnchor)));
 127         }
 128         methodDetailsTree.addContent(links.createAnchor(writer.getAnchor(method)));

 129         Content methodDocTree = writer.getMemberTreeHeader();
 130         Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
 131         heading.addContent(name(method));
 132         methodDocTree.addContent(heading);
 133         return methodDocTree;
 134     }
 135 
 136     /**
 137      * Get the signature for the given method.
 138      *
 139      * @param method the method being documented.
 140      * @return a content object for the signature
 141      */
 142     @Override
 143     public Content getSignature(ExecutableElement method) {
 144         Content pre = new HtmlTree(HtmlTag.PRE);
 145         writer.addAnnotationInfo(method, pre);
 146         int annotationLength = pre.charCount();
 147         addModifiers(method, pre);
 148         addTypeParameters(method, pre);


 268                 .addTab(resources.getText("doclet.Static_Methods"), utils::isStatic)
 269                 .addTab(resources.getText("doclet.Instance_Methods"), e -> !utils.isStatic(e))
 270                 .addTab(resources.getText("doclet.Abstract_Methods"), utils::isAbstract)
 271                 .addTab(resources.getText("doclet.Concrete_Methods"),
 272                         e -> !utils.isAbstract(e) && !utils.isInterface(e.getEnclosingElement()))
 273                 .addTab(resources.getText("doclet.Default_Methods"),
 274                         e -> !utils.isAbstract(e) && utils.isInterface(e.getEnclosingElement()))
 275                 .addTab(resources.getText("doclet.Deprecated_Methods"),
 276                         e -> utils.isDeprecated(e) || utils.isDeprecated(typeElement))
 277                 .setTabScriptVariable("methods")
 278                 .setTabScript(i -> "show(" + i + ");")
 279                 .setUseTBody(false)
 280                 .setPutIdFirst(true);
 281     }
 282 
 283     /**
 284      * {@inheritDoc}
 285      */
 286     @Override
 287     public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
 288         memberTree.addContent(links.createAnchor(SectionName.METHOD_SUMMARY));

 289     }
 290 
 291     /**
 292      * {@inheritDoc}
 293      */
 294     @Override
 295     public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) {
 296         inheritedTree.addContent(links.createAnchor(
 297                 SectionName.METHODS_INHERITANCE, configuration.getClassName(typeElement)));
 298     }
 299 
 300     /**
 301      * {@inheritDoc}
 302      */
 303     @Override
 304     public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) {
 305         Content classLink = writer.getPreQualifiedClassLink(
 306                 LinkInfoImpl.Kind.MEMBER, typeElement, false);
 307         Content label;
 308         if (configuration.summarizeOverriddenMethods) {
 309             label = new StringContent(utils.isClass(typeElement)
 310                     ? configuration.getText("doclet.Methods_Declared_In_Class")
 311                     : configuration.getText("doclet.Methods_Declared_In_Interface"));
 312         } else {
 313             label = new StringContent(utils.isClass(typeElement)
 314                     ? configuration.getText("doclet.Methods_Inherited_From_Class")
 315                     : configuration.getText("doclet.Methods_Inherited_From_Interface"));
 316         }


 352             return;
 353         }
 354         Content label = contents.overridesLabel;
 355         LinkInfoImpl.Kind context = LinkInfoImpl.Kind.METHOD_OVERRIDES;
 356 
 357         if (method != null) {
 358             if (utils.isAbstract(holder) && utils.isAbstract(method)){
 359                 //Abstract method is implemented from abstract class,
 360                 //not overridden
 361                 label = contents.specifiedByLabel;
 362                 context = LinkInfoImpl.Kind.METHOD_SPECIFIED_BY;
 363             }
 364             Content dt = HtmlTree.DT(HtmlTree.SPAN(HtmlStyle.overrideSpecifyLabel, label));
 365             dl.addContent(dt);
 366             Content overriddenTypeLink =
 367                     writer.getLink(new LinkInfoImpl(writer.configuration, context, overriddenType));
 368             Content codeOverridenTypeLink = HtmlTree.CODE(overriddenTypeLink);
 369             Content methlink = writer.getLink(
 370                     new LinkInfoImpl(writer.configuration, LinkInfoImpl.Kind.MEMBER,
 371                     holder)
 372                     .where(writer.links.getName(writer.getAnchor(method))).label(method.getSimpleName()));
 373             Content codeMethLink = HtmlTree.CODE(methlink);
 374             Content dd = HtmlTree.DD(codeMethLink);
 375             dd.addContent(Contents.SPACE);
 376             dd.addContent(writer.contents.inClass);
 377             dd.addContent(Contents.SPACE);
 378             dd.addContent(codeOverridenTypeLink);
 379             dl.addContent(dd);
 380         }
 381     }
 382 
 383     /**
 384      * {@inheritDoc}
 385      */
 386     protected static void addImplementsInfo(HtmlDocletWriter writer,
 387             ExecutableElement method, Content dl) {
 388         Utils utils = writer.utils;
 389         if (utils.isStatic(method) || writer.configuration.nocomment) {
 390             return;
 391         }
 392         Contents contents = writer.contents;


 422      * @param method the method being documented.
 423      * @param htmltree the content tree to which the return type will be added
 424      */
 425     protected void addReturnType(ExecutableElement method, Content htmltree) {
 426         TypeMirror type = utils.getReturnType(method);
 427         if (type != null) {
 428             Content linkContent = writer.getLink(
 429                     new LinkInfoImpl(configuration, LinkInfoImpl.Kind.RETURN_TYPE, type));
 430             htmltree.addContent(linkContent);
 431             htmltree.addContent(Contents.SPACE);
 432         }
 433     }
 434 
 435     /**
 436      * {@inheritDoc}
 437      */
 438     @Override
 439     protected Content getNavSummaryLink(TypeElement typeElement, boolean link) {
 440         if (link) {
 441             if (typeElement == null) {
 442                 return Links.createLink(
 443                         SectionName.METHOD_SUMMARY,
 444                         contents.navMethod);
 445             } else {
 446                 return links.createLink(
 447                         SectionName.METHODS_INHERITANCE,
 448                         configuration.getClassName(typeElement), contents.navMethod);
 449             }
 450         } else {
 451             return contents.navMethod;
 452         }
 453     }
 454 
 455     /**
 456      * {@inheritDoc}
 457      */
 458     @Override
 459     protected void addNavDetailLink(boolean link, Content liNav) {
 460         if (link) {
 461             liNav.addContent(Links.createLink(
 462                     SectionName.METHOD_DETAIL, contents.navMethod));
 463         } else {
 464             liNav.addContent(contents.navMethod);
 465         }
 466     }
 467 }
< prev index next >