285 return loc;
286
287 return defaultLocation();
288 }
289
290 private Location defaultLocation() {
291 JavaFileManager fm = configuration.docEnv.getJavaFileManager();
292 return fm.hasLocation(StandardLocation.SOURCE_PATH)
293 ? StandardLocation.SOURCE_PATH
294 : StandardLocation.CLASS_PATH;
295 }
296
297 public boolean isAnnotated(TypeMirror e) {
298 return !e.getAnnotationMirrors().isEmpty();
299 }
300
301 public boolean isAnnotated(Element e) {
302 return !e.getAnnotationMirrors().isEmpty();
303 }
304
305 @SuppressWarnings("removal")
306 public boolean isAnnotationType(Element e) {
307 return new SimpleElementVisitor14<Boolean, Void>() {
308 @Override
309 public Boolean visitExecutable(ExecutableElement e, Void p) {
310 return visit(e.getEnclosingElement());
311 }
312
313 @Override
314 public Boolean visitUnknown(Element e, Void p) {
315 return false;
316 }
317
318 @Override
319 protected Boolean defaultAction(Element e, Void p) {
320 return e.getKind() == ANNOTATION_TYPE;
321 }
322 }.visit(e);
323 }
324
325 /**
401 public String getPropertyLabel(String name) {
402 return name.substring(0, name.lastIndexOf("Property"));
403 }
404
405 public boolean isOverviewElement(Element e) {
406 return e.getKind() == ElementKind.OTHER;
407 }
408
409 public boolean isStatic(Element e) {
410 return e.getModifiers().contains(Modifier.STATIC);
411 }
412
413 public boolean isSerializable(TypeElement e) {
414 return typeUtils.isSubtype(e.asType(), getSerializableType());
415 }
416
417 public boolean isExternalizable(TypeElement e) {
418 return typeUtils.isSubtype(e.asType(), getExternalizableType());
419 }
420
421 @SuppressWarnings("removal")
422 public boolean isRecord(TypeElement e) {
423 return e.getKind() == ElementKind.RECORD;
424 }
425
426 @SuppressWarnings("removal")
427 public boolean isCanonicalRecordConstructor(ExecutableElement ee) {
428 TypeElement te = (TypeElement) ee.getEnclosingElement();
429 List<? extends RecordComponentElement> stateComps = te.getRecordComponents();
430 List<? extends VariableElement> params = ee.getParameters();
431 if (stateComps.size() != params.size()) {
432 return false;
433 }
434
435 Iterator<? extends RecordComponentElement> stateIter = stateComps.iterator();
436 Iterator<? extends VariableElement> paramIter = params.iterator();
437 while (paramIter.hasNext() && stateIter.hasNext()) {
438 VariableElement param = paramIter.next();
439 RecordComponentElement comp = stateIter.next();
440 if (!Objects.equals(param.getSimpleName(), comp.getSimpleName())
441 || !typeUtils.isSameType(param.asType(), comp.asType())) {
442 return false;
443 }
444 }
445
446 return true;
447 }
448
449 public SortedSet<VariableElement> serializableFields(TypeElement aclass) {
450 return configuration.workArounds.getSerializableFields(aclass);
451 }
452
453 public SortedSet<ExecutableElement> serializationMethods(TypeElement aclass) {
454 return configuration.workArounds.getSerializationMethods(aclass);
455 }
456
457 public boolean definesSerializableFields(TypeElement aclass) {
458 return configuration.workArounds.definesSerializableFields( aclass);
459 }
460
461 @SuppressWarnings("removal")
462 public String modifiersToString(Element e, boolean trailingSpace) {
463 SortedSet<Modifier> modifiers = new TreeSet<>(e.getModifiers());
464 modifiers.remove(NATIVE);
465 modifiers.remove(STRICTFP);
466 modifiers.remove(SYNCHRONIZED);
467
468 return new ElementKindVisitor14<String, SortedSet<Modifier>>() {
469 final StringBuilder sb = new StringBuilder();
470
471 void addVisibilityModifier(Set<Modifier> modifiers) {
472 if (modifiers.contains(PUBLIC)) {
473 append("public");
474 } else if (modifiers.contains(PROTECTED)) {
475 append("protected");
476 } else if (modifiers.contains(PRIVATE)) {
477 append("private");
478 }
479 }
480
481 void addStatic(Set<Modifier> modifiers) {
514 public String visitTypeAsEnum(TypeElement e, SortedSet<Modifier> mods) {
515 addVisibilityModifier(mods);
516 addStatic(mods);
517 return finalString("enum");
518 }
519
520 @Override
521 public String visitTypeAsAnnotationType(TypeElement e, SortedSet<Modifier> mods) {
522 addVisibilityModifier(mods);
523 addStatic(mods);
524 return finalString("@interface");
525 }
526
527 @Override
528 public String visitTypeAsRecord(TypeElement e, SortedSet<Modifier> mods) {
529 mods.remove(FINAL); // suppress the implicit `final`
530 return visitTypeAsClass(e, mods);
531 }
532
533 @Override
534 @SuppressWarnings("removal")
535 public String visitTypeAsClass(TypeElement e, SortedSet<Modifier> mods) {
536 Set<Modifier> beforeSealed = EnumSet.noneOf(Modifier.class);
537 Set<Modifier> afterSealed = EnumSet.noneOf(Modifier.class);
538 Set<Modifier> set = beforeSealed;
539 for (Modifier m : Modifier.values()) {
540 if (mods.contains(m)) {
541 set.add(m);
542 }
543 }
544 addModifiers(beforeSealed);
545 addModifiers(afterSealed);
546 String keyword = e.getKind() == ElementKind.RECORD ? "record" : "class";
547 return finalString(keyword);
548 }
549
550 @Override
551 protected String defaultAction(Element e, SortedSet<Modifier> mods) {
552 addModifiers(mods);
553 return sb.toString().trim();
554 }
1926
1927 @Override
1928 protected String defaultAction(TypeMirror t, Void p) {
1929 return t.toString();
1930 }
1931
1932 }.visit(t);
1933 }
1934
1935 /**
1936 * A generic utility which returns the fully qualified names of an entity,
1937 * if the entity is not qualifiable then its enclosing entity, it is upto
1938 * the caller to add the elements name as required.
1939 * @param e the element to get FQN for.
1940 * @return the name
1941 */
1942 public String getFullyQualifiedName(Element e) {
1943 return getFullyQualifiedName(e, true);
1944 }
1945
1946 @SuppressWarnings("removal")
1947 public String getFullyQualifiedName(Element e, final boolean outer) {
1948 return new SimpleElementVisitor14<String, Void>() {
1949 @Override
1950 public String visitModule(ModuleElement e, Void p) {
1951 return e.getQualifiedName().toString();
1952 }
1953
1954 @Override
1955 public String visitPackage(PackageElement e, Void p) {
1956 return e.getQualifiedName().toString();
1957 }
1958
1959 @Override
1960 public String visitType(TypeElement e, Void p) {
1961 return e.getQualifiedName().toString();
1962 }
1963
1964 @Override
1965 protected String defaultAction(Element e, Void p) {
1966 return outer ? visit(e.getEnclosingElement()) : e.getSimpleName().toString();
2101 return Integer.compare(getKindIndex(e1), getKindIndex(e2));
2102 }
2103
2104 private int getKindIndex(Element e) {
2105 switch (e.getKind()) {
2106 case MODULE: return 0;
2107 case PACKAGE: return 1;
2108 case CLASS: return 2;
2109 case ENUM: return 3;
2110 case ENUM_CONSTANT: return 4;
2111 case RECORD: return 5;
2112 case INTERFACE: return 6;
2113 case ANNOTATION_TYPE: return 7;
2114 case FIELD: return 8;
2115 case CONSTRUCTOR: return 9;
2116 case METHOD: return 10;
2117 default: throw new IllegalArgumentException(e.getKind().toString());
2118 }
2119 }
2120
2121 @SuppressWarnings("removal")
2122 boolean hasParameters(Element e) {
2123 return new SimpleElementVisitor14<Boolean, Void>() {
2124 @Override
2125 public Boolean visitExecutable(ExecutableElement e, Void p) {
2126 return true;
2127 }
2128
2129 @Override
2130 protected Boolean defaultAction(Element e, Void p) {
2131 return false;
2132 }
2133
2134 }.visit(e);
2135 }
2136
2137 /**
2138 * The fully qualified names of the entities, used solely by the comparator.
2139 *
2140 * @return a negative integer, zero, or a positive integer as the first argument is less
2141 * than, equal to, or greater than the second.
2142 */
2143 @SuppressWarnings("removal")
2144 private String getFullyQualifiedName(Element e) {
2145 return new SimpleElementVisitor14<String, Void>() {
2146 @Override
2147 public String visitModule(ModuleElement e, Void p) {
2148 return e.getQualifiedName().toString();
2149 }
2150
2151 @Override
2152 public String visitPackage(PackageElement e, Void p) {
2153 return e.getQualifiedName().toString();
2154 }
2155
2156 @Override
2157 public String visitExecutable(ExecutableElement e, Void p) {
2158 // For backward compatibility
2159 return getFullyQualifiedName(e.getEnclosingElement())
2160 + "." + e.getSimpleName().toString();
2161 }
2162
2163 @Override
2235 public List<Element> getAnnotationFields(TypeElement aClass) {
2236 return getItems0(aClass, true, FIELD);
2237 }
2238
2239 List<Element> getAnnotationFieldsUnfiltered(TypeElement aClass) {
2240 return getItems0(aClass, true, FIELD);
2241 }
2242
2243 public List<Element> getAnnotationMethods(TypeElement aClass) {
2244 return getItems0(aClass, true, METHOD);
2245 }
2246
2247 public List<TypeElement> getAnnotationTypes(Element e) {
2248 return convertToTypeElement(getItems(e, true, ANNOTATION_TYPE));
2249 }
2250
2251 public List<TypeElement> getAnnotationTypesUnfiltered(Element e) {
2252 return convertToTypeElement(getItems(e, false, ANNOTATION_TYPE));
2253 }
2254
2255 @SuppressWarnings("removal")
2256 public List<TypeElement> getRecords(Element e) {
2257 return convertToTypeElement(getItems(e, true, RECORD));
2258 }
2259
2260 @SuppressWarnings("removal")
2261 public List<TypeElement> getRecordsUnfiltered(Element e) {
2262 return convertToTypeElement(getItems(e, false, RECORD));
2263 }
2264
2265 public List<VariableElement> getFields(Element e) {
2266 return convertToVariableElement(getItems(e, true, FIELD));
2267 }
2268
2269 public List<VariableElement> getFieldsUnfiltered(Element e) {
2270 return convertToVariableElement(getItems(e, false, FIELD));
2271 }
2272
2273 public List<TypeElement> getClasses(Element e) {
2274 return convertToTypeElement(getItems(e, true, CLASS));
2275 }
2276
2277 public List<TypeElement> getClassesUnfiltered(Element e) {
2278 return convertToTypeElement(getItems(e, false, CLASS));
2279 }
2280
2489 public List<TypeElement> getOrdinaryClasses(Element e) {
2490 return getClasses(e).stream()
2491 .filter(te -> (!isException(te) && !isError(te)))
2492 .collect(Collectors.toList());
2493 }
2494
2495 public List<TypeElement> getErrors(Element e) {
2496 return getClasses(e)
2497 .stream()
2498 .filter(this::isError)
2499 .collect(Collectors.toList());
2500 }
2501
2502 public List<TypeElement> getExceptions(Element e) {
2503 return getClasses(e)
2504 .stream()
2505 .filter(this::isException)
2506 .collect(Collectors.toList());
2507 }
2508
2509 @SuppressWarnings("removal")
2510 List<Element> getItems(Element e, boolean filter, ElementKind select) {
2511 List<Element> elements = new ArrayList<>();
2512 return new SimpleElementVisitor14<List<Element>, Void>() {
2513
2514 @Override
2515 public List<Element> visitPackage(PackageElement e, Void p) {
2516 recursiveGetItems(elements, e, filter, select);
2517 return elements;
2518 }
2519
2520 @Override
2521 protected List<Element> defaultAction(Element e0, Void p) {
2522 return getItems0(e0, filter, select);
2523 }
2524
2525 }.visit(e);
2526 }
2527
2528 EnumSet<ElementKind> nestedKinds = EnumSet.of(ANNOTATION_TYPE, CLASS, ENUM, INTERFACE);
2529 void recursiveGetItems(Collection<Element> list, Element e, boolean filter, ElementKind... select) {
2537 }
2538 }
2539
2540 private List<Element> getItems0(Element te, boolean filter, ElementKind... select) {
2541 EnumSet<ElementKind> kinds = EnumSet.copyOf(Arrays.asList(select));
2542 return getItems0(te, filter, kinds);
2543 }
2544
2545 private List<Element> getItems0(Element te, boolean filter, Set<ElementKind> kinds) {
2546 List<Element> elements = new ArrayList<>();
2547 for (Element e : te.getEnclosedElements()) {
2548 if (kinds.contains(e.getKind())) {
2549 if (!filter || shouldDocument(e)) {
2550 elements.add(e);
2551 }
2552 }
2553 }
2554 return elements;
2555 }
2556
2557 @SuppressWarnings("removal")
2558 private SimpleElementVisitor14<Boolean, Void> shouldDocumentVisitor = null;
2559
2560 @SuppressWarnings("removal")
2561 public boolean shouldDocument(Element e) {
2562 if (shouldDocumentVisitor == null) {
2563 shouldDocumentVisitor = new SimpleElementVisitor14<Boolean, Void>() {
2564 private boolean hasSource(TypeElement e) {
2565 return configuration.docEnv.getFileKind(e) ==
2566 javax.tools.JavaFileObject.Kind.SOURCE;
2567 }
2568
2569 // handle types
2570 @Override
2571 public Boolean visitType(TypeElement e, Void p) {
2572 // treat inner classes etc as members
2573 if (e.getNestingKind().isNested()) {
2574 return defaultAction(e, p);
2575 }
2576 return configuration.docEnv.isSelected(e) && hasSource(e);
2577 }
2578
2579 // handle everything else
2580 @Override
2593
2594 /*
2595 * nameCache is maintained for improving the comparator
2596 * performance, noting that the Collator used by the comparators
2597 * use Strings, as of this writing.
2598 * TODO: when those APIs handle charSequences, the use of
2599 * this nameCache must be re-investigated and removed.
2600 */
2601 private final Map<Element, String> nameCache = new LinkedHashMap<>();
2602
2603 /**
2604 * Returns the name of the element after the last dot of the package name.
2605 * This emulates the behavior of the old doclet.
2606 * @param e an element whose name is required
2607 * @return the name
2608 */
2609 public String getSimpleName(Element e) {
2610 return nameCache.computeIfAbsent(e, this::getSimpleName0);
2611 }
2612
2613 @SuppressWarnings("removal")
2614 private SimpleElementVisitor14<String, Void> snvisitor = null;
2615
2616 @SuppressWarnings("removal")
2617 private String getSimpleName0(Element e) {
2618 if (snvisitor == null) {
2619 snvisitor = new SimpleElementVisitor14<String, Void>() {
2620 @Override
2621 public String visitModule(ModuleElement e, Void p) {
2622 return e.getQualifiedName().toString(); // temp fix for 8182736
2623 }
2624
2625 @Override
2626 public String visitType(TypeElement e, Void p) {
2627 StringBuilder sb = new StringBuilder(e.getSimpleName());
2628 Element enclosed = e.getEnclosingElement();
2629 while (enclosed != null
2630 && (enclosed.getKind().isClass() || enclosed.getKind().isInterface())) {
2631 sb.insert(0, enclosed.getSimpleName() + ".");
2632 enclosed = enclosed.getEnclosingElement();
2633 }
2634 return sb.toString();
2635 }
2636
2780 final String chars = "0123456789abcdef";
2781 buf.append("\\u");
2782 buf.append(chars.charAt(15 & (c>>12)));
2783 buf.append(chars.charAt(15 & (c>>8)));
2784 buf.append(chars.charAt(15 & (c>>4)));
2785 buf.append(chars.charAt(15 & (c>>0)));
2786 }
2787 private boolean isPrintableAscii(char c) {
2788 return c >= ' ' && c <= '~';
2789 }
2790 }
2791
2792 public boolean isEnclosingPackageIncluded(TypeElement te) {
2793 return isIncluded(containingPackage(te));
2794 }
2795
2796 public boolean isIncluded(Element e) {
2797 return configuration.docEnv.isIncluded(e);
2798 }
2799
2800 @SuppressWarnings("removal")
2801 private SimpleElementVisitor14<Boolean, Void> specifiedVisitor = null;
2802 @SuppressWarnings("removal")
2803 public boolean isSpecified(Element e) {
2804 if (specifiedVisitor == null) {
2805 specifiedVisitor = new SimpleElementVisitor14<Boolean, Void>() {
2806 @Override
2807 public Boolean visitModule(ModuleElement e, Void p) {
2808 return configuration.getSpecifiedModuleElements().contains(e);
2809 }
2810
2811 @Override
2812 public Boolean visitPackage(PackageElement e, Void p) {
2813 return configuration.getSpecifiedPackageElements().contains(e);
2814 }
2815
2816 @Override
2817 public Boolean visitType(TypeElement e, Void p) {
2818 return configuration.getSpecifiedTypeElements().contains(e);
2819 }
2820
2821 @Override
2822 protected Boolean defaultAction(Element e, Void p) {
|
285 return loc;
286
287 return defaultLocation();
288 }
289
290 private Location defaultLocation() {
291 JavaFileManager fm = configuration.docEnv.getJavaFileManager();
292 return fm.hasLocation(StandardLocation.SOURCE_PATH)
293 ? StandardLocation.SOURCE_PATH
294 : StandardLocation.CLASS_PATH;
295 }
296
297 public boolean isAnnotated(TypeMirror e) {
298 return !e.getAnnotationMirrors().isEmpty();
299 }
300
301 public boolean isAnnotated(Element e) {
302 return !e.getAnnotationMirrors().isEmpty();
303 }
304
305 @SuppressWarnings("preview")
306 public boolean isAnnotationType(Element e) {
307 return new SimpleElementVisitor14<Boolean, Void>() {
308 @Override
309 public Boolean visitExecutable(ExecutableElement e, Void p) {
310 return visit(e.getEnclosingElement());
311 }
312
313 @Override
314 public Boolean visitUnknown(Element e, Void p) {
315 return false;
316 }
317
318 @Override
319 protected Boolean defaultAction(Element e, Void p) {
320 return e.getKind() == ANNOTATION_TYPE;
321 }
322 }.visit(e);
323 }
324
325 /**
401 public String getPropertyLabel(String name) {
402 return name.substring(0, name.lastIndexOf("Property"));
403 }
404
405 public boolean isOverviewElement(Element e) {
406 return e.getKind() == ElementKind.OTHER;
407 }
408
409 public boolean isStatic(Element e) {
410 return e.getModifiers().contains(Modifier.STATIC);
411 }
412
413 public boolean isSerializable(TypeElement e) {
414 return typeUtils.isSubtype(e.asType(), getSerializableType());
415 }
416
417 public boolean isExternalizable(TypeElement e) {
418 return typeUtils.isSubtype(e.asType(), getExternalizableType());
419 }
420
421 @SuppressWarnings("preview")
422 public boolean isRecord(TypeElement e) {
423 return e.getKind() == ElementKind.RECORD;
424 }
425
426 @SuppressWarnings("preview")
427 public boolean isCanonicalRecordConstructor(ExecutableElement ee) {
428 TypeElement te = (TypeElement) ee.getEnclosingElement();
429 List<? extends RecordComponentElement> stateComps = te.getRecordComponents();
430 List<? extends VariableElement> params = ee.getParameters();
431 if (stateComps.size() != params.size()) {
432 return false;
433 }
434
435 Iterator<? extends RecordComponentElement> stateIter = stateComps.iterator();
436 Iterator<? extends VariableElement> paramIter = params.iterator();
437 while (paramIter.hasNext() && stateIter.hasNext()) {
438 VariableElement param = paramIter.next();
439 RecordComponentElement comp = stateIter.next();
440 if (!Objects.equals(param.getSimpleName(), comp.getSimpleName())
441 || !typeUtils.isSameType(param.asType(), comp.asType())) {
442 return false;
443 }
444 }
445
446 return true;
447 }
448
449 public SortedSet<VariableElement> serializableFields(TypeElement aclass) {
450 return configuration.workArounds.getSerializableFields(aclass);
451 }
452
453 public SortedSet<ExecutableElement> serializationMethods(TypeElement aclass) {
454 return configuration.workArounds.getSerializationMethods(aclass);
455 }
456
457 public boolean definesSerializableFields(TypeElement aclass) {
458 return configuration.workArounds.definesSerializableFields( aclass);
459 }
460
461 @SuppressWarnings("preview")
462 public String modifiersToString(Element e, boolean trailingSpace) {
463 SortedSet<Modifier> modifiers = new TreeSet<>(e.getModifiers());
464 modifiers.remove(NATIVE);
465 modifiers.remove(STRICTFP);
466 modifiers.remove(SYNCHRONIZED);
467
468 return new ElementKindVisitor14<String, SortedSet<Modifier>>() {
469 final StringBuilder sb = new StringBuilder();
470
471 void addVisibilityModifier(Set<Modifier> modifiers) {
472 if (modifiers.contains(PUBLIC)) {
473 append("public");
474 } else if (modifiers.contains(PROTECTED)) {
475 append("protected");
476 } else if (modifiers.contains(PRIVATE)) {
477 append("private");
478 }
479 }
480
481 void addStatic(Set<Modifier> modifiers) {
514 public String visitTypeAsEnum(TypeElement e, SortedSet<Modifier> mods) {
515 addVisibilityModifier(mods);
516 addStatic(mods);
517 return finalString("enum");
518 }
519
520 @Override
521 public String visitTypeAsAnnotationType(TypeElement e, SortedSet<Modifier> mods) {
522 addVisibilityModifier(mods);
523 addStatic(mods);
524 return finalString("@interface");
525 }
526
527 @Override
528 public String visitTypeAsRecord(TypeElement e, SortedSet<Modifier> mods) {
529 mods.remove(FINAL); // suppress the implicit `final`
530 return visitTypeAsClass(e, mods);
531 }
532
533 @Override
534 @SuppressWarnings("preview")
535 public String visitTypeAsClass(TypeElement e, SortedSet<Modifier> mods) {
536 Set<Modifier> beforeSealed = EnumSet.noneOf(Modifier.class);
537 Set<Modifier> afterSealed = EnumSet.noneOf(Modifier.class);
538 Set<Modifier> set = beforeSealed;
539 for (Modifier m : Modifier.values()) {
540 if (mods.contains(m)) {
541 set.add(m);
542 }
543 }
544 addModifiers(beforeSealed);
545 addModifiers(afterSealed);
546 String keyword = e.getKind() == ElementKind.RECORD ? "record" : "class";
547 return finalString(keyword);
548 }
549
550 @Override
551 protected String defaultAction(Element e, SortedSet<Modifier> mods) {
552 addModifiers(mods);
553 return sb.toString().trim();
554 }
1926
1927 @Override
1928 protected String defaultAction(TypeMirror t, Void p) {
1929 return t.toString();
1930 }
1931
1932 }.visit(t);
1933 }
1934
1935 /**
1936 * A generic utility which returns the fully qualified names of an entity,
1937 * if the entity is not qualifiable then its enclosing entity, it is upto
1938 * the caller to add the elements name as required.
1939 * @param e the element to get FQN for.
1940 * @return the name
1941 */
1942 public String getFullyQualifiedName(Element e) {
1943 return getFullyQualifiedName(e, true);
1944 }
1945
1946 @SuppressWarnings("preview")
1947 public String getFullyQualifiedName(Element e, final boolean outer) {
1948 return new SimpleElementVisitor14<String, Void>() {
1949 @Override
1950 public String visitModule(ModuleElement e, Void p) {
1951 return e.getQualifiedName().toString();
1952 }
1953
1954 @Override
1955 public String visitPackage(PackageElement e, Void p) {
1956 return e.getQualifiedName().toString();
1957 }
1958
1959 @Override
1960 public String visitType(TypeElement e, Void p) {
1961 return e.getQualifiedName().toString();
1962 }
1963
1964 @Override
1965 protected String defaultAction(Element e, Void p) {
1966 return outer ? visit(e.getEnclosingElement()) : e.getSimpleName().toString();
2101 return Integer.compare(getKindIndex(e1), getKindIndex(e2));
2102 }
2103
2104 private int getKindIndex(Element e) {
2105 switch (e.getKind()) {
2106 case MODULE: return 0;
2107 case PACKAGE: return 1;
2108 case CLASS: return 2;
2109 case ENUM: return 3;
2110 case ENUM_CONSTANT: return 4;
2111 case RECORD: return 5;
2112 case INTERFACE: return 6;
2113 case ANNOTATION_TYPE: return 7;
2114 case FIELD: return 8;
2115 case CONSTRUCTOR: return 9;
2116 case METHOD: return 10;
2117 default: throw new IllegalArgumentException(e.getKind().toString());
2118 }
2119 }
2120
2121 @SuppressWarnings("preview")
2122 boolean hasParameters(Element e) {
2123 return new SimpleElementVisitor14<Boolean, Void>() {
2124 @Override
2125 public Boolean visitExecutable(ExecutableElement e, Void p) {
2126 return true;
2127 }
2128
2129 @Override
2130 protected Boolean defaultAction(Element e, Void p) {
2131 return false;
2132 }
2133
2134 }.visit(e);
2135 }
2136
2137 /**
2138 * The fully qualified names of the entities, used solely by the comparator.
2139 *
2140 * @return a negative integer, zero, or a positive integer as the first argument is less
2141 * than, equal to, or greater than the second.
2142 */
2143 @SuppressWarnings("preview")
2144 private String getFullyQualifiedName(Element e) {
2145 return new SimpleElementVisitor14<String, Void>() {
2146 @Override
2147 public String visitModule(ModuleElement e, Void p) {
2148 return e.getQualifiedName().toString();
2149 }
2150
2151 @Override
2152 public String visitPackage(PackageElement e, Void p) {
2153 return e.getQualifiedName().toString();
2154 }
2155
2156 @Override
2157 public String visitExecutable(ExecutableElement e, Void p) {
2158 // For backward compatibility
2159 return getFullyQualifiedName(e.getEnclosingElement())
2160 + "." + e.getSimpleName().toString();
2161 }
2162
2163 @Override
2235 public List<Element> getAnnotationFields(TypeElement aClass) {
2236 return getItems0(aClass, true, FIELD);
2237 }
2238
2239 List<Element> getAnnotationFieldsUnfiltered(TypeElement aClass) {
2240 return getItems0(aClass, true, FIELD);
2241 }
2242
2243 public List<Element> getAnnotationMethods(TypeElement aClass) {
2244 return getItems0(aClass, true, METHOD);
2245 }
2246
2247 public List<TypeElement> getAnnotationTypes(Element e) {
2248 return convertToTypeElement(getItems(e, true, ANNOTATION_TYPE));
2249 }
2250
2251 public List<TypeElement> getAnnotationTypesUnfiltered(Element e) {
2252 return convertToTypeElement(getItems(e, false, ANNOTATION_TYPE));
2253 }
2254
2255 @SuppressWarnings("preview")
2256 public List<TypeElement> getRecords(Element e) {
2257 return convertToTypeElement(getItems(e, true, RECORD));
2258 }
2259
2260 @SuppressWarnings("preview")
2261 public List<TypeElement> getRecordsUnfiltered(Element e) {
2262 return convertToTypeElement(getItems(e, false, RECORD));
2263 }
2264
2265 public List<VariableElement> getFields(Element e) {
2266 return convertToVariableElement(getItems(e, true, FIELD));
2267 }
2268
2269 public List<VariableElement> getFieldsUnfiltered(Element e) {
2270 return convertToVariableElement(getItems(e, false, FIELD));
2271 }
2272
2273 public List<TypeElement> getClasses(Element e) {
2274 return convertToTypeElement(getItems(e, true, CLASS));
2275 }
2276
2277 public List<TypeElement> getClassesUnfiltered(Element e) {
2278 return convertToTypeElement(getItems(e, false, CLASS));
2279 }
2280
2489 public List<TypeElement> getOrdinaryClasses(Element e) {
2490 return getClasses(e).stream()
2491 .filter(te -> (!isException(te) && !isError(te)))
2492 .collect(Collectors.toList());
2493 }
2494
2495 public List<TypeElement> getErrors(Element e) {
2496 return getClasses(e)
2497 .stream()
2498 .filter(this::isError)
2499 .collect(Collectors.toList());
2500 }
2501
2502 public List<TypeElement> getExceptions(Element e) {
2503 return getClasses(e)
2504 .stream()
2505 .filter(this::isException)
2506 .collect(Collectors.toList());
2507 }
2508
2509 @SuppressWarnings("preview")
2510 List<Element> getItems(Element e, boolean filter, ElementKind select) {
2511 List<Element> elements = new ArrayList<>();
2512 return new SimpleElementVisitor14<List<Element>, Void>() {
2513
2514 @Override
2515 public List<Element> visitPackage(PackageElement e, Void p) {
2516 recursiveGetItems(elements, e, filter, select);
2517 return elements;
2518 }
2519
2520 @Override
2521 protected List<Element> defaultAction(Element e0, Void p) {
2522 return getItems0(e0, filter, select);
2523 }
2524
2525 }.visit(e);
2526 }
2527
2528 EnumSet<ElementKind> nestedKinds = EnumSet.of(ANNOTATION_TYPE, CLASS, ENUM, INTERFACE);
2529 void recursiveGetItems(Collection<Element> list, Element e, boolean filter, ElementKind... select) {
2537 }
2538 }
2539
2540 private List<Element> getItems0(Element te, boolean filter, ElementKind... select) {
2541 EnumSet<ElementKind> kinds = EnumSet.copyOf(Arrays.asList(select));
2542 return getItems0(te, filter, kinds);
2543 }
2544
2545 private List<Element> getItems0(Element te, boolean filter, Set<ElementKind> kinds) {
2546 List<Element> elements = new ArrayList<>();
2547 for (Element e : te.getEnclosedElements()) {
2548 if (kinds.contains(e.getKind())) {
2549 if (!filter || shouldDocument(e)) {
2550 elements.add(e);
2551 }
2552 }
2553 }
2554 return elements;
2555 }
2556
2557 @SuppressWarnings("preview")
2558 private SimpleElementVisitor14<Boolean, Void> shouldDocumentVisitor = null;
2559
2560 @SuppressWarnings("preview")
2561 public boolean shouldDocument(Element e) {
2562 if (shouldDocumentVisitor == null) {
2563 shouldDocumentVisitor = new SimpleElementVisitor14<Boolean, Void>() {
2564 private boolean hasSource(TypeElement e) {
2565 return configuration.docEnv.getFileKind(e) ==
2566 javax.tools.JavaFileObject.Kind.SOURCE;
2567 }
2568
2569 // handle types
2570 @Override
2571 public Boolean visitType(TypeElement e, Void p) {
2572 // treat inner classes etc as members
2573 if (e.getNestingKind().isNested()) {
2574 return defaultAction(e, p);
2575 }
2576 return configuration.docEnv.isSelected(e) && hasSource(e);
2577 }
2578
2579 // handle everything else
2580 @Override
2593
2594 /*
2595 * nameCache is maintained for improving the comparator
2596 * performance, noting that the Collator used by the comparators
2597 * use Strings, as of this writing.
2598 * TODO: when those APIs handle charSequences, the use of
2599 * this nameCache must be re-investigated and removed.
2600 */
2601 private final Map<Element, String> nameCache = new LinkedHashMap<>();
2602
2603 /**
2604 * Returns the name of the element after the last dot of the package name.
2605 * This emulates the behavior of the old doclet.
2606 * @param e an element whose name is required
2607 * @return the name
2608 */
2609 public String getSimpleName(Element e) {
2610 return nameCache.computeIfAbsent(e, this::getSimpleName0);
2611 }
2612
2613 @SuppressWarnings("preview")
2614 private SimpleElementVisitor14<String, Void> snvisitor = null;
2615
2616 @SuppressWarnings("preview")
2617 private String getSimpleName0(Element e) {
2618 if (snvisitor == null) {
2619 snvisitor = new SimpleElementVisitor14<String, Void>() {
2620 @Override
2621 public String visitModule(ModuleElement e, Void p) {
2622 return e.getQualifiedName().toString(); // temp fix for 8182736
2623 }
2624
2625 @Override
2626 public String visitType(TypeElement e, Void p) {
2627 StringBuilder sb = new StringBuilder(e.getSimpleName());
2628 Element enclosed = e.getEnclosingElement();
2629 while (enclosed != null
2630 && (enclosed.getKind().isClass() || enclosed.getKind().isInterface())) {
2631 sb.insert(0, enclosed.getSimpleName() + ".");
2632 enclosed = enclosed.getEnclosingElement();
2633 }
2634 return sb.toString();
2635 }
2636
2780 final String chars = "0123456789abcdef";
2781 buf.append("\\u");
2782 buf.append(chars.charAt(15 & (c>>12)));
2783 buf.append(chars.charAt(15 & (c>>8)));
2784 buf.append(chars.charAt(15 & (c>>4)));
2785 buf.append(chars.charAt(15 & (c>>0)));
2786 }
2787 private boolean isPrintableAscii(char c) {
2788 return c >= ' ' && c <= '~';
2789 }
2790 }
2791
2792 public boolean isEnclosingPackageIncluded(TypeElement te) {
2793 return isIncluded(containingPackage(te));
2794 }
2795
2796 public boolean isIncluded(Element e) {
2797 return configuration.docEnv.isIncluded(e);
2798 }
2799
2800 @SuppressWarnings("preview")
2801 private SimpleElementVisitor14<Boolean, Void> specifiedVisitor = null;
2802 @SuppressWarnings("preview")
2803 public boolean isSpecified(Element e) {
2804 if (specifiedVisitor == null) {
2805 specifiedVisitor = new SimpleElementVisitor14<Boolean, Void>() {
2806 @Override
2807 public Boolean visitModule(ModuleElement e, Void p) {
2808 return configuration.getSpecifiedModuleElements().contains(e);
2809 }
2810
2811 @Override
2812 public Boolean visitPackage(PackageElement e, Void p) {
2813 return configuration.getSpecifiedPackageElements().contains(e);
2814 }
2815
2816 @Override
2817 public Boolean visitType(TypeElement e, Void p) {
2818 return configuration.getSpecifiedTypeElements().contains(e);
2819 }
2820
2821 @Override
2822 protected Boolean defaultAction(Element e, Void p) {
|