--- old/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Mon Oct 16 17:19:47 2017 +++ new/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Mon Oct 16 17:19:46 2017 @@ -79,9 +79,8 @@ /** * Construct a new MemberSummaryBuilder. * - * @param classWriter the writer for the class whose members are being - * summarized. * @param context the build context. + * @param typeElement the typeElement. */ private MemberSummaryBuilder(Context context, TypeElement typeElement) { super(context); @@ -337,7 +336,7 @@ List tableContents = new LinkedList<>(); int counter = 0; for (Element member : members) { - final Element property = visibleMemberMap.getPropertyMemberDoc(member); + final Element property = visibleMemberMap.getPropertyElement(member); if (property != null) { processProperty(visibleMemberMap, member, property); } @@ -475,30 +474,57 @@ */ private void buildInheritedSummary(MemberSummaryWriter writer, VisibleMemberMap visibleMemberMap, LinkedList summaryTreeList) { - for (TypeElement inhclass : visibleMemberMap.getVisibleClasses()) { - if (!(utils.isPublic(inhclass) || utils.isLinkable(inhclass))) { + for (TypeElement inheritedClass : visibleMemberMap.getVisibleClasses()) { + if (!(utils.isPublic(inheritedClass) || utils.isLinkable(inheritedClass))) { continue; } - if (inhclass == typeElement) { + if (inheritedClass == typeElement) { continue; } - SortedSet inhmembers = asSortedSet(visibleMemberMap.getMembers(inhclass)); - if (!inhmembers.isEmpty()) { - Content inheritedTree = writer.getInheritedSummaryHeader(inhclass); - Content linksTree = writer.getInheritedSummaryLinksTree(); - for (Element member : inhmembers) { - TypeElement t= inhclass; - if (utils.isPackagePrivate(inhclass) && !utils.isLinkable(inhclass)) { - t = typeElement; + SortedSet inheritedMembersFromMap = asSortedSet( + visibleMemberMap.getMembers(inheritedClass)); + + if (!inheritedMembersFromMap.isEmpty()) { + SortedSet inheritedMembers = new TreeSet<>(comparator); + List enclosedSuperMethods = utils.getMethods(inheritedClass); + for (Element inheritedMember : inheritedMembersFromMap) { + if (visibleMemberMap.kind != VisibleMemberMap.Kind.METHODS) { + inheritedMembers.add(inheritedMember); + continue; } - writer.addInheritedMemberSummary(t, member, inhmembers.first() == member, - inhmembers.last() == member, linksTree); + + // If applicable, filter those overridden methods that + // should not be documented in the summary/detail sections + // instead document them in the footnote, care must be taken + // to handle fx property methods which have no source comments, + // but comments are synthesized on the output. + ExecutableElement inheritedMethod = (ExecutableElement)inheritedMember; + if (enclosedSuperMethods.stream() + .anyMatch(e -> utils.executableMembersEqual(inheritedMethod, e) + && (!utils.isSimpleOverride(e) + || visibleMemberMap.getPropertyElement(e) != null))) { + inheritedMembers.add(inheritedMember); + } } + + Content inheritedTree = writer.getInheritedSummaryHeader(inheritedClass); + Content linksTree = writer.getInheritedSummaryLinksTree(); + addSummaryFootNote(inheritedClass, inheritedMembers, linksTree, writer); inheritedTree.addContent(linksTree); summaryTreeList.add(writer.getMemberTree(inheritedTree)); } } } + + private void addSummaryFootNote(TypeElement inheritedClass, SortedSet inheritedMembers, + Content linksTree, MemberSummaryWriter writer) { + for (Element member : inheritedMembers) { + TypeElement t = (utils.isPackagePrivate(inheritedClass) && !utils.isLinkable(inheritedClass)) + ? typeElement : inheritedClass; + writer.addInheritedMemberSummary(t, member, inheritedMembers.first() == member, + inheritedMembers.last() == member, linksTree); + } + } /** * Add the summary for the documentation.