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