src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java

Thu, 27 Jun 2013 17:47:18 +0200

author
janvalenta
date
Thu, 27 Jun 2013 17:47:18 +0200
changeset 1866
26437287529d
parent 1606
ccbe7ffdd867
child 2035
a2a5ad0853ed
permissions
-rw-r--r--

8015720: since tag isn't copied while generating JavaFX documentation
Reviewed-by: jjg

duke@1 1 /*
jjg@1606 2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@554 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@554 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@554 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 22 * or visit www.oracle.com if you need additional information or have any
ohair@554 23 * questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.doclets.internal.toolkit.builders;
duke@1 27
bpatel@766 28 import java.util.*;
jjg@1606 29 import java.text.MessageFormat;
jjg@1357 30
jjg@1357 31 import com.sun.javadoc.*;
jjg@1357 32 import com.sun.tools.doclets.internal.toolkit.*;
duke@1 33 import com.sun.tools.doclets.internal.toolkit.util.*;
duke@1 34
duke@1 35 /**
duke@1 36 * Builds the member summary.
duke@1 37 *
jjg@1359 38 * <p><b>This is NOT part of any supported API.
jjg@1359 39 * If you write code that depends on this, you do so at your own risk.
jjg@1359 40 * This code and its internal interfaces are subject to change or
jjg@1359 41 * deletion without notice.</b>
duke@1 42 *
duke@1 43 * @author Jamie Ho
bpatel@766 44 * @author Bhavesh Patel (Modified)
duke@1 45 * @since 1.5
duke@1 46 */
duke@1 47 public class MemberSummaryBuilder extends AbstractMemberBuilder {
duke@1 48
bpatel@766 49 /**
bpatel@766 50 * The XML root for this builder.
bpatel@766 51 */
bpatel@766 52 public static final String NAME = "MemberSummary";
duke@1 53
bpatel@766 54 /**
bpatel@766 55 * The visible members for the given class.
bpatel@766 56 */
jjg@1410 57 private final VisibleMemberMap[] visibleMemberMaps;
duke@1 58
bpatel@766 59 /**
bpatel@766 60 * The member summary writers for the given class.
bpatel@766 61 */
bpatel@766 62 private MemberSummaryWriter[] memberSummaryWriters;
duke@1 63
bpatel@766 64 /**
bpatel@766 65 * The type being documented.
bpatel@766 66 */
jjg@1410 67 private final ClassDoc classDoc;
duke@1 68
jjg@1410 69 /**
jjg@1410 70 * Construct a new MemberSummaryBuilder.
jjg@1410 71 *
jjg@1410 72 * @param classWriter the writer for the class whose members are being
jjg@1410 73 * summarized.
jjg@1410 74 * @param context the build context.
jjg@1410 75 */
jjg@1410 76 private MemberSummaryBuilder(Context context, ClassDoc classDoc) {
jjg@1410 77 super(context);
jjg@1410 78 this.classDoc = classDoc;
jjg@1410 79 visibleMemberMaps =
jjg@1410 80 new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
jjg@1410 81 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
jjg@1410 82 visibleMemberMaps[i] =
jjg@1410 83 new VisibleMemberMap(
jjg@1410 84 classDoc,
jjg@1410 85 i,
jjg@1606 86 configuration);
jjg@1410 87 }
bpatel@766 88 }
duke@1 89
bpatel@766 90 /**
bpatel@766 91 * Construct a new MemberSummaryBuilder.
bpatel@766 92 *
bpatel@766 93 * @param classWriter the writer for the class whose members are being
bpatel@766 94 * summarized.
jjg@1410 95 * @param context the build context.
bpatel@766 96 */
bpatel@766 97 public static MemberSummaryBuilder getInstance(
jjg@1410 98 ClassWriter classWriter, Context context)
bpatel@766 99 throws Exception {
jjg@1410 100 MemberSummaryBuilder builder = new MemberSummaryBuilder(context,
jjg@1410 101 classWriter.getClassDoc());
jjg@1410 102 builder.memberSummaryWriters =
jjg@1410 103 new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
jjg@1410 104 WriterFactory wf = context.configuration.getWriterFactory();
jjg@1410 105 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
jjg@1410 106 builder.memberSummaryWriters[i] =
jjg@1410 107 builder.visibleMemberMaps[i].noVisibleMembers() ?
jjg@1410 108 null :
jjg@1410 109 wf.getMemberSummaryWriter(classWriter, i);
jjg@1410 110 }
bpatel@766 111 return builder;
bpatel@766 112 }
duke@1 113
duke@1 114 /**
duke@1 115 * Construct a new MemberSummaryBuilder.
duke@1 116 *
duke@1 117 * @param annotationTypeWriter the writer for the class whose members are
duke@1 118 * being summarized.
duke@1 119 * @param configuration the current configuration of the doclet.
duke@1 120 */
duke@1 121 public static MemberSummaryBuilder getInstance(
jjg@1410 122 AnnotationTypeWriter annotationTypeWriter, Context context)
bpatel@766 123 throws Exception {
jjg@1410 124 MemberSummaryBuilder builder = new MemberSummaryBuilder(context,
jjg@1410 125 annotationTypeWriter.getAnnotationTypeDoc());
jjg@1410 126 builder.memberSummaryWriters =
jjg@1410 127 new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
jjg@1410 128 WriterFactory wf = context.configuration.getWriterFactory();
jjg@1410 129 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
jjg@1410 130 builder.memberSummaryWriters[i] =
jjg@1410 131 builder.visibleMemberMaps[i].noVisibleMembers()?
jjg@1410 132 null :
jjg@1410 133 wf.getMemberSummaryWriter(
jjg@1410 134 annotationTypeWriter, i);
jjg@1410 135 }
duke@1 136 return builder;
duke@1 137 }
duke@1 138
bpatel@766 139 /**
bpatel@766 140 * {@inheritDoc}
bpatel@766 141 */
bpatel@766 142 public String getName() {
bpatel@766 143 return NAME;
bpatel@766 144 }
duke@1 145
bpatel@766 146 /**
bpatel@766 147 * Return the specified visible member map.
bpatel@766 148 *
bpatel@766 149 * @param type the type of visible member map to return.
bpatel@766 150 * @return the specified visible member map.
bpatel@766 151 * @throws ArrayIndexOutOfBoundsException when the type is invalid.
bpatel@766 152 * @see VisibleMemberMap
bpatel@766 153 */
bpatel@766 154 public VisibleMemberMap getVisibleMemberMap(int type) {
bpatel@766 155 return visibleMemberMaps[type];
bpatel@766 156 }
duke@1 157
bpatel@766 158 /**
bpatel@766 159 * Return the specified member summary writer.
bpatel@766 160 *
bpatel@766 161 * @param type the type of member summary writer to return.
bpatel@766 162 * @return the specified member summary writer.
bpatel@766 163 * @throws ArrayIndexOutOfBoundsException when the type is invalid.
bpatel@766 164 * @see VisibleMemberMap
bpatel@766 165 */
bpatel@766 166 public MemberSummaryWriter getMemberSummaryWriter(int type) {
bpatel@766 167 return memberSummaryWriters[type];
bpatel@766 168 }
duke@1 169
bpatel@766 170 /**
bpatel@766 171 * Returns a list of methods that will be documented for the given class.
bpatel@766 172 * This information can be used for doclet specific documentation
bpatel@766 173 * generation.
bpatel@766 174 *
bpatel@766 175 * @param type the type of members to return.
bpatel@766 176 * @return a list of methods that will be documented.
bpatel@766 177 * @see VisibleMemberMap
bpatel@766 178 */
bpatel@766 179 public List<ProgramElementDoc> members(int type) {
bpatel@766 180 return visibleMemberMaps[type].getLeafClassMembers(configuration);
bpatel@766 181 }
duke@1 182
bpatel@766 183 /**
bpatel@766 184 * Return true it there are any members to summarize.
bpatel@766 185 *
bpatel@766 186 * @return true if there are any members to summarize.
bpatel@766 187 */
bpatel@766 188 public boolean hasMembersToDocument() {
duke@1 189 if (classDoc instanceof AnnotationTypeDoc) {
duke@1 190 return ((AnnotationTypeDoc) classDoc).elements().length > 0;
duke@1 191 }
bpatel@766 192 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
bpatel@766 193 VisibleMemberMap members = visibleMemberMaps[i];
bpatel@766 194 if (!members.noVisibleMembers()) {
bpatel@766 195 return true;
bpatel@766 196 }
duke@1 197 }
bpatel@766 198 return false;
bpatel@766 199 }
duke@1 200
duke@1 201 /**
bpatel@766 202 * Build the summary for the enum constants.
bpatel@766 203 *
bpatel@766 204 * @param node the XML element that specifies which components to document
bpatel@766 205 * @param memberSummaryTree the content tree to which the documentation will be added
duke@1 206 */
bpatel@766 207 public void buildEnumConstantsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 208 MemberSummaryWriter writer =
bpatel@766 209 memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS];
bpatel@766 210 VisibleMemberMap visibleMemberMap =
bpatel@766 211 visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS];
bpatel@766 212 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
duke@1 213 }
duke@1 214
duke@1 215 /**
duke@1 216 * Build the summary for the optional members.
bpatel@766 217 *
bpatel@766 218 * @param node the XML element that specifies which components to document
bpatel@766 219 * @param memberSummaryTree the content tree to which the documentation will be added
duke@1 220 */
bpatel@766 221 public void buildAnnotationTypeOptionalMemberSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 222 MemberSummaryWriter writer =
bpatel@766 223 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
bpatel@766 224 VisibleMemberMap visibleMemberMap =
bpatel@766 225 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
bpatel@766 226 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
duke@1 227 }
duke@1 228
bpatel@766 229 /**
bpatel@766 230 * Build the summary for the optional members.
bpatel@766 231 *
bpatel@766 232 * @param node the XML element that specifies which components to document
bpatel@766 233 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 234 */
bpatel@766 235 public void buildAnnotationTypeRequiredMemberSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 236 MemberSummaryWriter writer =
bpatel@766 237 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
bpatel@766 238 VisibleMemberMap visibleMemberMap =
bpatel@766 239 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
bpatel@766 240 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
bpatel@766 241 }
duke@1 242
bpatel@766 243 /**
bpatel@766 244 * Build the summary for the fields.
bpatel@766 245 *
bpatel@766 246 * @param node the XML element that specifies which components to document
bpatel@766 247 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 248 */
bpatel@766 249 public void buildFieldsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 250 MemberSummaryWriter writer =
bpatel@766 251 memberSummaryWriters[VisibleMemberMap.FIELDS];
bpatel@766 252 VisibleMemberMap visibleMemberMap =
bpatel@766 253 visibleMemberMaps[VisibleMemberMap.FIELDS];
bpatel@766 254 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 255 }
duke@1 256
bpatel@766 257 /**
jjg@1606 258 * Build the summary for the fields.
jjg@1606 259 */
jjg@1606 260 public void buildPropertiesSummary(XMLNode node, Content memberSummaryTree) {
jjg@1606 261 MemberSummaryWriter writer =
jjg@1606 262 memberSummaryWriters[VisibleMemberMap.PROPERTIES];
jjg@1606 263 VisibleMemberMap visibleMemberMap =
jjg@1606 264 visibleMemberMaps[VisibleMemberMap.PROPERTIES];
jjg@1606 265 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
jjg@1606 266 }
jjg@1606 267
jjg@1606 268 /**
bpatel@766 269 * Build the summary for the nested classes.
bpatel@766 270 *
bpatel@766 271 * @param node the XML element that specifies which components to document
bpatel@766 272 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 273 */
bpatel@766 274 public void buildNestedClassesSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 275 MemberSummaryWriter writer =
bpatel@766 276 memberSummaryWriters[VisibleMemberMap.INNERCLASSES];
bpatel@766 277 VisibleMemberMap visibleMemberMap =
bpatel@766 278 visibleMemberMaps[VisibleMemberMap.INNERCLASSES];
bpatel@766 279 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 280 }
duke@1 281
bpatel@766 282 /**
bpatel@766 283 * Build the method summary.
bpatel@766 284 *
bpatel@766 285 * @param node the XML element that specifies which components to document
bpatel@766 286 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 287 */
bpatel@766 288 public void buildMethodsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 289 MemberSummaryWriter writer =
bpatel@766 290 memberSummaryWriters[VisibleMemberMap.METHODS];
bpatel@766 291 VisibleMemberMap visibleMemberMap =
bpatel@766 292 visibleMemberMaps[VisibleMemberMap.METHODS];
bpatel@766 293 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 294 }
duke@1 295
bpatel@766 296 /**
bpatel@766 297 * Build the constructor summary.
bpatel@766 298 *
bpatel@766 299 * @param node the XML element that specifies which components to document
bpatel@766 300 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 301 */
bpatel@766 302 public void buildConstructorsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 303 MemberSummaryWriter writer =
bpatel@766 304 memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS];
bpatel@766 305 VisibleMemberMap visibleMemberMap =
bpatel@766 306 visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS];
bpatel@766 307 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
bpatel@766 308 }
duke@1 309
bpatel@766 310 /**
bpatel@766 311 * Build the member summary for the given members.
bpatel@766 312 *
bpatel@766 313 * @param writer the summary writer to write the output.
bpatel@766 314 * @param visibleMemberMap the given members to summarize.
bpatel@766 315 * @param summaryTreeList list of content trees to which the documentation will be added
bpatel@766 316 */
bpatel@766 317 private void buildSummary(MemberSummaryWriter writer,
bpatel@766 318 VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
jjg@74 319 List<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
bpatel@766 320 configuration));
duke@1 321 if (members.size() > 0) {
duke@1 322 Collections.sort(members);
bpatel@1417 323 List<Content> tableContents = new LinkedList<Content>();
duke@1 324 for (int i = 0; i < members.size(); i++) {
jjg@74 325 ProgramElementDoc member = members.get(i);
jjg@1606 326 final ProgramElementDoc propertyDoc =
jjg@1606 327 visibleMemberMap.getPropertyMemberDoc(member);
jjg@1606 328 if (propertyDoc != null) {
jjg@1606 329 processProperty(visibleMemberMap, member, propertyDoc);
jjg@1606 330 }
duke@1 331 Tag[] firstSentenceTags = member.firstSentenceTags();
duke@1 332 if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
duke@1 333 //Inherit comments from overriden or implemented method if
duke@1 334 //necessary.
duke@1 335 DocFinder.Output inheritedDoc =
bpatel@766 336 DocFinder.search(new DocFinder.Input((MethodDoc) member));
bpatel@1417 337 if (inheritedDoc.holder != null
bpatel@1417 338 && inheritedDoc.holder.firstSentenceTags().length > 0) {
duke@1 339 firstSentenceTags = inheritedDoc.holder.firstSentenceTags();
duke@1 340 }
duke@1 341 }
bpatel@1417 342 writer.addMemberSummary(classDoc, member, firstSentenceTags,
bpatel@1417 343 tableContents, i);
duke@1 344 }
bpatel@1417 345 summaryTreeList.add(writer.getSummaryTableTree(classDoc, tableContents));
duke@1 346 }
bpatel@766 347 }
duke@1 348
duke@1 349 /**
jjg@1606 350 * Process the property method, property setter and/or property getter
jjg@1606 351 * comment text so that it contains the documentation from
jjg@1606 352 * the property field. The method adds the leading sentence,
jjg@1606 353 * copied documentation including the defaultValue tag and
jjg@1606 354 * the see tags if the appropriate property getter and setter are
jjg@1606 355 * available.
jjg@1606 356 *
jjg@1606 357 * @param visibleMemberMap the members information.
jjg@1606 358 * @param member the member which is to be augmented.
jjg@1606 359 * @param propertyDoc the original property documentation.
jjg@1606 360 */
jjg@1606 361 private void processProperty(VisibleMemberMap visibleMemberMap,
jjg@1606 362 ProgramElementDoc member,
jjg@1606 363 ProgramElementDoc propertyDoc) {
jjg@1606 364 StringBuilder commentTextBuilder = new StringBuilder();
jjg@1606 365 final boolean isSetter = isSetter(member);
jjg@1606 366 final boolean isGetter = isGetter(member);
jjg@1606 367 if (isGetter || isSetter) {
jjg@1606 368 //add "[GS]ets the value of the property PROPERTY_NAME."
jjg@1606 369 if (isSetter) {
jjg@1606 370 commentTextBuilder.append(
jjg@1606 371 MessageFormat.format(
jjg@1606 372 configuration.getText("doclet.PropertySetterWithName"),
jjg@1606 373 Util.propertyNameFromMethodName(member.name())));
jjg@1606 374 }
jjg@1606 375 if (isGetter) {
jjg@1606 376 commentTextBuilder.append(
jjg@1606 377 MessageFormat.format(
jjg@1606 378 configuration.getText("doclet.PropertyGetterWithName"),
jjg@1606 379 Util.propertyNameFromMethodName(member.name())));
jjg@1606 380 }
jjg@1606 381 if (propertyDoc.commentText() != null
jjg@1606 382 && !propertyDoc.commentText().isEmpty()) {
jjg@1606 383 commentTextBuilder.append(" \n @propertyDescription ");
jjg@1606 384 }
jjg@1606 385 }
jjg@1606 386 commentTextBuilder.append(propertyDoc.commentText());
jjg@1606 387
janvalenta@1866 388 // copy certain tags
janvalenta@1866 389 List<Tag> allTags = new LinkedList<Tag>();
janvalenta@1866 390 String[] tagNames = {"@defaultValue", "@since"};
janvalenta@1866 391 for (String tagName: tagNames) {
janvalenta@1866 392 Tag[] tags = propertyDoc.tags(tagName);
janvalenta@1866 393 if (tags != null) {
janvalenta@1866 394 allTags.addAll(Arrays.asList(tags));
jjg@1606 395 }
jjg@1606 396 }
janvalenta@1866 397 for (Tag tag: allTags) {
janvalenta@1866 398 commentTextBuilder.append("\n")
janvalenta@1866 399 .append(tag.name())
janvalenta@1866 400 .append(" ")
janvalenta@1866 401 .append(tag.text());
janvalenta@1866 402 }
jjg@1606 403
jjg@1606 404 //add @see tags
jjg@1606 405 if (!isGetter && !isSetter) {
jjg@1606 406 MethodDoc getter = (MethodDoc) visibleMemberMap.getGetterForProperty(member);
jjg@1606 407 MethodDoc setter = (MethodDoc) visibleMemberMap.getSetterForProperty(member);
jjg@1606 408
jjg@1606 409 if ((null != getter)
jjg@1606 410 && (commentTextBuilder.indexOf("@see #" + getter.name()) == -1)) {
jjg@1606 411 commentTextBuilder.append("\n @see #")
jjg@1606 412 .append(getter.name())
jjg@1606 413 .append("() ");
jjg@1606 414 }
jjg@1606 415
jjg@1606 416 if ((null != setter)
jjg@1606 417 && (commentTextBuilder.indexOf("@see #" + setter.name()) == -1)) {
jjg@1606 418 String typeName = setter.parameters()[0].typeName();
jjg@1606 419 // Removal of type parameters and package information.
jjg@1606 420 typeName = typeName.split("<")[0];
jjg@1606 421 if (typeName.contains(".")) {
jjg@1606 422 typeName = typeName.substring(typeName.lastIndexOf(".") + 1);
jjg@1606 423 }
jjg@1606 424 commentTextBuilder.append("\n @see #").append(setter.name());
jjg@1606 425
jjg@1606 426 if (setter.parameters()[0].type().asTypeVariable() == null) {
jjg@1606 427 commentTextBuilder.append("(").append(typeName).append(")");
jjg@1606 428 }
jjg@1606 429 commentTextBuilder.append(" \n");
jjg@1606 430 }
jjg@1606 431 }
jjg@1606 432 member.setRawCommentText(commentTextBuilder.toString());
jjg@1606 433 }
jjg@1606 434 /**
jjg@1606 435 * Test whether the method is a getter.
jjg@1606 436 * @param ped property method documentation. Needs to be either property
jjg@1606 437 * method, property getter, or property setter.
jjg@1606 438 * @return true if the given documentation belongs to a getter.
jjg@1606 439 */
jjg@1606 440 private boolean isGetter(ProgramElementDoc ped) {
jjg@1606 441 final String pedName = ped.name();
jjg@1606 442 return pedName.startsWith("get") || pedName.startsWith("is");
jjg@1606 443 }
jjg@1606 444
jjg@1606 445 /**
jjg@1606 446 * Test whether the method is a setter.
jjg@1606 447 * @param ped property method documentation. Needs to be either property
jjg@1606 448 * method, property getter, or property setter.
jjg@1606 449 * @return true if the given documentation belongs to a setter.
jjg@1606 450 */
jjg@1606 451 private boolean isSetter(ProgramElementDoc ped) {
jjg@1606 452 return ped.name().startsWith("set");
jjg@1606 453 }
jjg@1606 454
jjg@1606 455 /**
duke@1 456 * Build the inherited member summary for the given methods.
duke@1 457 *
bpatel@766 458 * @param writer the writer for this member summary.
duke@1 459 * @param visibleMemberMap the map for the members to document.
bpatel@766 460 * @param summaryTreeList list of content trees to which the documentation will be added
duke@1 461 */
bpatel@766 462 private void buildInheritedSummary(MemberSummaryWriter writer,
bpatel@766 463 VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
mcimadamore@184 464 for (Iterator<ClassDoc> iter = visibleMemberMap.getVisibleClassesList().iterator();
duke@1 465 iter.hasNext();) {
mcimadamore@184 466 ClassDoc inhclass = iter.next();
duke@1 467 if (! (inhclass.isPublic() ||
bpatel@766 468 Util.isLinkable(inhclass, configuration))) {
duke@1 469 continue;
duke@1 470 }
duke@1 471 if (inhclass == classDoc) {
duke@1 472 continue;
duke@1 473 }
jjg@74 474 List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
duke@1 475 if (inhmembers.size() > 0) {
duke@1 476 Collections.sort(inhmembers);
bpatel@766 477 Content inheritedTree = writer.getInheritedSummaryHeader(inhclass);
bpatel@766 478 Content linksTree = writer.getInheritedSummaryLinksTree();
duke@1 479 for (int j = 0; j < inhmembers.size(); ++j) {
bpatel@766 480 writer.addInheritedMemberSummary(
bpatel@766 481 inhclass.isPackagePrivate() &&
duke@1 482 ! Util.isLinkable(inhclass, configuration) ?
duke@1 483 classDoc : inhclass,
bpatel@766 484 inhmembers.get(j),
bpatel@766 485 j == 0,
bpatel@766 486 j == inhmembers.size() - 1, linksTree);
duke@1 487 }
bpatel@766 488 inheritedTree.addContent(linksTree);
bpatel@766 489 summaryTreeList.add(writer.getMemberTree(inheritedTree));
duke@1 490 }
duke@1 491 }
duke@1 492 }
bpatel@766 493
bpatel@766 494 /**
bpatel@766 495 * Add the summary for the documentation.
bpatel@766 496 *
bpatel@766 497 * @param writer the writer for this member summary.
bpatel@766 498 * @param visibleMemberMap the map for the members to document.
bpatel@766 499 * @param showInheritedSummary true if inherited summary should be documented
bpatel@766 500 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 501 */
bpatel@766 502 private void addSummary(MemberSummaryWriter writer,
bpatel@766 503 VisibleMemberMap visibleMemberMap, boolean showInheritedSummary,
bpatel@766 504 Content memberSummaryTree) {
bpatel@766 505 LinkedList<Content> summaryTreeList = new LinkedList<Content>();
bpatel@766 506 buildSummary(writer, visibleMemberMap, summaryTreeList);
bpatel@766 507 if (showInheritedSummary)
bpatel@766 508 buildInheritedSummary(writer, visibleMemberMap, summaryTreeList);
bpatel@766 509 if (!summaryTreeList.isEmpty()) {
bpatel@766 510 Content memberTree = writer.getMemberSummaryHeader(
bpatel@766 511 classDoc, memberSummaryTree);
bpatel@766 512 for (int i = 0; i < summaryTreeList.size(); i++) {
bpatel@766 513 memberTree.addContent(summaryTreeList.get(i));
bpatel@766 514 }
bpatel@766 515 memberSummaryTree.addContent(writer.getMemberTree(memberTree));
bpatel@766 516 }
bpatel@766 517 }
duke@1 518 }

mercurial