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 }
|