src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -21,19 +21,33 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-package com.sun.tools.doclets.internal.toolkit.builders;
+package jdk.javadoc.internal.doclets.toolkit.builders;
 
-import java.util.*;
 import java.text.MessageFormat;
+import java.util.*;
 
-import com.sun.javadoc.*;
-import com.sun.tools.doclets.internal.toolkit.*;
-import com.sun.tools.doclets.internal.toolkit.util.*;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
 
+import com.sun.source.doctree.DocTree;
+import com.sun.source.doctree.DocTree.Kind;
+import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeWriter;
+import jdk.javadoc.internal.doclets.toolkit.ClassWriter;
+import jdk.javadoc.internal.doclets.toolkit.Content;
+import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
+import jdk.javadoc.internal.doclets.toolkit.WriterFactory;
+import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
+import jdk.javadoc.internal.doclets.toolkit.util.DocFinder;
+import jdk.javadoc.internal.doclets.toolkit.util.Utils;
+import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap;
+import jdk.javadoc.internal.doclets.toolkit.CommentUtils;
+
 /**
  * Builds the member summary.
  *
  *  <p><b>This is NOT part of any supported API.
  *  If you write code that depends on this, you do so at your own risk.

@@ -52,40 +66,39 @@
     public static final String NAME = "MemberSummary";
 
     /**
      * The visible members for the given class.
      */
-    private final VisibleMemberMap[] visibleMemberMaps;
-
+    private final EnumMap<VisibleMemberMap.Kind, VisibleMemberMap> visibleMemberMaps;
     /**
      * The member summary writers for the given class.
      */
-    private MemberSummaryWriter[] memberSummaryWriters;
+    private final EnumMap<VisibleMemberMap.Kind, MemberSummaryWriter> memberSummaryWriters;
 
     /**
      * The type being documented.
      */
-    private final ClassDoc classDoc;
+    private final TypeElement typeElement;
 
     /**
      * Construct a new MemberSummaryBuilder.
      *
      * @param classWriter   the writer for the class whose members are being
      *                      summarized.
      * @param context       the build context.
      */
-    private MemberSummaryBuilder(Context context, ClassDoc classDoc) {
+    private MemberSummaryBuilder(Context context, TypeElement typeElement) {
         super(context);
-        this.classDoc = classDoc;
-        visibleMemberMaps =
-                new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
-        for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
-            visibleMemberMaps[i] =
+        this.typeElement = typeElement;
+        memberSummaryWriters = new EnumMap<>(VisibleMemberMap.Kind.class);
+        visibleMemberMaps = new EnumMap<>(VisibleMemberMap.Kind.class);
+        for (VisibleMemberMap.Kind kind : VisibleMemberMap.Kind.values()) {
+            visibleMemberMaps.put(kind,
                     new VisibleMemberMap(
-                    classDoc,
-                    i,
-                    configuration);
+                    typeElement,
+                    kind,
+                    configuration));
         }
     }
 
     /**
      * Construct a new MemberSummaryBuilder.

@@ -96,19 +109,17 @@
      */
     public static MemberSummaryBuilder getInstance(
             ClassWriter classWriter, Context context)
             throws Exception {
         MemberSummaryBuilder builder = new MemberSummaryBuilder(context,
-                classWriter.getClassDoc());
-        builder.memberSummaryWriters =
-                new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
+                classWriter.getTypeElement());
         WriterFactory wf = context.configuration.getWriterFactory();
-        for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
-                builder.memberSummaryWriters[i] =
-                    builder.visibleMemberMaps[i].noVisibleMembers() ?
-                        null :
-                        wf.getMemberSummaryWriter(classWriter, i);
+        for (VisibleMemberMap.Kind kind : VisibleMemberMap.Kind.values()) {
+            MemberSummaryWriter msw = builder.visibleMemberMaps.get(kind).noVisibleMembers()
+                    ? null
+                    : wf.getMemberSummaryWriter(classWriter, kind);
+            builder.memberSummaryWriters.put(kind, msw);
         }
         return builder;
     }
 
     /**

@@ -120,27 +131,25 @@
      */
     public static MemberSummaryBuilder getInstance(
             AnnotationTypeWriter annotationTypeWriter, Context context)
             throws Exception {
         MemberSummaryBuilder builder = new MemberSummaryBuilder(context,
-                annotationTypeWriter.getAnnotationTypeDoc());
-        builder.memberSummaryWriters =
-                new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
+                annotationTypeWriter.getAnnotationTypeElement());
         WriterFactory wf = context.configuration.getWriterFactory();
-        for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
-                builder.memberSummaryWriters[i] =
-                    builder.visibleMemberMaps[i].noVisibleMembers()?
-                        null :
-                        wf.getMemberSummaryWriter(
-                        annotationTypeWriter, i);
+        for (VisibleMemberMap.Kind kind : VisibleMemberMap.Kind.values()) {
+            MemberSummaryWriter msw = builder.visibleMemberMaps.get(kind).noVisibleMembers()
+                    ? null
+                    : wf.getMemberSummaryWriter(annotationTypeWriter, kind);
+            builder.memberSummaryWriters.put(kind, msw);
         }
         return builder;
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public String getName() {
         return NAME;
     }
 
     /**

@@ -149,24 +158,24 @@
      * @param type the type of visible member map to return.
      * @return the specified visible member map.
      * @throws ArrayIndexOutOfBoundsException when the type is invalid.
      * @see VisibleMemberMap
      */
-    public VisibleMemberMap getVisibleMemberMap(int type) {
-        return visibleMemberMaps[type];
+    public VisibleMemberMap getVisibleMemberMap(VisibleMemberMap.Kind type) {
+        return visibleMemberMaps.get(type);
     }
 
-    /**
+    /**.
      * Return the specified member summary writer.
      *
      * @param type the type of member summary writer to return.
      * @return the specified member summary writer.
      * @throws ArrayIndexOutOfBoundsException when the type is invalid.
      * @see VisibleMemberMap
      */
-    public MemberSummaryWriter getMemberSummaryWriter(int type) {
-        return memberSummaryWriters[type];
+    public MemberSummaryWriter getMemberSummaryWriter(VisibleMemberMap.Kind type) {
+        return memberSummaryWriters.get(type);
     }
 
     /**
      * Returns a list of methods that will be documented for the given class.
      * This information can be used for doclet specific documentation

@@ -174,25 +183,26 @@
      *
      * @param type the type of members to return.
      * @return a list of methods that will be documented.
      * @see VisibleMemberMap
      */
-    public List<ProgramElementDoc> members(int type) {
-        return visibleMemberMaps[type].getLeafClassMembers(configuration);
+    public SortedSet<Element> members(VisibleMemberMap.Kind type) {
+        return visibleMemberMaps.get(type).getLeafClassMembers();
     }
 
     /**
      * Return true it there are any members to summarize.
      *
      * @return true if there are any members to summarize.
      */
+    @Override
     public boolean hasMembersToDocument() {
-        if (classDoc instanceof AnnotationTypeDoc) {
-            return ((AnnotationTypeDoc) classDoc).elements().length > 0;
+        if (utils.isAnnotationType(typeElement)) {
+            return !utils.getAnnotationMethods(typeElement).isEmpty();
         }
-        for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
-            VisibleMemberMap members = visibleMemberMaps[i];
+        for (VisibleMemberMap.Kind kind : VisibleMemberMap.Kind.values()) {
+            VisibleMemberMap members = visibleMemberMaps.get(kind);
             if (!members.noVisibleMembers()) {
                 return true;
             }
         }
         return false;

@@ -204,13 +214,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildEnumConstantsSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.ENUM_CONSTANTS);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.ENUM_CONSTANTS);
         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
     }
 
     /**
      * Build the summary for fields.

@@ -218,13 +228,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildAnnotationTypeFieldsSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_FIELDS];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_FIELDS);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_FIELDS];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_FIELDS);
         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
     }
 
     /**
      * Build the summary for the optional members.

@@ -232,13 +242,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildAnnotationTypeOptionalMemberSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_MEMBER_OPTIONAL);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_MEMBER_OPTIONAL);
         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
     }
 
     /**
      * Build the summary for the optional members.

@@ -246,13 +256,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildAnnotationTypeRequiredMemberSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_MEMBER_REQUIRED);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.ANNOTATION_TYPE_MEMBER_REQUIRED);
         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
     }
 
     /**
      * Build the summary for the fields.

@@ -260,24 +270,24 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildFieldsSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.FIELDS];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.FIELDS);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.FIELDS];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.FIELDS);
         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
     }
 
     /**
      * Build the summary for the fields.
      */
     public void buildPropertiesSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.PROPERTIES];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.PROPERTIES);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.PROPERTIES];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.PROPERTIES);
         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
     }
 
     /**
      * Build the summary for the nested classes.

@@ -285,13 +295,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildNestedClassesSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.INNERCLASSES];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.INNER_CLASSES);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.INNERCLASSES];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.INNER_CLASSES);
         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
     }
 
     /**
      * Build the method summary.

@@ -299,13 +309,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildMethodsSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.METHODS];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.METHODS);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.METHODS];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.METHODS);
         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
     }
 
     /**
      * Build the constructor summary.

@@ -313,13 +323,13 @@
      * @param node the XML element that specifies which components to document
      * @param memberSummaryTree the content tree to which the documentation will be added
      */
     public void buildConstructorsSummary(XMLNode node, Content memberSummaryTree) {
         MemberSummaryWriter writer =
-                memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS];
+                memberSummaryWriters.get(VisibleMemberMap.Kind.CONSTRUCTORS);
         VisibleMemberMap visibleMemberMap =
-                visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS];
+                visibleMemberMaps.get(VisibleMemberMap.Kind.CONSTRUCTORS);
         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
     }
 
     /**
      * Build the member summary for the given members.

@@ -328,37 +338,39 @@
      * @param visibleMemberMap the given members to summarize.
      * @param summaryTreeList list of content trees to which the documentation will be added
      */
     private void buildSummary(MemberSummaryWriter writer,
             VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
-        List<ProgramElementDoc> members = new ArrayList<>(visibleMemberMap.getLeafClassMembers(
-                configuration));
-        if (members.size() > 0) {
-            Collections.sort(members);
+        SortedSet<Element> members = visibleMemberMap.getLeafClassMembers();
+        if (!members.isEmpty()) {
             List<Content> tableContents = new LinkedList<>();
-            for (int i = 0; i < members.size(); i++) {
-                ProgramElementDoc member = members.get(i);
-                final ProgramElementDoc propertyDoc =
-                            visibleMemberMap.getPropertyMemberDoc(member);
-                if (propertyDoc != null) {
-                    processProperty(visibleMemberMap, member, propertyDoc);
+            int counter = 0;
+            for (Element member : members) {
+                final Element property = visibleMemberMap.getPropertyMemberDoc(member);
+                if (property != null) {
+                    processProperty(visibleMemberMap, member, property);
                 }
-                Tag[] firstSentenceTags = member.firstSentenceTags();
-                if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
+                List<? extends DocTree> firstSentenceTags = utils.getFirstSentenceTrees(member);
+                if (utils.isExecutableElement(member) && firstSentenceTags.isEmpty()) {
                     //Inherit comments from overriden or implemented method if
                     //necessary.
                     DocFinder.Output inheritedDoc =
-                            DocFinder.search(configuration, new DocFinder.Input((MethodDoc) member));
+                            DocFinder.search(configuration,
+                                    new DocFinder.Input(utils, (ExecutableElement) member));
                     if (inheritedDoc.holder != null
-                            && inheritedDoc.holder.firstSentenceTags().length > 0) {
-                        firstSentenceTags = inheritedDoc.holder.firstSentenceTags();
+                            && !utils.getFirstSentenceTrees(inheritedDoc.holder).isEmpty()) {
+                        // let the comment helper know of the overridden element
+                        CommentHelper ch = utils.getCommentHelper(member);
+                        ch.setOverrideElement(inheritedDoc.holder);
+                        firstSentenceTags = utils.getFirstSentenceTrees(inheritedDoc.holder);
                     }
                 }
-                writer.addMemberSummary(classDoc, member, firstSentenceTags,
-                        tableContents, i);
+                writer.addMemberSummary(typeElement, member, firstSentenceTags,
+                        tableContents, counter);
+                counter++;
             }
-            summaryTreeList.add(writer.getSummaryTableTree(classDoc, tableContents));
+            summaryTreeList.add(writer.getSummaryTableTree(typeElement, tableContents));
         }
     }
 
     /**
      * Process the property method, property setter and/or property getter

@@ -368,104 +380,106 @@
      * the see tags if the appropriate property getter and setter are
      * available.
      *
      * @param visibleMemberMap the members information.
      * @param member the member which is to be augmented.
-     * @param propertyDoc the original property documentation.
+     * @param property the original property documentation.
      */
     private void processProperty(VisibleMemberMap visibleMemberMap,
-                                 ProgramElementDoc member,
-                                 ProgramElementDoc propertyDoc) {
-        StringBuilder commentTextBuilder = new StringBuilder();
+                                 Element member,
+                                 Element property) {
+        CommentUtils cmtutils = configuration.cmtutils;
         final boolean isSetter = isSetter(member);
         final boolean isGetter = isGetter(member);
+        List<DocTree> firstSentence = new ArrayList<>();
+        List<DocTree> bodyTags = new ArrayList<>();
+        List<DocTree> blockTags = new ArrayList<>();
         if (isGetter || isSetter) {
             //add "[GS]ets the value of the property PROPERTY_NAME."
             if (isSetter) {
-                commentTextBuilder.append(
-                        MessageFormat.format(
+                String text = MessageFormat.format(
                                 configuration.getText("doclet.PropertySetterWithName"),
-                                utils.propertyNameFromMethodName(configuration, member.name())));
+                        utils.propertyName((ExecutableElement)member));
+                firstSentence.addAll(cmtutils.makeFirstSentenceTree(text));
             }
             if (isGetter) {
-                commentTextBuilder.append(
-                        MessageFormat.format(
+                String text = MessageFormat.format(
                                 configuration.getText("doclet.PropertyGetterWithName"),
-                                utils.propertyNameFromMethodName(configuration, member.name())));
+                        utils.propertyName((ExecutableElement) member));
+                firstSentence.addAll(cmtutils.makeFirstSentenceTree(text));
             }
-            if (propertyDoc.commentText() != null
-                        && !propertyDoc.commentText().isEmpty()) {
-                commentTextBuilder.append(" \n @propertyDescription ");
+            List<? extends DocTree> propertyTags = utils.getBlockTags(property, "propertyDescription");
+            if (propertyTags.isEmpty()) {
+                List<? extends DocTree> comment = utils.getBody(property);
+                blockTags.addAll(cmtutils.makePropertyDescriptionTree(comment));
             }
+        } else {
+            firstSentence.addAll(utils.getBody(property));
         }
-        commentTextBuilder.append(propertyDoc.commentText());
 
         // copy certain tags
-        List<Tag> allTags = new LinkedList<>();
-        String[] tagNames = {"@defaultValue", "@since"};
-        for (String tagName: tagNames) {
-            Tag[] tags = propertyDoc.tags(tagName);
-            if (tags != null) {
-                allTags.addAll(Arrays.asList(tags));
+        List<? extends DocTree> tags = utils.getBlockTags(property, Kind.SINCE);
+        blockTags.addAll(tags);
+
+        List<? extends DocTree> bTags = utils.getBlockTags(property, Kind.UNKNOWN_BLOCK_TAG);
+        CommentHelper ch = utils.getCommentHelper(property);
+        for (DocTree dt : bTags) {
+            String tagName = ch.getTagName(dt);
+            if ( "defaultValue".equals(tagName)) {
+                blockTags.add(dt);
             }
         }
-        for (Tag tag: allTags) {
-            commentTextBuilder.append("\n")
-                                .append(tag.name())
-                                .append(" ")
-                                .append(tag.text());
-        }
 
         //add @see tags
         if (!isGetter && !isSetter) {
-            MethodDoc getter = (MethodDoc) visibleMemberMap.getGetterForProperty(member);
-            MethodDoc setter = (MethodDoc) visibleMemberMap.getSetterForProperty(member);
+            ExecutableElement getter = (ExecutableElement) visibleMemberMap.getGetterForProperty(member);
+            ExecutableElement setter = (ExecutableElement) visibleMemberMap.getSetterForProperty(member);
 
-            if ((null != getter)
-                    && (commentTextBuilder.indexOf("@see #" + getter.name()) == -1)) {
-                commentTextBuilder.append("\n @see #")
-                                  .append(getter.name())
-                                  .append("() ");
+            if (null != getter) {
+                StringBuilder sb = new StringBuilder("#");
+                sb.append(utils.getSimpleName(getter)).append("()");
+                blockTags.add(cmtutils.makeSeeTree(sb.toString(), getter));
             }
 
-            if ((null != setter)
-                    && (commentTextBuilder.indexOf("@see #" + setter.name()) == -1)) {
-                String typeName = setter.parameters()[0].typeName();
+            if (null != setter) {
+                VariableElement param = setter.getParameters().get(0);
+                String typeName = utils.getTypeName(param.asType(), false);
                 // Removal of type parameters and package information.
                 typeName = typeName.split("<")[0];
                 if (typeName.contains(".")) {
                     typeName = typeName.substring(typeName.lastIndexOf(".") + 1);
                 }
-                commentTextBuilder.append("\n @see #").append(setter.name());
-
-                if (setter.parameters()[0].type().asTypeVariable() == null) {
-                    commentTextBuilder.append("(").append(typeName).append(")");
+                StringBuilder sb = new StringBuilder("#");
+                sb.append(utils.getSimpleName(setter));
+                if (!utils.isTypeVariable(param.asType())) {
+                    sb.append("(").append(typeName).append(")");
                 }
-                commentTextBuilder.append(" \n");
+                blockTags.add(cmtutils.makeSeeTree(sb.toString(), setter));
             }
         }
-        member.setRawCommentText(commentTextBuilder.toString());
+        cmtutils.setDocCommentTree(member, firstSentence, bodyTags, blockTags, utils);
     }
+
     /**
      * Test whether the method is a getter.
-     * @param ped property method documentation. Needs to be either property
+     * @param element property method documentation. Needs to be either property
      * method, property getter, or property setter.
      * @return true if the given documentation belongs to a getter.
      */
-    private boolean isGetter(ProgramElementDoc ped) {
-        final String pedName = ped.name();
+    private boolean isGetter(Element element) {
+        final String pedName = element.getSimpleName().toString();
         return pedName.startsWith("get") || pedName.startsWith("is");
     }
 
     /**
      * Test whether the method is a setter.
-     * @param ped property method documentation. Needs to be either property
+     * @param element property method documentation. Needs to be either property
      * method, property getter, or property setter.
      * @return true if the given documentation belongs to a setter.
      */
-    private boolean isSetter(ProgramElementDoc ped) {
-        return ped.name().startsWith("set");
+    private boolean isSetter(Element element) {
+        return element.getSimpleName().toString().startsWith("set");
     }
 
     /**
      * Build the inherited member summary for the given methods.
      *

@@ -473,32 +487,29 @@
      * @param visibleMemberMap the map for the members to document.
      * @param summaryTreeList list of content trees to which the documentation will be added
      */
     private void buildInheritedSummary(MemberSummaryWriter writer,
             VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
-        for (ClassDoc inhclass : visibleMemberMap.getVisibleClassesList()) {
-            if (!(inhclass.isPublic() ||
-                  utils.isLinkable(inhclass, configuration))) {
+        for (TypeElement inhclass : visibleMemberMap.getVisibleClasses()) {
+            if (!(utils.isPublic(inhclass) || utils.isLinkable(inhclass))) {
                 continue;
             }
-            if (inhclass == classDoc) {
+            if (inhclass == typeElement) {
                 continue;
             }
-            List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
-            if (inhmembers.size() > 0) {
-                Collections.sort(inhmembers);
+            SortedSet<Element> inhmembers = visibleMemberMap.getMembersFor(inhclass);
+            if (!inhmembers.isEmpty()) {
                 Content inheritedTree = writer.getInheritedSummaryHeader(inhclass);
                 Content linksTree = writer.getInheritedSummaryLinksTree();
-                for (int j = 0; j < inhmembers.size(); ++j) {
-                    writer.addInheritedMemberSummary(
-                            inhclass.isPackagePrivate() &&
-                            !utils.isLinkable(inhclass, configuration) ?
-                            classDoc : inhclass,
-                            inhmembers.get(j),
-                            j == 0,
-                            j == inhmembers.size() - 1, linksTree);
+                for (Element member : inhmembers) {
+                    TypeElement t= inhclass;
+                    if (utils.isPackagePrivate(inhclass) && !utils.isLinkable(inhclass)) {
+                        t = typeElement;
                 }
+                    writer.addInheritedMemberSummary(t, member, inhmembers.first() == member,
+                            inhmembers.last() == member, linksTree);
+                }
                 inheritedTree.addContent(linksTree);
                 summaryTreeList.add(writer.getMemberTree(inheritedTree));
             }
         }
     }

@@ -517,14 +528,13 @@
         LinkedList<Content> summaryTreeList = new LinkedList<>();
         buildSummary(writer, visibleMemberMap, summaryTreeList);
         if (showInheritedSummary)
             buildInheritedSummary(writer, visibleMemberMap, summaryTreeList);
         if (!summaryTreeList.isEmpty()) {
-            Content memberTree = writer.getMemberSummaryHeader(
-                    classDoc, memberSummaryTree);
-            for (Content aSummaryTreeList : summaryTreeList) {
+            Content memberTree = writer.getMemberSummaryHeader(typeElement, memberSummaryTree);
+            summaryTreeList.stream().forEach((aSummaryTreeList) -> {
                 memberTree.addContent(aSummaryTreeList);
-            }
+            });
             writer.addMemberTree(memberSummaryTree, memberTree);
         }
     }
 }