< prev index next >
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java
Print this page
rev 58565 : records: mark record related model API as preview
*** 45,54 ****
--- 45,55 ----
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.ModuleElement.RequiresDirective;
import javax.lang.model.element.PackageElement;
+ import javax.lang.model.element.RecordComponentElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.DeclaredType;
*** 58,70 ****
import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.type.TypeVariable;
import javax.lang.model.type.WildcardType;
import javax.lang.model.util.ElementFilter;
! import javax.lang.model.util.ElementKindVisitor9;
import javax.lang.model.util.Elements;
! import javax.lang.model.util.SimpleElementVisitor9;
import javax.lang.model.util.SimpleTypeVisitor9;
import javax.lang.model.util.TypeKindVisitor9;
import javax.lang.model.util.Types;
import javax.tools.FileObject;
import javax.tools.JavaFileManager;
--- 59,71 ----
import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.type.TypeVariable;
import javax.lang.model.type.WildcardType;
import javax.lang.model.util.ElementFilter;
! import javax.lang.model.util.ElementKindVisitor14;
import javax.lang.model.util.Elements;
! import javax.lang.model.util.SimpleElementVisitor14;
import javax.lang.model.util.SimpleTypeVisitor9;
import javax.lang.model.util.TypeKindVisitor9;
import javax.lang.model.util.Types;
import javax.tools.FileObject;
import javax.tools.JavaFileManager;
*** 299,310 ****
public boolean isAnnotated(Element e) {
return !e.getAnnotationMirrors().isEmpty();
}
public boolean isAnnotationType(Element e) {
! return new SimpleElementVisitor9<Boolean, Void>() {
@Override
public Boolean visitExecutable(ExecutableElement e, Void p) {
return visit(e.getEnclosingElement());
}
--- 300,312 ----
public boolean isAnnotated(Element e) {
return !e.getAnnotationMirrors().isEmpty();
}
+ @SuppressWarnings("preview")
public boolean isAnnotationType(Element e) {
! return new SimpleElementVisitor14<Boolean, Void>() {
@Override
public Boolean visitExecutable(ExecutableElement e, Void p) {
return visit(e.getEnclosingElement());
}
*** 414,423 ****
--- 416,453 ----
public boolean isExternalizable(TypeElement e) {
return typeUtils.isSubtype(e.asType(), getExternalizableType());
}
+ @SuppressWarnings("preview")
+ public boolean isRecord(TypeElement e) {
+ return e.getKind() == ElementKind.RECORD;
+ }
+
+ @SuppressWarnings("preview")
+ public boolean isCanonicalRecordConstructor(ExecutableElement ee) {
+ TypeElement te = (TypeElement) ee.getEnclosingElement();
+ List<? extends RecordComponentElement> stateComps = te.getRecordComponents();
+ List<? extends VariableElement> params = ee.getParameters();
+ if (stateComps.size() != params.size()) {
+ return false;
+ }
+
+ Iterator<? extends RecordComponentElement> stateIter = stateComps.iterator();
+ Iterator<? extends VariableElement> paramIter = params.iterator();
+ while (paramIter.hasNext() && stateIter.hasNext()) {
+ VariableElement param = paramIter.next();
+ RecordComponentElement comp = stateIter.next();
+ if (!Objects.equals(param.getSimpleName(), comp.getSimpleName())
+ || !typeUtils.isSameType(param.asType(), comp.asType())) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
public SortedSet<VariableElement> serializableFields(TypeElement aclass) {
return configuration.workArounds.getSerializableFields(aclass);
}
public SortedSet<ExecutableElement> serializationMethods(TypeElement aclass) {
*** 426,514 ****
public boolean definesSerializableFields(TypeElement aclass) {
return configuration.workArounds.definesSerializableFields( aclass);
}
public String modifiersToString(Element e, boolean trailingSpace) {
! SortedSet<Modifier> set = new TreeSet<>(e.getModifiers());
! set.remove(Modifier.NATIVE);
! set.remove(Modifier.STRICTFP);
! set.remove(Modifier.SYNCHRONIZED);
! return new ElementKindVisitor9<String, SortedSet<Modifier>>() {
final StringBuilder sb = new StringBuilder();
void addVisibilityModifier(Set<Modifier> modifiers) {
if (modifiers.contains(PUBLIC)) {
! sb.append("public").append(" ");
} else if (modifiers.contains(PROTECTED)) {
! sb.append("protected").append(" ");
} else if (modifiers.contains(PRIVATE)) {
! sb.append("private").append(" ");
}
}
void addStatic(Set<Modifier> modifiers) {
if (modifiers.contains(STATIC)) {
! sb.append("static").append(" ");
}
}
! void addModifers(Set<Modifier> modifiers) {
! String s = set.stream().map(Modifier::toString).collect(Collectors.joining(" "));
! sb.append(s);
! if (!s.isEmpty())
sb.append(" ");
}
String finalString(String s) {
! sb.append(s);
if (trailingSpace) {
! if (sb.lastIndexOf(" ") == sb.length() - 1) {
! return sb.toString();
! } else {
! return sb.append(" ").toString();
! }
! } else {
! return sb.toString().trim();
}
}
@Override
! public String visitTypeAsInterface(TypeElement e, SortedSet<Modifier> p) {
! addVisibilityModifier(p);
! addStatic(p);
return finalString("interface");
}
@Override
! public String visitTypeAsEnum(TypeElement e, SortedSet<Modifier> p) {
! addVisibilityModifier(p);
! addStatic(p);
return finalString("enum");
}
@Override
! public String visitTypeAsAnnotationType(TypeElement e, SortedSet<Modifier> p) {
! addVisibilityModifier(p);
! addStatic(p);
return finalString("@interface");
}
@Override
! public String visitTypeAsClass(TypeElement e, SortedSet<Modifier> p) {
! addModifers(p);
! return finalString("class");
}
@Override
! protected String defaultAction(Element e, SortedSet<Modifier> p) {
! addModifers(p);
return sb.toString().trim();
}
! }.visit(e, set);
}
public boolean isFunctionalInterface(AnnotationMirror amirror) {
return amirror.getAnnotationType().equals(getFunctionalInterface()) &&
configuration.docEnv.getSourceVersion()
--- 456,561 ----
public boolean definesSerializableFields(TypeElement aclass) {
return configuration.workArounds.definesSerializableFields( aclass);
}
+ @SuppressWarnings("preview")
public String modifiersToString(Element e, boolean trailingSpace) {
! SortedSet<Modifier> modifiers = new TreeSet<>(e.getModifiers());
! modifiers.remove(NATIVE);
! modifiers.remove(STRICTFP);
! modifiers.remove(SYNCHRONIZED);
! return new ElementKindVisitor14<String, SortedSet<Modifier>>() {
final StringBuilder sb = new StringBuilder();
void addVisibilityModifier(Set<Modifier> modifiers) {
if (modifiers.contains(PUBLIC)) {
! append("public");
} else if (modifiers.contains(PROTECTED)) {
! append("protected");
} else if (modifiers.contains(PRIVATE)) {
! append("private");
}
}
void addStatic(Set<Modifier> modifiers) {
if (modifiers.contains(STATIC)) {
! append("static");
}
}
! void addModifiers(Set<Modifier> modifiers) {
! modifiers.stream().map(Modifier::toString).forEach(this::append);
! }
!
! void append(String s) {
! if (sb.length() > 0) {
sb.append(" ");
}
+ sb.append(s);
+ }
String finalString(String s) {
! append(s);
if (trailingSpace) {
! sb.append(" ");
}
+ return sb.toString();
}
@Override
! public String visitTypeAsInterface(TypeElement e, SortedSet<Modifier> mods) {
! addVisibilityModifier(mods);
! addStatic(mods);
return finalString("interface");
}
@Override
! public String visitTypeAsEnum(TypeElement e, SortedSet<Modifier> mods) {
! addVisibilityModifier(mods);
! addStatic(mods);
return finalString("enum");
}
@Override
! public String visitTypeAsAnnotationType(TypeElement e, SortedSet<Modifier> mods) {
! addVisibilityModifier(mods);
! addStatic(mods);
return finalString("@interface");
}
@Override
! public String visitTypeAsRecord(TypeElement e, SortedSet<Modifier> mods) {
! mods.remove(FINAL); // suppress the implicit `final`
! return visitTypeAsClass(e, mods);
}
@Override
! @SuppressWarnings("preview")
! public String visitTypeAsClass(TypeElement e, SortedSet<Modifier> mods) {
! Set<Modifier> beforeSealed = EnumSet.noneOf(Modifier.class);
! Set<Modifier> afterSealed = EnumSet.noneOf(Modifier.class);
! Set<Modifier> set = beforeSealed;
! for (Modifier m : Modifier.values()) {
! if (mods.contains(m)) {
! set.add(m);
! }
! }
! addModifiers(beforeSealed);
! addModifiers(afterSealed);
! String keyword = e.getKind() == ElementKind.RECORD ? "record" : "class";
! return finalString(keyword);
! }
!
! @Override
! protected String defaultAction(Element e, SortedSet<Modifier> mods) {
! addModifiers(mods);
return sb.toString().trim();
}
! }.visit(e, modifiers);
}
public boolean isFunctionalInterface(AnnotationMirror amirror) {
return amirror.getAnnotationType().equals(getFunctionalInterface()) &&
configuration.docEnv.getSourceVersion()
*** 591,601 ****
}
}
public boolean isTypeElement(Element e) {
switch (e.getKind()) {
! case CLASS: case ENUM: case INTERFACE: case ANNOTATION_TYPE:
return true;
default:
return false;
}
}
--- 638,648 ----
}
}
public boolean isTypeElement(Element e) {
switch (e.getKind()) {
! case CLASS: case ENUM: case INTERFACE: case ANNOTATION_TYPE: case RECORD:
return true;
default:
return false;
}
}
*** 1361,1391 ****
sb.append(text, pos, textLength);
return sb;
}
/**
- * The documentation for values() and valueOf() in Enums are set by the
- * doclet only iff the user or overridden methods are missing.
- * @param elem
- */
- public void setEnumDocumentation(TypeElement elem) {
- for (Element e : getMethods(elem)) {
- ExecutableElement ee = (ExecutableElement)e;
- if (!getFullBody(e).isEmpty()) // ignore if already set
- continue;
- if (ee.getSimpleName().contentEquals("values") && ee.getParameters().isEmpty()) {
- removeCommentHelper(ee); // purge previous entry
- configuration.cmtUtils.setEnumValuesTree(e);
- }
- if (ee.getSimpleName().contentEquals("valueOf") && ee.getParameters().size() == 1) {
- removeCommentHelper(ee); // purge previous entry
- configuration.cmtUtils.setEnumValueOfTree(e);
- }
- }
- }
-
- /**
* Returns a locale independent upper cased String. That is, it
* always uses US locale, this is a clone of the one in StringUtils.
* @param s to convert
* @return converted String
*/
--- 1408,1417 ----
*** 1758,1768 ****
return result;
}
result = compareStrings(getFullyQualifiedName(o1), getFullyQualifiedName(o2));
if (result != 0)
return result;
! return compareElementTypeKinds(o1, o2);
}
};
}
return overrideUseComparator;
}
--- 1784,1794 ----
return result;
}
result = compareStrings(getFullyQualifiedName(o1), getFullyQualifiedName(o2));
if (result != 0)
return result;
! return compareElementKinds(o1, o2);
}
};
}
return overrideUseComparator;
}
*** 1807,1817 ****
}
if (result != 0) {
return result;
}
// if names are the same, compare element kinds
! result = compareElementTypeKinds(e1, e2);
if (result != 0) {
return result;
}
// if element kinds are the same, and are methods,
// compare the method parameters
--- 1833,1843 ----
}
if (result != 0) {
return result;
}
// if names are the same, compare element kinds
! result = compareElementKinds(e1, e2);
if (result != 0) {
return result;
}
// if element kinds are the same, and are methods,
// compare the method parameters
*** 1915,1926 ****
*/
public String getFullyQualifiedName(Element e) {
return getFullyQualifiedName(e, true);
}
public String getFullyQualifiedName(Element e, final boolean outer) {
! return new SimpleElementVisitor9<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString();
}
--- 1941,1953 ----
*/
public String getFullyQualifiedName(Element e) {
return getFullyQualifiedName(e, true);
}
+ @SuppressWarnings("preview")
public String getFullyQualifiedName(Element e, final boolean outer) {
! return new SimpleElementVisitor14<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString();
}
*** 1983,1993 ****
result = compareParameters(true, parameters1, parameters2);
}
if (result != 0) {
return result;
}
! return compareElementTypeKinds(e1, e2);
}
};
}
return classUseComparator;
}
--- 2010,2020 ----
result = compareParameters(true, parameters1, parameters2);
}
if (result != 0) {
return result;
}
! return compareElementKinds(e1, e2);
}
};
}
return classUseComparator;
}
*** 1995,2027 ****
/**
* A general purpose comparator to sort Element entities, basically provides the building blocks
* for creating specific comparators for an use-case.
*/
private abstract class ElementComparator implements Comparator<Element> {
/**
* compares two parameter arrays by first comparing the length of the arrays, and
* then each Type of the parameter in the array.
* @param params1 the first parameter array.
* @param params2 the first parameter array.
* @return a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
- final EnumMap<ElementKind, Integer> elementKindOrder;
- public ElementComparator() {
- elementKindOrder = new EnumMap<>(ElementKind.class);
- elementKindOrder.put(ElementKind.MODULE, 0);
- elementKindOrder.put(ElementKind.PACKAGE, 1);
- elementKindOrder.put(ElementKind.CLASS, 2);
- elementKindOrder.put(ElementKind.ENUM, 3);
- elementKindOrder.put(ElementKind.ENUM_CONSTANT, 4);
- elementKindOrder.put(ElementKind.INTERFACE, 5);
- elementKindOrder.put(ElementKind.ANNOTATION_TYPE, 6);
- elementKindOrder.put(ElementKind.FIELD, 7);
- elementKindOrder.put(ElementKind.CONSTRUCTOR, 8);
- elementKindOrder.put(ElementKind.METHOD, 9);
- }
-
protected int compareParameters(boolean caseSensitive, List<? extends VariableElement> params1,
List<? extends VariableElement> params2) {
return compareStrings(caseSensitive, getParametersAsString(params1),
getParametersAsString(params2));
--- 2022,2041 ----
/**
* A general purpose comparator to sort Element entities, basically provides the building blocks
* for creating specific comparators for an use-case.
*/
private abstract class ElementComparator implements Comparator<Element> {
+ public ElementComparator() { }
+
/**
* compares two parameter arrays by first comparing the length of the arrays, and
* then each Type of the parameter in the array.
* @param params1 the first parameter array.
* @param params2 the first parameter array.
* @return a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
protected int compareParameters(boolean caseSensitive, List<? extends VariableElement> params1,
List<? extends VariableElement> params2) {
return compareStrings(caseSensitive, getParametersAsString(params1),
getParametersAsString(params2));
*** 2080,2095 ****
// add simplename to be compatible
String thisElement = getFullyQualifiedName(e1);
String thatElement = getFullyQualifiedName(e2);
return compareStrings(thisElement, thatElement);
}
! protected int compareElementTypeKinds(Element e1, Element e2) {
! return Integer.compare(elementKindOrder.get(e1.getKind()),
! elementKindOrder.get(e2.getKind()));
}
boolean hasParameters(Element e) {
! return new SimpleElementVisitor9<Boolean, Void>() {
@Override
public Boolean visitExecutable(ExecutableElement e, Void p) {
return true;
}
--- 2094,2128 ----
// add simplename to be compatible
String thisElement = getFullyQualifiedName(e1);
String thatElement = getFullyQualifiedName(e2);
return compareStrings(thisElement, thatElement);
}
!
! protected int compareElementKinds(Element e1, Element e2) {
! return Integer.compare(getKindIndex(e1), getKindIndex(e2));
}
+
+ private int getKindIndex(Element e) {
+ switch (e.getKind()) {
+ case MODULE: return 0;
+ case PACKAGE: return 1;
+ case CLASS: return 2;
+ case ENUM: return 3;
+ case ENUM_CONSTANT: return 4;
+ case RECORD: return 5;
+ case INTERFACE: return 6;
+ case ANNOTATION_TYPE: return 7;
+ case FIELD: return 8;
+ case CONSTRUCTOR: return 9;
+ case METHOD: return 10;
+ default: throw new IllegalArgumentException(e.getKind().toString());
+ }
+ }
+
+ @SuppressWarnings("preview")
boolean hasParameters(Element e) {
! return new SimpleElementVisitor14<Boolean, Void>() {
@Override
public Boolean visitExecutable(ExecutableElement e, Void p) {
return true;
}
*** 2105,2116 ****
* The fully qualified names of the entities, used solely by the comparator.
*
* @return a negative integer, zero, or a positive integer as the first argument is less
* than, equal to, or greater than the second.
*/
private String getFullyQualifiedName(Element e) {
! return new SimpleElementVisitor9<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString();
}
--- 2138,2150 ----
* The fully qualified names of the entities, used solely by the comparator.
*
* @return a negative integer, zero, or a positive integer as the first argument is less
* than, equal to, or greater than the second.
*/
+ @SuppressWarnings("preview")
private String getFullyQualifiedName(Element e) {
! return new SimpleElementVisitor14<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString();
}
*** 2185,2194 ****
--- 2219,2229 ----
public Iterable<TypeElement> getEnclosedTypeElements(PackageElement pkg) {
List<TypeElement> out = getInterfaces(pkg);
out.addAll(getClasses(pkg));
out.addAll(getEnums(pkg));
out.addAll(getAnnotationTypes(pkg));
+ out.addAll(getRecords(pkg));
return out;
}
// Element related methods
public List<Element> getAnnotationMembers(TypeElement aClass) {
*** 2215,2224 ****
--- 2250,2269 ----
public List<TypeElement> getAnnotationTypesUnfiltered(Element e) {
return convertToTypeElement(getItems(e, false, ANNOTATION_TYPE));
}
+ @SuppressWarnings("preview")
+ public List<TypeElement> getRecords(Element e) {
+ return convertToTypeElement(getItems(e, true, RECORD));
+ }
+
+ @SuppressWarnings("preview")
+ public List<TypeElement> getRecordsUnfiltered(Element e) {
+ return convertToTypeElement(getItems(e, false, RECORD));
+ }
+
public List<VariableElement> getFields(Element e) {
return convertToVariableElement(getItems(e, true, FIELD));
}
public List<VariableElement> getFieldsUnfiltered(Element e) {
*** 2369,2378 ****
--- 2414,2424 ----
public SortedSet<TypeElement> getAllClassesUnfiltered(Element e) {
List<TypeElement> clist = getClassesUnfiltered(e);
clist.addAll(getInterfacesUnfiltered(e));
clist.addAll(getAnnotationTypesUnfiltered(e));
+ clist.addAll(getRecordsUnfiltered(e));
SortedSet<TypeElement> oset = new TreeSet<>(makeGeneralPurposeComparator());
oset.addAll(clist);
return oset;
}
*** 2389,2398 ****
--- 2435,2445 ----
return oset;
List<TypeElement> clist = getClasses(e);
clist.addAll(getInterfaces(e));
clist.addAll(getAnnotationTypes(e));
clist.addAll(getEnums(e));
+ clist.addAll(getRecords(e));
oset = new TreeSet<>(makeGeneralPurposeComparator());
oset.addAll(clist);
cachedClasses.put(e, oset);
return oset;
}
*** 2457,2469 ****
.stream()
.filter(this::isException)
.collect(Collectors.toList());
}
List<Element> getItems(Element e, boolean filter, ElementKind select) {
List<Element> elements = new ArrayList<>();
! return new SimpleElementVisitor9<List<Element>, Void>() {
@Override
public List<Element> visitPackage(PackageElement e, Void p) {
recursiveGetItems(elements, e, filter, select);
return elements;
--- 2504,2517 ----
.stream()
.filter(this::isException)
.collect(Collectors.toList());
}
+ @SuppressWarnings("preview")
List<Element> getItems(Element e, boolean filter, ElementKind select) {
List<Element> elements = new ArrayList<>();
! return new SimpleElementVisitor14<List<Element>, Void>() {
@Override
public List<Element> visitPackage(PackageElement e, Void p) {
recursiveGetItems(elements, e, filter, select);
return elements;
*** 2504,2518 ****
}
}
return elements;
}
! private SimpleElementVisitor9<Boolean, Void> shouldDocumentVisitor = null;
! protected boolean shouldDocument(Element e) {
if (shouldDocumentVisitor == null) {
! shouldDocumentVisitor = new SimpleElementVisitor9<Boolean, Void>() {
private boolean hasSource(TypeElement e) {
return configuration.docEnv.getFileKind(e) ==
javax.tools.JavaFileObject.Kind.SOURCE;
}
--- 2552,2568 ----
}
}
return elements;
}
! @SuppressWarnings("preview")
! private SimpleElementVisitor14<Boolean, Void> shouldDocumentVisitor = null;
! @SuppressWarnings("preview")
! public boolean shouldDocument(Element e) {
if (shouldDocumentVisitor == null) {
! shouldDocumentVisitor = new SimpleElementVisitor14<Boolean, Void>() {
private boolean hasSource(TypeElement e) {
return configuration.docEnv.getFileKind(e) ==
javax.tools.JavaFileObject.Kind.SOURCE;
}
*** 2558,2572 ****
*/
public String getSimpleName(Element e) {
return nameCache.computeIfAbsent(e, this::getSimpleName0);
}
! private SimpleElementVisitor9<String, Void> snvisitor = null;
private String getSimpleName0(Element e) {
if (snvisitor == null) {
! snvisitor = new SimpleElementVisitor9<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString(); // temp fix for 8182736
}
--- 2608,2624 ----
*/
public String getSimpleName(Element e) {
return nameCache.computeIfAbsent(e, this::getSimpleName0);
}
! @SuppressWarnings("preview")
! private SimpleElementVisitor14<String, Void> snvisitor = null;
+ @SuppressWarnings("preview")
private String getSimpleName0(Element e) {
if (snvisitor == null) {
! snvisitor = new SimpleElementVisitor14<String, Void>() {
@Override
public String visitModule(ModuleElement e, Void p) {
return e.getQualifiedName().toString(); // temp fix for 8182736
}
*** 2743,2756 ****
public boolean isIncluded(Element e) {
return configuration.docEnv.isIncluded(e);
}
! private SimpleElementVisitor9<Boolean, Void> specifiedVisitor = null;
public boolean isSpecified(Element e) {
if (specifiedVisitor == null) {
! specifiedVisitor = new SimpleElementVisitor9<Boolean, Void>() {
@Override
public Boolean visitModule(ModuleElement e, Void p) {
return configuration.getSpecifiedModuleElements().contains(e);
}
--- 2795,2810 ----
public boolean isIncluded(Element e) {
return configuration.docEnv.isIncluded(e);
}
! @SuppressWarnings("preview")
! private SimpleElementVisitor14<Boolean, Void> specifiedVisitor = null;
! @SuppressWarnings("preview")
public boolean isSpecified(Element e) {
if (specifiedVisitor == null) {
! specifiedVisitor = new SimpleElementVisitor14<Boolean, Void>() {
@Override
public Boolean visitModule(ModuleElement e, Void p) {
return configuration.getSpecifiedModuleElements().contains(e);
}
*** 3194,3217 ****
public List<? extends DocTree> getThrowsTrees(Element element) {
return getBlockTags(element, DocTree.Kind.EXCEPTION, DocTree.Kind.THROWS);
}
! public List<? extends DocTree> getTypeParamTrees(Element element) {
return getParamTrees(element, true);
}
! public List<? extends DocTree> getParamTrees(Element element) {
return getParamTrees(element, false);
}
! private List<? extends DocTree> getParamTrees(Element element, boolean isTypeParameters) {
! List<DocTree> out = new ArrayList<>();
for (DocTree dt : getBlockTags(element, PARAM)) {
ParamTree pt = (ParamTree) dt;
if (pt.isTypeParameter() == isTypeParameters) {
! out.add(dt);
}
}
return out;
}
--- 3248,3271 ----
public List<? extends DocTree> getThrowsTrees(Element element) {
return getBlockTags(element, DocTree.Kind.EXCEPTION, DocTree.Kind.THROWS);
}
! public List<? extends ParamTree> getTypeParamTrees(Element element) {
return getParamTrees(element, true);
}
! public List<? extends ParamTree> getParamTrees(Element element) {
return getParamTrees(element, false);
}
! private List<? extends ParamTree> getParamTrees(Element element, boolean isTypeParameters) {
! List<ParamTree> out = new ArrayList<>();
for (DocTree dt : getBlockTags(element, PARAM)) {
ParamTree pt = (ParamTree) dt;
if (pt.isTypeParameter() == isTypeParameters) {
! out.add(pt);
}
}
return out;
}
< prev index next >