< prev index next >

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java

Print this page




 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) {


< prev index next >