langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java
changeset 7614 cfadc977ca75
parent 5855 00d9c252e60c
child 7681 1f0819a3341f
equal deleted inserted replaced
7336:3fd30668e9b5 7614:cfadc977ca75
    23  * questions.
    23  * questions.
    24  */
    24  */
    25 
    25 
    26 package com.sun.tools.doclets.internal.toolkit.builders;
    26 package com.sun.tools.doclets.internal.toolkit.builders;
    27 
    27 
       
    28 import java.util.*;
    28 import com.sun.tools.doclets.internal.toolkit.util.*;
    29 import com.sun.tools.doclets.internal.toolkit.util.*;
    29 import com.sun.tools.doclets.internal.toolkit.*;
    30 import com.sun.tools.doclets.internal.toolkit.*;
    30 import com.sun.javadoc.*;
    31 import com.sun.javadoc.*;
    31 import java.util.*;
       
    32 
    32 
    33 /**
    33 /**
    34  * Builds the member summary.
    34  * Builds the member summary.
    35  *
    35  *
    36  * This code is not part of an API.
    36  * This code is not part of an API.
    37  * It is implementation that is subject to change.
    37  * It is implementation that is subject to change.
    38  * Do not use it as an API
    38  * Do not use it as an API
    39  *
    39  *
    40  * @author Jamie Ho
    40  * @author Jamie Ho
       
    41  * @author Bhavesh Patel (Modified)
    41  * @since 1.5
    42  * @since 1.5
    42  */
    43  */
    43 public class MemberSummaryBuilder extends AbstractMemberBuilder {
    44 public class MemberSummaryBuilder extends AbstractMemberBuilder {
    44 
    45 
    45         /**
    46     /**
    46          * The XML root for this builder.
    47      * The XML root for this builder.
    47          */
    48      */
    48         public static final String NAME = "MemberSummary";
    49     public static final String NAME = "MemberSummary";
    49 
    50 
    50         /**
    51     /**
    51          * The visible members for the given class.
    52      * The visible members for the given class.
    52          */
    53      */
    53         private VisibleMemberMap[] visibleMemberMaps;
    54     private VisibleMemberMap[] visibleMemberMaps;
    54 
    55 
    55         /**
    56     /**
    56          * The member summary writers for the given class.
    57      * The member summary writers for the given class.
    57          */
    58      */
    58         private MemberSummaryWriter[] memberSummaryWriters;
    59     private MemberSummaryWriter[] memberSummaryWriters;
    59 
    60 
    60         /**
    61     /**
    61          * The type being documented.
    62      * The type being documented.
    62          */
    63      */
    63         private ClassDoc classDoc;
    64     private ClassDoc classDoc;
    64 
    65 
    65         private MemberSummaryBuilder(Configuration configuration) {
    66     private MemberSummaryBuilder(Configuration configuration) {
    66                 super(configuration);
    67         super(configuration);
    67         }
    68     }
    68 
    69 
    69         /**
    70     /**
    70          * Construct a new MemberSummaryBuilder.
    71      * Construct a new MemberSummaryBuilder.
    71          *
    72      *
    72          * @param classWriter   the writer for the class whose members are being
    73      * @param classWriter   the writer for the class whose members are being
    73          *                      summarized.
    74      *                      summarized.
    74          * @param configuration the current configuration of the doclet.
    75      * @param configuration the current configuration of the doclet.
    75          */
    76      */
    76         public static MemberSummaryBuilder getInstance(
    77     public static MemberSummaryBuilder getInstance(
    77                 ClassWriter classWriter, Configuration configuration)
    78             ClassWriter classWriter, Configuration configuration)
    78         throws Exception {
    79             throws Exception {
    79                 MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
    80         MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
    80                 builder.classDoc = classWriter.getClassDoc();
    81         builder.classDoc = classWriter.getClassDoc();
    81                 builder.init(classWriter);
    82         builder.init(classWriter);
    82                 return builder;
    83         return builder;
    83         }
    84     }
    84 
    85 
    85     /**
    86     /**
    86      * Construct a new MemberSummaryBuilder.
    87      * Construct a new MemberSummaryBuilder.
    87      *
    88      *
    88      * @param annotationTypeWriter the writer for the class whose members are
    89      * @param annotationTypeWriter the writer for the class whose members are
    89      *                             being summarized.
    90      *                             being summarized.
    90      * @param configuration the current configuration of the doclet.
    91      * @param configuration the current configuration of the doclet.
    91      */
    92      */
    92     public static MemberSummaryBuilder getInstance(
    93     public static MemberSummaryBuilder getInstance(
    93         AnnotationTypeWriter annotationTypeWriter, Configuration configuration)
    94             AnnotationTypeWriter annotationTypeWriter, Configuration configuration)
    94     throws Exception {
    95             throws Exception {
    95         MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
    96         MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
    96         builder.classDoc = annotationTypeWriter.getAnnotationTypeDoc();
    97         builder.classDoc = annotationTypeWriter.getAnnotationTypeDoc();
    97         builder.init(annotationTypeWriter);
    98         builder.init(annotationTypeWriter);
    98         return builder;
    99         return builder;
    99     }
   100     }
   100 
   101 
   101     private void init(Object writer) throws Exception {
   102     private void init(Object writer) throws Exception {
   102         visibleMemberMaps =
   103         visibleMemberMaps =
   103             new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
   104                 new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
   104         for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   105         for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   105             visibleMemberMaps[i] =
   106             visibleMemberMaps[i] =
   106                 new VisibleMemberMap(
   107                     new VisibleMemberMap(
   107                     classDoc,
   108                     classDoc,
   108                     i,
   109                     i,
   109                     configuration.nodeprecated);
   110                     configuration.nodeprecated);
   110         }
   111         }
   111         memberSummaryWriters =
   112         memberSummaryWriters =
   112             new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
   113                 new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
   113         for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   114         for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   114             if (classDoc.isAnnotationType()) {
   115             if (classDoc.isAnnotationType()) {
   115                 memberSummaryWriters[i] =
   116                 memberSummaryWriters[i] =
   116                     visibleMemberMaps[i].noVisibleMembers()?
   117                     visibleMemberMaps[i].noVisibleMembers()?
   117                         null :
   118                         null :
   118                         configuration.getWriterFactory().getMemberSummaryWriter(
   119                         configuration.getWriterFactory().getMemberSummaryWriter(
   119                             (AnnotationTypeWriter) writer, i);
   120                         (AnnotationTypeWriter) writer, i);
   120             } else {
   121             } else {
   121                 memberSummaryWriters[i] =
   122                 memberSummaryWriters[i] =
   122                     visibleMemberMaps[i].noVisibleMembers()?
   123                     visibleMemberMaps[i].noVisibleMembers()?
   123                         null :
   124                         null :
   124                         configuration.getWriterFactory().getMemberSummaryWriter(
   125                         configuration.getWriterFactory().getMemberSummaryWriter(
   125                             (ClassWriter) writer, i);
   126                         (ClassWriter) writer, i);
   126             }
   127             }
   127         }
   128         }
   128 
   129 
   129     }
   130     }
   130 
   131 
   131         /**
   132     /**
   132          * {@inheritDoc}
   133      * {@inheritDoc}
   133          */
   134      */
   134         public String getName() {
   135     public String getName() {
   135                 return NAME;
   136         return NAME;
   136         }
   137     }
   137 
   138 
   138         /**
   139     /**
   139          * Return the specified visible member map.
   140      * Return the specified visible member map.
   140          *
   141      *
   141          * @param type the type of visible member map to return.
   142      * @param type the type of visible member map to return.
   142          * @return the specified visible member map.
   143      * @return the specified visible member map.
   143          * @throws ArrayIndexOutOfBoundsException when the type is invalid.
   144      * @throws ArrayIndexOutOfBoundsException when the type is invalid.
   144          * @see VisibleMemberMap
   145      * @see VisibleMemberMap
   145          */
   146      */
   146         public VisibleMemberMap getVisibleMemberMap(int type) {
   147     public VisibleMemberMap getVisibleMemberMap(int type) {
   147                 return visibleMemberMaps[type];
   148         return visibleMemberMaps[type];
   148         }
   149     }
   149 
   150 
   150         /**
   151     /**
   151          * Return the specified member summary writer.
   152      * Return the specified member summary writer.
   152          *
   153      *
   153          * @param type the type of member summary writer to return.
   154      * @param type the type of member summary writer to return.
   154          * @return the specified member summary writer.
   155      * @return the specified member summary writer.
   155          * @throws ArrayIndexOutOfBoundsException when the type is invalid.
   156      * @throws ArrayIndexOutOfBoundsException when the type is invalid.
   156          * @see VisibleMemberMap
   157      * @see VisibleMemberMap
   157          */
   158      */
   158         public MemberSummaryWriter getMemberSummaryWriter(int type) {
   159     public MemberSummaryWriter getMemberSummaryWriter(int type) {
   159                 return memberSummaryWriters[type];
   160         return memberSummaryWriters[type];
   160         }
   161     }
   161 
   162 
   162         /**
   163     /**
   163          * Returns a list of methods that will be documented for the given class.
   164      * Returns a list of methods that will be documented for the given class.
   164          * This information can be used for doclet specific documentation
   165      * This information can be used for doclet specific documentation
   165          * generation.
   166      * generation.
   166          *
   167      *
   167          * @param classDoc the {@link ClassDoc} we want to check.
   168      * @param classDoc the {@link ClassDoc} we want to check.
   168          * @param type the type of members to return.
   169      * @param type the type of members to return.
   169          * @return a list of methods that will be documented.
   170      * @return a list of methods that will be documented.
   170          * @see VisibleMemberMap
   171      * @see VisibleMemberMap
   171          */
   172      */
   172         public List<ProgramElementDoc> members(int type) {
   173     public List<ProgramElementDoc> members(int type) {
   173                 return visibleMemberMaps[type].getLeafClassMembers(configuration);
   174         return visibleMemberMaps[type].getLeafClassMembers(configuration);
   174         }
   175     }
   175 
   176 
   176         /**
   177     /**
   177          * Return true it there are any members to summarize.
   178      * Return true it there are any members to summarize.
   178          *
   179      *
   179          * @return true if there are any members to summarize.
   180      * @return true if there are any members to summarize.
   180          */
   181      */
   181         public boolean hasMembersToDocument() {
   182     public boolean hasMembersToDocument() {
   182         if (classDoc instanceof AnnotationTypeDoc) {
   183         if (classDoc instanceof AnnotationTypeDoc) {
   183             return ((AnnotationTypeDoc) classDoc).elements().length > 0;
   184             return ((AnnotationTypeDoc) classDoc).elements().length > 0;
   184         }
   185         }
   185                 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   186         for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
   186                         VisibleMemberMap members = visibleMemberMaps[i];
   187             VisibleMemberMap members = visibleMemberMaps[i];
   187                         if (!members.noVisibleMembers()) {
   188             if (!members.noVisibleMembers()) {
   188                                 return true;
   189                 return true;
   189                         }
   190             }
   190                 }
   191         }
   191                 return false;
   192         return false;
   192         }
   193     }
   193 
   194 
   194         /**
   195     /**
   195          * Build the summary for the enum constants.
   196      * Build the summary for the enum constants.
   196          */
   197      *
   197         public void buildEnumConstantsSummary(XMLNode node) {
   198      * @param node the XML element that specifies which components to document
   198                 buildSummary(
   199      * @param memberSummaryTree the content tree to which the documentation will be added
   199                         memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS],
   200      */
   200                         visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS]);
   201     public void buildEnumConstantsSummary(XMLNode node, Content memberSummaryTree) {
   201         }
   202         MemberSummaryWriter writer =
       
   203                 memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS];
       
   204         VisibleMemberMap visibleMemberMap =
       
   205                 visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS];
       
   206         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
       
   207     }
   202 
   208 
   203     /**
   209     /**
   204      * Build the summary for the optional members.
   210      * Build the summary for the optional members.
   205      */
   211      *
   206     public void buildAnnotationTypeOptionalMemberSummary(XMLNode node) {
   212      * @param node the XML element that specifies which components to document
   207         buildSummary(
   213      * @param memberSummaryTree the content tree to which the documentation will be added
   208             memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL],
   214      */
   209                 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL]);
   215     public void buildAnnotationTypeOptionalMemberSummary(XMLNode node, Content memberSummaryTree) {
       
   216         MemberSummaryWriter writer =
       
   217                 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
       
   218         VisibleMemberMap visibleMemberMap =
       
   219                 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
       
   220         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
   210     }
   221     }
   211 
   222 
   212     /**
   223     /**
   213      * Build the summary for the optional members.
   224      * Build the summary for the optional members.
   214      */
   225      *
   215     public void buildAnnotationTypeRequiredMemberSummary(XMLNode node) {
   226      * @param node the XML element that specifies which components to document
   216         buildSummary(
   227      * @param memberSummaryTree the content tree to which the documentation will be added
   217             memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED],
   228      */
   218                 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED]);
   229     public void buildAnnotationTypeRequiredMemberSummary(XMLNode node, Content memberSummaryTree) {
   219     }
   230         MemberSummaryWriter writer =
   220 
   231                 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
   221         /**
   232         VisibleMemberMap visibleMemberMap =
   222          * Build the summary for the fields.
   233                 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
   223          */
   234         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
   224         public void buildFieldsSummary(XMLNode node) {
   235     }
   225                 buildSummary(
   236 
   226                         memberSummaryWriters[VisibleMemberMap.FIELDS],
   237     /**
   227                         visibleMemberMaps[VisibleMemberMap.FIELDS]);
   238      * Build the summary for the fields.
   228         }
   239      *
   229 
   240      * @param node the XML element that specifies which components to document
   230         /**
   241      * @param memberSummaryTree the content tree to which the documentation will be added
   231          * Build the inherited summary for the fields.
   242      */
   232          */
   243     public void buildFieldsSummary(XMLNode node, Content memberSummaryTree) {
   233         public void buildFieldsInheritedSummary(XMLNode node) {
   244         MemberSummaryWriter writer =
   234                 buildInheritedSummary(
   245                 memberSummaryWriters[VisibleMemberMap.FIELDS];
   235                         memberSummaryWriters[VisibleMemberMap.FIELDS],
   246         VisibleMemberMap visibleMemberMap =
   236                         visibleMemberMaps[VisibleMemberMap.FIELDS]);
   247                 visibleMemberMaps[VisibleMemberMap.FIELDS];
   237         }
   248         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
   238 
   249     }
   239         /**
   250 
   240          * Build the summary for the nested classes.
   251     /**
   241          */
   252      * Build the summary for the nested classes.
   242         public void buildNestedClassesSummary(XMLNode node) {
   253      *
   243                 buildSummary(
   254      * @param node the XML element that specifies which components to document
   244                         memberSummaryWriters[VisibleMemberMap.INNERCLASSES],
   255      * @param memberSummaryTree the content tree to which the documentation will be added
   245                         visibleMemberMaps[VisibleMemberMap.INNERCLASSES]);
   256      */
   246         }
   257     public void buildNestedClassesSummary(XMLNode node, Content memberSummaryTree) {
   247 
   258         MemberSummaryWriter writer =
   248         /**
   259                 memberSummaryWriters[VisibleMemberMap.INNERCLASSES];
   249          * Build the inherited summary for the nested classes.
   260         VisibleMemberMap visibleMemberMap =
   250          */
   261                 visibleMemberMaps[VisibleMemberMap.INNERCLASSES];
   251         public void buildNestedClassesInheritedSummary(XMLNode node) {
   262         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
   252                 buildInheritedSummary(
   263     }
   253                         memberSummaryWriters[VisibleMemberMap.INNERCLASSES],
   264 
   254                         visibleMemberMaps[VisibleMemberMap.INNERCLASSES]);
   265     /**
   255         }
   266      * Build the method summary.
   256 
   267      *
   257         /**
   268      * @param node the XML element that specifies which components to document
   258          * Build the method summary.
   269      * @param memberSummaryTree the content tree to which the documentation will be added
   259          */
   270      */
   260         public void buildMethodsSummary(XMLNode node) {
   271     public void buildMethodsSummary(XMLNode node, Content memberSummaryTree) {
   261                 buildSummary(
   272         MemberSummaryWriter writer =
   262                         memberSummaryWriters[VisibleMemberMap.METHODS],
   273                 memberSummaryWriters[VisibleMemberMap.METHODS];
   263                         visibleMemberMaps[VisibleMemberMap.METHODS]);
   274         VisibleMemberMap visibleMemberMap =
   264         }
   275                 visibleMemberMaps[VisibleMemberMap.METHODS];
   265 
   276         addSummary(writer, visibleMemberMap, true, memberSummaryTree);
   266         /**
   277     }
   267          * Build the inherited method summary.
   278 
   268          */
   279     /**
   269         public void buildMethodsInheritedSummary(XMLNode node) {
   280      * Build the constructor summary.
   270                 buildInheritedSummary(
   281      *
   271                         memberSummaryWriters[VisibleMemberMap.METHODS],
   282      * @param node the XML element that specifies which components to document
   272                         visibleMemberMaps[VisibleMemberMap.METHODS]);
   283      * @param memberSummaryTree the content tree to which the documentation will be added
   273         }
   284      */
   274 
   285     public void buildConstructorsSummary(XMLNode node, Content memberSummaryTree) {
   275         /**
   286         MemberSummaryWriter writer =
   276          * Build the constructor summary.
   287                 memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS];
   277          */
   288         VisibleMemberMap visibleMemberMap =
   278         public void buildConstructorsSummary(XMLNode node) {
   289                 visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS];
   279                 buildSummary(
   290         addSummary(writer, visibleMemberMap, false, memberSummaryTree);
   280                         memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS],
   291     }
   281                         visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS]);
   292 
   282         }
   293     /**
   283 
   294      * Build the member summary for the given members.
   284         /**
   295      *
   285          * Build the member summary for the given members.
   296      * @param writer the summary writer to write the output.
   286          *
   297      * @param visibleMemberMap the given members to summarize.
   287          * @param writer           the summary writer to write the output.
   298      * @param summaryTreeList list of content trees to which the documentation will be added
   288          * @param visibleMemberMap the given members to summarize.
   299      */
   289          */
   300     private void buildSummary(MemberSummaryWriter writer,
   290         private void buildSummary(MemberSummaryWriter writer,
   301             VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
   291             VisibleMemberMap visibleMemberMap) {
       
   292         List<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
   302         List<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
   293             configuration));
   303                 configuration));
   294         if (members.size() > 0) {
   304         if (members.size() > 0) {
   295             Collections.sort(members);
   305             Collections.sort(members);
   296             writer.writeMemberSummaryHeader(classDoc);
   306             Content tableTree = writer.getSummaryTableTree(classDoc);
   297             for (int i = 0; i < members.size(); i++) {
   307             for (int i = 0; i < members.size(); i++) {
   298                 ProgramElementDoc member = members.get(i);
   308                 ProgramElementDoc member = members.get(i);
   299                 Tag[] firstSentenceTags = member.firstSentenceTags();
   309                 Tag[] firstSentenceTags = member.firstSentenceTags();
   300                 if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
   310                 if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
   301                     //Inherit comments from overriden or implemented method if
   311                     //Inherit comments from overriden or implemented method if
   302                     //necessary.
   312                     //necessary.
   303                     DocFinder.Output inheritedDoc =
   313                     DocFinder.Output inheritedDoc =
   304                         DocFinder.search(new DocFinder.Input((MethodDoc) member));
   314                             DocFinder.search(new DocFinder.Input((MethodDoc) member));
   305                     if (inheritedDoc.holder != null &&
   315                     if (inheritedDoc.holder != null &&
   306                             inheritedDoc.holder.firstSentenceTags().length > 0) {
   316                             inheritedDoc.holder.firstSentenceTags().length > 0) {
   307                         firstSentenceTags = inheritedDoc.holder.firstSentenceTags();
   317                         firstSentenceTags = inheritedDoc.holder.firstSentenceTags();
   308                     }
   318                     }
   309                 }
   319                 }
   310                 writer.writeMemberSummary(classDoc, member, firstSentenceTags,
   320                 writer.addMemberSummary(classDoc, member, firstSentenceTags, tableTree, i);
   311                     i == 0, i == members.size() - 1);
   321             }
   312             }
   322             summaryTreeList.add(tableTree);
   313             writer.writeMemberSummaryFooter(classDoc);
   323         }
   314         }
   324     }
   315         }
       
   316 
   325 
   317     /**
   326     /**
   318      * Build the inherited member summary for the given methods.
   327      * Build the inherited member summary for the given methods.
   319      *
   328      *
   320      * @param writer           the writer for this member summary.
   329      * @param writer the writer for this member summary.
   321      * @param visibleMemberMap the map for the members to document.
   330      * @param visibleMemberMap the map for the members to document.
   322      */
   331      * @param summaryTreeList list of content trees to which the documentation will be added
   323         private void buildInheritedSummary(MemberSummaryWriter writer,
   332      */
   324             VisibleMemberMap visibleMemberMap) {
   333     private void buildInheritedSummary(MemberSummaryWriter writer,
       
   334             VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
   325         for (Iterator<ClassDoc> iter = visibleMemberMap.getVisibleClassesList().iterator();
   335         for (Iterator<ClassDoc> iter = visibleMemberMap.getVisibleClassesList().iterator();
   326                 iter.hasNext();) {
   336                 iter.hasNext();) {
   327             ClassDoc inhclass = iter.next();
   337             ClassDoc inhclass = iter.next();
   328             if (! (inhclass.isPublic() ||
   338             if (! (inhclass.isPublic() ||
   329                 Util.isLinkable(inhclass, configuration))) {
   339                     Util.isLinkable(inhclass, configuration))) {
   330                 continue;
   340                 continue;
   331             }
   341             }
   332             if (inhclass == classDoc) {
   342             if (inhclass == classDoc) {
   333                 continue;
   343                 continue;
   334             }
   344             }
   335             List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
   345             List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
   336             if (inhmembers.size() > 0) {
   346             if (inhmembers.size() > 0) {
   337                 Collections.sort(inhmembers);
   347                 Collections.sort(inhmembers);
   338                 writer.writeInheritedMemberSummaryHeader(inhclass);
   348                 Content inheritedTree = writer.getInheritedSummaryHeader(inhclass);
       
   349                 Content linksTree = writer.getInheritedSummaryLinksTree();
   339                 for (int j = 0; j < inhmembers.size(); ++j) {
   350                 for (int j = 0; j < inhmembers.size(); ++j) {
   340                     writer.writeInheritedMemberSummary(
   351                     writer.addInheritedMemberSummary(
   341                         inhclass.isPackagePrivate() &&
   352                             inhclass.isPackagePrivate() &&
   342                             ! Util.isLinkable(inhclass, configuration) ?
   353                             ! Util.isLinkable(inhclass, configuration) ?
   343                             classDoc : inhclass,
   354                             classDoc : inhclass,
   344                         inhmembers.get(j),
   355                             inhmembers.get(j),
   345                         j == 0,
   356                             j == 0,
   346                         j == inhmembers.size() - 1);
   357                             j == inhmembers.size() - 1, linksTree);
   347                 }
   358                 }
   348                 writer.writeInheritedMemberSummaryFooter(inhclass);
   359                 inheritedTree.addContent(linksTree);
   349             }
   360                 summaryTreeList.add(writer.getMemberTree(inheritedTree));
       
   361             }
       
   362         }
       
   363     }
       
   364 
       
   365     /**
       
   366      * Add the summary for the documentation.
       
   367      *
       
   368      * @param writer the writer for this member summary.
       
   369      * @param visibleMemberMap the map for the members to document.
       
   370      * @param showInheritedSummary true if inherited summary should be documented
       
   371      * @param memberSummaryTree the content tree to which the documentation will be added
       
   372      */
       
   373     private void addSummary(MemberSummaryWriter writer,
       
   374             VisibleMemberMap visibleMemberMap, boolean showInheritedSummary,
       
   375             Content memberSummaryTree) {
       
   376         LinkedList<Content> summaryTreeList = new LinkedList<Content>();
       
   377         buildSummary(writer, visibleMemberMap, summaryTreeList);
       
   378         if (showInheritedSummary)
       
   379             buildInheritedSummary(writer, visibleMemberMap, summaryTreeList);
       
   380         if (!summaryTreeList.isEmpty()) {
       
   381             Content memberTree = writer.getMemberSummaryHeader(
       
   382                     classDoc, memberSummaryTree);
       
   383             for (int i = 0; i < summaryTreeList.size(); i++) {
       
   384                 memberTree.addContent(summaryTreeList.get(i));
       
   385             }
       
   386             memberSummaryTree.addContent(writer.getMemberTree(memberTree));
   350         }
   387         }
   351     }
   388     }
   352 }
   389 }