< prev index next >

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

Print this page

        

@@ -44,16 +44,18 @@
 import jdk.javadoc.internal.doclets.formats.html.markup.Entity;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
 import jdk.javadoc.internal.doclets.formats.html.markup.Links;
+import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
 import jdk.javadoc.internal.doclets.formats.html.markup.Table;
 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
 import jdk.javadoc.internal.doclets.toolkit.Content;
 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
 import jdk.javadoc.internal.doclets.toolkit.Resources;
 import jdk.javadoc.internal.doclets.toolkit.taglets.DeprecatedTaglet;
+import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
 
 import static javax.lang.model.element.Modifier.ABSTRACT;
 import static javax.lang.model.element.Modifier.NATIVE;
 import static javax.lang.model.element.Modifier.PUBLIC;

@@ -217,59 +219,10 @@
      * @param member the member being linked to
      * @return a content tree representing the link
      */
     protected abstract Content getDeprecatedLink(Element member);
 
-    /**
-     * Add the member name to the content tree.
-     *
-     * @param name the member name to be added to the content tree.
-     * @param htmltree the content tree to which the name will be added.
-     */
-    protected void addName(String name, Content htmltree) {
-        htmltree.add(name);
-    }
-
-    /**
-     * Add the modifier for the member. The modifiers are ordered as specified
-     * by <em>The Java Language Specification</em>.
-     *
-     * @param member the member for which the modifier will be added.
-     * @param htmltree the content tree to which the modifier information will be added.
-     */
-    protected void addModifiers(Element member, Content htmltree) {
-        Set<Modifier> set = new TreeSet<>(member.getModifiers());
-
-        // remove the ones we really don't need
-        set.remove(NATIVE);
-        set.remove(SYNCHRONIZED);
-        set.remove(STRICTFP);
-
-        // According to JLS, we should not be showing public modifier for
-        // interface methods.
-        if ((utils.isField(member) || utils.isMethod(member))
-            && ((writer instanceof ClassWriterImpl
-                 && utils.isInterface(((ClassWriterImpl) writer).getTypeElement())  ||
-                 writer instanceof AnnotationTypeWriterImpl) )) {
-            // Remove the implicit abstract and public modifiers
-            if (utils.isMethod(member) &&
-                (utils.isInterface(member.getEnclosingElement()) ||
-                 utils.isAnnotationType(member.getEnclosingElement()))) {
-                set.remove(ABSTRACT);
-                set.remove(PUBLIC);
-            }
-            if (!utils.isMethod(member)) {
-                set.remove(PUBLIC);
-            }
-        }
-        if (!set.isEmpty()) {
-            String mods = set.stream().map(Modifier::toString).collect(Collectors.joining(" "));
-            htmltree.add(mods);
-            htmltree.add(Entity.NO_BREAK_SPACE);
-        }
-    }
-
     protected CharSequence makeSpace(int len) {
         if (len <= 0) {
             return "";
         }
         StringBuilder sb = new StringBuilder(len);

@@ -561,6 +514,183 @@
         if (isLastContent)
             return HtmlTree.LI(HtmlStyle.blockListLast, memberTree);
         else
             return HtmlTree.LI(HtmlStyle.blockList, memberTree);
     }
+
+    /**
+     * A HtmlTree builder for member signatures.
+     */
+    class MemberSignature {
+
+        // The content builder
+        private Content content = new ContentBuilder();
+
+        // Position of last line separator.
+        private int lastNewLine = 0;
+
+        // Threshold for length of type parameters before switching from inline to block representation.
+        private final static int TYPE_PARAMS_MAX_INLINE_LENGTH = 50;
+
+        // Threshold for combined length of modifiers, type params and return type before breaking
+        // it up with a line break before the return type.
+        private final static int RETURN_TYPE_MAX_LINE_LENGTH = 50;
+
+        /**
+         * Create a new member signature tree.
+         *
+         * @param element The element for which to create a signature.
+         */
+        MemberSignature(Element element) {
+            Content annotationInfo = writer.getAnnotationInfo(element.getAnnotationMirrors(), true);
+            if (!annotationInfo.isEmpty()) {
+                content.add(HtmlTree.SPAN(HtmlStyle.annotations, annotationInfo));
+                lastNewLine = content.charCount();
+            }
+            addModifiers(element);
+        }
+
+        /**
+         * Add the modifier for the member. The modifiers are ordered as specified
+         * by <em>The Java Language Specification</em>.
+         *
+         * @param member the member for which the modifier will be added.
+         */
+        void addModifiers(Element member) {
+            Set<Modifier> set = new TreeSet<>(member.getModifiers());
+
+            // remove the ones we really don't need
+            set.remove(NATIVE);
+            set.remove(SYNCHRONIZED);
+            set.remove(STRICTFP);
+
+            // According to JLS, we should not be showing public modifier for
+            // interface methods.
+            if ((utils.isField(member) || utils.isMethod(member))
+                    && ((writer instanceof ClassWriterImpl
+                    && utils.isInterface(((ClassWriterImpl) writer).getTypeElement())  ||
+                    writer instanceof AnnotationTypeWriterImpl) )) {
+                // Remove the implicit abstract and public modifiers
+                if (utils.isMethod(member) &&
+                        (utils.isInterface(member.getEnclosingElement()) ||
+                                utils.isAnnotationType(member.getEnclosingElement()))) {
+                    set.remove(ABSTRACT);
+                    set.remove(PUBLIC);
+                }
+                if (!utils.isMethod(member)) {
+                    set.remove(PUBLIC);
+                }
+            }
+            if (!set.isEmpty()) {
+                String mods = set.stream().map(Modifier::toString).collect(Collectors.joining(" "));
+                content.add(HtmlTree.SPAN(HtmlStyle.modifiers, new StringContent(mods)));
+                content.add(Entity.NO_BREAK_SPACE);
+            }
+        }
+
+        /**
+         * Add the type parameters and return type for an executable member.
+         *
+         * @param typeParameters the content tree containing the type parameters to add.
+         * @param returnType the content tree containing the return type to add.
+         */
+        void addTypeParametersAndReturnType(Content typeParameters, Content returnType) {
+
+            if (!typeParameters.isEmpty()) {
+                // Apply different wrapping strategies for type parameters
+                // depending of combined length of type parameters and return type.
+                int typeParamLength = typeParameters.charCount();
+
+                if (typeParamLength >= TYPE_PARAMS_MAX_INLINE_LENGTH) {
+                    content.add(HtmlTree.SPAN(HtmlStyle.typeParametersLong, typeParameters));
+                } else {
+                    content.add(HtmlTree.SPAN(HtmlStyle.typeParameters, typeParameters));
+                }
+
+                // count below includes modifiers plus type params added above
+                if (charCountFromNewline() + returnType.charCount()> RETURN_TYPE_MAX_LINE_LENGTH) {
+                    content.add(DocletConstants.NL);
+                    lastNewLine = content.charCount();
+                } else {
+                    content.add(Entity.NO_BREAK_SPACE);
+                }
+            }
+
+            content.add(HtmlTree.SPAN(HtmlStyle.returnType, returnType));
+            content.add(Entity.NO_BREAK_SPACE);
+        }
+
+        /**
+         * Add the type information for a non-executable member.
+         *
+         * @param type the type of the member.
+         */
+        void addType(TypeMirror type) {
+            Content typeLink = writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, type));
+            content.add(HtmlTree.SPAN(HtmlStyle.returnType, typeLink));
+            content.add(Entity.NO_BREAK_SPACE);
+        }
+
+        /**
+         * Add the name of a member.
+         *
+         * @param element the member being documented.
+         */
+        void addName(Element element) {
+            HtmlTree nameSpan = new HtmlTree(HtmlTag.SPAN);
+            nameSpan.setStyle(HtmlStyle.memberName);
+            if (configuration.linksource) {
+                Content name = new StringContent(name(element));
+                writer.addSrcLink(element, name, nameSpan);
+            } else {
+                nameSpan.add(name(element));
+            }
+            content.add(nameSpan);
+        }
+
+        /**
+         * Add the parameter and exception information of an executable member.
+         *
+         * @param paramTree the content tree containing the parameter information.
+         * @param exceptionTree the content tree containing the exception information.
+         */
+        void addParametersAndExceptions(Content paramTree, Content exceptionTree) {
+            int indentSize = charCountFromNewline();
+
+            if (paramTree.isEmpty()) {
+                content.add("()");
+            } else {
+                content.add(Entity.ZERO_WIDTH_SPACE);
+                content.add("(");
+                content.add(HtmlTree.SPAN(HtmlStyle.arguments, paramTree));
+                paramTree.add(")");
+            }
+
+            if (!exceptionTree.isEmpty()) {
+                CharSequence indent = makeSpace(indentSize + 1 - 7);
+                content.add(DocletConstants.NL);
+                content.add(indent);
+                content.add("throws ");
+                content.add(HtmlTree.SPAN(HtmlStyle.exceptions, exceptionTree));
+            }
+        }
+
+        /**
+         * Return the number of characters of plain text content since the last newline character.
+         *
+         * @return the number of plain text characters since the last newline character
+         */
+        int charCountFromNewline() {
+            return content.charCount() - lastNewLine;
+        }
+
+        /**
+         * Return a HTML tree containing the member signature.
+         *
+         * @return the member signature
+         */
+        Content toContent() {
+            return HtmlTree.DIV(HtmlStyle.memberSignature, content);
+        }
+
+    }
 }
< prev index next >