From 0694db0bcd59e00850fd7914a14c32dd2c9b9f51 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 3 Sep 2020 12:35:32 +0200 Subject: [PATCH 01/42] 8250768: a prototype of updates for JEP 12. --- make/CompileInterimLangtools.gmk | 8 +- .../tools/symbolgenerator/CreateSymbols.java | 18 +- make/modules/jdk.compiler/Gendata.gmk | 2 +- .../share/classes/java/lang/Class.java | 12 +- .../share/classes/java/lang/Record.java | 4 +- .../java/lang/annotation/ElementType.java | 4 +- .../java/lang/reflect/RecordComponent.java | 4 +- .../java/lang/runtime/ObjectMethods.java | 3 +- .../internal/{ => javac}/PreviewFeature.java | 8 +- src/java.base/share/classes/module-info.java | 3 +- .../reflect/annotation/TypeAnnotation.java | 4 +- .../javax/lang/model/element/ElementKind.java | 12 +- .../lang/model/element/ElementVisitor.java | 4 +- .../javax/lang/model/element/Modifier.java | 8 +- .../model/element/RecordComponentElement.java | 4 +- .../javax/lang/model/element/TypeElement.java | 8 +- .../model/util/AbstractElementVisitor14.java | 4 +- .../javax/lang/model/util/ElementFilter.java | 8 +- .../lang/model/util/ElementKindVisitor14.java | 4 +- .../lang/model/util/ElementKindVisitor6.java | 4 +- .../lang/model/util/ElementScanner14.java | 4 +- .../javax/lang/model/util/Elements.java | 4 +- .../model/util/SimpleElementVisitor14.java | 4 +- .../com/sun/source/tree/ClassTree.java | 4 +- .../classes/com/sun/source/tree/Tree.java | 4 +- .../sun/tools/javac/api/JavacTaskPool.java | 4 + .../com/sun/tools/javac/code/Flags.java | 4 +- .../com/sun/tools/javac/code/Preview.java | 20 +- .../com/sun/tools/javac/code/Symtab.java | 2 +- .../com/sun/tools/javac/comp/Annotate.java | 4 +- .../com/sun/tools/javac/comp/Attr.java | 2 +- .../com/sun/tools/javac/comp/Check.java | 49 +- .../com/sun/tools/javac/comp/Enter.java | 3 + .../com/sun/tools/javac/comp/Modules.java | 1 + .../com/sun/tools/javac/comp/Resolve.java | 2 +- .../com/sun/tools/javac/comp/TypeEnter.java | 4 +- .../com/sun/tools/javac/jvm/ClassReader.java | 4 +- .../com/sun/tools/javac/jvm/ClassWriter.java | 2 +- .../sun/tools/javac/parser/JavacParser.java | 3 +- .../tools/javac/resources/compiler.properties | 33 +- .../javac/util/MandatoryWarningHandler.java | 22 +- .../com/sun/tools/javac/util/Names.java | 4 +- .../javac/util/RawDiagnosticFormatter.java | 8 + .../formats/html/AbstractMemberWriter.java | 10 + .../doclets/formats/html/ClassWriterImpl.java | 19 +- .../doclets/formats/html/LinkFactoryImpl.java | 27 +- .../doclets/formats/html/LinkInfoImpl.java | 8 + .../formats/html/MethodWriterImpl.java | 2 + .../formats/html/PackageWriterImpl.java | 4 + .../doclets/formats/html/markup/HtmlAttr.java | 1 + .../formats/html/markup/HtmlStyle.java | 3 + .../doclets/formats/html/markup/Table.java | 33 +- .../html/resources/standard.properties | 15 + .../internal/doclets/toolkit/WorkArounds.java | 15 + .../doclets/toolkit/resources/stylesheet.css | 22 +- .../internal/doclets/toolkit/util/Utils.java | 120 +++++ .../doclets/toolkit/util/links/LinkInfo.java | 7 + .../share/classes/jdk/jshell/Snippet.java | 2 +- .../defineHiddenClass/PreviewHiddenClass.java | 2 +- .../modules/etc/JdkQualifiedExportTest.java | 2 +- .../TestDeclaredUsingPreview.java | 69 +++ .../api/preview/Core.java | 30 ++ .../api/preview/Reflective.java | 30 ++ .../m/module-info.java | 25 + .../m/pkg/TestPreviewAPIUse.java | 33 ++ .../m/pkg/TestPreviewDeclaration.java | 27 + .../m/pkg/TestPreviewDeclarationUse.java | 34 ++ .../testRecordLinks/TestRecordLinks.java | 2 +- .../tools/javac/diags/examples.not-yet.txt | 1 + .../javac/diags/examples/SealedTypes.java | 1 + .../tools/javac/lib/combo/ComboTask.java | 4 + .../options/BCPOrSystemNotSpecified.java | 2 +- .../javac/patterns/BindingsExistTest.out | 2 +- .../javac/patterns/BindingsTest1Merging.out | 2 +- .../tools/javac/patterns/BindingsTest2.out | 2 +- .../javac/patterns/CastConversionMatch.out | 2 +- .../javac/patterns/DuplicateBindingTest.out | 2 +- .../javac/patterns/EnsureTypesOrderTest.out | 2 +- .../javac/patterns/ImpossibleTypeTest.out | 2 +- .../javac/patterns/MatchBindingScopeTest.out | 2 +- .../javac/patterns/PatternMatchPosTest.out | 2 +- .../patterns/PatternVariablesAreFinal.out | 2 +- .../tools/javac/patterns/Reifiable.out | 2 +- .../tools/javac/patterns/ReifiableOld.out | 2 +- .../UncheckedWarningOnMatchesTest.out | 2 +- .../javac/platform/PreviewAPIsWithRelease.out | 2 +- .../preview/DeclaredUsingPreview-class.out | 7 + .../preview/DeclaredUsingPreview-source.out | 8 + .../javac/preview/DeclaredUsingPreview.java | 12 + .../DeclaredUsingPreviewDeclarations.java | 6 + .../javac/preview/PreviewAutoSuppress.java | 220 ++++++++ .../tools/javac/preview/PreviewErrors.java | 469 ++++++++++++++---- .../element/JavaxLangModelForRecords.java | 12 +- .../processing/model/element/TestSealed.java | 40 +- .../sealed/SealedDiffConfigurationsTest.java | 2 +- .../tools/jdeps/listdeps/ListModuleDeps.java | 2 +- 96 files changed, 1392 insertions(+), 281 deletions(-) rename src/java.base/share/classes/jdk/internal/{ => javac}/PreviewFeature.java (94%) create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Core.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Reflective.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/module-info.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewAPIUse.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java create mode 100644 test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out create mode 100644 test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out create mode 100644 test/langtools/tools/javac/preview/DeclaredUsingPreview.java create mode 100644 test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java create mode 100644 test/langtools/tools/javac/preview/PreviewAutoSuppress.java diff --git a/make/CompileInterimLangtools.gmk b/make/CompileInterimLangtools.gmk index 88578e3e060c0..fc90badaa1bae 100644 --- a/make/CompileInterimLangtools.gmk +++ b/make/CompileInterimLangtools.gmk @@ -49,8 +49,8 @@ TARGETS += $(patsubst %, $(BUILDTOOLS_OUTPUTDIR)/gensrc/%/module-info.java, \ $(INTERIM_LANGTOOLS_MODULES)) $(eval $(call SetupCopyFiles, COPY_PREVIEW_FEATURES, \ - FILES := $(TOPDIR)/src/java.base/share/classes/jdk/internal/PreviewFeature.java, \ - DEST := $(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim/jdk/internal/, \ + FILES := $(TOPDIR)/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java, \ + DEST := $(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim/jdk/internal/javac/, \ )) TARGETS += $(COPY_PREVIEW_FEATURES) @@ -81,8 +81,8 @@ define SetupInterimModule --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \ $$(INTERIM_LANGTOOLS_ADD_EXPORTS) \ --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ - --add-exports java.base/jdk.internal=java.compiler.interim \ - --add-exports java.base/jdk.internal=jdk.compiler.interim, \ + --add-exports java.base/jdk.internal.javac=java.compiler.interim \ + --add-exports java.base/jdk.internal.javac=jdk.compiler.interim, \ )) $1_DEPS_INTERIM := $$(addsuffix .interim, $$(filter \ diff --git a/make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java b/make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java index 2ac123d87c8f0..1e4cba72392bd 100644 --- a/make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java +++ b/make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java @@ -1080,20 +1080,32 @@ private Annotation[][] createParameterAnnotations(List constantPool, Lis private Annotation createAnnotation(List constantPool, AnnotationDescription desc) { String annotationType = desc.annotationType; + Map values = desc.values; - if (PREVIEW_FEATURE_ANNOTATION.equals(annotationType)) { + if (PREVIEW_FEATURE_ANNOTATION_NEW.equals(annotationType)) { //the non-public PreviewFeature annotation will not be available in ct.sym, //replace with purely synthetic javac-internal annotation: annotationType = PREVIEW_FEATURE_ANNOTATION_INTERNAL; } + if (PREVIEW_FEATURE_ANNOTATION_OLD.equals(annotationType)) { + //the non-public PreviewFeature annotation will not be available in ct.sym, + //replace with purely synthetic javac-internal annotation: + annotationType = PREVIEW_FEATURE_ANNOTATION_INTERNAL; + values = new HashMap<>(values); + Boolean essentialAPI = (Boolean) values.remove("essentialAPI"); + values.put("reflective", essentialAPI != null && !essentialAPI); + } + return new Annotation(null, addString(constantPool, annotationType), - createElementPairs(constantPool, desc.values)); + createElementPairs(constantPool, values)); } //where: - private static final String PREVIEW_FEATURE_ANNOTATION = + private static final String PREVIEW_FEATURE_ANNOTATION_OLD = "Ljdk/internal/PreviewFeature;"; + private static final String PREVIEW_FEATURE_ANNOTATION_NEW = + "Ljdk/internal/javac/PreviewFeature;"; private static final String PREVIEW_FEATURE_ANNOTATION_INTERNAL = "Ljdk/internal/PreviewFeature+Annotation;"; diff --git a/make/modules/jdk.compiler/Gendata.gmk b/make/modules/jdk.compiler/Gendata.gmk index 0da7147609da9..275470ce60050 100644 --- a/make/modules/jdk.compiler/Gendata.gmk +++ b/make/modules/jdk.compiler/Gendata.gmk @@ -44,7 +44,7 @@ CT_MODULESOURCEPATH := $(call GetModuleSrcPath) CT_DATA_DESCRIPTION += $(TOPDIR)/make/data/symbols/symbols COMPILECREATESYMBOLS_ADD_EXPORTS := \ - --add-exports java.base/jdk.internal=java.compiler.interim,jdk.compiler.interim \ + --add-exports java.base/jdk.internal.javac=java.compiler.interim,jdk.compiler.interim \ --add-exports jdk.compiler.interim/com.sun.tools.javac.api=ALL-UNNAMED \ --add-exports jdk.compiler.interim/com.sun.tools.javac.code=ALL-UNNAMED \ --add-exports jdk.compiler.interim/com.sun.tools.javac.util=ALL-UNNAMED \ diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 1fabad437380e..6e0fd78180aa8 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -2387,8 +2387,8 @@ public Field[] getDeclaredFields() throws SecurityException { * @jls 8.10 Record Types * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") @CallerSensitive public RecordComponent[] getRecordComponents() { @@ -3709,8 +3709,8 @@ private static Class javaLangRecordClass() { * @jls 8.10 Record Types * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) public boolean isRecord() { return getSuperclass() == JAVA_LANG_RECORD_CLASS && isRecord0(); } @@ -4405,7 +4405,7 @@ public Optional describeConstable() { * @jls 9.1 Interface Declarations * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, reflective=true) public ClassDesc[] permittedSubclasses() { String[] subclassNames; if (isArray() || isPrimitive() || (subclassNames = getPermittedSubclasses0()).length == 0) { @@ -4441,7 +4441,7 @@ public ClassDesc[] permittedSubclasses() { * @jls 9.1 Interface Declarations * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, reflective=true) @SuppressWarnings("preview") public boolean isSealed() { if (isArray() || isPrimitive()) { diff --git a/src/java.base/share/classes/java/lang/Record.java b/src/java.base/share/classes/java/lang/Record.java index 4d568e8baa010..a9b095564643b 100644 --- a/src/java.base/share/classes/java/lang/Record.java +++ b/src/java.base/share/classes/java/lang/Record.java @@ -88,8 +88,8 @@ * @jls 8.10 Record Types * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=true) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=false) public abstract class Record { /** * Constructor for record classes to call. diff --git a/src/java.base/share/classes/java/lang/annotation/ElementType.java b/src/java.base/share/classes/java/lang/annotation/ElementType.java index 15182f2a87ba3..a10bafc0f4130 100644 --- a/src/java.base/share/classes/java/lang/annotation/ElementType.java +++ b/src/java.base/share/classes/java/lang/annotation/ElementType.java @@ -133,7 +133,7 @@ public enum ElementType { * * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=true) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=false) RECORD_COMPONENT; } diff --git a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java index 225a0999f17ee..2d842ff4cd3f8 100644 --- a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java +++ b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java @@ -53,8 +53,8 @@ * @jls 8.10 Record Types * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) public final class RecordComponent implements AnnotatedElement { // declaring class private Class clazz; diff --git a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java index f1115b6c36d1b..5edd6d19b6d0a 100644 --- a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java +++ b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java @@ -53,8 +53,7 @@ * * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS) public class ObjectMethods { private ObjectMethods() { } diff --git a/src/java.base/share/classes/jdk/internal/PreviewFeature.java b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java similarity index 94% rename from src/java.base/share/classes/jdk/internal/PreviewFeature.java rename to src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java index 2f62a9c48a600..a1483d40afcef 100644 --- a/src/java.base/share/classes/jdk/internal/PreviewFeature.java +++ b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.internal; +package jdk.internal.javac; import java.lang.annotation.*; @@ -51,7 +51,7 @@ */ public Feature feature(); - public boolean essentialAPI() default false; + public boolean reflective() default false; public enum Feature { PATTERN_MATCHING_IN_INSTANCEOF, @@ -64,6 +64,10 @@ public enum Feature { TEXT_BLOCKS, RECORDS, SEALED_CLASSES, + /** + * A key for testing. + */ + TEST, ; } } diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 62c343412f0fa..70a1302450563 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -139,8 +139,9 @@ exports com.sun.security.ntlm to java.security.sasl; exports jdk.internal to + jdk.jfr; + exports jdk.internal.javac to java.compiler, - jdk.jfr, jdk.compiler, jdk.jshell; exports jdk.internal.access to diff --git a/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java b/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java index 6fc8ad93384b9..334490823ad61 100644 --- a/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java +++ b/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java @@ -100,8 +100,8 @@ public static enum TypeAnnotationTarget { * features of the Java language.} * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) RECORD_COMPONENT; } diff --git a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java index deb9f8006c6da..fb73cd3398540 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java @@ -120,8 +120,8 @@ public enum ElementKind { * A record type. * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) RECORD, /** @@ -135,8 +135,8 @@ public enum ElementKind { * A record component of a {@code record}. * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) RECORD_COMPONENT, /** @@ -152,8 +152,8 @@ public enum ElementKind { * A binding variable in a pattern . * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) BINDING_VARIABLE; /** diff --git a/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java b/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java index dd37a25db4f35..04b38d79ed143 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java @@ -229,8 +229,8 @@ default R visitModule(ModuleElement e, P p) { * @return a visitor-specified result * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") default R visitRecordComponent(RecordComponentElement e, P p) { return visitUnknown(e, p); diff --git a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java index f8aef53bae30b..628c20bb127fa 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java @@ -76,8 +76,8 @@ public enum Modifier { * The modifier {@code sealed} * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, + reflective=true) SEALED, /** @@ -91,8 +91,8 @@ public enum Modifier { * The modifier {@code non-sealed} * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, + reflective=true) NON_SEALED { public String toString() { return "non-sealed"; diff --git a/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java b/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java index be4bd7c2680c1..44b265a6153b5 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java @@ -37,8 +37,8 @@ * * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) public interface RecordComponentElement extends Element { /** * Returns the enclosing element of this record component. diff --git a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java index 1899bd0dffdf4..dd21e63a44b79 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java @@ -198,8 +198,8 @@ public interface TypeElement extends Element, Parameterizable, QualifiedNameable * * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") default List getRecordComponents() { return List.of(); @@ -222,8 +222,8 @@ default List getRecordComponents() { * * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, + reflective=true) default List getPermittedSubclasses() { return List.of(); } diff --git a/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java index 051479f9208c2..2ae7c9c75f1f9 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java @@ -56,8 +56,8 @@ * @see AbstractElementVisitor9 * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SupportedSourceVersion(RELEASE_16) public abstract class AbstractElementVisitor14 extends AbstractElementVisitor9 { /** diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java index a82d2e52b0864..ab77143184679 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java @@ -124,8 +124,8 @@ private ElementFilter() {} // Do not instantiate. * @param elements the elements to filter * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") public static List recordComponentsIn(Iterable elements) { @@ -145,8 +145,8 @@ private ElementFilter() {} // Do not instantiate. * @param elements the elements to filter * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") public static Set recordComponentsIn(Set elements) { diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java index 1e7c92e156752..55c779055e805 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java @@ -68,8 +68,8 @@ * @see ElementKindVisitor9 * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SupportedSourceVersion(RELEASE_16) public class ElementKindVisitor14 extends ElementKindVisitor9 { /** diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java index 356accba1e09a..0e3c4f0aa3fb2 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java @@ -234,8 +234,8 @@ public R visitTypeAsInterface(TypeElement e, P p) { * * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) public R visitTypeAsRecord(TypeElement e, P p) { return visitUnknown(e, p); } diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java index d0e92f911f505..ef0544db4afde 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java @@ -83,8 +83,8 @@ * @see ElementScanner9 * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SupportedSourceVersion(RELEASE_16) public class ElementScanner14 extends ElementScanner9 { /** diff --git a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java index 81344311869d8..5702d1df8c559 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java @@ -657,8 +657,8 @@ boolean overrides(ExecutableElement overrider, ExecutableElement overridden, * component accessor * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SuppressWarnings("preview") default RecordComponentElement recordComponentFor(ExecutableElement accessor) { if (accessor.getEnclosingElement().getKind() == ElementKind.RECORD) { diff --git a/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java index 5d0768eb0b0bd..deefa07c7d607 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java @@ -64,8 +64,8 @@ * @see SimpleElementVisitor9 * @since 14 */ -@jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) @SupportedSourceVersion(RELEASE_16) public class SimpleElementVisitor14 extends SimpleElementVisitor9 { /** diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java index 73adca1516979..b0672b9af2e2b 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java @@ -102,8 +102,8 @@ public interface ClassTree extends StatementTree { * * @since 15 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.SEALED_CLASSES, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.SEALED_CLASSES, + reflective=true) default List getPermitsClause() { return List.of(); } diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java index f368973b5505e..67d8638ed3cb9 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java @@ -660,8 +660,8 @@ public enum Kind { * * @since 14 */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS, - essentialAPI=false) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, + reflective=true) RECORD(ClassTree.class), /** diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java index f7ba8cfe73107..cfcf84fc4baca 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java @@ -44,6 +44,7 @@ import javax.tools.DiagnosticListener; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; @@ -251,6 +252,9 @@ static class ReusableContext extends Context implements TaskListener { } void clear() { + //when patching modules (esp. java.base), it may be impossible to + //clear the symbols read from the patch path: + polluted |= get(JavaFileManager.class).hasLocation(StandardLocation.PATCH_MODULE_PATH); drop(Arguments.argsKey); drop(DiagnosticListener.class); drop(Log.outKey); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java index f43484bb3b147..597f385f4f484 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java @@ -333,7 +333,7 @@ public static EnumSet asFlagSet(long flags) { /** * Flag to indicate the API element in question is for a preview API. */ - public static final long PREVIEW_ESSENTIAL_API = 1L<<58; //any Symbol kind + public static final long PREVIEW_REFLECTIVE = 1L<<58; //any Symbol kind /** * Flag to indicate the given variable is a match binding variable. @@ -504,7 +504,7 @@ public enum Flag { ANONCONSTR_BASED(Flags.ANONCONSTR_BASED), NAME_FILLED(Flags.NAME_FILLED), PREVIEW_API(Flags.PREVIEW_API), - PREVIEW_ESSENTIAL_API(Flags.PREVIEW_ESSENTIAL_API), + PREVIEW_REFLECTIVE(Flags.PREVIEW_REFLECTIVE), MATCH_BINDING(Flags.MATCH_BINDING), MATCH_BINDING_TO_OUTER(Flags.MATCH_BINDING_TO_OUTER), RECORD(Flags.RECORD), diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java index d79f3f7b51a21..bf1e0c0daf60f 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java @@ -42,7 +42,9 @@ import javax.tools.JavaFileObject; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import static com.sun.tools.javac.main.Option.PREVIEW; @@ -70,6 +72,7 @@ public class Preview { /** a mapping from classfile numbers to Java SE versions */ private final Map majorVersionToSource; + private final Set sourcesWithPreviewFeatures = new HashSet<>(); private final Lint lint; private final Log log; @@ -90,8 +93,9 @@ public static Preview instance(Context context) { enabled = options.isSet(PREVIEW); log = Log.instance(context); lint = Lint.instance(context); + Source source = Source.instance(context); this.previewHandler = - new MandatoryWarningHandler(log, lint.isEnabled(LintCategory.PREVIEW), true, "preview", LintCategory.PREVIEW); + new MandatoryWarningHandler(log, source, lint.isEnabled(LintCategory.PREVIEW), true, "preview", LintCategory.PREVIEW); forcePreview = options.isSet("forcePreview"); majorVersionToSource = initMajorVersionToSourceMap(); } @@ -128,6 +132,7 @@ public void warnPreview(DiagnosticPosition pos, Feature feature) { Assert.check(isEnabled()); Assert.check(isPreview(feature)); if (!lint.isSuppressed(LintCategory.PREVIEW)) { + sourcesWithPreviewFeatures.add(log.currentSourceFile()); previewHandler.report(pos, feature.isPlural() ? Warnings.PreviewFeatureUsePlural(feature.nameFragment()) : Warnings.PreviewFeatureUse(feature.nameFragment())); @@ -141,16 +146,25 @@ public void warnPreview(DiagnosticPosition pos, Feature feature) { */ public void warnPreview(JavaFileObject classfile, int majorVersion) { Assert.check(isEnabled()); - if (!lint.isSuppressed(LintCategory.PREVIEW)) { - previewHandler.report(null, + if (lint.isEnabled(LintCategory.PREVIEW)) { + sourcesWithPreviewFeatures.add(log.currentSourceFile()); + log.mandatoryWarning(LintCategory.PREVIEW, null, Warnings.PreviewFeatureUseClassfile(classfile, majorVersionToSource.get(majorVersion).name)); } } + public void markUsesPreview(DiagnosticPosition pos) { + sourcesWithPreviewFeatures.add(log.currentSourceFile()); + } + public void reportPreviewWarning(DiagnosticPosition pos, Warning warnKey) { previewHandler.report(pos, warnKey); } + public boolean usesPreview(JavaFileObject file) { + return sourcesWithPreviewFeatures.contains(file); + } + /** * Are preview features enabled? * @return true, if preview features are enabled. diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java index 5a5d78be3c894..e72bc1c676138 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java @@ -580,7 +580,7 @@ public R accept(ElementVisitor v, P p) { lambdaMetafactory = enterClass("java.lang.invoke.LambdaMetafactory"); stringConcatFactory = enterClass("java.lang.invoke.StringConcatFactory"); functionalInterfaceType = enterClass("java.lang.FunctionalInterface"); - previewFeatureType = enterClass("jdk.internal.PreviewFeature"); + previewFeatureType = enterClass("jdk.internal.javac.PreviewFeature"); previewFeatureInternalType = enterSyntheticAnnotation("jdk.internal.PreviewFeature+Annotation"); typeDescriptorType = enterClass("java.lang.invoke.TypeDescriptor"); recordType = enterClass("java.lang.Record"); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java index e3d54f4a10049..eb1945d32c7f7 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java @@ -373,8 +373,8 @@ private void annotateNow(Symbol toAnnotate, if (!c.type.isErroneous() && types.isSameType(c.type, syms.previewFeatureType)) { toAnnotate.flags_field |= Flags.PREVIEW_API; - if (isAttributeTrue(c.member(names.essentialAPI))) { - toAnnotate.flags_field |= Flags.PREVIEW_ESSENTIAL_API; + if (isAttributeTrue(c.member(names.reflective))) { + toAnnotate.flags_field |= Flags.PREVIEW_REFLECTIVE; } } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index b6f0dd415513f..5c13dd48da245 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -4429,7 +4429,7 @@ else if (ownOuter.hasTag(CLASS) && site != ownOuter) { chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym); chk.checkSunAPI(tree.pos(), sym); chk.checkProfile(tree.pos(), sym); - chk.checkPreview(tree.pos(), sym); + chk.checkPreview(tree.pos(), env.info.scope.owner, sym); } // If symbol is a variable, check that its type and diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 3dbe8a001e1bc..2d45f3137d46c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -148,13 +148,13 @@ protected Check(Context context) { boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED); boolean enforceMandatoryWarnings = true; - deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated, + deprecationHandler = new MandatoryWarningHandler(log, null, verboseDeprecated, enforceMandatoryWarnings, "deprecated", LintCategory.DEPRECATION); - removalHandler = new MandatoryWarningHandler(log, verboseRemoval, + removalHandler = new MandatoryWarningHandler(log, null, verboseRemoval, enforceMandatoryWarnings, "removal", LintCategory.REMOVAL); - uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked, + uncheckedHandler = new MandatoryWarningHandler(log, null, verboseUnchecked, enforceMandatoryWarnings, "unchecked", LintCategory.UNCHECKED); - sunApiHandler = new MandatoryWarningHandler(log, false, + sunApiHandler = new MandatoryWarningHandler(log, null, false, enforceMandatoryWarnings, "sunapi", null); deferredLintHandler = DeferredLintHandler.instance(context); @@ -240,21 +240,22 @@ void warnDeprecated(DiagnosticPosition pos, Symbol sym) { } } - /** Warn about deprecated symbol. + /** Log a preview warning. * @param pos Position to be used for error reporting. - * @param sym The deprecated symbol. + * @param msg A Warning describing the problem. */ - void warnPreview(DiagnosticPosition pos, Symbol sym) { - warnPreview(pos, Warnings.IsPreview(sym)); + public void warnPreviewAPI(DiagnosticPosition pos, Warning warnKey) { + if (!lint.isSuppressed(LintCategory.PREVIEW)) + preview.reportPreviewWarning(pos, warnKey); } /** Log a preview warning. * @param pos Position to be used for error reporting. * @param msg A Warning describing the problem. */ - public void warnPreview(DiagnosticPosition pos, Warning warnKey) { + public void warnDeclaredUsingPreview(DiagnosticPosition pos, Symbol sym) { if (!lint.isSuppressed(LintCategory.PREVIEW)) - preview.reportPreviewWarning(pos, warnKey); + preview.reportPreviewWarning(pos, Warnings.DeclaredUsingPreview(kindName(sym), sym)); } /** Warn about unchecked operation. @@ -3535,14 +3536,32 @@ void checkProfile(final DiagnosticPosition pos, final Symbol s) { } } - void checkPreview(DiagnosticPosition pos, Symbol s) { - if ((s.flags() & PREVIEW_API) != 0) { - if ((s.flags() & PREVIEW_ESSENTIAL_API) != 0 && !preview.isEnabled()) { - log.error(pos, Errors.IsPreview(s)); + void checkPreview(DiagnosticPosition pos, Symbol other, Symbol s) { + if ((s.flags() & PREVIEW_API) != 0 && s.packge().modle != other.packge().modle) { + if ((s.flags() & PREVIEW_REFLECTIVE) == 0) { + if (!preview.isEnabled()) { + log.error(pos, Errors.IsPreview(s)); + } else { + preview.markUsesPreview(pos); + deferredLintHandler.report(() -> warnPreviewAPI(pos, Warnings.IsPreview(s))); + } } else { - deferredLintHandler.report(() -> warnPreview(pos, s)); + deferredLintHandler.report(() -> warnPreviewAPI(pos, Warnings.IsPreviewReflective(s))); } } + if (declaredUsingPreviewFeature(s)) { + if (preview.isEnabled()) { + //for preview disabled do presumably do not need to do anything? + //If "s" is compiled from source, then there was an error for it already; + //if "s" is from classfile, there already was an error for the classfile. + preview.markUsesPreview(pos); + deferredLintHandler.report(() -> warnDeclaredUsingPreview(pos, s)); + } + } + } + private boolean declaredUsingPreviewFeature(Symbol sym) { + return ((sym.flags() & RECORD) != 0 && preview.isPreview(Feature.RECORDS)) || + ((sym.flags() & SEALED) != 0 && preview.isPreview(Feature.SEALED_CLASSES)); } /* ************************************************************************* diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java index b4dd7d84cc468..dbee35663ca0c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java @@ -35,6 +35,7 @@ import com.sun.tools.javac.code.Kinds.KindName; import com.sun.tools.javac.code.Kinds.KindSelector; import com.sun.tools.javac.code.Scope.*; +import com.sun.tools.javac.code.Source.Feature; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.main.Option.PkgInfo; @@ -104,6 +105,7 @@ public class Enter extends JCTree.Visitor { TypeEnvs typeEnvs; Modules modules; JCDiagnostic.Factory diags; + Preview preview; private final Todo todo; @@ -128,6 +130,7 @@ protected Enter(Context context) { names = Names.instance(context); modules = Modules.instance(context); diags = JCDiagnostic.Factory.instance(context); + preview = Preview.instance(context); predefClassDef = make.ClassDef( make.Modifiers(PUBLIC), diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java index b5980f699e587..534c7a9c1b731 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java @@ -1138,6 +1138,7 @@ public void visitProvides(JCProvides tree) { public void visitRequires(JCRequires tree) { if (tree.directive != null && allModules().contains(tree.directive.module)) { chk.checkDeprecated(tree.moduleName.pos(), msym, tree.directive.module); + chk.checkPreview(tree.moduleName.pos(), msym, tree.directive.module); chk.checkModuleRequires(tree.moduleName.pos(), tree.directive); msym.directives = msym.directives.prepend(tree.directive); } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index e855c24036043..692a4e5fbdb38 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -2847,7 +2847,7 @@ Symbol findConstructor(DiagnosticPosition pos, Env env, typeargtypes, allowBoxing, useVarargs); chk.checkDeprecated(pos, env.info.scope.owner, sym); - chk.checkPreview(pos, sym); + chk.checkPreview(pos, env.info.scope.owner, sym); return sym; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java index 110a1f4be7652..511d64505bec9 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java @@ -114,6 +114,7 @@ public class TypeEnter implements Completer { private final Lint lint; private final TypeEnvs typeEnvs; private final Dependencies dependencies; + private final Preview preview; public static TypeEnter instance(Context context) { TypeEnter instance = context.get(typeEnterKey); @@ -141,6 +142,7 @@ protected TypeEnter(Context context) { lint = Lint.instance(context); typeEnvs = TypeEnvs.instance(context); dependencies = Dependencies.instance(context); + preview = Preview.instance(context); Source source = Source.instance(context); allowTypeAnnos = Feature.TYPE_ANNOTATIONS.allowedInSource(source); allowDeprecationOnImport = Feature.DEPRECATION_ON_IMPORT.allowedInSource(source); @@ -1462,7 +1464,7 @@ private void handleDeprecatedAnnotations(List annotations, Symbol setFlagIfAttributeTrue(a, sym, names.forRemoval, DEPRECATED_REMOVAL); } else if (a.annotationType.type == syms.previewFeatureType) { sym.flags_field |= Flags.PREVIEW_API; - setFlagIfAttributeTrue(a, sym, names.essentialAPI, PREVIEW_ESSENTIAL_API); + setFlagIfAttributeTrue(a, sym, names.reflective, Flags.PREVIEW_REFLECTIVE); } } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java index a0085a3e6e17e..90a7711936967 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -1431,7 +1431,7 @@ else if (proxy.type.tsym.flatName() == syms.profileType.tsym.flatName()) { } } else if (proxy.type.tsym.flatName() == syms.previewFeatureInternalType.tsym.flatName()) { sym.flags_field |= PREVIEW_API; - setFlagIfAttributeTrue(proxy, sym, names.essentialAPI, PREVIEW_ESSENTIAL_API); + setFlagIfAttributeTrue(proxy, sym, names.reflective, PREVIEW_REFLECTIVE); } else { if (proxy.type.tsym == syms.annotationTargetType.tsym) { target = proxy; @@ -1442,7 +1442,7 @@ else if (proxy.type.tsym.flatName() == syms.profileType.tsym.flatName()) { setFlagIfAttributeTrue(proxy, sym, names.forRemoval, DEPRECATED_REMOVAL); } else if (proxy.type.tsym == syms.previewFeatureType.tsym) { sym.flags_field |= PREVIEW_API; - setFlagIfAttributeTrue(proxy, sym, names.essentialAPI, PREVIEW_ESSENTIAL_API); + setFlagIfAttributeTrue(proxy, sym, names.reflective, PREVIEW_REFLECTIVE); } proxies.append(proxy); } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index c4dd360812da5..4c5280e60752c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -1632,7 +1632,7 @@ public void writeClassFile(OutputStream out, ClassSymbol c) acount += writeExtraAttributes(c); poolbuf.appendInt(JAVA_MAGIC); - if (preview.isEnabled()) { + if (preview.isEnabled() && preview.usesPreview(c.sourcefile)) { poolbuf.appendChar(ClassFile.PREVIEW_MINOR_VERSION); } else { poolbuf.appendChar(target.minorVersion); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index dc5d31a4aab0f..393c56d308575 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2645,6 +2645,7 @@ List blockStatement() { } } if (isRecordStart() && allowRecords) { + checkSourceLevel(Feature.RECORDS); dc = token.comment(CommentStyle.JAVADOC); return List.of(recordDeclaration(F.at(pos).Modifiers(0), dc)); } else { @@ -3708,6 +3709,7 @@ protected JCStatement classOrRecordOrInterfaceOrEnumDeclaration(JCModifiers mods if (token.kind == CLASS) { return classDeclaration(mods, dc); } if (isRecordStart()) { + checkSourceLevel(Feature.RECORDS); return recordDeclaration(mods, dc); } else if (token.kind == INTERFACE) { return interfaceDeclaration(mods, dc); @@ -4212,7 +4214,6 @@ protected boolean isRecordStart() { (peekToken(TokenKind.IDENTIFIER, TokenKind.LPAREN) || peekToken(TokenKind.IDENTIFIER, TokenKind.EOF) || peekToken(TokenKind.IDENTIFIER, TokenKind.LT))) { - checkSourceLevel(Feature.RECORDS); return true; } else { return false; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 575d80d657c36..dfa769cd0ca23 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1634,24 +1634,26 @@ compiler.note.unchecked.filename.additional=\ compiler.note.unchecked.plural.additional=\ Some input files additionally use unchecked or unsafe operations. -# 0: file name +# 0: file name, 1: source compiler.note.preview.filename=\ - {0} uses preview language features. + {0} uses preview features of Java SE {1}. +# 0: source compiler.note.preview.plural=\ - Some input files use preview language features. + Some input files use preview features of Java SE {0}. # The following string may appear after one of the above deprecation # messages. compiler.note.preview.recompile=\ Recompile with -Xlint:preview for details. -# 0: file name +# 0: file name, 1: source compiler.note.preview.filename.additional=\ - {0} has additional uses of preview language features. + {0} has additional uses of preview features of Java SE {1}. +# 0: source compiler.note.preview.plural.additional=\ - Some input files additionally use preview language features. + Some input files additionally use preview features of Java SE {0}. # Notes related to annotation processing @@ -1785,11 +1787,16 @@ compiler.warn.has.been.deprecated.for.removal=\ # 0: symbol compiler.warn.is.preview=\ - {0} is an API that is part of a preview feature + {0} is a preview API and may be removed in a future release. # 0: symbol compiler.err.is.preview=\ - {0} is an API that is part of a preview feature + {0} is a preview API and is disabled by default.\n\ + (use --enable-preview to enable preview APIs) + +# 0: symbol +compiler.warn.is.preview.reflective=\ + {0} is a reflective preview API and may be removed in a future release. # 0: symbol compiler.warn.has.been.deprecated.module=\ @@ -2865,8 +2872,8 @@ compiler.err.preview.feature.disabled.plural=\ # 0: file object (classfile), 1: string (expected version) compiler.err.preview.feature.disabled.classfile=\ - classfile for {0} uses preview features of Java SE {1}.\n\ - (use --enable-preview to allow loading of classfiles which contain preview features) + class file for {0} uses preview features of Java SE {1}.\n\ + (use --enable-preview to allow loading of class files which contain preview features) # 0: message segment (feature) compiler.warn.preview.feature.use=\ @@ -2878,7 +2885,7 @@ compiler.warn.preview.feature.use.plural=\ # 0: file object (classfile), 1: string (expected version) compiler.warn.preview.feature.use.classfile=\ - classfile for {0} uses preview features of Java SE {1}. + class file for {0} uses preview features of Java SE {1}. compiler.misc.feature.modules=\ @@ -3725,3 +3732,7 @@ compiler.err.preview.not.latest=\ compiler.err.preview.without.source.or.release=\ --enable-preview must be used with either -source or --release + +# 0: kind name, 1: symbol +compiler.warn.declared.using.preview=\ + {0} {1} is declared using a preview feature, which may be removed in a future release. diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java index 51b2d24ef3a9b..9fe9590ef35b1 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java @@ -31,6 +31,7 @@ import javax.tools.JavaFileObject; import com.sun.tools.javac.code.Lint.LintCategory; +import com.sun.tools.javac.code.Source; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.JCDiagnostic.Note; import com.sun.tools.javac.util.JCDiagnostic.Warning; @@ -111,10 +112,11 @@ private enum DeferredDiagnosticKind { * the messages that may be generated. * @param lc An associated lint category for the warnings, or null if none. */ - public MandatoryWarningHandler(Log log, boolean verbose, + public MandatoryWarningHandler(Log log, Source source, boolean verbose, boolean enforceMandatory, String prefix, LintCategory lc) { this.log = log; + this.source = source; this.verbose = verbose; this.prefix = prefix; this.enforceMandatory = enforceMandatory; @@ -173,10 +175,19 @@ public void report(DiagnosticPosition pos, Warning warnKey) { */ public void reportDeferredDiagnostic() { if (deferredDiagnosticKind != null) { - if (deferredDiagnosticArg == null) - logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix)); - else - logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg); + if (deferredDiagnosticArg == null) { + if (source != null) { + logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), source); + } else { + logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix)); + } + } else { + if (source != null) { + logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg, source); + } else { + logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg); + } + } if (!verbose) logMandatoryNote(deferredDiagnosticSource, prefix + ".recompile"); @@ -187,6 +198,7 @@ public void reportDeferredDiagnostic() { * The log to which to report warnings. */ private final Log log; + private final Source source; /** * Whether or not to report individual warnings, or simply to report a diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java index 90e9c685ad779..6261799d2f9bc 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java @@ -86,7 +86,7 @@ public static Names instance(Context context) { public final Name error; public final Name finalize; public final Name forRemoval; - public final Name essentialAPI; + public final Name reflective; public final Name getClass; public final Name hasNext; public final Name hashCode; @@ -259,7 +259,7 @@ public Names(Context context) { error = fromString(""); finalize = fromString("finalize"); forRemoval = fromString("forRemoval"); - essentialAPI = fromString("essentialAPI"); + reflective = fromString("reflective"); getClass = fromString("getClass"); hasNext = fromString("hasNext"); hashCode = fromString("hashCode"); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java index 2305f8f42563b..de78b434982f3 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java @@ -28,10 +28,12 @@ import java.util.Collection; import java.util.EnumSet; import java.util.Locale; +import java.util.Set; import javax.tools.JavaFileObject; import com.sun.tools.javac.api.DiagnosticFormatter.Configuration.*; import com.sun.tools.javac.api.Formattable; +import com.sun.tools.javac.code.Source; import com.sun.tools.javac.file.PathFileObject; import com.sun.tools.javac.tree.JCTree.*; @@ -160,11 +162,17 @@ protected String formatArgument(JCDiagnostic diag, Object arg, Locale l) { s = ((PathFileObject) arg).getShortName(); } else if (arg instanceof Tag) { s = "compiler.misc.tree.tag." + StringUtils.toLowerCase(((Tag) arg).name()); + } else if (arg instanceof Source && arg == Source.DEFAULT && + CODES_NEEDING_SOURCE_NORMALIZATION.contains(diag.getCode())) { + s = "DEFAULT"; } else { s = super.formatArgument(diag, arg, null); } return (arg instanceof JCDiagnostic) ? "(" + s + ")" : s; } + //where: + private static final Set CODES_NEEDING_SOURCE_NORMALIZATION = Set.of( + "compiler.note.preview.filename", "compiler.note.preview.plural"); @Override protected String localize(Locale l, String key, Object... args) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index f5c140bd5acac..d60f18bf8a50d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -62,6 +62,8 @@ import static javax.lang.model.element.Modifier.PUBLIC; import static javax.lang.model.element.Modifier.STRICTFP; import static javax.lang.model.element.Modifier.SYNCHRONIZED; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; +import jdk.javadoc.internal.doclets.toolkit.Content; /** * The base class for member writers. @@ -281,6 +283,10 @@ protected void addDeprecatedInfo(Element member, Content contentTree) { Content div = HtmlTree.DIV(HtmlStyle.deprecationBlock, deprecatedContent); contentTree.add(div); } + for (Content note : utils.getPreviewNotes(member, false)) { + Content div = HtmlTree.DIV(HtmlStyle.previewBlock, note); + contentTree.add(div); + } } /** @@ -397,6 +403,10 @@ public void addMemberSummary(TypeElement tElement, Element member, writer.addSummaryLinkComment(this, member, firstSentenceTags, desc); rowContents.add(desc); table.addRow(member, rowContents); + List notes = utils.getPreviewNotes(member, true); + for (Content c : notes) { + table.addRow(member, HtmlTree.TD(HtmlStyle.colFirst, c).put(HtmlAttr.COLSPAN, "3")); //TODO: "3"!! + } } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 5999d7ab5afa7..351366f26d338 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -42,6 +42,7 @@ import javax.lang.model.util.SimpleElementVisitor8; import com.sun.source.doctree.DocTree; +import javax.lang.model.element.ElementKind; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; @@ -197,7 +198,14 @@ public void addClassSignature(String modifiers, Content classInfoTree) { classInfoTree.add(hr); Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); - pre.add(modifiers); + Content sep = null; + for (String modifiersPart : modifiers.split("record")) { + if (sep != null) { + pre.add(sep); + } + pre.add(modifiersPart); + sep = HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add("record")); + } LinkInfoImpl linkInfo = new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE, typeElement); //Let's not link to ourselves in the signature. @@ -223,7 +231,8 @@ public void addClassSignature(String modifiers, Content classInfoTree) { pre.add("extends "); Content link = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE_PARENT_NAME, - superclass)); + superclass) + .checkPreviewAPI(typeElement.getKind() != ElementKind.RECORD)); pre.add(link); } } @@ -521,6 +530,12 @@ public void addClassDeprecationInfo(Content classInfoTree) { } classInfoTree.add(div); } + for (Content previewNote : utils.getPreviewNotes(typeElement, false)) { + HtmlTree div = new HtmlTree(TagName.DIV); + div.setStyle(HtmlStyle.previewBlock); + div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, previewNote)); + classInfoTree.add(div); + } } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 036a42b53403c..9ddeab0358a96 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -36,12 +37,17 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; +import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkFactory; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo; @@ -78,25 +84,36 @@ protected Content getClassLink(LinkInfo linkInfo) { // Create a tool tip if we are linking to a class or interface. Don't // create one if we are linking to a member. String title = ""; - if (classLinkInfo.where == null || classLinkInfo.where.length() == 0) { + boolean hasWhere = classLinkInfo.where != null && classLinkInfo.where.length() != 0; + if (!hasWhere) { boolean isTypeLink = classLinkInfo.type != null && utils.isTypeVariable(utils.getComponentType(classLinkInfo.type)); title = getClassToolTip(typeElement, isTypeLink); } Content label = classLinkInfo.getClassLinkLabel(configuration); + Function wrapWithPreviewNotice = c -> { + if (!hasWhere) { + boolean previewWarning = utils.isDeclaredUsingPreview(typeElement) || utils.getPreviewAPIType(typeElement) != PreviewAPIType.STANDARD; + if (previewWarning) { + HtmlTree span = HtmlTree.SPAN(HtmlStyle.previewReference, c); + c = span; + } + } + return c; + }; Content link = new ContentBuilder(); if (utils.isIncluded(typeElement)) { if (configuration.isGeneratedDoc(typeElement)) { DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || !(docPaths.forName(typeElement)).equals(m_writer.filename)) { - link.add(m_writer.links.createLink( + link.add(wrapWithPreviewNotice.apply(m_writer.links.createLink( filename.fragment(classLinkInfo.where), label, classLinkInfo.isStrong, title, - classLinkInfo.target)); + classLinkInfo.target))); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } @@ -108,7 +125,7 @@ protected Content getClassLink(LinkInfo linkInfo) { typeElement, classLinkInfo.where, label, classLinkInfo.isStrong, true); if (crossLink != null) { - link.add(crossLink); + link.add(wrapWithPreviewNotice.apply(crossLink)); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } @@ -116,7 +133,7 @@ protected Content getClassLink(LinkInfo linkInfo) { } } // Can't link so just write label. - link.add(label); + link.add(wrapWithPreviewNotice.apply(label)); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 7ab8c39c632fe..895a17a865d35 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -299,6 +299,14 @@ public LinkInfoImpl label(Content label) { return this; } + /** + * Set the checkPreviewAPI flag. + */ + public LinkInfoImpl checkPreviewAPI(boolean checkPreviewAPI) { + this.checkPreviewAPI = checkPreviewAPI; + return this; + } + /** * Set whether or not the link should be strong. */ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java index d41a3e0c6a97d..f62c521633dee 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java @@ -25,12 +25,14 @@ package jdk.javadoc.internal.doclets.formats.html; +import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index aaefb006da1ae..7dd22987d7cea 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.formats.html.markup.Table; import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; @@ -231,6 +232,9 @@ public void addClassesSummary(SortedSet classes, String label, addSummaryComment(klass, description); } table.addRow(classLink, description); + for (Content c : utils.getPreviewNotes(klass, true)) { + table.addRow(HtmlTree.TD(HtmlStyle.colFirst, c).put(HtmlAttr.COLSPAN, "2")); //TODO: "2"!! + } } summaryContentTree.add(HtmlTree.LI(table)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlAttr.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlAttr.java index bf3187c546e6d..f13e8f6f630e8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlAttr.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlAttr.java @@ -44,6 +44,7 @@ public enum HtmlAttr { CLASS, CLEAR, COLS, + COLSPAN, CONTENT, DISABLED, FOR, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 61e02b1052064..00cd439635872 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -78,6 +78,9 @@ public enum HtmlStyle { packageHierarchyLabel, packageUses, permitsNote, + previewBlock, + previewLabel, + previewReference, searchTagLink, searchTagResult, serializedPackageContainer, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java index 14f8490f90028..6206385edf277 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java @@ -84,6 +84,7 @@ public class Table extends Content { private int rowScopeColumnIndex; private List stripedStyles = Arrays.asList(HtmlStyle.altColor, HtmlStyle.rowColor); private final List bodyRows; + private int significantRowCount = -1; private final List bodyRowMasks; private String rowIdPrefix = "i"; private String id; @@ -360,25 +361,31 @@ public void addRow(Element element, List contents) { HtmlTree row = new HtmlTree(TagName.TR); - if (stripedStyles != null) { - int rowIndex = bodyRows.size(); - row.setStyle(stripedStyles.get(rowIndex % 2)); - } int colIndex = 0; for (Content c : contents) { - HtmlStyle cellStyle = (columnStyles == null || colIndex > columnStyles.size()) - ? null - : columnStyles.get(colIndex); - HtmlTree cell = (colIndex == rowScopeColumnIndex) - ? HtmlTree.TH(cellStyle, "row", c) - : HtmlTree.TD(cellStyle, c); - row.add(cell); - colIndex++; + if (c instanceof HtmlTree && ((HtmlTree) c).tagName == TagName.TD) { + row.add(c); + colIndex++; + significantRowCount--; //XXX - should not happen this way + } else { + HtmlStyle cellStyle = (columnStyles == null || colIndex > columnStyles.size()) + ? null + : columnStyles.get(colIndex); + HtmlTree cell = (colIndex == rowScopeColumnIndex) + ? HtmlTree.TH(cellStyle, "row", c) + : HtmlTree.TD(cellStyle, c); + row.add(cell); + colIndex++; + } + } + significantRowCount++; + if (stripedStyles != null) { + row.setStyle(stripedStyles.get(significantRowCount % 2)); } bodyRows.add(row); if (tabMap != null) { - int index = bodyRows.size() - 1; + int index = significantRowCount; row.put(HtmlAttr.ID, (rowIdPrefix + index)); int mask = 0; int maskBit = 1; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index a3356bdb1fa15..45edd3d992f73 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -266,6 +266,21 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} +doclet.Declared_Using_Preview=XXX +doclet.PreviewAPI=XXX +doclet.ReflectivePreviewAPI=XXX +doclet.Declared_Using_Preview.type=This class is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewAPI.type=The declaration of this class uses a preview API. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.ReflectivePreviewAPI.type=The declaration of this class uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.UsesDeclaredUsingPreview.type=The declaration of this class uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.Declared_Using_Preview.method=This method is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewAPI.method=The declaration of this method uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.ReflectivePreviewAPI.method=The declaration of this method uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.UsesDeclaredUsingPreview.method=The declaration of this method uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.Declared_Using_Preview.field=This field is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewAPI.field=The declaration of this field uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.ReflectivePreviewAPI.field=The declaration of this field uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.UsesDeclaredUsingPreview.field=The declaration of this field uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java index 0225512242761..1fe421ddfd051 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java @@ -77,6 +77,7 @@ import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; import static javax.lang.model.element.ElementKind.*; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * A quarantine class to isolate all the workarounds and bridges to @@ -613,4 +614,18 @@ public PackageElement getAbbreviatedPackageElement(PackageElement pkg) { ? utils.elementUtils.getPackageElement(parsedPackageName) : ((JavacElements) utils.elementUtils).getPackageElement(encl, parsedPackageName); } + + public PreviewAPIType getPreviewAPIType(TypeElement el) { + Symbol sym = (Symbol) el; + if ((sym.flags() & Flags.PREVIEW_API) != 0) { + if ((sym.flags() & Flags.PREVIEW_REFLECTIVE) != 0) { + return PreviewAPIType.REFLECTIVE; + } else { + return PreviewAPIType.PREVIEW; + } + } else { + return PreviewAPIType.STANDARD; + } + } + } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 79a9d970c8b49..b638727a4140c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -556,9 +556,17 @@ h1.hidden { } .deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, .module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, -.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { +.package-hierarchy-label, .preview-label, .type-name-label, .type-name-link, .search-tag-link { font-weight:bold; } +.preview-reference { + border-style:solid; + border-width:thin; + border-radius:10px; + border-color:red; + padding-left: 10px; + padding-right: 10px; +} .deprecation-comment, .help-footnote, .interface-name { font-style:italic; } @@ -573,6 +581,18 @@ h1.hidden { margin-right:10px; display:inline-block; } +.preview-block { +/* font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + border-color:red; + padding: 10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block;*/ +} div.block div.deprecation-comment, div.block div.block span.emphasized-phrase, div.block div.block span.interface-name { font-style:normal; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index f0b061335b414..97ac8aff8b830 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -119,6 +119,11 @@ import static javax.lang.model.type.TypeKind.*; import static com.sun.source.doctree.DocTree.Kind.*; +import java.util.function.Function; +import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.toolkit.Content; import static jdk.javadoc.internal.doclets.toolkit.builders.ConstantsSummaryBuilder.MAX_CONSTANT_VALUE_INDEX_LENGTH; /** @@ -1703,6 +1708,81 @@ public String getHTMLTitle(Element element) { return sb.toString().trim(); } + @SuppressWarnings("preview") + public List getPreviewNotes(Element el, boolean span) { + List result = new ArrayList<>(); + List usedInDeclaration = new ArrayList<>(); + String suffix; + switch (el.getKind()) { + case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> { + suffix = "type"; + //TODO: annotations + TypeElement te = (TypeElement) el; + for (TypeParameterElement tpe : te.getTypeParameters()) { + usedInDeclaration.addAll(types2Classes(tpe.getBounds())); + } + usedInDeclaration.addAll(types2Classes(List.of(te.getSuperclass()))); + usedInDeclaration.addAll(types2Classes(te.getInterfaces())); + usedInDeclaration.addAll(types2Classes(te.getPermittedSubclasses())); + usedInDeclaration.addAll(types2Classes(te.getRecordComponents().stream().map(c -> c.asType()).collect(Collectors.toList()))); //TODO: annotations on record components??? + } + case CONSTRUCTOR, METHOD -> { + suffix = "method"; + //TODO: annotations + ExecutableElement ee = (ExecutableElement) el; + for (TypeParameterElement tpe : ee.getTypeParameters()) { + usedInDeclaration.addAll(types2Classes(tpe.getBounds())); + } + usedInDeclaration.addAll(types2Classes(List.of(ee.getReturnType()))); + usedInDeclaration.addAll(types2Classes(List.of(ee.getReceiverType()))); + usedInDeclaration.addAll(types2Classes(ee.getThrownTypes())); + usedInDeclaration.addAll(types2Classes(ee.getParameters().stream().map(p -> p.asType()).collect(Collectors.toList()))); + } + case FIELD, ENUM_CONSTANT -> { + suffix = "field"; + //TODO: annotations + VariableElement ve = (VariableElement) el; + usedInDeclaration.addAll(types2Classes(List.of(ve.asType()))); + } + default -> throw new IllegalStateException("Unexpected: " + el.getKind()); + } + Function wrap = c -> { + return span ? HtmlTree.SPAN(HtmlStyle.previewReference, c) + : HtmlTree.DIV(HtmlStyle.previewReference, c); + }; + if (isDeclaredUsingPreview(el)) { + result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview." + suffix)))); + } + Set previewAPITypes = getPreviewAPITypes(usedInDeclaration); + if (previewAPITypes.contains(PreviewAPIType.PREVIEW)) { + result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.PreviewAPI." + suffix)))); + } + if (previewAPITypes.contains(PreviewAPIType.REFLECTIVE)) { + result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.ReflectivePreviewAPI." + suffix)))); + } + if (previewAPITypes.contains(PreviewAPIType.DECLARED_USING_PREVIEW)) { + result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.UsesDeclaredUsingPreview." + suffix)))); + } + return result; + } + + private Collection types2Classes(List types) { + List result = new ArrayList<>(); + List todo = new ArrayList<>(types); + + while (!todo.isEmpty()) { + TypeMirror type = todo.remove(todo.size() - 1); + + if (type.getKind() == DECLARED) { + DeclaredType dt = (DeclaredType) type; + result.add((TypeElement) dt.asElement()); + todo.addAll(dt.getTypeArguments()); + } + } + + return result; + } + private static class DocCollator { private final Map keys; private final Collator instance; @@ -2937,4 +3017,44 @@ public String toString() { return first + ":" + second; } } + + /** + * Return true if the given Element is deprecated. + * + * @param e the Element to check. + * @return true if the given Element is deprecated. + */ + @SuppressWarnings("preview") + public boolean isDeclaredUsingPreview(Element e) { + return e.getKind() == ElementKind.RECORD || + e.getModifiers().contains(Modifier.SEALED); + } + + public Set getPreviewAPITypes(Iterable elements) { + Set result = new TreeSet<>(); + + for (TypeElement type : elements) { + result.add(getPreviewAPIType(type)); + } + + result.remove(PreviewAPIType.STANDARD); + + return result; + } + + public PreviewAPIType getPreviewAPIType(TypeElement el) { + //TODO: PREVIEW+DECLARED_USING_PREVIEW? + if (isDeclaredUsingPreview(el)) { + return PreviewAPIType.DECLARED_USING_PREVIEW; + } + return configuration.workArounds.getPreviewAPIType(el); + } + + public enum PreviewAPIType { + STANDARD, + REFLECTIVE, + PREVIEW, + DECLARED_USING_PREVIEW; + } + } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java index d3ba8cd244d6d..77224719cc253 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java @@ -110,6 +110,13 @@ public abstract class LinkInfo { */ public boolean linkToSelf = true; + /** + * By default, the target of the link should be checked if it is a preview API. + * However, for record supertype (java.lang.Record), do not mark the supertype + * as preview. + */ + public boolean checkPreviewAPI = true; + /** * Return an empty instance of a content object. * diff --git a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java index bc08a6015449b..86f0a85fe4b8f 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java @@ -249,7 +249,7 @@ public enum SubKind { * @since 14 * */ - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS) + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS) RECORD_SUBKIND(Kind.TYPE_DECL), /** diff --git a/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java b/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java index 3464fea732651..f171de9155a54 100644 --- a/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java +++ b/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java @@ -56,7 +56,7 @@ public void previewNotEnabled() throws Exception { // compile a class with --enable-preview Path sourceFile = SRC_DIR.resolve("HiddenInterface.java"); String[] options = new String[] { - "--enable-preview", "-source", String.valueOf(Runtime.version().feature()) }; + "--enable-preview", "-source", String.valueOf(Runtime.version().feature()), "-XDforcePreview" }; if (!CompilerUtils.compile(sourceFile, CLASSES_DIR, options)) { throw new RuntimeException("Compilation of the test failed: " + sourceFile); } diff --git a/test/jdk/jdk/modules/etc/JdkQualifiedExportTest.java b/test/jdk/jdk/modules/etc/JdkQualifiedExportTest.java index 23722c0c09f48..4718e10e8629d 100644 --- a/test/jdk/jdk/modules/etc/JdkQualifiedExportTest.java +++ b/test/jdk/jdk/modules/etc/JdkQualifiedExportTest.java @@ -74,7 +74,7 @@ static void check(ModuleDescriptor md) { "jdk.internal.vm.ci/jdk.vm.ci.hotspot", "jdk.internal.vm.ci/jdk.vm.ci.meta", "jdk.internal.vm.ci/jdk.vm.ci.code", - "java.base/jdk.internal"); + "java.base/jdk.internal.javac"); static void checkExports(ModuleDescriptor md) { // build a map of upgradeable module to Exports that are qualified to it diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java new file mode 100644 index 0000000000000..6904000f84df4 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8250768 + * @summary test generated docs for items declared using preview + * @library ../../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build javadoc.tester.* + * @run main TestDeclaredUsingPreview + */ + +import java.nio.file.Paths; +import javadoc.tester.JavadocTester; + +public class TestDeclaredUsingPreview extends JavadocTester { + + public static void main(String... args) throws Exception { + TestDeclaredUsingPreview tester = new TestDeclaredUsingPreview(); + tester.runTests(); + } + + @Test + public void test() { + javadoc("-d", "out", + "-XDforcePreview", "--enable-preview", "-source", System.getProperty("java.specification.version"), + "--patch-module", "java.base=" + Paths.get(testSrc, "api").toAbsolutePath().toString(), + "--add-exports", "java.base/preview=m", + "--module-source-path", testSrc, + "m/pkg"); + checkExit(Exit.OK); + + checkOutput("m/pkg/TestPreviewDeclaration.html", true, + ""); + checkOutput("m/pkg/TestPreviewDeclarationUse.html", true, + ""); + checkOutput("m/pkg/TestPreviewDeclarationUse.Impl.html", false, + ""); + checkOutput("m/pkg/TestPreviewDeclarationUse.Impl.html", true, + ""); + checkOutput("m/pkg/TestPreviewAPIUse.html", true, + "foo() - JavadocTest.Bar + JavadocTest.Bar """); checkOutput("example/JavadocTest.Bar.html", true, diff --git a/test/langtools/tools/javac/diags/examples.not-yet.txt b/test/langtools/tools/javac/diags/examples.not-yet.txt index 78b4eafb7e96e..bc9083c97f860 100644 --- a/test/langtools/tools/javac/diags/examples.not-yet.txt +++ b/test/langtools/tools/javac/diags/examples.not-yet.txt @@ -116,6 +116,7 @@ compiler.warn.illegal.char.for.encoding compiler.warn.incubating.modules # requires adjusted classfile compiler.warn.invalid.archive.file compiler.warn.is.preview # difficult to produce reliably despite future changes to java.base +compiler.warn.is.preview.reflective # difficult to produce reliably despite future changes to java.base compiler.warn.override.bridge compiler.warn.position.overflow # CRTable: caused by files with long lines >= 1024 chars compiler.warn.proc.type.already.exists # JavacFiler: just mentioned in TODO diff --git a/test/langtools/tools/javac/diags/examples/SealedTypes.java b/test/langtools/tools/javac/diags/examples/SealedTypes.java index b533bddce2026..43e8c10fc0577 100644 --- a/test/langtools/tools/javac/diags/examples/SealedTypes.java +++ b/test/langtools/tools/javac/diags/examples/SealedTypes.java @@ -23,6 +23,7 @@ // key: compiler.misc.feature.sealed.classes // key: compiler.warn.preview.feature.use.plural +// key: compiler.warn.declared.using.preview // options: --enable-preview -source ${jdk.version} -Xlint:preview sealed class Sealed {} diff --git a/test/langtools/tools/javac/lib/combo/ComboTask.java b/test/langtools/tools/javac/lib/combo/ComboTask.java index fddd940e4d02e..04a2a2ebb5173 100644 --- a/test/langtools/tools/javac/lib/combo/ComboTask.java +++ b/test/langtools/tools/javac/lib/combo/ComboTask.java @@ -213,6 +213,10 @@ private void doRunTest(Consumer>> c, }); } + public List getSources() { + return sources; + } + interface Convertor { public Iterable convert(JavacTask task) throws IOException; } diff --git a/test/langtools/tools/javac/options/BCPOrSystemNotSpecified.java b/test/langtools/tools/javac/options/BCPOrSystemNotSpecified.java index c08f843931f77..36bf20b805876 100644 --- a/test/langtools/tools/javac/options/BCPOrSystemNotSpecified.java +++ b/test/langtools/tools/javac/options/BCPOrSystemNotSpecified.java @@ -194,7 +194,7 @@ protected void runTests() throws Exception { private void prepareBCP(Path target) throws IOException { try (JavaFileManager jfm = ToolProvider.getSystemJavaCompiler() .getStandardFileManager(null, null, null)) { - for (String pack : new String[] {"", "java.lang", "java.lang.annotation", "jdk.internal"}) { + for (String pack : new String[] {"", "java.lang", "java.lang.annotation", "jdk.internal.javac"}) { JavaFileManager.Location javaBase = jfm.getLocationForModule(StandardLocation.SYSTEM_MODULES, "java.base"); diff --git a/test/langtools/tools/javac/patterns/BindingsExistTest.out b/test/langtools/tools/javac/patterns/BindingsExistTest.out index 28ed647f5c5a2..4c0b22fc13127 100644 --- a/test/langtools/tools/javac/patterns/BindingsExistTest.out +++ b/test/langtools/tools/javac/patterns/BindingsExistTest.out @@ -4,6 +4,6 @@ BindingsExistTest.java:16:35: compiler.err.already.defined: kindname.variable, k BindingsExistTest.java:19:34: compiler.err.already.defined: kindname.variable, s2, kindname.method, t(java.lang.Object,java.lang.Object) BindingsExistTest.java:22:20: compiler.err.already.defined: kindname.variable, s3, kindname.method, t(java.lang.Object,java.lang.Object) BindingsExistTest.java:28:16: compiler.err.already.defined: kindname.variable, s4, kindname.method, t(java.lang.Object,java.lang.Object) -- compiler.note.preview.filename: BindingsExistTest.java +- compiler.note.preview.filename: BindingsExistTest.java, DEFAULT - compiler.note.preview.recompile 6 errors diff --git a/test/langtools/tools/javac/patterns/BindingsTest1Merging.out b/test/langtools/tools/javac/patterns/BindingsTest1Merging.out index 77f01a12367d1..a67aff6614ee2 100644 --- a/test/langtools/tools/javac/patterns/BindingsTest1Merging.out +++ b/test/langtools/tools/javac/patterns/BindingsTest1Merging.out @@ -7,6 +7,6 @@ BindingsTest1Merging.java:44:21: compiler.err.match.binding.exists BindingsTest1Merging.java:50:36: compiler.err.match.binding.exists BindingsTest1Merging.java:56:39: compiler.err.match.binding.exists BindingsTest1Merging.java:62:42: compiler.err.match.binding.exists -- compiler.note.preview.filename: BindingsTest1Merging.java +- compiler.note.preview.filename: BindingsTest1Merging.java, DEFAULT - compiler.note.preview.recompile 9 errors diff --git a/test/langtools/tools/javac/patterns/BindingsTest2.out b/test/langtools/tools/javac/patterns/BindingsTest2.out index c9c179e1f97cc..0f17d3112d863 100644 --- a/test/langtools/tools/javac/patterns/BindingsTest2.out +++ b/test/langtools/tools/javac/patterns/BindingsTest2.out @@ -49,6 +49,6 @@ BindingsTest2.java:241:17: compiler.err.cant.resolve.location: kindname.variable BindingsTest2.java:135:17: compiler.err.unreachable.stmt BindingsTest2.java:160:17: compiler.err.unreachable.stmt BindingsTest2.java:185:17: compiler.err.unreachable.stmt -- compiler.note.preview.filename: BindingsTest2.java +- compiler.note.preview.filename: BindingsTest2.java, DEFAULT - compiler.note.preview.recompile 51 errors \ No newline at end of file diff --git a/test/langtools/tools/javac/patterns/CastConversionMatch.out b/test/langtools/tools/javac/patterns/CastConversionMatch.out index 528ef8e817af0..88ea60c3fc8ce 100644 --- a/test/langtools/tools/javac/patterns/CastConversionMatch.out +++ b/test/langtools/tools/javac/patterns/CastConversionMatch.out @@ -1,4 +1,4 @@ CastConversionMatch.java:11:26: compiler.err.type.found.req: int, (compiler.misc.type.req.class.array) -- compiler.note.preview.filename: CastConversionMatch.java +- compiler.note.preview.filename: CastConversionMatch.java, DEFAULT - compiler.note.preview.recompile 1 error diff --git a/test/langtools/tools/javac/patterns/DuplicateBindingTest.out b/test/langtools/tools/javac/patterns/DuplicateBindingTest.out index 1d41169eb1580..86bdb49f653c1 100644 --- a/test/langtools/tools/javac/patterns/DuplicateBindingTest.out +++ b/test/langtools/tools/javac/patterns/DuplicateBindingTest.out @@ -22,6 +22,6 @@ DuplicateBindingTest.java:50:102: compiler.err.match.binding.exists DuplicateBindingTest.java:51:73: compiler.err.match.binding.exists DuplicateBindingTest.java:54:69: compiler.err.cant.resolve.location: kindname.variable, s, , , (compiler.misc.location: kindname.class, DuplicateBindingTest, null) DuplicateBindingTest.java:55:44: compiler.err.cant.resolve.location: kindname.variable, s, , , (compiler.misc.location: kindname.class, DuplicateBindingTest, null) -- compiler.note.preview.filename: DuplicateBindingTest.java +- compiler.note.preview.filename: DuplicateBindingTest.java, DEFAULT - compiler.note.preview.recompile 24 errors diff --git a/test/langtools/tools/javac/patterns/EnsureTypesOrderTest.out b/test/langtools/tools/javac/patterns/EnsureTypesOrderTest.out index ca05e4638dc4d..c063dd56b234a 100644 --- a/test/langtools/tools/javac/patterns/EnsureTypesOrderTest.out +++ b/test/langtools/tools/javac/patterns/EnsureTypesOrderTest.out @@ -1,4 +1,4 @@ EnsureTypesOrderTest.java:9:13: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.lang.String[], java.lang.String) -- compiler.note.preview.filename: EnsureTypesOrderTest.java +- compiler.note.preview.filename: EnsureTypesOrderTest.java, DEFAULT - compiler.note.preview.recompile 1 error \ No newline at end of file diff --git a/test/langtools/tools/javac/patterns/ImpossibleTypeTest.out b/test/langtools/tools/javac/patterns/ImpossibleTypeTest.out index 6003b006d91eb..2a3e708ced547 100644 --- a/test/langtools/tools/javac/patterns/ImpossibleTypeTest.out +++ b/test/langtools/tools/javac/patterns/ImpossibleTypeTest.out @@ -1,5 +1,5 @@ ImpossibleTypeTest.java:14:13: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: java.lang.Integer, java.lang.String) ImpossibleTypeTest.java:17:26: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, ImpossibleTypeTest, null) -- compiler.note.preview.filename: ImpossibleTypeTest.java +- compiler.note.preview.filename: ImpossibleTypeTest.java, DEFAULT - compiler.note.preview.recompile 2 errors diff --git a/test/langtools/tools/javac/patterns/MatchBindingScopeTest.out b/test/langtools/tools/javac/patterns/MatchBindingScopeTest.out index 6f21aca174efc..9fbe2c869e59a 100644 --- a/test/langtools/tools/javac/patterns/MatchBindingScopeTest.out +++ b/test/langtools/tools/javac/patterns/MatchBindingScopeTest.out @@ -11,6 +11,6 @@ MatchBindingScopeTest.java:56:48: compiler.err.cant.resolve.location: kindname.v MatchBindingScopeTest.java:57:32: compiler.err.cant.resolve.location: kindname.variable, j, , , (compiler.misc.location: kindname.class, MatchBindingScopeTest, null) MatchBindingScopeTest.java:62:23: compiler.err.cant.resolve.location: kindname.variable, j, , , (compiler.misc.location: kindname.class, MatchBindingScopeTest, null) MatchBindingScopeTest.java:65:23: compiler.err.cant.resolve.location: kindname.variable, j, , , (compiler.misc.location: kindname.class, MatchBindingScopeTest, null) -- compiler.note.preview.filename: MatchBindingScopeTest.java +- compiler.note.preview.filename: MatchBindingScopeTest.java, DEFAULT - compiler.note.preview.recompile 13 errors \ No newline at end of file diff --git a/test/langtools/tools/javac/patterns/PatternMatchPosTest.out b/test/langtools/tools/javac/patterns/PatternMatchPosTest.out index 0d5d809ef1e72..e1580f2832cb6 100644 --- a/test/langtools/tools/javac/patterns/PatternMatchPosTest.out +++ b/test/langtools/tools/javac/patterns/PatternMatchPosTest.out @@ -10,5 +10,5 @@ - compiler.note.proc.messager: java.lang.String - compiler.note.proc.messager: java.lang - compiler.note.proc.messager: java -- compiler.note.preview.filename: PatternMatchPosTestData.java +- compiler.note.preview.filename: PatternMatchPosTestData.java, DEFAULT - compiler.note.preview.recompile diff --git a/test/langtools/tools/javac/patterns/PatternVariablesAreFinal.out b/test/langtools/tools/javac/patterns/PatternVariablesAreFinal.out index bf266e311f30b..bb987ea8ac310 100644 --- a/test/langtools/tools/javac/patterns/PatternVariablesAreFinal.out +++ b/test/langtools/tools/javac/patterns/PatternVariablesAreFinal.out @@ -1,4 +1,4 @@ PatternVariablesAreFinal.java:11:13: compiler.err.pattern.binding.may.not.be.assigned: s -- compiler.note.preview.filename: PatternVariablesAreFinal.java +- compiler.note.preview.filename: PatternVariablesAreFinal.java, DEFAULT - compiler.note.preview.recompile 1 error diff --git a/test/langtools/tools/javac/patterns/Reifiable.out b/test/langtools/tools/javac/patterns/Reifiable.out index 7d4461c9fc660..923b480e6004d 100644 --- a/test/langtools/tools/javac/patterns/Reifiable.out +++ b/test/langtools/tools/javac/patterns/Reifiable.out @@ -2,6 +2,6 @@ Reifiable.java:10:16: compiler.err.instanceof.reifiable.not.safe: java.lang.Obje Reifiable.java:12:16: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: Reifiable.List, Reifiable.ListImpl) Reifiable.java:13:39: compiler.err.not.within.bounds: java.lang.String, T Reifiable.java:14:16: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: Reifiable.List, Reifiable.Unrelated) -- compiler.note.preview.filename: Reifiable.java +- compiler.note.preview.filename: Reifiable.java, DEFAULT - compiler.note.preview.recompile 4 errors diff --git a/test/langtools/tools/javac/patterns/ReifiableOld.out b/test/langtools/tools/javac/patterns/ReifiableOld.out index 04d84f1020199..cef312ad6cd8c 100644 --- a/test/langtools/tools/javac/patterns/ReifiableOld.out +++ b/test/langtools/tools/javac/patterns/ReifiableOld.out @@ -2,6 +2,6 @@ ReifiableOld.java:12:16: compiler.err.instanceof.reifiable.not.safe: java.lang.O ReifiableOld.java:14:16: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: ReifiableOld.List, ReifiableOld.ListImpl) ReifiableOld.java:15:39: compiler.err.not.within.bounds: java.lang.String, T ReifiableOld.java:16:16: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: ReifiableOld.List, ReifiableOld.Unrelated) -- compiler.note.preview.filename: ReifiableOld.java +- compiler.note.preview.filename: ReifiableOld.java, DEFAULT - compiler.note.preview.recompile 4 errors diff --git a/test/langtools/tools/javac/patterns/UncheckedWarningOnMatchesTest.out b/test/langtools/tools/javac/patterns/UncheckedWarningOnMatchesTest.out index 447cfff51b380..1dfe4a563a6d9 100644 --- a/test/langtools/tools/javac/patterns/UncheckedWarningOnMatchesTest.out +++ b/test/langtools/tools/javac/patterns/UncheckedWarningOnMatchesTest.out @@ -1,4 +1,4 @@ UncheckedWarningOnMatchesTest.java:14:13: compiler.err.instanceof.reifiable.not.safe: java.lang.Object, java.util.ArrayList -- compiler.note.preview.filename: UncheckedWarningOnMatchesTest.java +- compiler.note.preview.filename: UncheckedWarningOnMatchesTest.java, DEFAULT - compiler.note.preview.recompile 1 error diff --git a/test/langtools/tools/javac/platform/PreviewAPIsWithRelease.out b/test/langtools/tools/javac/platform/PreviewAPIsWithRelease.out index f07ff3a3b9675..16dfc44d4b47a 100644 --- a/test/langtools/tools/javac/platform/PreviewAPIsWithRelease.out +++ b/test/langtools/tools/javac/platform/PreviewAPIsWithRelease.out @@ -1,4 +1,4 @@ PreviewAPIsWithRelease.java:12:11: compiler.err.is.preview: stripIndent() -PreviewAPIsWithRelease.java:13:22: compiler.warn.is.preview: RECORD +PreviewAPIsWithRelease.java:13:22: compiler.warn.is.preview.reflective: RECORD 1 error 1 warning diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out new file mode 100644 index 0000000000000..aa152f0b45566 --- /dev/null +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out @@ -0,0 +1,7 @@ +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations.class, 16 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$R.class, 16 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C.class, 16 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C2.class, 16 +DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.record, DeclaredUsingPreviewDeclarations.R +DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +6 warnings diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out new file mode 100644 index 0000000000000..e95d5a66b2492 --- /dev/null +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out @@ -0,0 +1,8 @@ +DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records) +DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) +DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) +DeclaredUsingPreviewDeclarations.java:5:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) +DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.record, DeclaredUsingPreviewDeclarations.R +DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +DeclaredUsingPreviewDeclarations.java:5:33: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +7 warnings diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview.java b/test/langtools/tools/javac/preview/DeclaredUsingPreview.java new file mode 100644 index 0000000000000..360ff9a53a5f3 --- /dev/null +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview.java @@ -0,0 +1,12 @@ +/** + * @test /nodynamiccopyright/ + * @bug 8250768 + * @summary Verify javac correctly reports errors for uses of classes declared using preview features. + * @compile/ref=DeclaredUsingPreview-source.out -XDrawDiagnostics --enable-preview -source ${jdk.version} -Xlint:preview DeclaredUsingPreview.java DeclaredUsingPreviewDeclarations.java + * @compile/ref=DeclaredUsingPreview-class.out -XDrawDiagnostics --enable-preview -source ${jdk.version} -Xlint:preview DeclaredUsingPreview.java + */ +public class DeclaredUsingPreview { + DeclaredUsingPreviewDeclarations.R r; + DeclaredUsingPreviewDeclarations.C c; + DeclaredUsingPreviewDeclarations.C2 c2; //TODO: should cause warning? +} diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java b/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java new file mode 100644 index 0000000000000..086735691efc3 --- /dev/null +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java @@ -0,0 +1,6 @@ +///nodynamiccopyright/ +public class DeclaredUsingPreviewDeclarations { + record R(int i) {} + sealed class C {} + non-sealed class C2 extends C {} +} diff --git a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java new file mode 100644 index 0000000000000..4e08431473022 --- /dev/null +++ b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /tools/lib + * @modules + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.classfile + * @build toolbox.ToolBox toolbox.JavacTask + * @run main PreviewAutoSuppress + */ +import com.sun.tools.classfile.ClassFile; +import java.io.InputStream; +import java.nio.file.Files; +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.TestRunner; +import toolbox.ToolBox; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +public class PreviewAutoSuppress extends TestRunner { + + protected ToolBox tb; + + PreviewAutoSuppress() { + super(System.err); + tb = new ToolBox(); + } + + public static void main(String... args) throws Exception { + PreviewAutoSuppress t = new PreviewAutoSuppress(); + t.runTests(); + } + + protected void runTests() throws Exception { + runTests(m -> new Object[] { Paths.get(m.getName()) }); + } + + @Test + public void declarationWarning(Path base) throws Exception { + Path src = base.resolve("src"); + tb.writeJavaFiles(src, + """ + package test; + public class Outer { + record R(int i) {} + R r; + } + """, + """ + package test; + public class Use { + Outer.R r; + } + """); + Path classes = base.resolve("classes"); + + List log = new JavacTask(tb, Task.Mode.CMDLINE) + .outdir(classes) + .options("--enable-preview", + "-source", String.valueOf(Runtime.version().feature()), + "-Xlint:preview", + "-XDforcePreview", + "-XDrawDiagnostics") + .files(tb.findJavaFiles(src)) + .run() + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + List expected = + List.of("Outer.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records)", + "Outer.java:4:5: compiler.warn.declared.using.preview: kindname.record, test.Outer.R", + "Use.java:3:8: compiler.warn.declared.using.preview: kindname.record, test.Outer.R", + "3 warnings"); + if (!log.equals(expected)) + throw new Exception("expected output not found" + log); + checkPreviewClassfile(classes.resolve("test").resolve("Outer.class"), + true); //TODO: correct? + checkPreviewClassfile(classes.resolve("test").resolve("Outer$R.class"), + true); + checkPreviewClassfile(classes.resolve("test").resolve("Use.class"), + true); + } + + @Test + public void previewAPI(Path base) throws Exception { + Path apiSrc = base.resolve("api-src"); + tb.writeJavaFiles(apiSrc, + """ + package preview.api; + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.TEST) + public class Outer { + public void test() {} + } + """, + """ + package preview.impl; + import preview.api.Outer; + public class Impl { + public void run() { + new Outer().test(); + } + public static class C extends Outer {} + } + """); + Path apiClasses = base.resolve("api-classes"); + + new JavacTask(tb, Task.Mode.CMDLINE) + .outdir(apiClasses) + .options("-XDforcePreview", + "-XDrawDiagnostics", + "--patch-module", "java.base=" + apiSrc.toString(), + "-Werror") + .files(tb.findJavaFiles(apiSrc)) + .run() + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + checkPreviewClassfile(apiClasses.resolve("preview").resolve("api").resolve("Outer.class"), + false); + checkPreviewClassfile(apiClasses.resolve("preview").resolve("impl").resolve("Impl.class"), + false); + checkPreviewClassfile(apiClasses.resolve("preview").resolve("impl").resolve("Impl$C.class"), + false); + + Path testSrc = base.resolve("test-src"); + tb.writeJavaFiles(testSrc, + """ + package test; + import preview.api.Outer; + public class Use { + public void run() { + new Outer().test(); + } + public static class C extends Outer {} + } + """); + Path testClasses = base.resolve("test-classes"); + List log = new JavacTask(tb, Task.Mode.CMDLINE) + .outdir(testClasses) + .options("--patch-module", "java.base=" + apiClasses.toString(), + "--add-exports", "java.base/preview.api=ALL-UNNAMED", + "-XDrawDiagnostics") + .files(tb.findJavaFiles(testSrc)) + .run(Task.Expect.FAIL) + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + List expected = + List.of("Use.java:2:19: compiler.err.is.preview: preview.api.Outer", + "Use.java:7:35: compiler.err.is.preview: preview.api.Outer", + "Use.java:5:13: compiler.err.is.preview: preview.api.Outer", + "3 errors"); + + if (!log.equals(expected)) + throw new Exception("expected output not found" + log); + + log = new JavacTask(tb, Task.Mode.CMDLINE) + .outdir(testClasses) + .options("--patch-module", "java.base=" + apiClasses.toString(), + "--add-exports", "java.base/preview.api=ALL-UNNAMED", + "--enable-preview", + "-Xlint:preview", + "-source", String.valueOf(Runtime.version().feature()), + "-XDrawDiagnostics") + .files(tb.findJavaFiles(testSrc)) + .run() + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + + expected = + List.of("Use.java:5:13: compiler.warn.is.preview: preview.api.Outer", + "Use.java:7:35: compiler.warn.is.preview: preview.api.Outer", + "2 warnings"); + + if (!log.equals(expected)) + throw new Exception("expected output not found" + log); + + checkPreviewClassfile(testClasses.resolve("test").resolve("Use.class"), + true); + checkPreviewClassfile(testClasses.resolve("test").resolve("Use$C.class"), + true); + } + + private void checkPreviewClassfile(Path p, boolean preview) throws Exception { + try (InputStream in = Files.newInputStream(p)) { + ClassFile cf = ClassFile.read(in); + if (preview && cf.minor_version != 65535) { + throw new IllegalStateException("Expected preview class, but got: " + cf.minor_version); + } else if (!preview && cf.minor_version != 0) { + throw new IllegalStateException("Expected minor version == 0 but got: " + cf.minor_version); + } + } + } +} diff --git a/test/langtools/tools/javac/preview/PreviewErrors.java b/test/langtools/tools/javac/preview/PreviewErrors.java index 2e8fc74e91eda..4bb0e654f9615 100644 --- a/test/langtools/tools/javac/preview/PreviewErrors.java +++ b/test/langtools/tools/javac/preview/PreviewErrors.java @@ -27,15 +27,16 @@ * @summary Verify behavior w.r.t. preview feature API errors and warnings * @library /tools/lib /tools/javac/lib * @modules - * java.base/jdk.internal + * java.base/jdk.internal.javac * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main * jdk.compiler/com.sun.tools.javac.util + * jdk.jdeps/com.sun.tools.classfile * @build toolbox.ToolBox toolbox.JavacTask * @build combo.ComboTestHelper - * @compile --enable-preview -source ${jdk.version} PreviewErrors.java - * @run main/othervm --enable-preview PreviewErrors + * @compile PreviewErrors.java + * @run main PreviewErrors */ import java.io.IOException; @@ -48,11 +49,19 @@ import combo.ComboTask; import combo.ComboTestHelper; import java.util.Arrays; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; import javax.tools.Diagnostic; -import jdk.internal.PreviewFeature; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import java.io.FileWriter; +import java.io.UncheckedIOException; +import java.io.Writer; +import java.util.Map.Entry; +import javax.tools.JavaFileObject; import toolbox.JavacTask; import toolbox.ToolBox; @@ -66,25 +75,119 @@ public class PreviewErrors extends ComboInstance { tb = new ToolBox(); } + private static String previewAPI(PreviewElementType elementType) { + return """ + package preview.api; + public class ${name} { + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.${preview} + ${reflective}) + public static void test() { } + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.${preview} + ${reflective}) + public static class Clazz {} + } + """.replace("${name}", elementType.className) + .replace("${preview}", "TEST") + .replace("${reflective}", elementType.reflective); + } + + private static final String RECORD_DECLARATION = """ + package user; + public record R(int i) {} + """; + + static Map>>> parts = new TreeMap<>(); public static void main(String... args) throws Exception { new ComboTestHelper() - .withDimension("ESSENTIAL", (x, essential) -> x.essential = essential, EssentialAPI.values()) .withDimension("PREVIEW", (x, preview) -> x.preview = preview, Preview.values()) .withDimension("LINT", (x, lint) -> x.lint = lint, Lint.values()) .withDimension("SUPPRESS", (x, suppress) -> x.suppress = suppress, Suppress.values()) - .withDimension("FROM", (x, from) -> x.from = from, PreviewFrom.values()) + .withDimension("ELEMENT_TYPE", (x, elementType) -> x.elementType = elementType, PreviewElementType.values()) .run(PreviewErrors::new); + if (args.length == 1) { + try (Writer out = new FileWriter(args[0])) { + int petCount = 0; + for (Entry>>> pet : parts.entrySet()) { + petCount++; + switch (pet.getKey()) { + case API_REFLECTIVE_CLASS, API_CLASS -> { + if (pet.getKey() == PreviewElementType.API_REFLECTIVE_CLASS) { + out.write("

" + petCount + ". Reflective Preview API

\n"); + } else { + out.write("

" + petCount + ". Preview API

\n"); + } + out.write("API source (part of java.base):\n"); + out.write("
\n");
+                            String previewAPI = previewAPI(pet.getKey());
+                            out.write(previewAPI);
+                            out.write("\n
\n"); + } + case REFER_TO_DECLARATION_CLASS -> { + out.write("

" + petCount + ". Using an element declared using a preview feature

\n"); + out.write("Element declaration:\n"); + out.write("
\n");
+                            out.write(RECORD_DECLARATION);
+                            out.write("\n
\n"); + } + case LANGUAGE -> { + out.write("

" + petCount + ". Using preview language feature

\n"); + } + } + int prevCount = 0; + for (Entry>> prev : pet.getValue().entrySet()) { + prevCount++; + switch (prev.getKey()) { + case YES -> { + out.write("

" + petCount + "." + prevCount + ". With --enable-preview

\n"); + } + case NO -> { + out.write("

" + petCount + "." + prevCount + ". Without --enable-preview

\n"); + } + } + int supCount = 0; + for (Entry> sup : prev.getValue().entrySet()) { + supCount++; + switch (sup.getKey()) { + case YES -> { + out.write("

" + petCount + "." + prevCount + "." + supCount + ". Usages suppressed with @SuppressWarnings

\n"); + } + case NO -> { + out.write("

" + petCount + "." + prevCount + "." + supCount + ". Usages not suppressed with @SuppressWarnings

\n"); + } + } + int lintCount = 0; + for (Entry lint : sup.getValue().entrySet()) { + lintCount++; + switch (lint.getKey()) { + case NONE -> { + out.write("
" + petCount + "." + prevCount + "." + supCount + "." + lintCount + ". Neither -Xlint:preview nor -Xlint:-preview
\n"); + } + case ENABLE_PREVIEW -> { + out.write("
" + petCount + "." + prevCount + "." + supCount + "." + lintCount + ". With -Xlint:preview
\n"); + } + case DISABLE_PREVIEW -> { + out.write("
" + petCount + "." + prevCount + "." + supCount + "." + lintCount + ". With -Xlint:-preview
\n"); + } + } + out.write(lint.getValue().toString()); + out.write("\n"); + } + } + } + } + } + } } - private EssentialAPI essential; private Preview preview; private Lint lint; private Suppress suppress; - private PreviewFrom from; + private PreviewElementType elementType; @Override public void doWork() throws IOException { Path base = Paths.get("."); + tb.cleanDirectory(base); Path src = base.resolve("src"); Path srcJavaBase = src.resolve("java.base"); Path classes = base.resolve("classes"); @@ -92,62 +195,83 @@ public void doWork() throws IOException { Files.createDirectories(classesJavaBase); - String previewAPI = """ - package preview.api; - public class Extra { - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.${preview} - ${essential}) - public static void test() { } - @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.${preview} - ${essential}) - public static class Clazz {} - } - """.replace("${preview}", PreviewFeature.Feature.values()[0].name()) - .replace("${essential}", essential.expand(null)); - - if (from == PreviewFrom.CLASS) { - tb.writeJavaFiles(srcJavaBase, previewAPI); - - new JavacTask(tb) - .outdir(classesJavaBase) - .options("--patch-module", "java.base=" + srcJavaBase.toString()) - .files(tb.findJavaFiles(srcJavaBase)) - .run() - .writeAll(); - } + String previewAPI = previewAPI(elementType); ComboTask task = newCompilationTask() - .withSourceFromTemplate(""" - package test; - public class Test { - #{SUPPRESS} - public void test() { - preview.api.Extra.test(); - preview.api.Extra.Clazz c; - } - } - """) .withOption("-XDrawDiagnostics") .withOption("-source") .withOption(String.valueOf(Runtime.version().feature())); - if (from == PreviewFrom.CLASS) { - task.withOption("--patch-module") - .withOption("java.base=" + classesJavaBase.toString()) - .withOption("--add-exports") - .withOption("java.base/preview.api=ALL-UNNAMED"); - } else { - task.withSourceFromTemplate("Extra", previewAPI) - .withOption("--add-exports") - .withOption("java.base/jdk.internal=ALL-UNNAMED"); + switch (elementType) { + case API_CLASS, API_REFLECTIVE_CLASS -> { + tb.writeJavaFiles(srcJavaBase, previewAPI); + + new JavacTask(tb) + .outdir(classesJavaBase) + .options("--patch-module", "java.base=" + srcJavaBase.toString()) + .files(tb.findJavaFiles(srcJavaBase)) + .run() + .writeAll(); + + task.withOption("--patch-module") + .withOption("java.base=" + classesJavaBase.toString()) + .withOption("--add-exports") + .withOption("java.base/preview.api=ALL-UNNAMED"); + } + case API_SOURCE, API_REFLECTIVE_SOURCE -> { + tb.writeJavaFiles(srcJavaBase, previewAPI); + + task.withOption("--patch-module") + .withOption("java.base=" + srcJavaBase.toString()) + .withOption("--add-exports") + .withOption("java.base/preview.api=ALL-UNNAMED"); + } + case LANGUAGE -> { + task.withOption("-XDforcePreview=true"); + } + case REFER_TO_DECLARATION_CLASS -> { + tb.writeJavaFiles(srcJavaBase, RECORD_DECLARATION); + + new JavacTask(tb) + .outdir(classesJavaBase) + .options("--patch-module", "java.base=" + srcJavaBase.toString(), + "--enable-preview", + "-source", String.valueOf(Runtime.version().feature())) + .files(tb.findJavaFiles(srcJavaBase)) + .run() + .writeAll(); + + task.withOption("--patch-module") + .withOption("java.base=" + classesJavaBase.toString()) + .withOption("--add-exports") + .withOption("java.base/user=ALL-UNNAMED"); + } + case REFER_TO_DECLARATION_SOURCE -> { + tb.writeJavaFiles(srcJavaBase, RECORD_DECLARATION); + + task.withOption("--patch-module") + .withOption("java.base=" + srcJavaBase.toString()) + .withOption("--add-exports") + .withOption("java.base/user=ALL-UNNAMED"); + } } + task.withSourceFromTemplate(""" + package test; + public class Test { + #{SUPPRESS} + public void test(Object o) { + #{ELEMENT_TYPE} + } + } + """); + if (preview.expand(null)!= null) { - task = task.withOption(preview.expand(null)); + task.withOption(preview.expand(null)); } if (lint.expand(null) != null) { - task = task.withOption(lint.expand(null)); + task.withOption(lint.expand(null)); } task.generate(result -> { @@ -155,65 +279,172 @@ public void test() { .flatMap(kind -> result.diagnosticsForKind(kind).stream()) .map(d -> d.getLineNumber() + ":" + d.getColumnNumber() + ":" + d.getCode()) .collect(Collectors.toSet()); - Set expected; boolean ok; - if (essential == EssentialAPI.YES) { - if (preview == Preview.YES) { - if (suppress == Suppress.YES) { - expected = Set.of(); - } else if (lint == Lint.ENABLE_PREVIEW) { - expected = Set.of("5:26:compiler.warn.is.preview", "6:26:compiler.warn.is.preview"); - } else { - expected = Set.of("-1:-1:compiler.note.preview.filename", - "-1:-1:compiler.note.preview.recompile"); + boolean previewClass = true; + Set expected = null; + if (preview == Preview.NO) { + switch (elementType) { + case LANGUAGE -> { + ok = false; + expected = Set.of("5:41:compiler.err.preview.feature.disabled"); + } + case REFER_TO_DECLARATION_CLASS -> { + ok = false; + expected = Set.of("-1:-1:compiler.err.preview.feature.disabled.classfile"); + } + case REFER_TO_DECLARATION_SOURCE -> { + ok = false; + expected = Set.of("2:8:compiler.err.preview.feature.disabled.plural"); + } + case API_CLASS, API_SOURCE -> { + ok = false; + expected = Set.of("6:17:compiler.err.is.preview", + "5:25:compiler.err.is.preview"); + } + case API_REFLECTIVE_CLASS, API_REFLECTIVE_SOURCE -> { + ok = true; + previewClass = false; + if (suppress == Suppress.YES) { + expected = Set.of(); + } else if (lint == Lint.NONE || lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("6:20:compiler.warn.is.preview.reflective", + "5:28:compiler.warn.is.preview.reflective"); + } else {//-Xlint:-preview + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } + } + default -> { + throw new IllegalStateException(elementType.name()); } - ok = true; - } else { - expected = Set.of("5:26:compiler.err.is.preview", "6:26:compiler.err.is.preview"); - ok = false; } } else { - if (suppress == Suppress.YES) { - expected = Set.of(); - } else if ((preview == Preview.YES && (lint == Lint.NONE || lint == Lint.DISABLE_PREVIEW)) || - (preview == Preview.NO && lint == Lint.DISABLE_PREVIEW)) { - expected = Set.of("-1:-1:compiler.note.preview.filename", - "-1:-1:compiler.note.preview.recompile"); - } else { - expected = Set.of("5:26:compiler.warn.is.preview", "6:26:compiler.warn.is.preview"); - } ok = true; + switch (elementType) { + case LANGUAGE -> { + if (lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("5:41:compiler.warn.preview.feature.use"); + } else { + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } + } + case REFER_TO_DECLARATION_CLASS -> { + if (suppress == Suppress.YES) { + if (lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("-1:-1:compiler.warn.preview.feature.use.classfile"); + } else { + expected = Set.of(/*"-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"*/); + } + } else if (lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("5:13:compiler.warn.declared.using.preview", + "5:24:compiler.warn.declared.using.preview", + "-1:-1:compiler.warn.preview.feature.use.classfile"); + } else { + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } + } + case REFER_TO_DECLARATION_SOURCE -> { + if (lint == Lint.ENABLE_PREVIEW) { + if (suppress == Suppress.YES) { + expected = Set.of("2:8:compiler.warn.preview.feature.use.plural"); + } else { + expected = Set.of("5:13:compiler.warn.declared.using.preview", + "5:24:compiler.warn.declared.using.preview", + "2:8:compiler.warn.preview.feature.use.plural"); + } + } else { + if (suppress == Suppress.YES) { + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } else { + expected = Set.of("-1:-1:compiler.note.preview.plural", + "-1:-1:compiler.note.preview.recompile"); + } + } + } + case API_CLASS, API_SOURCE -> { + if (suppress == Suppress.YES) { + expected = Set.of(); + } else if (lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("6:17:compiler.warn.is.preview", + "5:25:compiler.warn.is.preview"); + } else { + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } + } + case API_REFLECTIVE_CLASS, API_REFLECTIVE_SOURCE -> { + previewClass = false; + if (suppress == Suppress.YES) { + expected = Set.of(); + } else if (lint == Lint.ENABLE_PREVIEW) { + expected = Set.of("6:20:compiler.warn.is.preview.reflective", + "5:28:compiler.warn.is.preview.reflective"); + } else { + expected = Set.of("-1:-1:compiler.note.preview.filename", + "-1:-1:compiler.note.preview.recompile"); + } + } + } + } + if (!elementType.isSource) { + try { + parts.computeIfAbsent(elementType, x -> new TreeMap<>()) + .computeIfAbsent(preview, x -> new TreeMap<>()) + .computeIfAbsent(suppress, x -> new TreeMap<>()) + .computeIfAbsent(lint, x -> new StringBuilder()) + .append("
\n")
+                                .append(task.getSources().head.getCharContent(false))
+                                .append("\n
\n") + .append("
\n")
+                                .append(Arrays.stream(Diagnostic.Kind.values())
+                                              .flatMap(kind -> result.diagnosticsForKind(kind).reverse().stream())
+                                              .filter(d -> d.getSource() == null || !d.getSource().getName().contains("R.java"))
+                                              .map(d -> (d.getSource() != null ? d.getSource().getName() + ":" + d.getLineNumber() + ":" : "") + d.getKind()+ ": " + d.getMessage(null)).collect(Collectors.joining("\n")))
+                                .append("\n
\n") + .append(ok ? previewClass ? "Test.class is marked as a preview class file." : "Test.class is NOT marked as a preview class file." : "Does not compile."); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } } if (ok) { if (!result.get().iterator().hasNext()) { - throw new IllegalStateException("Did not succeed as expected." + actual); + throw new IllegalStateException("Did not succeed as expected for preview=" + preview + ", lint=" + lint + ", suppress=" + suppress + ", elementType=" + elementType + ": actual:\"" + actual + "\""); + } + ClassFile cf; + try { + JavaFileObject testClass = null; + for (JavaFileObject classfile : result.get()) { + if (classfile.isNameCompatible("Test", JavaFileObject.Kind.CLASS)){ + testClass = classfile; + } + } + if (testClass == null) { + throw new IllegalStateException("Cannot find Test.class"); + } + cf = ClassFile.read(testClass.openInputStream()); + } catch (IOException | ConstantPoolException ex) { + throw new IllegalStateException(ex); + } + if (previewClass && cf.minor_version != 65535) { + throw new IllegalStateException("Expected preview class, but got: " + cf.minor_version); + } else if (!previewClass && cf.minor_version != 0) { + throw new IllegalStateException("Expected minor version == 0 but got: " + cf.minor_version); } } else { if (result.get().iterator().hasNext()) { - throw new IllegalStateException("Succeed unexpectedly."); + throw new IllegalStateException("Succeed unexpectedly for preview=" + preview + ", lint=" + lint + ", suppress=" + suppress + ", elementType=" + elementType); } } - if (!expected.equals(actual)) { - throw new IllegalStateException("Unexpected output for " + essential + ", " + preview + ", " + lint + ", " + suppress + ", " + from + ": actual: \"" + actual + "\", expected: \"" + expected + "\""); + if (expected != null && !expected.equals(actual)) { + throw new IllegalStateException("Unexpected output for preview=" + preview + ", lint=" + lint + ", suppress=" + suppress + ", elementType=" + elementType + ": actual: \"" + actual + "\", expected: \"" + expected + "\""); } }); } - public enum EssentialAPI implements ComboParameter { - YES(", essentialAPI=true"), - NO(", essentialAPI=false"); - - private final String code; - - private EssentialAPI(String code) { - this.code = code; - } - - public String expand(String optParameter) { - return code; - } - } - public enum Preview implements ComboParameter { YES("--enable-preview"), NO(null); @@ -260,15 +491,53 @@ public String expand(String optParameter) { } } - public enum PreviewFrom implements ComboParameter { - CLASS, - SOURCE; - - private PreviewFrom() { + public enum PreviewElementType implements ComboParameter { + LANGUAGE("boolean b = o instanceof String s;", ", reflective=false", "", false), + REFER_TO_DECLARATION_SOURCE("user.R d1; user.R d2;", ", reflective=false", "", true), + REFER_TO_DECLARATION_CLASS("user.R d1; user.R d2;", ", reflective=false", "", false), + API_CLASS(""" + preview.api.Core.test(); + preview.api.Core.Clazz c; + """, + ", reflective=false", + "Core", + false), + API_REFLECTIVE_CLASS(""" + preview.api.Reflect.test(); + preview.api.Reflect.Clazz c; + """, + ", reflective=true", + "Reflect", + false), + API_SOURCE(""" + preview.api.Core.test(); + preview.api.Core.Clazz c; + """, + ", reflective=false", + "Core", + true), + API_REFLECTIVE_SOURCE(""" + preview.api.Reflect.test(); + preview.api.Reflect.Clazz c; + """, + ", reflective=true", + "Reflect", + true); + + String code; + String reflective; + String className; + boolean isSource; + + private PreviewElementType(String code, String reflective, String className, boolean isSource) { + this.code = code; + this.reflective = reflective; + this.className = className; + this.isSource = isSource; } public String expand(String optParameter) { - throw new IllegalStateException(); + return code; } } } diff --git a/test/langtools/tools/javac/processing/model/element/JavaxLangModelForRecords.java b/test/langtools/tools/javac/processing/model/element/JavaxLangModelForRecords.java index 85fa3b90435a8..9063b66491f0d 100644 --- a/test/langtools/tools/javac/processing/model/element/JavaxLangModelForRecords.java +++ b/test/langtools/tools/javac/processing/model/element/JavaxLangModelForRecords.java @@ -105,17 +105,17 @@ public void testQualifiedClassForProcessing(Path base) throws Exception { tb.writeJavaFiles(r, "record R(int i) {}"); - List expected = List.of("Note: field: i", - "Note: record component: i", - "Note: testQualifiedClassForProcessing" + File.separator + "src" + File.separator - + "R" + File.separator + "R.java uses preview language features.", - "Note: Recompile with -Xlint:preview for details."); + List expected = List.of("- compiler.note.proc.messager: field: i", + "- compiler.note.proc.messager: record component: i", + "- compiler.note.preview.filename: R.java, DEFAULT", + "- compiler.note.preview.recompile"); for (Mode mode : new Mode[] {Mode.API}) { List log = new JavacTask(tb, mode) .options("-processor", QualifiedClassForProcessing.class.getName(), "--enable-preview", - "-source", Integer.toString(Runtime.version().feature())) + "-source", Integer.toString(Runtime.version().feature()), + "-XDrawDiagnostics") .files(findJavaFiles(src)) .outdir(classes) .run() diff --git a/test/langtools/tools/javac/processing/model/element/TestSealed.java b/test/langtools/tools/javac/processing/model/element/TestSealed.java index 818ab6219cfe6..1859ff25ce3ee 100644 --- a/test/langtools/tools/javac/processing/model/element/TestSealed.java +++ b/test/langtools/tools/javac/processing/model/element/TestSealed.java @@ -115,32 +115,32 @@ class ClassOutOfSealedHierarchy extends NonSealedClass1 {} ); List expected = List.of( - "Note: visiting: SealedInterface Modifiers: [abstract, sealed]", - "Note: this class has: 2, permitted subclasses", - "Note: permitted subclass: NonSealedClass1", - "Note: permitted subclass: SealedClass", - "Note: visiting: NonSealedClass1 Modifiers: [non-sealed]", - "Note: this class has: 0, permitted subclasses", - "Note: visiting: SealedClass Modifiers: [sealed]", - "Note: this class has: 2, permitted subclasses", - "Note: permitted subclass: FinalClass", - "Note: permitted subclass: NonSealedClass2", - "Note: visiting: FinalClass Modifiers: [final]", - "Note: this class has: 0, permitted subclasses", - "Note: visiting: NonSealedClass2 Modifiers: [non-sealed]", - "Note: this class has: 0, permitted subclasses", - "Note: visiting: ClassOutOfSealedHierarchy Modifiers: []", - "Note: this class has: 0, permitted subclasses", - "Note: testSealedClassesProcessor" + File.separator + "src" + File.separator - + "Test" + File.separator + "SealedInterface.java uses preview language features.", - "Note: Recompile with -Xlint:preview for details." + "- compiler.note.proc.messager: visiting: SealedInterface Modifiers: [abstract, sealed]", + "- compiler.note.proc.messager: this class has: 2, permitted subclasses", + "- compiler.note.proc.messager: permitted subclass: NonSealedClass1", + "- compiler.note.proc.messager: permitted subclass: SealedClass", + "- compiler.note.proc.messager: visiting: NonSealedClass1 Modifiers: [non-sealed]", + "- compiler.note.proc.messager: this class has: 0, permitted subclasses", + "- compiler.note.proc.messager: visiting: SealedClass Modifiers: [sealed]", + "- compiler.note.proc.messager: this class has: 2, permitted subclasses", + "- compiler.note.proc.messager: permitted subclass: FinalClass", + "- compiler.note.proc.messager: permitted subclass: NonSealedClass2", + "- compiler.note.proc.messager: visiting: FinalClass Modifiers: [final]", + "- compiler.note.proc.messager: this class has: 0, permitted subclasses", + "- compiler.note.proc.messager: visiting: NonSealedClass2 Modifiers: [non-sealed]", + "- compiler.note.proc.messager: this class has: 0, permitted subclasses", + "- compiler.note.proc.messager: visiting: ClassOutOfSealedHierarchy Modifiers: []", + "- compiler.note.proc.messager: this class has: 0, permitted subclasses", + "- compiler.note.preview.filename: SealedInterface.java, DEFAULT", + "- compiler.note.preview.recompile" ); for (Mode mode : new Mode[] {Mode.API}) { List log = new JavacTask(tb, mode) .options("-processor", SealedClassesProcessor.class.getName(), "--enable-preview", - "-source", Integer.toString(Runtime.version().feature())) + "-source", Integer.toString(Runtime.version().feature()), + "-XDrawDiagnostics") .files(findJavaFiles(src)) .outdir(classes) .run() diff --git a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java index 55e872e3900ea..3ac5d4fd882b4 100644 --- a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java +++ b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java @@ -602,7 +602,7 @@ public void testDifferentModuleNeg(Path base) throws Exception { List expected = List.of( "Base.java:1:46: compiler.err.cant.inherit.from.sealed: a.Base", - "- compiler.note.preview.filename: Base.java", + "- compiler.note.preview.plural: DEFAULT", "- compiler.note.preview.recompile", "1 error" ); diff --git a/test/langtools/tools/jdeps/listdeps/ListModuleDeps.java b/test/langtools/tools/jdeps/listdeps/ListModuleDeps.java index d0d208d579d73..0f014f4bc3613 100644 --- a/test/langtools/tools/jdeps/listdeps/ListModuleDeps.java +++ b/test/langtools/tools/jdeps/listdeps/ListModuleDeps.java @@ -92,7 +92,7 @@ public void compileAll() throws Exception { public Object[][] jdkModules() { return new Object[][]{ {"jdk.compiler", new String[]{ - "java.base/jdk.internal", + "java.base/jdk.internal.javac", "java.base/jdk.internal.jmod", "java.base/jdk.internal.misc", "java.base/sun.reflect.annotation", From b9dbff5ddadf05b8418fc9593f9ef83eb9defe80 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 3 Sep 2020 13:20:50 +0200 Subject: [PATCH 02/42] Updates to the preview javadoc appearance. --- .../doclets/formats/html/ClassWriterImpl.java | 12 ++++++++---- .../doclets/formats/html/markup/HtmlStyle.java | 1 + .../doclets/toolkit/resources/stylesheet.css | 15 +++++++++++---- .../internal/doclets/toolkit/util/Utils.java | 4 ++-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 351366f26d338..2f1b7aadae24d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -198,13 +198,17 @@ public void addClassSignature(String modifiers, Content classInfoTree) { classInfoTree.add(hr); Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); - Content sep = null; - for (String modifiersPart : modifiers.split("record")) { + String sep = null; + for (String modifiersPart : modifiers.split(" ")) { if (sep != null) { pre.add(sep); } - pre.add(modifiersPart); - sep = HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add("record")); + if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { + pre.add(HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add(modifiersPart))); + } else { + pre.add(modifiersPart); + } + sep = " "; } LinkInfoImpl linkInfo = new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE, typeElement); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 00cd439635872..efc636187341c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -81,6 +81,7 @@ public enum HtmlStyle { previewBlock, previewLabel, previewReference, + previewReferenceNote, searchTagLink, searchTagResult, serializedPackageContainer, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index b638727a4140c..80f3967c9e866 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -556,16 +556,23 @@ h1.hidden { } .deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, .module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, -.package-hierarchy-label, .preview-label, .type-name-label, .type-name-link, .search-tag-link { +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { font-weight:bold; } +.preview-label {} +.preview-reference-note { + background-color: #fdd; + padding: 4px; + border-radius:4px; +} .preview-reference { border-style:solid; border-width:thin; - border-radius:10px; + border-radius:4px; border-color:red; - padding-left: 10px; - padding-right: 10px; + padding-left: 4px; + padding-right: 4px; + background-color: #fdd; } .deprecation-comment, .help-footnote, .interface-name { font-style:italic; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 97ac8aff8b830..335204db54a37 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -1747,8 +1747,8 @@ public List getPreviewNotes(Element el, boolean span) { default -> throw new IllegalStateException("Unexpected: " + el.getKind()); } Function wrap = c -> { - return span ? HtmlTree.SPAN(HtmlStyle.previewReference, c) - : HtmlTree.DIV(HtmlStyle.previewReference, c); + return /*span ? */HtmlTree.SPAN(HtmlStyle.previewReferenceNote, c); +// : HtmlTree.DIV(HtmlStyle.previewReferenceNote, c); }; if (isDeclaredUsingPreview(el)) { result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview." + suffix)))); From 70286c0fab25b8e59e6346a3a9cec6ebc67221ef Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 8 Sep 2020 17:11:56 +0200 Subject: [PATCH 03/42] Experimenting with UI for preview links. --- .../classes/build/tools/taglet/Preview.java | 2 +- .../formats/html/AbstractMemberWriter.java | 8 ---- .../doclets/formats/html/ClassWriterImpl.java | 40 +++++++++-------- .../doclets/formats/html/LinkFactoryImpl.java | 44 +++++++++++++------ .../formats/html/PackageWriterImpl.java | 3 -- .../doclets/formats/html/markup/HtmlTree.java | 2 +- .../doclets/formats/html/markup/TagName.java | 1 + .../internal/doclets/toolkit/WorkArounds.java | 2 +- .../doclets/toolkit/resources/stylesheet.css | 12 ++--- .../internal/doclets/toolkit/util/Utils.java | 16 ++++++- 10 files changed, 78 insertions(+), 52 deletions(-) diff --git a/make/jdk/src/classes/build/tools/taglet/Preview.java b/make/jdk/src/classes/build/tools/taglet/Preview.java index 2b4bf16b75cdb..78285b10de6fd 100644 --- a/make/jdk/src/classes/build/tools/taglet/Preview.java +++ b/make/jdk/src/classes/build/tools/taglet/Preview.java @@ -73,7 +73,7 @@ public String toString(List tags, Element elem) { if (Arrays.stream(stackTrace).anyMatch(isSummary)) { return "
" + summary + "

"; } - return "
" + details + "

"; + return "

Preview

" + details + "

"; } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index d60f18bf8a50d..3481d77083ef1 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -283,10 +283,6 @@ protected void addDeprecatedInfo(Element member, Content contentTree) { Content div = HtmlTree.DIV(HtmlStyle.deprecationBlock, deprecatedContent); contentTree.add(div); } - for (Content note : utils.getPreviewNotes(member, false)) { - Content div = HtmlTree.DIV(HtmlStyle.previewBlock, note); - contentTree.add(div); - } } /** @@ -403,10 +399,6 @@ public void addMemberSummary(TypeElement tElement, Element member, writer.addSummaryLinkComment(this, member, firstSentenceTags, desc); rowContents.add(desc); table.addRow(member, rowContents); - List notes = utils.getPreviewNotes(member, true); - for (Content c : notes) { - table.addRow(member, HtmlTree.TD(HtmlStyle.colFirst, c).put(HtmlAttr.COLSPAN, "3")); //TODO: "3"!! - } } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 2f1b7aadae24d..561ad3e2b1da3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -42,6 +42,7 @@ import javax.lang.model.util.SimpleElementVisitor8; import com.sun.source.doctree.DocTree; +import com.sun.tools.doclint.HtmlTag; import javax.lang.model.element.ElementKind; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -198,18 +199,18 @@ public void addClassSignature(String modifiers, Content classInfoTree) { classInfoTree.add(hr); Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); - String sep = null; - for (String modifiersPart : modifiers.split(" ")) { - if (sep != null) { - pre.add(sep); - } - if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { - pre.add(HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add(modifiersPart))); - } else { - pre.add(modifiersPart); - } - sep = " "; - } +// String sep = null; +// for (String modifiersPart : modifiers.split(" ")) { +// if (sep != null) { +// pre.add(sep); +// } +// if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { +// pre.add(HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add(modifiersPart))); +// } else { +// pre.add(modifiersPart); +// } +// sep = " "; +// } LinkInfoImpl linkInfo = new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE, typeElement); //Let's not link to ourselves in the signature. @@ -319,6 +320,15 @@ public void addClassDescription(Content classInfoTree) { addInlineComment(typeElement, classInfoTree); } } + List previewNotes = utils.getPreviewNotes(typeElement, true); + if (!previewNotes.isEmpty()) { + classInfoTree.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.HEADING(TagName.H3, new ContentBuilder().add("Preview")))); + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewReferenceNote); + for (Content note : previewNotes) { + previewDiv.add(HtmlTree.DIV(note)); + } + classInfoTree.add(previewDiv); + } } @Override @@ -534,12 +544,6 @@ public void addClassDeprecationInfo(Content classInfoTree) { } classInfoTree.add(div); } - for (Content previewNote : utils.getPreviewNotes(typeElement, false)) { - HtmlTree div = new HtmlTree(TagName.DIV); - div.setStyle(HtmlStyle.previewBlock); - div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, previewNote)); - classInfoTree.add(div); - } } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 9ddeab0358a96..3b93c65bdfc9c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.function.Function; import javax.lang.model.element.AnnotationMirror; @@ -40,6 +41,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.Resources; @@ -47,6 +49,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkFactory; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo; @@ -91,29 +94,35 @@ protected Content getClassLink(LinkInfo linkInfo) { title = getClassToolTip(typeElement, isTypeLink); } Content label = classLinkInfo.getClassLinkLabel(configuration); + Set flags = utils.elementFlags(typeElement); - Function wrapWithPreviewNotice = c -> { - if (!hasWhere) { - boolean previewWarning = utils.isDeclaredUsingPreview(typeElement) || utils.getPreviewAPIType(typeElement) != PreviewAPIType.STANDARD; - if (previewWarning) { - HtmlTree span = HtmlTree.SPAN(HtmlStyle.previewReference, c); - c = span; - } - } - return c; - }; +// Function wrapWithPreviewNotice = c -> { +// if (!hasWhere) { +// if (previewWarning) { +// ContentBuilder cb = new ContentBuilder(c, new HtmlTree(TagName.SUP).add(HtmlTree.A("#", new ContentBuilder().add("PREVIEW")))); +// HtmlTree span = HtmlTree.SPAN(HtmlStyle.previewReference, cb); +// c = span; +// } +// } +// return c; +// }; Content link = new ContentBuilder(); if (utils.isIncluded(typeElement)) { if (configuration.isGeneratedDoc(typeElement)) { DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || !(docPaths.forName(typeElement)).equals(m_writer.filename)) { - link.add(wrapWithPreviewNotice.apply(m_writer.links.createLink( + link.add(m_writer.links.createLink( filename.fragment(classLinkInfo.where), label, classLinkInfo.isStrong, title, - classLinkInfo.target))); + classLinkInfo.target)); + if (flags.contains(ElementFlag.PREVIEW) && !hasWhere/*XXX*/) { + link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( + filename.fragment("preview"), + new ContentBuilder().add("PREVIEW")))); + } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } @@ -125,7 +134,14 @@ protected Content getClassLink(LinkInfo linkInfo) { typeElement, classLinkInfo.where, label, classLinkInfo.isStrong, true); if (crossLink != null) { - link.add(wrapWithPreviewNotice.apply(crossLink)); + link.add(crossLink); + if (flags.contains(ElementFlag.PREVIEW) && !hasWhere/*XXX*/) { + link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( + typeElement, + "preview", + new ContentBuilder().add("PREVIEW"), + false, false))); + } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } @@ -133,7 +149,7 @@ protected Content getClassLink(LinkInfo linkInfo) { } } // Can't link so just write label. - link.add(wrapWithPreviewNotice.apply(label)); + link.add(label); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index 7dd22987d7cea..30f5a7f43e766 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -232,9 +232,6 @@ public void addClassesSummary(SortedSet classes, String label, addSummaryComment(klass, description); } table.addRow(classLink, description); - for (Content c : utils.getPreviewNotes(klass, true)) { - table.addRow(HtmlTree.TD(HtmlStyle.colFirst, c).put(HtmlAttr.COLSPAN, "2")); //TODO: "2"!! - } } summaryContentTree.add(HtmlTree.LI(table)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java index 2982064e66c14..476990c74e764 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java @@ -917,7 +917,7 @@ public boolean isValid() { public boolean isInline() { switch (tagName) { case A: case BUTTON: case BR: case CODE: case EM: case I: case IMG: - case LABEL: case SMALL: case SPAN: case STRONG: case SUB: + case LABEL: case SMALL: case SPAN: case STRONG: case SUB: case SUP: return true; default: return false; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java index b3d688efa7ffb..5133ce27f47fc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java @@ -83,6 +83,7 @@ public enum TagName { SPAN, STRONG, SUB, + SUP, TABLE, TBODY, THEAD, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java index 1fe421ddfd051..a5c3e05fc2645 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java @@ -615,7 +615,7 @@ public PackageElement getAbbreviatedPackageElement(PackageElement pkg) { : ((JavacElements) utils.elementUtils).getPackageElement(encl, parsedPackageName); } - public PreviewAPIType getPreviewAPIType(TypeElement el) { + public PreviewAPIType getPreviewAPIType(Element el) { Symbol sym = (Symbol) el; if ((sym.flags() & Flags.PREVIEW_API) != 0) { if ((sym.flags() & Flags.PREVIEW_REFLECTIVE) != 0) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 80f3967c9e866..b49382df14c20 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -561,19 +561,21 @@ h1.hidden { } .preview-label {} .preview-reference-note { - background-color: #fdd; - padding: 4px; - border-radius:4px; + border: 1px solid red; border-radius: 5px; padding: 5px; display:inline-block; font-size: larger } .preview-reference { - border-style:solid; +/* border-style:solid; border-width:thin; border-radius:4px; border-color:red; padding-left: 4px; padding-right: 4px; - background-color: #fdd; + background-color: #fdd;*/ } +/*.preview-reference:after { + content: "PREVIEW"; + vertical-align: super; +}*/ .deprecation-comment, .help-footnote, .interface-name { font-style:italic; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 335204db54a37..94e6422e227ca 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -1747,7 +1747,8 @@ public List getPreviewNotes(Element el, boolean span) { default -> throw new IllegalStateException("Unexpected: " + el.getKind()); } Function wrap = c -> { - return /*span ? */HtmlTree.SPAN(HtmlStyle.previewReferenceNote, c); + return c; +// return /*span ? */HtmlTree.SPAN(HtmlStyle.previewReferenceNote, c); // : HtmlTree.DIV(HtmlStyle.previewReferenceNote, c); }; if (isDeclaredUsingPreview(el)) { @@ -3057,4 +3058,17 @@ public enum PreviewAPIType { DECLARED_USING_PREVIEW; } + public Set elementFlags(Element el) { + Set flags = EnumSet.noneOf(ElementFlag.class); + + if (isDeclaredUsingPreview(el) || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD) { + flags.add(ElementFlag.PREVIEW); + } + + return flags; + } + + public enum ElementFlag { + PREVIEW; + } } From 637b8c3e7a6128f68f5612be29ce709ab08642c5 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 9 Sep 2020 15:43:01 +0200 Subject: [PATCH 04/42] Experimenting with UI for preview links. --- .../doclets/formats/html/ClassWriterImpl.java | 102 ++++++++++++-- .../formats/html/HtmlDocletWriter.java | 2 + .../doclets/formats/html/LinkFactoryImpl.java | 25 ++-- .../doclets/formats/html/LinkInfoImpl.java | 9 ++ .../html/resources/standard.properties | 32 +++-- .../internal/doclets/toolkit/util/Utils.java | 131 +++++++++--------- .../javadoc/internal/tool/ElementsTable.java | 2 +- 7 files changed, 197 insertions(+), 106 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 561ad3e2b1da3..7641e34f0b881 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -43,6 +43,9 @@ import com.sun.source.doctree.DocTree; import com.sun.tools.doclint.HtmlTag; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.function.Function; import javax.lang.model.element.ElementKind; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -60,6 +63,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; /** * Generate the Class Information Page. @@ -199,18 +203,23 @@ public void addClassSignature(String modifiers, Content classInfoTree) { classInfoTree.add(hr); Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); -// String sep = null; -// for (String modifiersPart : modifiers.split(" ")) { -// if (sep != null) { -// pre.add(sep); -// } -// if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { -// pre.add(HtmlTree.SPAN(HtmlStyle.previewReference, new ContentBuilder().add(modifiersPart))); -// } else { -// pre.add(modifiersPart); -// } -// sep = " "; -// } + String sep = null; + for (String modifiersPart : modifiers.split(" ")) { + if (sep != null) { + pre.add(sep); + } + if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart) || "permits".equals(modifiersPart)) { + pre.add(modifiersPart); + pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", new ContentBuilder().add("PREVIEW")))); + pre.add(" "); + } else { + pre.add(modifiersPart); + } + sep = " "; + } + if (modifiers.endsWith(" ")) { + pre.add(" "); + } LinkInfoImpl linkInfo = new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE, typeElement); //Let's not link to ourselves in the signature. @@ -320,7 +329,7 @@ public void addClassDescription(Content classInfoTree) { addInlineComment(typeElement, classInfoTree); } } - List previewNotes = utils.getPreviewNotes(typeElement, true); + List previewNotes = getPreviewNotes(typeElement); if (!previewNotes.isEmpty()) { classInfoTree.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.HEADING(TagName.H3, new ContentBuilder().add("Preview")))); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewReferenceNote); @@ -331,6 +340,73 @@ public void addClassDescription(Content classInfoTree) { } } + @SuppressWarnings("preview") + public List getPreviewNotes(TypeElement el) { + List result = new ArrayList<>(); + PreviewSummary previewAPITypes = utils.declaredUsingPreviewAPIs(el); + Set memberPreviewAPI = new HashSet<>(); + Set memberReflectivePreviewAPI = new HashSet<>(); + Set memberDeclaredUsingPreviewFeature = new HashSet<>(); + boolean memberIsDeclaredUsingPreviewFeature = false; + for (Element enclosed : el.getEnclosedElements()) { + if (!utils.isIncluded(enclosed)) { + continue; + } + PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); + memberPreviewAPI.addAll(memberAPITypes.previewAPI); + memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); + memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); + memberIsDeclaredUsingPreviewFeature |= utils.isDeclaredUsingPreview(enclosed); + } + if (utils.isDeclaredUsingPreview(el)) { + result.add(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview.type"))); + } + if (memberIsDeclaredUsingPreviewFeature) { + result.add(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview.member"))); + } + if (!previewAPITypes.previewAPI.isEmpty()) { + result.add(injectLinks("doclet.PreviewAPI.type", previewAPITypes.previewAPI)); + } + if (!memberPreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.PreviewAPI.member", memberPreviewAPI)); + } + if (!previewAPITypes.reflectivePreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.ReflectivePreviewAPI.type", previewAPITypes.reflectivePreviewAPI)); + } + if (!memberReflectivePreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.ReflectivePreviewAPI.member", memberReflectivePreviewAPI)); + } + if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty()) { + result.add(injectLinks("doclet.UsesDeclaredUsingPreview.type", previewAPITypes.declaredUsingPreviewFeature)); + } + if (!memberDeclaredUsingPreviewFeature.isEmpty()) { + result.add(injectLinks("doclet.UsesDeclaredUsingPreview.member", memberDeclaredUsingPreviewFeature)); + } + return result; + } + + private Content injectLinks(String key, Set elements) { + ContentBuilder result = new ContentBuilder(); + String template = resources.getText(key); + int injectPoint = template.indexOf("{0}"); + if (injectPoint == (-1)) { + result.add(template); + return result; + } + result.add(template.substring(0, injectPoint)); + String[] sep = new String[] {""}; + elements.stream() + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te))) + .forEach(c -> { + result.add(sep[0]); + result.add(c); + sep[0] = ", "; + }); + result.add(template.substring(injectPoint + 3)); + return result; + } + @Override public void addClassTagInfo(Content classInfoTree) { if (!options.noComment()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 9c37719498bc0..d66748b03c79f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -928,6 +928,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(getAnchor(ee, isProperty))) + .whereMember(element) .strong(strong)); } @@ -935,6 +936,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(element.getSimpleName().toString())) + .whereMember(element) .strong(strong)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 3b93c65bdfc9c..a0ea44a616154 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -26,6 +26,7 @@ package jdk.javadoc.internal.doclets.formats.html; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.function.Function; @@ -94,18 +95,16 @@ protected Content getClassLink(LinkInfo linkInfo) { title = getClassToolTip(typeElement, isTypeLink); } Content label = classLinkInfo.getClassLinkLabel(configuration); - Set flags = utils.elementFlags(typeElement); + Set flags; + if (!hasWhere) { + flags = utils.elementFlags(typeElement); + } else if (classLinkInfo.whereMember != null) { + flags = utils.elementFlags(classLinkInfo.whereMember); + } else { + //TODO: no information? + flags = EnumSet.noneOf(ElementFlag.class); + } -// Function wrapWithPreviewNotice = c -> { -// if (!hasWhere) { -// if (previewWarning) { -// ContentBuilder cb = new ContentBuilder(c, new HtmlTree(TagName.SUP).add(HtmlTree.A("#", new ContentBuilder().add("PREVIEW")))); -// HtmlTree span = HtmlTree.SPAN(HtmlStyle.previewReference, cb); -// c = span; -// } -// } -// return c; -// }; Content link = new ContentBuilder(); if (utils.isIncluded(typeElement)) { if (configuration.isGeneratedDoc(typeElement)) { @@ -118,7 +117,7 @@ protected Content getClassLink(LinkInfo linkInfo) { classLinkInfo.isStrong, title, classLinkInfo.target)); - if (flags.contains(ElementFlag.PREVIEW) && !hasWhere/*XXX*/) { + if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( filename.fragment("preview"), new ContentBuilder().add("PREVIEW")))); @@ -135,7 +134,7 @@ protected Content getClassLink(LinkInfo linkInfo) { label, classLinkInfo.isStrong, true); if (crossLink != null) { link.add(crossLink); - if (flags.contains(ElementFlag.PREVIEW) && !hasWhere/*XXX*/) { + if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( typeElement, "preview", diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 895a17a865d35..52995f84bb464 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -25,6 +25,7 @@ package jdk.javadoc.internal.doclets.formats.html; +import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; @@ -230,11 +231,14 @@ public enum Kind { */ public String where = ""; + public Element whereMember; + /** * The value of the target. */ public String target = ""; public final Utils utils; + /** * Construct a LinkInfo object. * @@ -340,6 +344,11 @@ public LinkInfoImpl where(String where) { return this; } + public LinkInfoImpl whereMember(Element el) { + this.whereMember = el; + return this; + } + public Kind getContext() { return context; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 45edd3d992f73..49ed670389c9c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -266,21 +266,25 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} -doclet.Declared_Using_Preview=XXX -doclet.PreviewAPI=XXX -doclet.ReflectivePreviewAPI=XXX +#doclet.Declared_Using_Preview=XXX +#doclet.PreviewAPI=XXX +#doclet.ReflectivePreviewAPI=XXX doclet.Declared_Using_Preview.type=This class is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.PreviewAPI.type=The declaration of this class uses a preview API. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.ReflectivePreviewAPI.type=The declaration of this class uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.UsesDeclaredUsingPreview.type=The declaration of this class uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.Declared_Using_Preview.method=This method is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.PreviewAPI.method=The declaration of this method uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.ReflectivePreviewAPI.method=The declaration of this method uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.UsesDeclaredUsingPreview.method=The declaration of this method uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.Declared_Using_Preview.field=This field is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.PreviewAPI.field=The declaration of this field uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.ReflectivePreviewAPI.field=The declaration of this field uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.UsesDeclaredUsingPreview.field=The declaration of this field uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.Declared_Using_Preview.member=This class contains members declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewAPI.type=The declaration of this class uses the following preview API(s): {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewAPI.member=The declaration of member(s) of this class uses the following preview API(s): {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.ReflectivePreviewAPI.type=The declaration of this class uses the following reflective preview API(s): {0}. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.ReflectivePreviewAPI.member=The declaration of member(s) of this class uses the following reflective preview API(s): {0}. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.UsesDeclaredUsingPreview.type=The declaration of this class uses the following type(s) declared using a preview feature of the Java language: {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.UsesDeclaredUsingPreview.member=The declaration of member(s) of this class uses the following type(s) declared using a preview feature of the Java language: {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.Declared_Using_Preview.method=This method is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.PreviewAPI.method=The declaration of this method uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.ReflectivePreviewAPI.method=The declaration of this method uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.UsesDeclaredUsingPreview.method=The declaration of this method uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.Declared_Using_Preview.field=This field is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.PreviewAPI.field=The declaration of this field uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.ReflectivePreviewAPI.field=The declaration of this field uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +#doclet.UsesDeclaredUsingPreview.field=The declaration of this field uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 94e6422e227ca..7d3224d39a970 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -120,6 +120,8 @@ import static com.sun.source.doctree.DocTree.Kind.*; import java.util.function.Function; +import jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter; +import jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; @@ -1708,65 +1710,6 @@ public String getHTMLTitle(Element element) { return sb.toString().trim(); } - @SuppressWarnings("preview") - public List getPreviewNotes(Element el, boolean span) { - List result = new ArrayList<>(); - List usedInDeclaration = new ArrayList<>(); - String suffix; - switch (el.getKind()) { - case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> { - suffix = "type"; - //TODO: annotations - TypeElement te = (TypeElement) el; - for (TypeParameterElement tpe : te.getTypeParameters()) { - usedInDeclaration.addAll(types2Classes(tpe.getBounds())); - } - usedInDeclaration.addAll(types2Classes(List.of(te.getSuperclass()))); - usedInDeclaration.addAll(types2Classes(te.getInterfaces())); - usedInDeclaration.addAll(types2Classes(te.getPermittedSubclasses())); - usedInDeclaration.addAll(types2Classes(te.getRecordComponents().stream().map(c -> c.asType()).collect(Collectors.toList()))); //TODO: annotations on record components??? - } - case CONSTRUCTOR, METHOD -> { - suffix = "method"; - //TODO: annotations - ExecutableElement ee = (ExecutableElement) el; - for (TypeParameterElement tpe : ee.getTypeParameters()) { - usedInDeclaration.addAll(types2Classes(tpe.getBounds())); - } - usedInDeclaration.addAll(types2Classes(List.of(ee.getReturnType()))); - usedInDeclaration.addAll(types2Classes(List.of(ee.getReceiverType()))); - usedInDeclaration.addAll(types2Classes(ee.getThrownTypes())); - usedInDeclaration.addAll(types2Classes(ee.getParameters().stream().map(p -> p.asType()).collect(Collectors.toList()))); - } - case FIELD, ENUM_CONSTANT -> { - suffix = "field"; - //TODO: annotations - VariableElement ve = (VariableElement) el; - usedInDeclaration.addAll(types2Classes(List.of(ve.asType()))); - } - default -> throw new IllegalStateException("Unexpected: " + el.getKind()); - } - Function wrap = c -> { - return c; -// return /*span ? */HtmlTree.SPAN(HtmlStyle.previewReferenceNote, c); -// : HtmlTree.DIV(HtmlStyle.previewReferenceNote, c); - }; - if (isDeclaredUsingPreview(el)) { - result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview." + suffix)))); - } - Set previewAPITypes = getPreviewAPITypes(usedInDeclaration); - if (previewAPITypes.contains(PreviewAPIType.PREVIEW)) { - result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.PreviewAPI." + suffix)))); - } - if (previewAPITypes.contains(PreviewAPIType.REFLECTIVE)) { - result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.ReflectivePreviewAPI." + suffix)))); - } - if (previewAPITypes.contains(PreviewAPIType.DECLARED_USING_PREVIEW)) { - result.add(wrap.apply(new ContentBuilder().add(resources.getText("doclet.UsesDeclaredUsingPreview." + suffix)))); - } - return result; - } - private Collection types2Classes(List types) { List result = new ArrayList<>(); List todo = new ArrayList<>(types); @@ -3031,16 +2974,73 @@ public boolean isDeclaredUsingPreview(Element e) { e.getModifiers().contains(Modifier.SEALED); } - public Set getPreviewAPITypes(Iterable elements) { - Set result = new TreeSet<>(); + public PreviewSummary getPreviewAPITypes(Iterable elements) { //TODO: private/merge into declaredUsingPreviewAPIs? + Set previewAPI = new HashSet<>(); + Set reflectivePreviewAPI = new HashSet<>(); + Set declaredUsingPreviewFeature = new HashSet<>(); for (TypeElement type : elements) { - result.add(getPreviewAPIType(type)); + if (!isIncluded(type)) { + continue; + } + switch (getPreviewAPIType(type)) { + case PREVIEW -> previewAPI.add(type); + case REFLECTIVE -> reflectivePreviewAPI.add(type); + case DECLARED_USING_PREVIEW -> declaredUsingPreviewFeature.add(type); + } } - result.remove(PreviewAPIType.STANDARD); + return new PreviewSummary(previewAPI, reflectivePreviewAPI, declaredUsingPreviewFeature); + } - return result; + @SuppressWarnings("preview") + public PreviewSummary declaredUsingPreviewAPIs(Element el) { + List usedInDeclaration = new ArrayList<>(); + switch (el.getKind()) { + case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> { + //TODO: annotations + TypeElement te = (TypeElement) el; + for (TypeParameterElement tpe : te.getTypeParameters()) { + usedInDeclaration.addAll(types2Classes(tpe.getBounds())); + } + usedInDeclaration.addAll(types2Classes(List.of(te.getSuperclass()))); + usedInDeclaration.addAll(types2Classes(te.getInterfaces())); + usedInDeclaration.addAll(types2Classes(te.getPermittedSubclasses())); + usedInDeclaration.addAll(types2Classes(te.getRecordComponents().stream().map(c -> c.asType()).collect(Collectors.toList()))); //TODO: annotations on record components??? + } + case CONSTRUCTOR, METHOD -> { + //TODO: annotations + ExecutableElement ee = (ExecutableElement) el; + for (TypeParameterElement tpe : ee.getTypeParameters()) { + usedInDeclaration.addAll(types2Classes(tpe.getBounds())); + } + usedInDeclaration.addAll(types2Classes(List.of(ee.getReturnType()))); + usedInDeclaration.addAll(types2Classes(List.of(ee.getReceiverType()))); + usedInDeclaration.addAll(types2Classes(ee.getThrownTypes())); + usedInDeclaration.addAll(types2Classes(ee.getParameters().stream().map(p -> p.asType()).collect(Collectors.toList()))); + } + case FIELD, ENUM_CONSTANT, RECORD_COMPONENT -> { + //TODO: annotations + VariableElement ve = (VariableElement) el; + usedInDeclaration.addAll(types2Classes(List.of(ve.asType()))); + } + default -> throw new IllegalStateException("Unexpected: " + el.getKind()); + } + PreviewSummary previewAPITypes = getPreviewAPITypes(usedInDeclaration); + return previewAPITypes; + } + + public static final class PreviewSummary { + public final Set previewAPI; + public final Set reflectivePreviewAPI; + public final Set declaredUsingPreviewFeature; + + public PreviewSummary(Set previewAPI, Set reflectivePreviewAPI, Set declaredUsingPreviewFeature) { + this.previewAPI = previewAPI; + this.reflectivePreviewAPI = reflectivePreviewAPI; + this.declaredUsingPreviewFeature = declaredUsingPreviewFeature; + } + } public PreviewAPIType getPreviewAPIType(TypeElement el) { @@ -3060,8 +3060,9 @@ public enum PreviewAPIType { public Set elementFlags(Element el) { Set flags = EnumSet.noneOf(ElementFlag.class); + PreviewSummary previewAPIs = declaredUsingPreviewAPIs(el); - if (isDeclaredUsingPreview(el) || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD) { + if (isDeclaredUsingPreview(el) || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD || !previewAPIs.previewAPI.isEmpty() || !previewAPIs.reflectivePreviewAPI.isEmpty() || !previewAPIs.declaredUsingPreviewFeature.isEmpty()) { flags.add(ElementFlag.PREVIEW); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java index 9ba1826357099..51c1eab3ff316 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java @@ -1280,7 +1280,7 @@ private ElementKind getAllowedKind(ElementKind kind) { switch (kind) { case CLASS: case METHOD: case MODULE: case PACKAGE: return kind; - case RECORD: case ANNOTATION_TYPE: case ENUM: case INTERFACE: + case RECORD: case ANNOTATION_TYPE: case ENUM: case INTERFACE: /*???*/case RECORD_COMPONENT: return ElementKind.CLASS; case CONSTRUCTOR: case ENUM_CONSTANT: case EXCEPTION_PARAMETER: case FIELD: case INSTANCE_INIT: case LOCAL_VARIABLE: case PARAMETER: From df6db2e003ccd8aca89704c743b40c3a6e600aa4 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 10 Sep 2020 15:20:08 +0200 Subject: [PATCH 05/42] More experiments on Preview stuff in javadoc. --- .../doclets/formats/html/ClassWriterImpl.java | 99 ++++++++++++------- .../formats/html/HtmlDocletWriter.java | 2 - .../doclets/formats/html/LinkFactoryImpl.java | 3 +- .../doclets/formats/html/LinkInfoImpl.java | 2 +- .../formats/html/markup/HtmlStyle.java | 5 +- .../html/resources/standard.properties | 26 ++--- .../doclets/toolkit/resources/stylesheet.css | 16 +-- .../internal/doclets/toolkit/util/Utils.java | 27 +++-- 8 files changed, 95 insertions(+), 85 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 7641e34f0b881..e7e9ec4f91a30 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -44,8 +44,11 @@ import com.sun.source.doctree.DocTree; import com.sun.tools.doclint.HtmlTag; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.function.Function; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; import javax.lang.model.element.ElementKind; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -208,7 +211,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (sep != null) { pre.add(sep); } - if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart) || "permits".equals(modifiersPart)) { + if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { pre.add(modifiersPart); pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", new ContentBuilder().add("PREVIEW")))); pre.add(" "); @@ -282,7 +285,9 @@ public void addClassSignature(String modifiers, Content classInfoTree) { TypeElement tDoc = utils.asTypeElement(type); if (isFirst) { pre.add(DocletConstants.NL); - pre.add("permits "); + pre.add("permits"); + pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", new ContentBuilder().add("PREVIEW")))); + pre.add(" "); isFirst = false; } else { pre.add(", "); @@ -331,11 +336,13 @@ public void addClassDescription(Content classInfoTree) { } List previewNotes = getPreviewNotes(typeElement); if (!previewNotes.isEmpty()) { - classInfoTree.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.HEADING(TagName.H3, new ContentBuilder().add("Preview")))); - HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewReferenceNote); + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new HtmlTree(TagName.STRONG).add(new ContentBuilder().add(resources.getText("doclet.PreviewLeadingNote"))))); for (Content note : previewNotes) { - previewDiv.add(HtmlTree.DIV(note)); + previewDiv.add(HtmlTree.P(note)); } + previewDiv.add(HtmlTree.P(new ContentBuilder().add(resources.getText("doclet.PreviewTrailingNote1")))); + previewDiv.add(HtmlTree.P(new ContentBuilder().add(resources.getText("doclet.PreviewTrailingNote2")))); classInfoTree.add(previewDiv); } } @@ -347,45 +354,44 @@ public List getPreviewNotes(TypeElement el) { Set memberPreviewAPI = new HashSet<>(); Set memberReflectivePreviewAPI = new HashSet<>(); Set memberDeclaredUsingPreviewFeature = new HashSet<>(); - boolean memberIsDeclaredUsingPreviewFeature = false; + Set memberPreviewLanguageFeatures = new HashSet<>(); for (Element enclosed : el.getEnclosedElements()) { if (!utils.isIncluded(enclosed)) { continue; } - PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); - memberPreviewAPI.addAll(memberAPITypes.previewAPI); - memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); - memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); - memberIsDeclaredUsingPreviewFeature |= utils.isDeclaredUsingPreview(enclosed); - } - if (utils.isDeclaredUsingPreview(el)) { - result.add(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview.type"))); - } - if (memberIsDeclaredUsingPreviewFeature) { - result.add(new ContentBuilder().add(resources.getText("doclet.Declared_Using_Preview.member"))); - } - if (!previewAPITypes.previewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI.type", previewAPITypes.previewAPI)); - } - if (!memberPreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI.member", memberPreviewAPI)); + if (!enclosed.getKind().isClass() && !enclosed.getKind().isInterface()) { + PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); + memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); + memberPreviewAPI.addAll(memberAPITypes.previewAPI); + memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); + memberPreviewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(enclosed)); + } else if (!utils.previewLanguageFeaturesUsed(enclosed).isEmpty()) { + memberDeclaredUsingPreviewFeature.add((TypeElement) enclosed); + } } - if (!previewAPITypes.reflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI.type", previewAPITypes.reflectivePreviewAPI)); + Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); + if (!previewLanguageFeatures.isEmpty() || !memberPreviewLanguageFeatures.isEmpty()) { + result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", previewLanguageFeatures, memberPreviewLanguageFeatures)); } - if (!memberReflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI.member", memberReflectivePreviewAPI)); + if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty() || !memberDeclaredUsingPreviewFeature.isEmpty()) { + result.add(injectLinks("doclet.UsesDeclaredUsingPreview", previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); } - if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview.type", previewAPITypes.declaredUsingPreviewFeature)); + System.err.println("el=" + el + "/" + previewAPITypes.previewAPI); + if (!previewAPITypes.previewAPI.isEmpty() || !memberPreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.PreviewAPI", previewAPITypes.previewAPI, memberPreviewAPI)); } - if (!memberDeclaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview.member", memberDeclaredUsingPreviewFeature)); + if (!previewAPITypes.reflectivePreviewAPI.isEmpty() || !memberReflectivePreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.ReflectivePreviewAPI", previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); } return result; } - private Content injectLinks(String key, Set elements) { + private Content injectPreviewFeatures(String key, Set features1, Set features2) { + Set features = new HashSet<>(); + features.addAll(features1); + features.addAll(features2); + List expectedOrder = new ArrayList<>(List.of("record", "sealed", "permits")); + expectedOrder.retainAll(features); ContentBuilder result = new ContentBuilder(); String template = resources.getText(key); int injectPoint = template.indexOf("{0}"); @@ -395,18 +401,39 @@ private Content injectLinks(String key, Set elements) { } result.add(template.substring(0, injectPoint)); String[] sep = new String[] {""}; - elements.stream() - .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te))) + expectedOrder.stream() .forEach(c -> { result.add(sep[0]); - result.add(c); + result.add(HtmlTree.CODE(new ContentBuilder().add(c))); sep[0] = ", "; }); result.add(template.substring(injectPoint + 3)); return result; } + private Content injectLinks(String key, Set elements1, Set elements2) { + ContentBuilder result = new ContentBuilder(); + String template = resources.getText(key); + int injectPoint = template.indexOf("{0}"); + if (injectPoint == (-1)) { + result.add(template); + return result; + } + result.add(template.substring(0, injectPoint)); + String[] sep = new String[] {""}; + Stream.concat(elements1.stream(), elements2.stream()) + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .distinct() + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te))) + .forEach(c -> { + result.add(sep[0]); + result.add(c); + sep[0] = ", "; + }); + result.add(template.substring(injectPoint + 3)); + return result; + } + @Override public void addClassTagInfo(Content classInfoTree) { if (!options.noComment()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index d66748b03c79f..9c37719498bc0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -928,7 +928,6 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(getAnchor(ee, isProperty))) - .whereMember(element) .strong(strong)); } @@ -936,7 +935,6 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(element.getSimpleName().toString())) - .whereMember(element) .strong(strong)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index a0ea44a616154..b86f689ea3108 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -98,10 +98,9 @@ protected Content getClassLink(LinkInfo linkInfo) { Set flags; if (!hasWhere) { flags = utils.elementFlags(typeElement); - } else if (classLinkInfo.whereMember != null) { + } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null) { flags = utils.elementFlags(classLinkInfo.whereMember); } else { - //TODO: no information? flags = EnumSet.noneOf(ElementFlag.class); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 52995f84bb464..0f1fcac1c05fe 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -342,7 +342,7 @@ public LinkInfoImpl varargs(boolean varargs) { public LinkInfoImpl where(String where) { this.where = where; return this; - } + } public LinkInfoImpl whereMember(Element el) { this.whereMember = el; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index efc636187341c..e3c59a624b682 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -78,10 +78,7 @@ public enum HtmlStyle { packageHierarchyLabel, packageUses, permitsNote, - previewBlock, - previewLabel, - previewReference, - previewReferenceNote, + previewNote, searchTagLink, searchTagResult, serializedPackageContainer, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 49ed670389c9c..79fe2a955b95e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -266,25 +266,13 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} -#doclet.Declared_Using_Preview=XXX -#doclet.PreviewAPI=XXX -#doclet.ReflectivePreviewAPI=XXX -doclet.Declared_Using_Preview.type=This class is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.Declared_Using_Preview.member=This class contains members declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.PreviewAPI.type=The declaration of this class uses the following preview API(s): {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.PreviewAPI.member=The declaration of member(s) of this class uses the following preview API(s): {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.ReflectivePreviewAPI.type=The declaration of this class uses the following reflective preview API(s): {0}. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.ReflectivePreviewAPI.member=The declaration of member(s) of this class uses the following reflective preview API(s): {0}. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.UsesDeclaredUsingPreview.type=The declaration of this class uses the following type(s) declared using a preview feature of the Java language: {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.UsesDeclaredUsingPreview.member=The declaration of member(s) of this class uses the following type(s) declared using a preview feature of the Java language: {0}. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.Declared_Using_Preview.method=This method is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.PreviewAPI.method=The declaration of this method uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.ReflectivePreviewAPI.method=The declaration of this method uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.UsesDeclaredUsingPreview.method=The declaration of this method uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.Declared_Using_Preview.field=This field is declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.PreviewAPI.field=The declaration of this field uses a preview API. Programs can only use this method when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.ReflectivePreviewAPI.field=The declaration of this field uses a reflective preview API. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -#doclet.UsesDeclaredUsingPreview.field=The declaration of this field uses a type declared using a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.PreviewLeadingNote=This class relies on preview features. +doclet.Declared_Using_Preview=This class is declared using a preview feature of the Java language: {0}. +doclet.PreviewAPI=This class refers to one or more preview APIs: {0}. +doclet.ReflectivePreviewAPI=This class refers to one or more reflective preview APIs: {0}. +doclet.UsesDeclaredUsingPreview=This class refers to one or more types which are declared using a preview feature of the Java language: {0}. +doclet.PreviewTrailingNote1=Programs can only use this class when preview features are enabled. +doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index b49382df14c20..c78f46dbacfb7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -559,23 +559,9 @@ h1.hidden { .package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { font-weight:bold; } -.preview-label {} -.preview-reference-note { +.preview-note { border: 1px solid red; border-radius: 5px; padding: 5px; display:inline-block; font-size: larger } -.preview-reference { -/* border-style:solid; - border-width:thin; - border-radius:4px; - border-color:red; - padding-left: 4px; - padding-right: 4px; - background-color: #fdd;*/ -} -/*.preview-reference:after { - content: "PREVIEW"; - vertical-align: super; -}*/ .deprecation-comment, .help-footnote, .interface-name { font-style:italic; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 7d3224d39a970..21ceb9a543b89 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -2969,9 +2969,24 @@ public String toString() { * @return true if the given Element is deprecated. */ @SuppressWarnings("preview") - public boolean isDeclaredUsingPreview(Element e) { - return e.getKind() == ElementKind.RECORD || - e.getModifiers().contains(Modifier.SEALED); + public Set previewLanguageFeaturesUsed(Element e) { + Set result = new HashSet<>(); + + if (e.getKind() == ElementKind.RECORD) { + result.add("record"); + } + + if (e.getModifiers().contains(Modifier.SEALED)) { + result.add("sealed"); + List permits = ((TypeElement) e).getPermittedSubclasses(); + boolean hasLinkablePermits = permits.stream() + .anyMatch(t -> isLinkable(asTypeElement(t))); + if (hasLinkablePermits) { + result.add("permits"); + } + } + + return result; } public PreviewSummary getPreviewAPITypes(Iterable elements) { //TODO: private/merge into declaredUsingPreviewAPIs? @@ -2980,7 +2995,7 @@ public PreviewSummary getPreviewAPITypes(Iterable elements) { //TOD Set declaredUsingPreviewFeature = new HashSet<>(); for (TypeElement type : elements) { - if (!isIncluded(type)) { + if (!isIncluded(type) && !configuration.extern.isExternal(type)) { continue; } switch (getPreviewAPIType(type)) { @@ -3045,7 +3060,7 @@ public PreviewSummary(Set previewAPI, Set reflectivePr public PreviewAPIType getPreviewAPIType(TypeElement el) { //TODO: PREVIEW+DECLARED_USING_PREVIEW? - if (isDeclaredUsingPreview(el)) { + if (!previewLanguageFeaturesUsed(el).isEmpty()) { return PreviewAPIType.DECLARED_USING_PREVIEW; } return configuration.workArounds.getPreviewAPIType(el); @@ -3062,7 +3077,7 @@ public Set elementFlags(Element el) { Set flags = EnumSet.noneOf(ElementFlag.class); PreviewSummary previewAPIs = declaredUsingPreviewAPIs(el); - if (isDeclaredUsingPreview(el) || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD || !previewAPIs.previewAPI.isEmpty() || !previewAPIs.reflectivePreviewAPI.isEmpty() || !previewAPIs.declaredUsingPreviewFeature.isEmpty()) { + if (!previewLanguageFeaturesUsed(el).isEmpty() || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD || !previewAPIs.previewAPI.isEmpty() || !previewAPIs.reflectivePreviewAPI.isEmpty() || !previewAPIs.declaredUsingPreviewFeature.isEmpty()) { flags.add(ElementFlag.PREVIEW); } From d27c4dcbff3c29330adff93c5187754716faf27d Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 15 Sep 2020 09:34:16 +0200 Subject: [PATCH 06/42] More updates to the javadoc Preview UI. --- make/Docs.gmk | 1 - .../share/classes/java/lang/Class.java | 28 ---- .../share/classes/java/lang/Record.java | 8 - .../java/lang/annotation/ElementType.java | 8 - .../java/lang/reflect/RecordComponent.java | 7 - .../java/lang/runtime/ObjectMethods.java | 7 - .../jdk/internal/loader/URLClassPath.java | 2 + .../reflect/annotation/TypeAnnotation.java | 6 - .../javax/lang/model/element/ElementKind.java | 23 --- .../lang/model/element/ElementVisitor.java | 7 - .../javax/lang/model/element/Modifier.java | 14 -- .../model/element/RecordComponentElement.java | 7 - .../javax/lang/model/element/TypeElement.java | 13 -- .../model/util/AbstractElementVisitor14.java | 7 - .../javax/lang/model/util/ElementFilter.java | 14 -- .../lang/model/util/ElementKindVisitor14.java | 7 - .../lang/model/util/ElementKindVisitor6.java | 7 - .../lang/model/util/ElementScanner14.java | 7 - .../javax/lang/model/util/Elements.java | 7 - .../model/util/SimpleElementVisitor14.java | 7 - .../sun/source/tree/BindingPatternTree.java | 10 +- .../com/sun/source/tree/ClassTree.java | 7 - .../com/sun/source/tree/InstanceOfTree.java | 10 +- .../com/sun/source/tree/PatternTree.java | 10 +- .../classes/com/sun/source/tree/Tree.java | 17 +- .../com/sun/source/tree/TreeVisitor.java | 10 +- .../com/sun/tools/javac/file/FSInfo.java | 4 +- .../formats/html/AbstractMemberWriter.java | 56 +++++++ .../doclets/formats/html/ClassWriterImpl.java | 157 ++++++++++++------ .../doclets/formats/html/Contents.java | 2 + .../formats/html/HtmlDocletWriter.java | 8 +- .../doclets/formats/html/LinkFactoryImpl.java | 33 ++-- .../doclets/formats/html/LinkInfoImpl.java | 6 + .../formats/html/PackageWriterImpl.java | 16 ++ .../formats/html/markup/HtmlStyle.java | 1 + .../html/resources/standard.properties | 17 +- .../AnnotationTypeRequiredMemberBuilder.java | 2 + .../toolkit/builders/ConstructorBuilder.java | 3 + .../toolkit/builders/EnumConstantBuilder.java | 2 + .../toolkit/builders/FieldBuilder.java | 2 + .../toolkit/builders/MethodBuilder.java | 2 + .../toolkit/resources/doclets.properties | 1 + .../doclets/toolkit/resources/stylesheet.css | 39 ++++- .../internal/doclets/toolkit/util/Utils.java | 45 ++++- .../share/classes/jdk/jshell/Snippet.java | 7 - 45 files changed, 318 insertions(+), 336 deletions(-) diff --git a/make/Docs.gmk b/make/Docs.gmk index 19e962b79afd0..9b63607346eb7 100644 --- a/make/Docs.gmk +++ b/make/Docs.gmk @@ -92,7 +92,6 @@ JAVADOC_TAGS := \ -tag see \ -taglet build.tools.taglet.ExtLink \ -taglet build.tools.taglet.Incubating \ - -taglet build.tools.taglet.Preview \ -tagletpath $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ $(CUSTOM_JAVADOC_TAGS) \ # diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 6e0fd78180aa8..9392d13ea7b3d 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -2342,13 +2342,6 @@ public Field[] getDeclaredFields() throws SecurityException { } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns an array of {@code RecordComponent} objects representing all the * record components of this record class, or {@code null} if this class is * not a record class. @@ -3688,13 +3681,6 @@ private static Class javaLangRecordClass() { } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns {@code true} if and only if this class is a record class. * *

The {@linkplain #getSuperclass() direct superclass} of a record @@ -4385,13 +4371,6 @@ public Optional describeConstable() { public native boolean isHidden(); /** - * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This method is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns an array containing {@code ClassDesc} objects representing all the * direct subclasses or direct implementation classes permitted to extend or * implement this class or interface if it is sealed. The order of such elements @@ -4424,13 +4403,6 @@ public ClassDesc[] permittedSubclasses() { } /** - * * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This method is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns {@code true} if and only if this {@code Class} object represents a sealed class or interface. * If this {@code Class} object represents a primitive type, {@code void}, or an array type, this method returns * {@code false}. diff --git a/src/java.base/share/classes/java/lang/Record.java b/src/java.base/share/classes/java/lang/Record.java index a9b095564643b..8f1d7cc096fd2 100644 --- a/src/java.base/share/classes/java/lang/Record.java +++ b/src/java.base/share/classes/java/lang/Record.java @@ -25,14 +25,6 @@ package java.lang; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Programs can only use this - * class when preview features are enabled. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * This is the common base class of all Java language record classes. * *

More information about records, including descriptions of the diff --git a/src/java.base/share/classes/java/lang/annotation/ElementType.java b/src/java.base/share/classes/java/lang/annotation/ElementType.java index a10bafc0f4130..28791a6549d90 100644 --- a/src/java.base/share/classes/java/lang/annotation/ElementType.java +++ b/src/java.base/share/classes/java/lang/annotation/ElementType.java @@ -118,14 +118,6 @@ public enum ElementType { MODULE, /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This constant is associated with records, a preview - * feature of the Java language. Programs can only use this - * constant when preview features are enabled. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Record component * * @jls 8.10.3 Record Members diff --git a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java index 2d842ff4cd3f8..6c3d13992486e 100644 --- a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java +++ b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java @@ -38,13 +38,6 @@ import java.util.Objects; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A {@code RecordComponent} provides information about, and dynamic access to, a * component of a record class. * diff --git a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java index 5edd6d19b6d0a..ab7fa3704c220 100644 --- a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java +++ b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java @@ -38,13 +38,6 @@ import java.util.Objects; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Bootstrap methods for state-driven implementations of core methods, * including {@link Object#equals(Object)}, {@link Object#hashCode()}, and * {@link Object#toString()}. These methods may be used, for example, by diff --git a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java index 4640b5b3a7dcf..fce4970139487 100644 --- a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java +++ b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java @@ -452,6 +452,7 @@ private synchronized Loader getLoader(int index) { push(urls); } } catch (IOException e) { + e.printStackTrace(); // Silently ignore for now... continue; } catch (SecurityException se) { @@ -1061,6 +1062,7 @@ public JarLoader run() throws IOException { */ @Override URL[] getClassPath() throws IOException { + Thread.dumpStack(); if (index != null) { return null; } diff --git a/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java b/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java index 334490823ad61..38bec88d2c432 100644 --- a/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java +++ b/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java @@ -92,12 +92,6 @@ public static enum TypeAnnotationTarget { METHOD_FORMAL_PARAMETER, THROWS, /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This enum constant is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} * @since 14 */ @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS, diff --git a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java index fb73cd3398540..651f2b12437d5 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java @@ -110,13 +110,6 @@ public enum ElementKind { MODULE, /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This enum constant is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A record type. * @since 14 */ @@ -125,13 +118,6 @@ public enum ElementKind { RECORD, /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This enum constant is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A record component of a {@code record}. * @since 14 */ @@ -140,15 +126,6 @@ public enum ElementKind { RECORD_COMPONENT, /** - * {@preview Associated with pattern matching for {@code - * instanceof}, a preview feature of the Java language. - * - * This enum constant is associated with pattern - * matching for {@code instanceof}, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A binding variable in a pattern . * @since 14 */ diff --git a/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java b/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java index 04b38d79ed143..41c5095520082 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/ElementVisitor.java @@ -212,13 +212,6 @@ default R visitModule(ModuleElement e, P p) { } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Visits a record component element. * * @implSpec The default implementation visits a {@code diff --git a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java index 628c20bb127fa..0ec28283e0a75 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java @@ -66,13 +66,6 @@ public enum Modifier { /** The modifier {@code static} */ STATIC, /** - * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This enum constant is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * The modifier {@code sealed} * @since 15 */ @@ -81,13 +74,6 @@ public enum Modifier { SEALED, /** - * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This enum constant is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * The modifier {@code non-sealed} * @since 15 */ diff --git a/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java b/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java index 44b265a6153b5..e4770730368e0 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/RecordComponentElement.java @@ -26,13 +26,6 @@ package javax.lang.model.element; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Represents a record component. * * @since 14 diff --git a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java index dd21e63a44b79..55241d0d26049 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java @@ -180,13 +180,6 @@ public interface TypeElement extends Element, Parameterizable, QualifiedNameable List getTypeParameters(); /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns the record components of this type element in * declaration order. * @@ -206,12 +199,6 @@ default List getRecordComponents() { } /** - * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This method is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} * Returns the permitted classes of this type element in * declaration order. * diff --git a/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java index 2ae7c9c75f1f9..16c9ac25d5e4a 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor14.java @@ -31,13 +31,6 @@ import static javax.lang.model.SourceVersion.*; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A skeletal visitor of program elements with default behavior * appropriate for the {@link SourceVersion#RELEASE_14 RELEASE_14} * source version. diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java index ab77143184679..d26a8c34e3a76 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementFilter.java @@ -112,13 +112,6 @@ private ElementFilter() {} // Do not instantiate. } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns a list of record components in {@code elements}. * @return a list of record components in {@code elements} * @param elements the elements to filter @@ -133,13 +126,6 @@ private ElementFilter() {} // Do not instantiate. } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns a set of record components in {@code elements}. * @return a set of record components in {@code elements} * @param elements the elements to filter diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java index 55c779055e805..51c3f4e055e4a 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java @@ -31,13 +31,6 @@ import javax.lang.model.SourceVersion; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A visitor of program elements based on their {@linkplain * ElementKind kind} with default behavior appropriate for the {@link * SourceVersion#RELEASE_14 RELEASE_14} source version. diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java index 0e3c4f0aa3fb2..456255fa218ca 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java @@ -217,13 +217,6 @@ public R visitTypeAsInterface(TypeElement e, P p) { } /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Visits a {@code RECORD} type element. * * @implSpec This implementation calls {@code visitUnknown}. diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java index ef0544db4afde..9edecb9569e0d 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner14.java @@ -33,13 +33,6 @@ import static javax.lang.model.SourceVersion.*; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A scanning visitor of program elements with default behavior * appropriate for the {@link SourceVersion#RELEASE_14 RELEASE_14} * source version. diff --git a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java index 5702d1df8c559..1fa38ab4f0492 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java @@ -634,13 +634,6 @@ boolean overrides(ExecutableElement overrider, ExecutableElement overridden, boolean isFunctionalInterface(TypeElement type); /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This method is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns the record component for the given accessor. Returns null if the * given method is not a record component accessor. * diff --git a/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java index deefa07c7d607..748037991056a 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor14.java @@ -31,13 +31,6 @@ import static javax.lang.model.SourceVersion.*; /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This class is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A simple visitor of program elements with default behavior * appropriate for the {@link SourceVersion#RELEASE_14 RELEASE_14} * source version. diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java index bdd4fb5673d77..e0b7984a1be55 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java @@ -28,18 +28,12 @@ import javax.lang.model.element.Name; /** - * {@preview Associated with pattern matching for instanceof, a preview feature of - * the Java language. - * - * This interface is associated with pattern matching for instanceof, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A binding pattern tree * * @since 14 */ +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) public interface BindingPatternTree extends PatternTree { /** diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java index b0672b9af2e2b..2a0930543ff91 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java @@ -87,13 +87,6 @@ public interface ClassTree extends StatementTree { List getImplementsClause(); /** - * {@preview Associated with sealed classes, a preview feature of the Java language. - * - * This method is associated with sealed classes, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns the subclasses permitted by this type declaration. * * @implSpec this implementation returns an empty list diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java index 1d501c5678bc8..9a07eb54e3e38 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java @@ -53,14 +53,6 @@ public interface InstanceOfTree extends ExpressionTree { Tree getType(); /** - * {@preview Associated with pattern matching for instanceof, a preview feature of - * the Java language. - * - * This method is associated with pattern matching for instanceof, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Returns the tested pattern, or null if this instanceof does not use * a pattern. * @@ -79,5 +71,7 @@ public interface InstanceOfTree extends ExpressionTree { * @return the tested pattern, or null if this instanceof does not use a pattern * @since 14 */ + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) PatternTree getPattern(); } diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java index 70ad395cd4513..974e21fd4980f 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java @@ -26,17 +26,11 @@ package com.sun.source.tree; /** - * {@preview Associated with pattern matching for instanceof, a preview feature of - * the Java language. - * - * This interface is associated with pattern matching for instanceof, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A tree node used as the base class for the different kinds of * statements. * * @since 14 */ +@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) public interface PatternTree extends Tree {} diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java index 67d8638ed3cb9..a1f4f924960f1 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java @@ -220,18 +220,12 @@ public enum Kind { PARENTHESIZED(ParenthesizedTree.class), /** - * {@preview Associated with pattern matching for instanceof, a preview feature of - * the Java language. - * - * This enum constant is associated with pattern matching for instanceof, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Used for instances of {@link BindingPatternTree}. * * @since 14 */ + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) BINDING_PATTERN(BindingPatternTree.class), /** @@ -649,13 +643,6 @@ public enum Kind { PROVIDES(ProvidesTree.class), /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This enum constant is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Used for instances of {@link ClassTree} representing records. * * @since 14 diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java b/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java index 1fb0b0a6aaeac..0a0ada169428a 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java @@ -258,20 +258,14 @@ public interface TreeVisitor { R visitLiteral(LiteralTree node, P p); /** - * {@preview Associated with pattern matching for instanceof, a preview feature of - * the Java language. - * - * This method is associated with pattern matching for instanceof, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * Visits an BindingPattern node. * @param node the node being visited * @param p a parameter value * @return a result value * @since 14 */ + @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, + reflective=true) R visitBindingPattern(BindingPatternTree node, P p); /** diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java index ab0d3d8e3fd32..6c620f4268bf0 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java @@ -119,8 +119,8 @@ public List getJarClassPath(Path file) throws IOException { if (url != null) { list.add(Path.of(url.toURI())); } - } catch (URISyntaxException ex) { - throw new IOException(ex); + } catch (URISyntaxException | MalformedURLException ex) { + //ignored per the jar file specification } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 3481d77083ef1..cdda44687c491 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -39,6 +39,9 @@ import javax.lang.model.type.TypeMirror; import com.sun.source.doctree.DocTree; +import java.util.function.BiConsumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -63,7 +66,9 @@ import static javax.lang.model.element.Modifier.STRICTFP; import static javax.lang.model.element.Modifier.SYNCHRONIZED; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.toolkit.Content; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * The base class for member writers. @@ -297,6 +302,46 @@ protected void addComment(Element member, Content htmltree) { } } + public void addPreviewInfo(Element member, Content contentTree) { + PreviewAPIType previewAPIType = utils.getPreviewAPIType(member); + if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { + //in Java platform: + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); + DocTree previewTree = utils.getPreviewTree(member); + if (previewTree != null) { + //TODO: tags/html inside + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); + } else { + String simpleName = member.getSimpleName().toString(); + String fullName = typeElement.getSimpleName() + "." + member.getSimpleName(); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(simpleName))))))); + if (previewAPIType == PreviewAPIType.PREVIEW) { + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + } + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + } + contentTree.add(previewDiv); + } + } + private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); + + private Content replaceParams(String template, BiConsumer fillParams) { + ContentBuilder result = new ContentBuilder(); + int lastEnd = 0; + Matcher m = PARAMETER.matcher(template); + + while (m.find()) { + result.add(template.substring(lastEnd, m.start())); + lastEnd = m.start(); + fillParams.accept(m.group(1), result); + lastEnd = m.end(); + } + + result.add(template.substring(lastEnd)); + + return result; + } + protected String name(Element member) { return utils.getSimpleName(member); } @@ -396,6 +441,17 @@ public void addMemberSummary(TypeElement tElement, Element member, addSummaryLink(tElement, member, summaryLink); rowContents.add(summaryLink); Content desc = new ContentBuilder(); + PreviewAPIType parentPreviewAPIType = utils.getPreviewAPIType(tElement); + PreviewAPIType previewAPIType = utils.getPreviewAPIType(member); + if (parentPreviewAPIType == PreviewAPIType.STANDARD && + (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE)) { + DocTree previewTree = utils.getPreviewTree(member); + if (previewTree != null) { + desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); + } else { + desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); + } + } writer.addSummaryLinkComment(this, member, firstSentenceTags, desc); rowContents.add(desc); table.addRow(member, rowContents); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index e7e9ec4f91a30..3308c1cf56192 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -46,7 +46,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Stream; import java.util.stream.StreamSupport; import javax.lang.model.element.ElementKind; @@ -57,6 +60,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.ClassWriter; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -66,6 +70,10 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; +import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.DeclarationPreviewLanguageFeatures; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.Pair; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; /** @@ -334,27 +342,48 @@ public void addClassDescription(Content classInfoTree) { addInlineComment(typeElement, classInfoTree); } } - List previewNotes = getPreviewNotes(typeElement); - if (!previewNotes.isEmpty()) { + PreviewAPIType previewAPIType = utils.getPreviewAPIType(typeElement); + if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { + //in Java platform: HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new HtmlTree(TagName.STRONG).add(new ContentBuilder().add(resources.getText("doclet.PreviewLeadingNote"))))); - for (Content note : previewNotes) { - previewDiv.add(HtmlTree.P(note)); + DocTree previewTree = utils.getPreviewTree(typeElement); + if (previewTree != null) { + //TODO: tags/html inside + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); + } else { + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName()))))))); + if (previewAPIType == PreviewAPIType.PREVIEW) { + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); + } + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); } - previewDiv.add(HtmlTree.P(new ContentBuilder().add(resources.getText("doclet.PreviewTrailingNote1")))); - previewDiv.add(HtmlTree.P(new ContentBuilder().add(resources.getText("doclet.PreviewTrailingNote2")))); classInfoTree.add(previewDiv); + } else { + List previewNotes = getPreviewNotes(typeElement); + if (!previewNotes.isEmpty()) { + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName()))))))); + HtmlTree ul = new HtmlTree(TagName.UL); + for (Content note : previewNotes) { + ul.add(HtmlTree.LI(note)); + } + previewDiv.add(ul); + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); + previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); + classInfoTree.add(previewDiv); + } } } @SuppressWarnings("preview") public List getPreviewNotes(TypeElement el) { + String className = el.getSimpleName().toString(); List result = new ArrayList<>(); PreviewSummary previewAPITypes = utils.declaredUsingPreviewAPIs(el); Set memberPreviewAPI = new HashSet<>(); Set memberReflectivePreviewAPI = new HashSet<>(); Set memberDeclaredUsingPreviewFeature = new HashSet<>(); - Set memberPreviewLanguageFeatures = new HashSet<>(); + Set memberPreviewLanguageFeatures = new HashSet<>(); for (Element enclosed : el.getEnclosedElements()) { if (!utils.isIncluded(enclosed)) { continue; @@ -369,68 +398,86 @@ public List getPreviewNotes(TypeElement el) { memberDeclaredUsingPreviewFeature.add((TypeElement) enclosed); } } - Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); + Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); if (!previewLanguageFeatures.isEmpty() || !memberPreviewLanguageFeatures.isEmpty()) { - result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", previewLanguageFeatures, memberPreviewLanguageFeatures)); + Set features = new HashSet<>(); + features.addAll(previewLanguageFeatures); + features.addAll(memberPreviewLanguageFeatures); + if (features.contains(DeclarationPreviewLanguageFeatures.SEALED_PERMITS)) { + features.remove(DeclarationPreviewLanguageFeatures.SEALED); + } + for (DeclarationPreviewLanguageFeatures feature : features) { + result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", className, resources.getText("doclet.Declared_Using_Preview." + feature.name()), feature.features)); + } } if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty() || !memberDeclaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview", previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); + result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); } - System.err.println("el=" + el + "/" + previewAPITypes.previewAPI); if (!previewAPITypes.previewAPI.isEmpty() || !memberPreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI", previewAPITypes.previewAPI, memberPreviewAPI)); + result.add(injectLinks("doclet.PreviewAPI", className, previewAPITypes.previewAPI, memberPreviewAPI)); } if (!previewAPITypes.reflectivePreviewAPI.isEmpty() || !memberReflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI", previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); + result.add(injectLinks("doclet.ReflectivePreviewAPI", className, previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); } return result; } - private Content injectPreviewFeatures(String key, Set features1, Set features2) { - Set features = new HashSet<>(); - features.addAll(features1); - features.addAll(features2); - List expectedOrder = new ArrayList<>(List.of("record", "sealed", "permits")); - expectedOrder.retainAll(features); - ContentBuilder result = new ContentBuilder(); + private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); + + private Content injectPreviewFeatures(String key, String className, String featureName, List features) { String template = resources.getText(key); - int injectPoint = template.indexOf("{0}"); - if (injectPoint == (-1)) { - result.add(template); - return result; - } - result.add(template.substring(0, injectPoint)); - String[] sep = new String[] {""}; - expectedOrder.stream() - .forEach(c -> { - result.add(sep[0]); - result.add(HtmlTree.CODE(new ContentBuilder().add(c))); - sep[0] = ", "; - }); - result.add(template.substring(injectPoint + 3)); - return result; + return replaceParams(template, (param, result) -> { + switch (param) { + case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); + case "1" -> result.add(new HtmlTree(TagName.EM).add(featureName)); + case "2" -> { + String[] sep = new String[] {""}; + features.stream() + .forEach(c -> { + result.add(sep[0]); + result.add(HtmlTree.CODE(new ContentBuilder().add(c))); + sep[0] = ", "; + }); + } + } + }); } - private Content injectLinks(String key, Set elements1, Set elements2) { - ContentBuilder result = new ContentBuilder(); + private Content injectLinks(String key, String className, Set elements1, Set elements2) { String template = resources.getText(key); - int injectPoint = template.indexOf("{0}"); - if (injectPoint == (-1)) { - result.add(template); - return result; - } - result.add(template.substring(0, injectPoint)); - String[] sep = new String[] {""}; - Stream.concat(elements1.stream(), elements2.stream()) - .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) - .distinct() - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te))) - .forEach(c -> { - result.add(sep[0]); - result.add(c); - sep[0] = ", "; - }); - result.add(template.substring(injectPoint + 3)); + return replaceParams(template, (param, result) -> { + switch (param) { + case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); + case "1" -> { + String[] sep = new String[] {""}; + Stream.concat(elements1.stream(), elements2.stream()) + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .distinct() + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).skipPreview(true))) + .forEach(c -> { + result.add(sep[0]); + result.add(c); + sep[0] = ", "; + }); + } + } + }); + } + + private Content replaceParams(String template, BiConsumer fillParams) { + ContentBuilder result = new ContentBuilder(); + int lastEnd = 0; + Matcher m = PARAMETER.matcher(template); + + while (m.find()) { + result.add(template.substring(lastEnd, m.start())); + lastEnd = m.start(); + fillParams.accept(m.group(1), result); + lastEnd = m.end(); + } + + result.add(template.substring(lastEnd)); + return result; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java index fbcae00e9488d..1e74dda251e1c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java @@ -152,6 +152,7 @@ public class Contents { public final Content package_; public final Content packagesLabel; public final Content parameters; + public final Content previewPhrase; public final Content properties; public final Content propertyLabel; public final Content propertyDetailsLabel; @@ -288,6 +289,7 @@ public class Contents { package_ = getContent("doclet.package"); packagesLabel = getContent("doclet.Packages"); parameters = getContent("doclet.Parameters"); + previewPhrase = getContent("doclet.Preview"); properties = getContent("doclet.Properties"); propertyLabel = getContent("doclet.Property"); propertyDetailsLabel = getContent("doclet.Property_Detail"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 9c37719498bc0..b428013c090aa 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -707,6 +707,12 @@ public Content getTypeParameterLinks(LinkInfoImpl linkInfo) { */ public Content getCrossClassLink(TypeElement classElement, String refMemName, Content label, boolean strong, boolean code) { + return getCrossClassLink(classElement, refMemName, label, strong, code, true); + } + + public Content getCrossClassLink(TypeElement classElement, String refMemName, + Content label, boolean strong, boolean code, + boolean showExternal) { if (classElement != null) { String className = utils.getSimpleName(classElement); PackageElement packageElement = utils.containingPackage(classElement); @@ -727,7 +733,7 @@ class (assuming that it exists). This is definitely a limitation of (label == null) || label.isEmpty() ? defaultLabel : label, strong, resources.getText("doclet.Href_Class_Or_Interface_Title", - utils.getPackageName(packageElement)), "", true); + utils.getPackageName(packageElement)), "", showExternal); } } return null; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index b86f689ea3108..3ff81aa43b28c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -96,9 +96,9 @@ protected Content getClassLink(LinkInfo linkInfo) { } Content label = classLinkInfo.getClassLinkLabel(configuration); Set flags; - if (!hasWhere) { + if (!hasWhere && !classLinkInfo.skipPreview) { flags = utils.elementFlags(typeElement); - } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null) { + } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null && !classLinkInfo.skipPreview) { flags = utils.elementFlags(classLinkInfo.whereMember); } else { flags = EnumSet.noneOf(ElementFlag.class); @@ -128,22 +128,25 @@ protected Content getClassLink(LinkInfo linkInfo) { } } } else { + HtmlTree externalMarkSpan = new HtmlTree(TagName.SPAN); + externalMarkSpan.setStyle(HtmlStyle.externalLink); Content crossLink = m_writer.getCrossClassLink( typeElement, classLinkInfo.where, - label, classLinkInfo.isStrong, true); + label, classLinkInfo.isStrong, true, false); if (crossLink != null) { - link.add(crossLink); - if (flags.contains(ElementFlag.PREVIEW)) { - link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( - typeElement, - "preview", - new ContentBuilder().add("PREVIEW"), - false, false))); - } - if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { - link.add(getTypeParameterLinks(linkInfo)); - } - return link; + externalMarkSpan.add(crossLink); + if (flags.contains(ElementFlag.PREVIEW)) { + externalMarkSpan.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( + typeElement, + "preview", + new ContentBuilder().add("PREVIEW"), + false, false, false))); + } + link.add(externalMarkSpan); + if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { + link.add(getTypeParameterLinks(linkInfo)); + } + return link; } } // Can't link so just write label. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 0f1fcac1c05fe..beb65eca75b33 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -232,6 +232,7 @@ public enum Kind { public String where = ""; public Element whereMember; + public boolean skipPreview; /** * The value of the target. @@ -349,6 +350,11 @@ public LinkInfoImpl whereMember(Element el) { return this; } + public LinkInfoImpl skipPreview(boolean skipPreview) { + this.skipPreview = skipPreview; + return this; + } + public Kind getContext() { return context; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index 30f5a7f43e766..630259f97ceef 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -33,6 +33,10 @@ import javax.lang.model.element.TypeElement; import com.sun.source.doctree.DocTree; +import com.sun.source.doctree.InlineTagTree; +import com.sun.source.doctree.TextTree; +import com.sun.source.doctree.UnknownInlineTagTree; +import java.util.stream.Collectors; import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -41,6 +45,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.formats.html.markup.Table; import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; @@ -50,6 +55,8 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; +import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Class to generate file for each package contents in the right-hand @@ -222,6 +229,15 @@ public void addClassesSummary(SortedSet classes, String label, Content classLink = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.PACKAGE, klass)); ContentBuilder description = new ContentBuilder(); + PreviewAPIType previewAPIType = utils.getPreviewAPIType(klass); + if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { + DocTree previewTree = utils.getPreviewTree(klass); + if (previewTree != null) { + description.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); + } else { + description.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); + } + } if (utils.isDeprecated(klass)) { description.add(getDeprecatedPhrase(klass)); List tags = utils.getDeprecatedTrees(klass); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index e3c59a624b682..8ed340b4293c2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -78,6 +78,7 @@ public enum HtmlStyle { packageHierarchyLabel, packageUses, permitsNote, + previewLabel, previewNote, searchTagLink, searchTagResult, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 79fe2a955b95e..9440fc6dcfbc4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -266,13 +266,18 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} -doclet.PreviewLeadingNote=This class relies on preview features. -doclet.Declared_Using_Preview=This class is declared using a preview feature of the Java language: {0}. -doclet.PreviewAPI=This class refers to one or more preview APIs: {0}. -doclet.ReflectivePreviewAPI=This class refers to one or more reflective preview APIs: {0}. -doclet.UsesDeclaredUsingPreview=This class refers to one or more types which are declared using a preview feature of the Java language: {0}. -doclet.PreviewTrailingNote1=Programs can only use this class when preview features are enabled. +doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: +doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). +doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. +doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. +doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. +doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. +doclet.Declared_Using_Preview.RECORD=Records +doclet.Declared_Using_Preview.SEALED=Sealed Classes +doclet.Declared_Using_Preview.SEALED_PERMITS=Sealed Classes +doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. +doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index 23511da68bae0..e361abd6bd938 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -29,6 +29,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; +import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.AnnotationTypeRequiredMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; @@ -153,6 +154,7 @@ protected void buildAnnotationTypeMemberChildren(Content annotationDocTree) { buildSignature(annotationDocTree); buildDeprecationInfo(annotationDocTree); buildMemberComments(annotationDocTree); + ((AbstractMemberWriter) writer).addPreviewInfo(currentMember, annotationDocTree); buildTagInfo(annotationDocTree); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java index 3c25d089ce316..1f6b31ff4205d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java @@ -25,11 +25,13 @@ package jdk.javadoc.internal.doclets.toolkit.builders; +import static java.lang.invoke.ConstantBootstraps.enumConstant; import java.util.*; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.ConstructorWriter; @@ -133,6 +135,7 @@ protected void buildConstructorDoc(Content detailsList) throws DocletException { buildSignature(constructorDocTree); buildDeprecationInfo(constructorDocTree); buildConstructorComments(constructorDocTree); + ((AbstractMemberWriter) writer).addPreviewInfo(currentConstructor, constructorDocTree); buildTagInfo(constructorDocTree); memberList.add(writer.getMemberListItem(constructorDocTree)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java index 5046d9b1a0378..cbc056bb4524e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java @@ -30,6 +30,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -126,6 +127,7 @@ protected void buildEnumConstant(Content detailsList) throws DocletException { buildSignature(enumConstantsTree); buildDeprecationInfo(enumConstantsTree); buildEnumConstantComments(enumConstantsTree); + ((AbstractMemberWriter) writer).addPreviewInfo(enumConstant, enumConstantsTree); buildTagInfo(enumConstantsTree); memberList.add(writer.getMemberListItem(enumConstantsTree)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java index a79b398bf00af..9908bb9fcf5cd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java @@ -30,6 +30,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -126,6 +127,7 @@ protected void buildFieldDoc(Content detailsList) throws DocletException { buildSignature(fieldDocTree); buildDeprecationInfo(fieldDocTree); buildFieldComments(fieldDocTree); + ((AbstractMemberWriter) writer).addPreviewInfo(element, fieldDocTree); buildTagInfo(fieldDocTree); memberList.add(writer.getMemberListItem(fieldDocTree)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java index 18a723dc41d1f..8f07db700d295 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java @@ -31,6 +31,7 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; +import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -124,6 +125,7 @@ protected void buildMethodDoc(Content detailsList) throws DocletException { buildSignature(methodDocTree); buildDeprecationInfo(methodDocTree); buildMethodComments(methodDocTree); + ((AbstractMemberWriter) writer).addPreviewInfo(method, methodDocTree); buildTagInfo(methodDocTree); memberList.add(writer.getMemberListItem(methodDocTree)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 62246eba3edc6..09004691f5ad8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -207,6 +207,7 @@ doclet.Use_Table_Summary=Use table, listing {0}, and an explanation doclet.Member_Table_Summary={0} table, listing {1}, and an explanation doclet.fields=fields doclet.Fields=Fields +doclet.Preview=Preview API. doclet.Properties=Properties doclet.constructors=constructors doclet.Constructors=Constructors diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index c78f46dbacfb7..8e50f966fe08c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -559,6 +559,11 @@ h1.hidden { .package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { font-weight:bold; } +.preview-label { + font-weight:bold; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} .preview-note { border: 1px solid red; border-radius: 5px; padding: 5px; display:inline-block; font-size: larger } @@ -577,16 +582,15 @@ h1.hidden { display:inline-block; } .preview-block { -/* font-size:14px; + font-size:14px; font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; border-style:solid; border-width:thin; border-radius:10px; - border-color:red; - padding: 10px; + padding:10px; margin-bottom:10px; margin-right:10px; - display:inline-block;*/ + display:inline-block; } div.block div.deprecation-comment, div.block div.block span.emphasized-phrase, div.block div.block span.interface-name { @@ -703,7 +707,7 @@ ul.help-section-list { } /* * Indicator icon for external links. - */ + * / main a[href*="://"]::after { content:""; display:inline-block; @@ -725,6 +729,31 @@ main a[href*="://"]:focus::after { \ '); +}*/ +/* + * Indicator icon for external links. + */ +.external-link::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +.external-link:hover::after, +.external-link:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); } /* diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 21ceb9a543b89..533e6437a6292 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -119,6 +119,7 @@ import static javax.lang.model.type.TypeKind.*; import static com.sun.source.doctree.DocTree.Kind.*; +import com.sun.source.doctree.UnknownInlineTagTree; import java.util.function.Function; import jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter; import jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl; @@ -2868,6 +2869,25 @@ public List getUsesTrees(Element element) { return getBlockTags(element, USES); } + public DocTree getPreviewTree(Element element) { + return getBody(element).stream() + .filter(t -> t.getKind() == Kind.UNKNOWN_INLINE_TAG) + .filter(t -> "preview".equals(((UnknownInlineTagTree) t).getTagName())) + .findAny() + .orElse(null); + } + + public Pair getPreviewTreeSummaryAndDetails(DocTree t) { + //TODO: handle broken trees: + UnknownInlineTagTree previewTag = (UnknownInlineTagTree) t; + List previewContent = previewTag.getContent(); + String previewText = ((TextTree) previewContent.get(0)).getBody(); + String[] summaryAndDetails = previewText.split("\n\r?\n\r?"); + String summary = summaryAndDetails[0]; + String details = summaryAndDetails.length > 1 ? summaryAndDetails[1] : summaryAndDetails[0]; + return new Pair<>(summary, details); + } + public List getFirstSentenceTrees(Element element) { DocCommentTree dcTree = getDocCommentTree(element); if (dcTree == null) { @@ -2969,26 +2989,39 @@ public String toString() { * @return true if the given Element is deprecated. */ @SuppressWarnings("preview") - public Set previewLanguageFeaturesUsed(Element e) { - Set result = new HashSet<>(); + public Set previewLanguageFeaturesUsed(Element e) { + Set result = new HashSet<>(); if (e.getKind() == ElementKind.RECORD) { - result.add("record"); + result.add(DeclarationPreviewLanguageFeatures.RECORD); } if (e.getModifiers().contains(Modifier.SEALED)) { - result.add("sealed"); List permits = ((TypeElement) e).getPermittedSubclasses(); boolean hasLinkablePermits = permits.stream() .anyMatch(t -> isLinkable(asTypeElement(t))); if (hasLinkablePermits) { - result.add("permits"); + result.add(DeclarationPreviewLanguageFeatures.SEALED_PERMITS); + } else { + result.add(DeclarationPreviewLanguageFeatures.SEALED); } } return result; } + public enum DeclarationPreviewLanguageFeatures { + SEALED(List.of("sealed")), + SEALED_PERMITS(List.of("sealed", "permits")), + RECORD(List.of("record")); + public final List features; + + private DeclarationPreviewLanguageFeatures(List features) { + this.features = features; + } + + } + public PreviewSummary getPreviewAPITypes(Iterable elements) { //TODO: private/merge into declaredUsingPreviewAPIs? Set previewAPI = new HashSet<>(); Set reflectivePreviewAPI = new HashSet<>(); @@ -3058,7 +3091,7 @@ public PreviewSummary(Set previewAPI, Set reflectivePr } - public PreviewAPIType getPreviewAPIType(TypeElement el) { + public PreviewAPIType getPreviewAPIType(Element el) { //TODO: PREVIEW+DECLARED_USING_PREVIEW? if (!previewLanguageFeaturesUsed(el).isEmpty()) { return PreviewAPIType.DECLARED_USING_PREVIEW; diff --git a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java index 86f0a85fe4b8f..0297cff8ecd38 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java @@ -236,13 +236,6 @@ public enum SubKind { ENUM_SUBKIND(Kind.TYPE_DECL), /** - * {@preview Associated with records, a preview feature of the Java language. - * - * This enum constant is associated with records, a preview - * feature of the Java language. Preview features - * may be removed in a future release, or upgraded to permanent - * features of the Java language.} - * * A record declaration. * A {@code SubKind} of {@link Kind#TYPE_DECL}. * @jls 8.10 Record Types From 82f1c3aa5c0e3b3f09a64ded8cd3b9d37537205c Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 23 Sep 2020 12:03:44 +0200 Subject: [PATCH 07/42] More updateds to the preview javadoc appearance. --- .../jdk/internal/loader/URLClassPath.java | 1 - .../formats/html/AbstractMemberWriter.java | 68 +-- ...nnotationTypeRequiredMemberWriterImpl.java | 5 + .../doclets/formats/html/ClassUseWriter.java | 3 +- .../doclets/formats/html/ClassWriterImpl.java | 140 +----- .../formats/html/ConstructorWriterImpl.java | 5 + .../doclets/formats/html/Contents.java | 4 + .../formats/html/EnumConstantWriterImpl.java | 5 + .../doclets/formats/html/FieldWriterImpl.java | 5 + .../doclets/formats/html/HtmlDoclet.java | 5 + .../formats/html/HtmlDocletWriter.java | 234 +++++++++- .../doclets/formats/html/LinkFactoryImpl.java | 7 +- .../formats/html/MethodWriterImpl.java | 5 + .../formats/html/ModuleIndexWriter.java | 5 + .../formats/html/ModuleWriterImpl.java | 3 + .../doclets/formats/html/Navigation.java | 22 + .../formats/html/PackageWriterImpl.java | 11 +- .../formats/html/PreviewListWriter.java | 406 ++++++++++++++++++ .../formats/html/PropertyWriterImpl.java | 4 + .../formats/html/SubWriterHolderWriter.java | 3 + .../formats/html/markup/HtmlStyle.java | 8 +- .../html/resources/standard.properties | 3 + .../AnnotationTypeRequiredMemberWriter.java | 8 + .../doclets/toolkit/ConstructorWriter.java | 8 + .../doclets/toolkit/EnumConstantWriter.java | 8 + .../internal/doclets/toolkit/FieldWriter.java | 8 + .../doclets/toolkit/MethodWriter.java | 8 + .../doclets/toolkit/PropertyWriter.java | 8 + .../AnnotationTypeRequiredMemberBuilder.java | 11 +- .../toolkit/builders/ConstructorBuilder.java | 11 +- .../toolkit/builders/EnumConstantBuilder.java | 11 +- .../toolkit/builders/FieldBuilder.java | 11 +- .../toolkit/builders/MethodBuilder.java | 11 +- .../toolkit/builders/PropertyBuilder.java | 9 + .../doclets/toolkit/resources/stylesheet.css | 13 +- .../doclets/toolkit/util/DocLink.java | 4 + .../doclets/toolkit/util/DocPaths.java | 3 + .../toolkit/util/PreviewAPIListBuilder.java | 184 ++++++++ .../internal/doclets/toolkit/util/Utils.java | 19 + .../toolkit/util/links/LinkFactory.java | 2 + 40 files changed, 1064 insertions(+), 225 deletions(-) create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java diff --git a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java index fce4970139487..a3336f75489d2 100644 --- a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java +++ b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java @@ -1062,7 +1062,6 @@ public JarLoader run() throws IOException { */ @Override URL[] getClassPath() throws IOException { - Thread.dumpStack(); if (index != null) { return null; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index cdda44687c491..d5ee8fa6c5c61 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -302,44 +302,14 @@ protected void addComment(Element member, Content htmltree) { } } - public void addPreviewInfo(Element member, Content contentTree) { - PreviewAPIType previewAPIType = utils.getPreviewAPIType(member); - if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { - //in Java platform: - HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); - DocTree previewTree = utils.getPreviewTree(member); - if (previewTree != null) { - //TODO: tags/html inside - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); - } else { - String simpleName = member.getSimpleName().toString(); - String fullName = typeElement.getSimpleName() + "." + member.getSimpleName(); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(simpleName))))))); - if (previewAPIType == PreviewAPIType.PREVIEW) { - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); - } - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); - } - contentTree.add(previewDiv); - } - } - private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); - - private Content replaceParams(String template, BiConsumer fillParams) { - ContentBuilder result = new ContentBuilder(); - int lastEnd = 0; - Matcher m = PARAMETER.matcher(template); - - while (m.find()) { - result.add(template.substring(lastEnd, m.start())); - lastEnd = m.start(); - fillParams.accept(m.group(1), result); - lastEnd = m.end(); - } - - result.add(template.substring(lastEnd)); - - return result; + /** + * Add the preview information for the given member. + * + * @param member the member being documented. + * @param contentTree the content tree to which the preview information will be added. + */ + protected void addPreviewInfo(Element member, Content contentTree) { + writer.addPreviewInfo(member, contentTree); } protected String name(Element member) { @@ -441,17 +411,17 @@ public void addMemberSummary(TypeElement tElement, Element member, addSummaryLink(tElement, member, summaryLink); rowContents.add(summaryLink); Content desc = new ContentBuilder(); - PreviewAPIType parentPreviewAPIType = utils.getPreviewAPIType(tElement); - PreviewAPIType previewAPIType = utils.getPreviewAPIType(member); - if (parentPreviewAPIType == PreviewAPIType.STANDARD && - (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE)) { - DocTree previewTree = utils.getPreviewTree(member); - if (previewTree != null) { - desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); - } else { - desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); - } - } +// PreviewAPIType parentPreviewAPIType = utils.getPreviewAPIType(tElement); +// PreviewAPIType previewAPIType = utils.getPreviewAPIType(member); +// if (parentPreviewAPIType == PreviewAPIType.STANDARD && +// (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE)) { +// DocTree previewTree = utils.getPreviewTree(member); +// if (previewTree != null) { +// desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); +// } else { +// desc.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); +// } +// } writer.addSummaryLinkComment(this, member, firstSentenceTags, desc); rowContents.add(desc); table.addRow(member, rowContents); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index cfe26b440c139..140e608f45d03 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -124,6 +124,11 @@ public void addDeprecated(Element member, Content annotationDocTree) { addDeprecatedInfo(member, annotationDocTree); } + @Override + public void addPreview(Element member, Content contentTree) { + addPreviewInfo(member, contentTree); + } + @Override public void addComments(Element member, Content annotationDocTree) { addComment(member, annotationDocTree); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java index 007ff9ebce873..aec6ecf725a11 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java @@ -431,7 +431,8 @@ protected HtmlTree getClassUseHeader() { navBar.setNavLinkModule(mdleLinkContent); Content classLinkContent = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement) - .label(resources.getText("doclet.Class"))); + .label(resources.getText("doclet.Class")) + .skipPreview(true)); navBar.setNavLinkClass(classLinkContent); navBar.setUserHeader(getUserHeaderFooter(true)); headerContent.add(navBar.getContent(Navigation.Position.TOP)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 3308c1cf56192..756236d5561a5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -336,149 +336,17 @@ private Content getRecordComponents(TypeElement typeElem) { @Override public void addClassDescription(Content classInfoTree) { + addPreviewInfo(classInfoTree); if (!options.noComment()) { // generate documentation for the class. if (!utils.getFullBody(typeElement).isEmpty()) { addInlineComment(typeElement, classInfoTree); } } - PreviewAPIType previewAPIType = utils.getPreviewAPIType(typeElement); - if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { - //in Java platform: - HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); - DocTree previewTree = utils.getPreviewTree(typeElement); - if (previewTree != null) { - //TODO: tags/html inside - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); - } else { - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName()))))))); - if (previewAPIType == PreviewAPIType.PREVIEW) { - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); - } - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); - } - classInfoTree.add(previewDiv); - } else { - List previewNotes = getPreviewNotes(typeElement); - if (!previewNotes.isEmpty()) { - HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewNote); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName()))))))); - HtmlTree ul = new HtmlTree(TagName.UL); - for (Content note : previewNotes) { - ul.add(HtmlTree.LI(note)); - } - previewDiv.add(ul); - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); - previewDiv.add(HtmlTree.P(replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(typeElement.getSimpleName())))))); - classInfoTree.add(previewDiv); - } - } - } - - @SuppressWarnings("preview") - public List getPreviewNotes(TypeElement el) { - String className = el.getSimpleName().toString(); - List result = new ArrayList<>(); - PreviewSummary previewAPITypes = utils.declaredUsingPreviewAPIs(el); - Set memberPreviewAPI = new HashSet<>(); - Set memberReflectivePreviewAPI = new HashSet<>(); - Set memberDeclaredUsingPreviewFeature = new HashSet<>(); - Set memberPreviewLanguageFeatures = new HashSet<>(); - for (Element enclosed : el.getEnclosedElements()) { - if (!utils.isIncluded(enclosed)) { - continue; - } - if (!enclosed.getKind().isClass() && !enclosed.getKind().isInterface()) { - PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); - memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); - memberPreviewAPI.addAll(memberAPITypes.previewAPI); - memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); - memberPreviewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(enclosed)); - } else if (!utils.previewLanguageFeaturesUsed(enclosed).isEmpty()) { - memberDeclaredUsingPreviewFeature.add((TypeElement) enclosed); - } - } - Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); - if (!previewLanguageFeatures.isEmpty() || !memberPreviewLanguageFeatures.isEmpty()) { - Set features = new HashSet<>(); - features.addAll(previewLanguageFeatures); - features.addAll(memberPreviewLanguageFeatures); - if (features.contains(DeclarationPreviewLanguageFeatures.SEALED_PERMITS)) { - features.remove(DeclarationPreviewLanguageFeatures.SEALED); - } - for (DeclarationPreviewLanguageFeatures feature : features) { - result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", className, resources.getText("doclet.Declared_Using_Preview." + feature.name()), feature.features)); - } - } - if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty() || !memberDeclaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); - } - if (!previewAPITypes.previewAPI.isEmpty() || !memberPreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI", className, previewAPITypes.previewAPI, memberPreviewAPI)); - } - if (!previewAPITypes.reflectivePreviewAPI.isEmpty() || !memberReflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI", className, previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); - } - return result; - } - - private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); - - private Content injectPreviewFeatures(String key, String className, String featureName, List features) { - String template = resources.getText(key); - return replaceParams(template, (param, result) -> { - switch (param) { - case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); - case "1" -> result.add(new HtmlTree(TagName.EM).add(featureName)); - case "2" -> { - String[] sep = new String[] {""}; - features.stream() - .forEach(c -> { - result.add(sep[0]); - result.add(HtmlTree.CODE(new ContentBuilder().add(c))); - sep[0] = ", "; - }); - } - } - }); - } - - private Content injectLinks(String key, String className, Set elements1, Set elements2) { - String template = resources.getText(key); - return replaceParams(template, (param, result) -> { - switch (param) { - case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); - case "1" -> { - String[] sep = new String[] {""}; - Stream.concat(elements1.stream(), elements2.stream()) - .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) - .distinct() - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).skipPreview(true))) - .forEach(c -> { - result.add(sep[0]); - result.add(c); - sep[0] = ", "; - }); - } - } - }); } - - private Content replaceParams(String template, BiConsumer fillParams) { - ContentBuilder result = new ContentBuilder(); - int lastEnd = 0; - Matcher m = PARAMETER.matcher(template); - - while (m.find()) { - result.add(template.substring(lastEnd, m.start())); - lastEnd = m.start(); - fillParams.accept(m.group(1), result); - lastEnd = m.end(); - } - - result.add(template.substring(lastEnd)); - - return result; + + private void addPreviewInfo(Content classInfoTree) { + addPreviewInfo(typeElement, classInfoTree); } @Override diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java index 43483c8ad33a8..b5f87d985b85f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java @@ -141,6 +141,11 @@ public void addDeprecated(ExecutableElement constructor, Content constructorDocT addDeprecatedInfo(constructor, constructorDocTree); } + @Override + public void addPreview(ExecutableElement constructor, Content constructorDocTree) { + addPreviewInfo(constructor, constructorDocTree); + } + @Override public void addComments(ExecutableElement constructor, Content constructorDocTree) { addComment(constructor, constructorDocTree); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java index 1e74dda251e1c..945756337d587 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java @@ -152,6 +152,8 @@ public class Contents { public final Content package_; public final Content packagesLabel; public final Content parameters; + public final Content previewAPI; + public final Content previewLabel; public final Content previewPhrase; public final Content properties; public final Content propertyLabel; @@ -289,6 +291,8 @@ public class Contents { package_ = getContent("doclet.package"); packagesLabel = getContent("doclet.Packages"); parameters = getContent("doclet.Parameters"); + previewAPI = getContent("doclet.Preview_API"); + previewLabel = getContent("doclet.navPreview"); previewPhrase = getContent("doclet.Preview"); properties = getContent("doclet.Properties"); propertyLabel = getContent("doclet.Property"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java index 63df3466d600d..9ab4135458402 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java @@ -108,6 +108,11 @@ public void addDeprecated(VariableElement enumConstant, Content enumConstantsTre addDeprecatedInfo(enumConstant, enumConstantsTree); } + @Override + public void addPreview(VariableElement enumConstant, Content enumConstantsTree) { + addPreviewInfo(enumConstant, enumConstantsTree); + } + @Override public void addComments(VariableElement enumConstant, Content enumConstantsTree) { addComment(enumConstant, enumConstantsTree); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java index f7a3c3231147f..915b1fb4707a6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java @@ -108,6 +108,11 @@ public void addDeprecated(VariableElement field, Content fieldTree) { addDeprecatedInfo(field, fieldTree); } + @Override + public void addPreview(VariableElement field, Content fieldTree) { + addPreviewInfo(field, fieldTree); + } + @Override public void addComments(VariableElement field, Content fieldTree) { if (!utils.getFullBody(field).isEmpty()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index 4cc2da80a9635..fafcfb9961113 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -160,6 +160,11 @@ protected void generateOtherFiles(DocletEnvironment docEnv, ClassTree classtree) DeprecatedListWriter.generate(configuration); } + if (configuration.getIncludedModuleElements().stream().anyMatch(m -> m.getQualifiedName().contentEquals("java.base"))) { + //XXX: options? + PreviewListWriter.generate(configuration); + } + if (options.createOverview()) { if (configuration.showModules) { ModuleIndexWriter.generate(configuration); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index b428013c090aa..9b8976b4d34e0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -110,7 +110,19 @@ import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.TEXT; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.function.BiConsumer; +import java.util.stream.Stream; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; +import jdk.javadoc.internal.doclets.toolkit.Content; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; +import jdk.javadoc.internal.doclets.toolkit.util.DocPath; +import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.DeclarationPreviewLanguageFeatures; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; /** @@ -607,16 +619,31 @@ public Content getPackageLink(PackageElement packageElement, Content label) { } } } + Set flags; + if (packageElement != null) { + flags = utils.elementFlags(packageElement); + } else { + flags = EnumSet.noneOf(ElementFlag.class); + } + DocLink targetLink = null; if (included || packageElement == null) { - return links.createLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY), - label); + targetLink = new DocLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY)); } else { - DocLink crossPkgLink = getCrossPackageLink(packageElement); - if (crossPkgLink != null) { - return links.createLink(crossPkgLink, label); - } else { - return label; + targetLink = getCrossPackageLink(packageElement); + } + if (targetLink != null) { + //TODO: external + if (flags.contains(ElementFlag.PREVIEW)) { + return new ContentBuilder( + links.createLink(targetLink, label), + new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), + new ContentBuilder().add("PREVIEW"))) + ); } + return links.createLink(targetLink, label); + } else { + //TODO: PREVIEW + return label; } } @@ -628,10 +655,22 @@ public Content getPackageLink(PackageElement packageElement, Content label) { * @return a content for the module link */ public Content getModuleLink(ModuleElement mdle, Content label) { + Set flags = utils.elementFlags(mdle); boolean included = utils.isIncluded(mdle); - return (included) - ? links.createLink(pathToRoot.resolve(docPaths.moduleSummary(mdle)), label, "", "") - : label; + if (included) { + DocLink targetLink = new DocLink(pathToRoot.resolve(docPaths.moduleSummary(mdle))); + Content link = links.createLink(targetLink, label, "", ""); + if (flags.contains(ElementFlag.PREVIEW) && label != contents.moduleLabel) { + link = new ContentBuilder( + link, + new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), + new ContentBuilder().add("PREVIEW"))) + ); + } + return link; + } + //TODO: preview + return label; } public Content interfaceName(TypeElement typeElement, boolean qual) { @@ -934,6 +973,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(getAnchor(ee, isProperty))) + .whereMember(element) .strong(strong)); } @@ -941,6 +981,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(element.getSimpleName().toString())) + .whereMember(element) .strong(strong)); } @@ -2165,4 +2206,177 @@ private List getStylesheets(Element element) throws DocFileIOException Content getVerticalSeparator() { return HtmlTree.SPAN(HtmlStyle.verticalSeparator, new FixedStringContent("|")); } + + public void addPreviewSummary(Element forWhat, Content target) { + PreviewAPIType parentPreviewAPIType = PreviewAPIType.STANDARD; + Element enclosing = forWhat.getEnclosingElement(); + if (enclosing != null && (enclosing.getKind().isClass() || enclosing.getKind().isInterface())) { + parentPreviewAPIType = utils.getPreviewAPIType(forWhat.getEnclosingElement()); + } + PreviewAPIType previewAPIType = utils.getPreviewAPIType(forWhat); + if (parentPreviewAPIType == PreviewAPIType.STANDARD && + (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE)) { + DocTree previewTree = utils.getPreviewTree(forWhat); + Content div = HtmlTree.DIV(HtmlStyle.block); + if (previewTree != null) { + div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); + } else { + div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); + } + target.add(div); + } + } + + public void addPreviewInfo(Element forWhat, Content target) { + PreviewAPIType previewAPIType = utils.getPreviewAPIType(forWhat); + if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { + //in Java platform: + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); + DocTree previewTree = utils.getPreviewTree(forWhat); + if (previewTree != null) { + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); + } else { + String simpleName = switch (forWhat.getKind()) { + case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); + default -> forWhat.getSimpleName().toString(); + }; + String fullName = switch (forWhat.getKind()) { + case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> forWhat.getSimpleName().toString(); + case CONSTRUCTOR -> /*TODO?*/((TypeElement) forWhat.getEnclosingElement()).getQualifiedName().toString(); + case ENUM_CONSTANT, FIELD, METHOD -> + ((TypeElement) forWhat.getEnclosingElement()).getQualifiedName() + "." + forWhat.getSimpleName(); + case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); + default -> forWhat.getSimpleName().toString(); + }; + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(simpleName))))))); + if (previewAPIType == PreviewAPIType.PREVIEW) { + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + } + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + } + target.add(previewDiv); + } else if (forWhat.getKind().isClass() || forWhat.getKind().isInterface()) { + List previewNotes = getPreviewNotes((TypeElement) forWhat); + if (!previewNotes.isEmpty()) { + HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, replaceParams(resources.getText("doclet.PreviewLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName()))))))); + HtmlTree ul = new HtmlTree(TagName.UL); + ul.setStyle(HtmlStyle.previewComment); + for (Content note : previewNotes) { + ul.add(HtmlTree.LI(note)); + } + previewDiv.add(ul); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName())))))); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName())))))); + target.add(previewDiv); + } + } + } + + @SuppressWarnings("preview") + public List getPreviewNotes(TypeElement el) { + String className = el.getSimpleName().toString(); + List result = new ArrayList<>(); + PreviewSummary previewAPITypes = utils.declaredUsingPreviewAPIs(el); + Set memberPreviewAPI = new HashSet<>(); + Set memberReflectivePreviewAPI = new HashSet<>(); + Set memberDeclaredUsingPreviewFeature = new HashSet<>(); + Set memberPreviewLanguageFeatures = new HashSet<>(); + for (Element enclosed : el.getEnclosedElements()) { + if (!utils.isIncluded(enclosed)) { + continue; + } + if (!enclosed.getKind().isClass() && !enclosed.getKind().isInterface()) { + PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); + memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); + memberPreviewAPI.addAll(memberAPITypes.previewAPI); + memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); + memberPreviewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(enclosed)); + } else if (!utils.previewLanguageFeaturesUsed(enclosed).isEmpty()) { + memberDeclaredUsingPreviewFeature.add((TypeElement) enclosed); + } + } + Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); + if (!previewLanguageFeatures.isEmpty() || !memberPreviewLanguageFeatures.isEmpty()) { + Set features = new HashSet<>(); + features.addAll(previewLanguageFeatures); + features.addAll(memberPreviewLanguageFeatures); + if (features.contains(DeclarationPreviewLanguageFeatures.SEALED_PERMITS)) { + features.remove(DeclarationPreviewLanguageFeatures.SEALED); + } + for (DeclarationPreviewLanguageFeatures feature : features) { + result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", className, resources.getText("doclet.Declared_Using_Preview." + feature.name()), feature.features)); + } + } + if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty() || !memberDeclaredUsingPreviewFeature.isEmpty()) { + result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); + } + if (!previewAPITypes.previewAPI.isEmpty() || !memberPreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.PreviewAPI", className, previewAPITypes.previewAPI, memberPreviewAPI)); + } + if (!previewAPITypes.reflectivePreviewAPI.isEmpty() || !memberReflectivePreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.ReflectivePreviewAPI", className, previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); + } + return result; + } + + private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); + + private Content injectPreviewFeatures(String key, String className, String featureName, List features) { + String template = resources.getText(key); + return replaceParams(template, (param, result) -> { + switch (param) { + case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); + case "1" -> result.add(new HtmlTree(TagName.EM).add(featureName)); + case "2" -> { + String[] sep = new String[] {""}; + features.stream() + .forEach(c -> { + result.add(sep[0]); + result.add(HtmlTree.CODE(new ContentBuilder().add(c))); + sep[0] = ", "; + }); + } + } + }); + } + + private Content injectLinks(String key, String className, Set elements1, Set elements2) { + String template = resources.getText(key); + return replaceParams(template, (param, result) -> { + switch (param) { + case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); + case "1" -> { + String[] sep = new String[] {""}; + Stream.concat(elements1.stream(), elements2.stream()) + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .distinct() + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).skipPreview(true))) + .forEach(c -> { + result.add(sep[0]); + result.add(c); + sep[0] = ", "; + }); + } + } + }); + } + + private Content replaceParams(String template, BiConsumer fillParams) { + ContentBuilder result = new ContentBuilder(); + int lastEnd = 0; + Matcher m = PARAMETER.matcher(template); + + while (m.find()) { + result.add(template.substring(lastEnd, m.start())); + lastEnd = m.start(); + fillParams.accept(m.group(1), result); + lastEnd = m.end(); + } + + result.add(template.substring(lastEnd)); + + return result; + } + } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 3ff81aa43b28c..d9deee44b3c73 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -96,9 +96,10 @@ protected Content getClassLink(LinkInfo linkInfo) { } Content label = classLinkInfo.getClassLinkLabel(configuration); Set flags; - if (!hasWhere && !classLinkInfo.skipPreview) { + boolean noPreview = classLinkInfo.skipPreview; + if (!hasWhere && !noPreview) { flags = utils.elementFlags(typeElement); - } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null && !classLinkInfo.skipPreview) { + } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null && !noPreview) { flags = utils.elementFlags(classLinkInfo.whereMember); } else { flags = EnumSet.noneOf(ElementFlag.class); @@ -205,7 +206,7 @@ protected Content getTypeParameterLinks(LinkInfo linkInfo, boolean isClassLabel) */ protected Content getTypeParameterLink(LinkInfo linkInfo, TypeMirror typeParam) { LinkInfoImpl typeLinkInfo = new LinkInfoImpl(m_writer.configuration, - ((LinkInfoImpl) linkInfo).getContext(), typeParam); + ((LinkInfoImpl) linkInfo).getContext(), typeParam).skipPreview(true); typeLinkInfo.excludeTypeBounds = linkInfo.excludeTypeBounds; typeLinkInfo.excludeTypeParameterLinks = linkInfo.excludeTypeParameterLinks; typeLinkInfo.linkToSelf = linkInfo.linkToSelf; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java index f62c521633dee..aa483dabd2db0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java @@ -137,6 +137,11 @@ public void addDeprecated(ExecutableElement method, Content methodDocTree) { addDeprecatedInfo(method, methodDocTree); } + @Override + public void addPreview(ExecutableElement method, Content methodDocTree) { + addPreviewInfo(method, methodDocTree); + } + @Override public void addComments(TypeMirror holderType, ExecutableElement method, Content methodDocTree) { TypeElement holder = utils.asTypeElement(holderType); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java index 4805b3bfe8bc4..5d9ce1e748c26 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java @@ -25,6 +25,7 @@ package jdk.javadoc.internal.doclets.formats.html; +import com.sun.source.doctree.DocTree; import jdk.javadoc.internal.doclets.formats.html.markup.Table; import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; @@ -34,11 +35,14 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Generate the module index page "index.html". @@ -111,6 +115,7 @@ protected void addIndex(Content main) { if (!(options.noDeprecated() && utils.isDeprecated(mdle))) { Content moduleLinkContent = getModuleLink(mdle, new StringContent(mdle.getQualifiedName().toString())); Content summaryContent = new ContentBuilder(); + addPreviewSummary(mdle, summaryContent); addSummaryComment(mdle, summaryContent); table.addRow(mdle, moduleLinkContent, summaryContent); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java index 2e89df466711f..9f07c23caa77d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java @@ -57,6 +57,7 @@ import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Class to generate file for each module contents in the right-hand frame. This will list all the @@ -638,6 +639,7 @@ public void addPackageSummary(HtmlTree li) { row.add(getPackageExportOpensTo(entry.openedTo)); } Content summary = new ContentBuilder(); + addPreviewSummary(pkg, summary); addSummaryComment(pkg, summary); row.add(summary); @@ -834,6 +836,7 @@ public void addDeprecationInfo(Content div) { @Override public void addModuleDescription(Content moduleContentTree) { + addPreviewInfo(mdle, moduleContentTree); if (!utils.getFullBody(mdle).isEmpty()) { HtmlTree tree = HtmlTree.SECTION(HtmlStyle.moduleDescription); tree.setId(SectionName.MODULE_DESCRIPTION.getName()); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index 4b8eeeebcca41..68572cc94f7fe 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -98,6 +98,7 @@ public enum PageMode { MODULE, OVERVIEW, PACKAGE, + PREVIEW, SERIALIZED_FORM, SYSTEM_PROPERTIES, TREE, @@ -212,6 +213,7 @@ private void addMainNavLinks(Content tree) { addPageLabel(tree, contents.useLabel, options.classUse()); addTreeLink(tree); addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -223,6 +225,7 @@ private void addMainNavLinks(Content tree) { addPageLabel(tree, contents.useLabel, options.classUse()); addTreeLink(tree); addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -240,6 +243,7 @@ private void addMainNavLinks(Content tree) { contents.treeLabel, "", "")); } addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -257,6 +261,7 @@ private void addMainNavLinks(Content tree) { contents.treeLabel, "", "")); } addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -279,6 +284,7 @@ private void addMainNavLinks(Content tree) { : links.createLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), contents.treeLabel)); } addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -295,12 +301,14 @@ private void addMainNavLinks(Content tree) { addPageLabel(tree, contents.useLabel, options.classUse()); addActivePageLink(tree, contents.treeLabel, options.createTree()); addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; case DEPRECATED: case INDEX: case HELP: + case PREVIEW: addOverviewLink(tree); addModuleLink(tree); addPackageLink(tree); @@ -313,6 +321,11 @@ private void addMainNavLinks(Content tree) { } else { addDeprecatedLink(tree); } + if (documentedPage == PageMode.PREVIEW) { + addActivePageLink(tree, contents.previewLabel, true); //TODO: option + } else { + addPreviewLink(tree); + } if (documentedPage == PageMode.INDEX) { addActivePageLink(tree, contents.indexLabel, options.createIndex()); } else { @@ -336,6 +349,7 @@ private void addMainNavLinks(Content tree) { addPageLabel(tree, contents.useLabel, options.classUse()); addTreeLink(tree); addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -347,6 +361,7 @@ private void addMainNavLinks(Content tree) { addPageLabel(tree, contents.useLabel, options.classUse()); addTreeLink(tree); addDeprecatedLink(tree); + addPreviewLink(tree); addIndexLink(tree); addHelpLink(tree); break; @@ -869,6 +884,13 @@ private void addDeprecatedLink(Content tree) { } } + private void addPreviewLink(Content tree) { + if (configuration.getIncludedModuleElements().stream().anyMatch(m -> m.getQualifiedName().contentEquals("java.base"))) { + tree.add(HtmlTree.LI(links.createLink(pathToRoot.resolve(DocPaths.PREVIEW_LIST), + contents.previewLabel, "", ""))); + } + } + private void addIndexLink(Content tree) { if (options.createIndex()) { tree.add(HtmlTree.LI(links.createLink(pathToRoot.resolve( diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index 630259f97ceef..c197f41a811f9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -229,15 +229,7 @@ public void addClassesSummary(SortedSet classes, String label, Content classLink = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.PACKAGE, klass)); ContentBuilder description = new ContentBuilder(); - PreviewAPIType previewAPIType = utils.getPreviewAPIType(klass); - if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { - DocTree previewTree = utils.getPreviewTree(klass); - if (previewTree != null) { - description.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); - } else { - description.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); - } - } + addPreviewSummary(klass, description); if (utils.isDeprecated(klass)) { description.add(getDeprecatedPhrase(klass)); List tags = utils.getDeprecatedTrees(klass); @@ -255,6 +247,7 @@ public void addClassesSummary(SortedSet classes, String label, @Override public void addPackageDescription(Content packageContentTree) { + addPreviewInfo(packageElement, packageContentTree); if (!utils.getBody(packageElement).isEmpty()) { HtmlTree tree = sectionTree; tree.setId(SectionName.PACKAGE_DESCRIPTION.getName()); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java new file mode 100644 index 0000000000000..d36f02a2c7192 --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -0,0 +1,406 @@ +/* + * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.javadoc.internal.doclets.formats.html; + +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; + +import java.util.EnumMap; +import java.util.List; +import java.util.SortedSet; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ModuleElement; +import javax.lang.model.element.PackageElement; + +import com.sun.source.doctree.DocTree; +import javax.lang.model.element.ElementKind; +import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; +import jdk.javadoc.internal.doclets.formats.html.markup.TagName; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; +import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.toolkit.Content; +import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; +import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder.DeprElementKind; +import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; +import jdk.javadoc.internal.doclets.toolkit.util.DocPath; +import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; +import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder; +import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder.PreviewElementKind; + +/** + * Generate File to list all the preview elements with the + * appropriate links. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @see java.util.List + */ +public class PreviewListWriter extends SubWriterHolderWriter { + + private String getAnchorName(PreviewElementKind kind) { + switch (kind) { + case MODULE: + return "module"; + case PACKAGE: + return "package"; + case INTERFACE: + return "interface"; + case CLASS: + return "class"; + case ENUM: + return "enum"; + case EXCEPTION: + return "exception"; + case ERROR: + return "error"; + case ANNOTATION_TYPE: + return "annotation.type"; + case FIELD: + return "field"; + case METHOD: + return "method"; + case CONSTRUCTOR: + return "constructor"; + case ENUM_CONSTANT: + return "enum.constant"; + case ANNOTATION_TYPE_MEMBER: + return "annotation.type.member"; + default: + throw new AssertionError("unknown kind: " + kind); + } + } + + private String getHeadingKey(PreviewElementKind kind) { + switch (kind) { + case MODULE: + return "doclet.Modules"; + case PACKAGE: + return "doclet.Packages"; + case INTERFACE: + return "doclet.Interfaces"; + case CLASS: + return "doclet.Classes"; + case ENUM: + return "doclet.Enums"; + case EXCEPTION: + return "doclet.Exceptions"; + case ERROR: + return "doclet.Errors"; + case ANNOTATION_TYPE: + return "doclet.Annotation_Types"; + case FIELD: + return "doclet.Fields"; + case METHOD: + return "doclet.Methods"; + case CONSTRUCTOR: + return "doclet.Constructors"; + case ENUM_CONSTANT: + return "doclet.Enum_Constants"; + case ANNOTATION_TYPE_MEMBER: + return "doclet.Annotation_Type_Members"; + default: + throw new AssertionError("unknown kind: " + kind); + } + } + + private String getSummaryKey(PreviewElementKind kind) { + switch (kind) { + case MODULE: + return "doclet.modules"; + case PACKAGE: + return "doclet.packages"; + case INTERFACE: + return "doclet.interfaces"; + case CLASS: + return "doclet.classes"; + case ENUM: + return "doclet.enums"; + case EXCEPTION: + return "doclet.exceptions"; + case ERROR: + return "doclet.errors"; + case ANNOTATION_TYPE: + return "doclet.annotation_types"; + case FIELD: + return "doclet.fields"; + case METHOD: + return "doclet.methods"; + case CONSTRUCTOR: + return "doclet.constructors"; + case ENUM_CONSTANT: + return "doclet.enum_constants"; + case ANNOTATION_TYPE_MEMBER: + return "doclet.annotation_type_members"; + default: + throw new AssertionError("unknown kind: " + kind); + } + } + + private String getHeaderKey(PreviewElementKind kind) { + switch (kind) { + case MODULE: + return "doclet.Module"; + case PACKAGE: + return "doclet.Package"; + case INTERFACE: + return "doclet.Interface"; + case CLASS: + return "doclet.Class"; + case ENUM: + return "doclet.Enum"; + case EXCEPTION: + return "doclet.Exceptions"; + case ERROR: + return "doclet.Errors"; + case ANNOTATION_TYPE: + return "doclet.AnnotationType"; + case FIELD: + return "doclet.Field"; + case METHOD: + return "doclet.Method"; + case CONSTRUCTOR: + return "doclet.Constructor"; + case ENUM_CONSTANT: + return "doclet.Enum_Constant"; + case ANNOTATION_TYPE_MEMBER: + return "doclet.Annotation_Type_Member"; + default: + throw new AssertionError("unknown kind: " + kind); + } + } + + private EnumMap writerMap; + + private final Navigation navBar; + + /** + * Constructor. + * + * @param configuration the configuration for this doclet + * @param filename the file to be generated + */ + + public PreviewListWriter(HtmlConfiguration configuration, DocPath filename) { + super(configuration, filename); + this.navBar = new Navigation(null, configuration, PageMode.PREVIEW, path); + NestedClassWriterImpl classW = new NestedClassWriterImpl(this); + writerMap = new EnumMap<>(PreviewElementKind.class); + for (PreviewElementKind kind : PreviewElementKind.values()) { + writerMap.put(kind, switch (kind) { + case MODULE, PACKAGE, INTERFACE, CLASS, ENUM, + EXCEPTION, ERROR, ANNOTATION_TYPE -> classW; + case FIELD -> new FieldWriterImpl(this); + case METHOD -> new MethodWriterImpl(this); + case CONSTRUCTOR -> new ConstructorWriterImpl(this); + case ENUM_CONSTANT -> new EnumConstantWriterImpl(this); + case ANNOTATION_TYPE_MEMBER -> new AnnotationTypeOptionalMemberWriterImpl(this, null); + }); + } + } + + /** + * Get list of all the preview elements. + * Then instantiate DeprecatedListWriter and generate File. + * + * @param configuration the current configuration of the doclet. + * @throws DocFileIOException if there is a problem writing the deprecated list + */ + public static void generate(HtmlConfiguration configuration) throws DocFileIOException { + DocPath filename = DocPaths.PREVIEW_LIST; + PreviewListWriter depr = new PreviewListWriter(configuration, filename); + depr.generatePreviewListFile( + new PreviewAPIListBuilder(configuration)); + } + + /** + * Generate the deprecated API list. + * + * @param previewapi list of deprecated API built already. + * @throws DocFileIOException if there is a problem writing the deprecated list + */ + protected void generatePreviewListFile(PreviewAPIListBuilder previewapi) + throws DocFileIOException { + HtmlTree body = getHeader(); + bodyContents.addMainContent(getContentsList(previewapi)); + String memberTableSummary; + Content content = new ContentBuilder(); + for (PreviewElementKind kind : PreviewElementKind.values()) { + if (previewapi.hasDocumentation(kind)) { + memberTableSummary = resources.getText("doclet.Member_Table_Summary", + resources.getText(getHeadingKey(kind)), + resources.getText(getSummaryKey(kind))); + TableHeader memberTableHeader = new TableHeader( + contents.getContent(getHeaderKey(kind)), contents.descriptionLabel); + addPreviewAPI(previewapi.getSet(kind), getAnchorName(kind), + getHeadingKey(kind), memberTableSummary, memberTableHeader, content); + } + } + bodyContents.addMainContent(content); + HtmlTree htmlTree = HtmlTree.FOOTER(); + navBar.setUserFooter(getUserHeaderFooter(false)); + htmlTree.add(navBar.getContent(Navigation.Position.BOTTOM)); + addBottom(htmlTree); + bodyContents.setFooter(htmlTree); + String description = "deprecated elements"; + body.add(bodyContents); + printHtmlDocument(null, description, body); + } + + /** + * Add the index link. + * + * @param builder the deprecated list builder + * @param kind the kind of list being documented + * @param contentTree the content tree to which the index link will be added + */ + private void addIndexLink(PreviewAPIListBuilder builder, + PreviewElementKind kind, Content contentTree) { + if (builder.hasDocumentation(kind)) { + Content li = HtmlTree.LI(links.createLink(getAnchorName(kind), + contents.getContent(getHeadingKey(kind)))); + contentTree.add(li); + } + } + + /** + * Get the contents list. + * + * @param previewapi the deprecated list builder + * @return a content tree for the contents list + */ + public Content getContentsList(PreviewAPIListBuilder previewapi) { + Content headContent = contents.previewAPI; + Content heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, + HtmlStyle.title, headContent); + Content div = HtmlTree.DIV(HtmlStyle.header, heading); + Content headingContent = contents.contentsHeading; + div.add(HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING, + headingContent)); + Content ul = new HtmlTree(TagName.UL); + for (PreviewElementKind kind : PreviewElementKind.values()) { + addIndexLink(previewapi, kind, ul); + } + div.add(ul); + return div; + } + + /** + * Get the header for the deprecated API Listing. + * + * @return a content tree for the header + */ + public HtmlTree getHeader() { + String title = resources.getText("doclet.Window_Preview_List"); + HtmlTree bodyTree = getBody(getWindowTitle(title)); + Content headerContent = new ContentBuilder(); + addTop(headerContent); + navBar.setUserHeader(getUserHeaderFooter(true)); + headerContent.add(navBar.getContent(Navigation.Position.TOP)); + bodyContents.setHeader(headerContent); + return bodyTree; + } + + /** + * Add deprecated information to the documentation tree + * + * @param deprList list of deprecated API elements + * @param id the id attribute of the table + * @param headingKey the caption for the deprecated table + * @param tableSummary the summary for the deprecated table + * @param tableHeader table headers for the deprecated table + * @param contentTree the content tree to which the deprecated table will be added + */ + protected void addPreviewAPI(SortedSet deprList, String id, String headingKey, + String tableSummary, TableHeader tableHeader, Content contentTree) { + if (deprList.size() > 0) { + Content caption = contents.getContent(headingKey); + Table table = new Table(HtmlStyle.deprecatedSummary, HtmlStyle.summaryTable) + .setCaption(caption) + .setHeader(tableHeader) + .setId(id) + .setColumnStyles(HtmlStyle.colDeprecatedItemName, HtmlStyle.colLast); + for (Element e : deprList) { + Content link; + switch (e.getKind()) { + case MODULE: + ModuleElement m = (ModuleElement) e; + link = getModuleLink(m, new StringContent(m.getQualifiedName())); + break; + case PACKAGE: + PackageElement pkg = (PackageElement) e; + link = getPackageLink(pkg, getPackageName(pkg)); + break; + default: + link = getPreviewLink(e); + } + Content desc = new ContentBuilder(); + List tags = utils.getDeprecatedTrees(e); + if (!tags.isEmpty()) { + addInlineDeprecatedComment(e, tags.get(0), desc); + } else { + desc.add(HtmlTree.EMPTY); + } + table.addRow(link, desc); + } + // note: singleton list + contentTree.add(HtmlTree.UL(HtmlStyle.blockList, HtmlTree.LI(table))); + } + } + + protected Content getPreviewLink(Element e) { + //XXX!!!XXX!!!XXX!!! + AbstractMemberWriter writer; + switch (e.getKind()) { + case INTERFACE: + case CLASS: + case ENUM: + case ANNOTATION_TYPE: + writer = new NestedClassWriterImpl(this); + break; + case FIELD: + writer = new FieldWriterImpl(this); + break; + case METHOD: + writer = new MethodWriterImpl(this); + break; + case CONSTRUCTOR: + writer = new ConstructorWriterImpl(this); + break; + case ENUM_CONSTANT: + writer = new EnumConstantWriterImpl(this); + break; + default: + writer = new AnnotationTypeOptionalMemberWriterImpl(this, null); + } + return writer.getDeprecatedLink(e); + } +} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java index b2265cb9f00bd..e3a526e38bded 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java @@ -100,6 +100,10 @@ public Content getSignature(ExecutableElement property) { public void addDeprecated(ExecutableElement property, Content propertyDocTree) { } + @Override + public void addPreview(ExecutableElement property, Content propertyDocTree) { + } + @Override public void addComments(ExecutableElement property, Content propertyDocTree) { TypeElement holder = (TypeElement)property.getEnclosingElement(); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java index c6f0463b645f1..c86d4f770465b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java @@ -36,8 +36,10 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * This abstract class exists to provide functionality needed in the @@ -108,6 +110,7 @@ protected void addIndexComment(Element member, Content contentTree) { */ protected void addIndexComment(Element member, List firstSentenceTags, Content tdSummary) { + addPreviewSummary(member, tdSummary); List deprs = utils.getBlockTags(member, DocTree.Kind.DEPRECATED); Content div; if (utils.isDeprecated(member)) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 8ed340b4293c2..0da91b79c4ba2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -78,8 +78,9 @@ public enum HtmlStyle { packageHierarchyLabel, packageUses, permitsNote, + previewBlock, + previewComment, previewLabel, - previewNote, searchTagLink, searchTagResult, serializedPackageContainer, @@ -687,6 +688,11 @@ public enum HtmlStyle { */ packageUsePage, + /** + * The class of the {@code body} element for the page listing any deprecated items. + */ + previewListPage, + /** * The class of the {@code body} element for the serialized-forms page. */ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 9440fc6dcfbc4..b65b4861d6864 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -72,6 +72,7 @@ doclet.Navigation=Navigation doclet.New_Page=NewPage doclet.navDeprecated=Deprecated doclet.Window_Deprecated_List=Deprecated List +doclet.Window_Preview_List=Preview List doclet.Overrides=Overrides: doclet.in_class=in class doclet.Static_variable_in=Static variable in {0} @@ -89,6 +90,8 @@ doclet.see.class_or_package_not_found=Tag {0}: reference not found: {1} doclet.see.class_or_package_not_accessible=Tag {0}: reference not accessible: {1} doclet.tag.invalid_usage=invalid usage of tag {0} doclet.Deprecated_API=Deprecated API +doclet.Preview_API=Preview API +doclet.navPreview=Preview doclet.For_Removal=For Removal doclet.Annotation_Types=Annotation Types doclet.Annotation_Type_Members=Annotation Type Elements diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java index 4ea1a2b4f35f2..8edc9f4b644c8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java @@ -92,6 +92,14 @@ public interface AnnotationTypeRequiredMemberWriter extends MemberWriter { */ void addDeprecated(Element member, Content annotationDocTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(Element member, Content contentTree); + /** * Add the comments for the given member. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java index ec79ba242ab4e..cb408bbea6a64 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java @@ -70,6 +70,14 @@ public interface ConstructorWriter extends MemberWriter { */ void addDeprecated(ExecutableElement constructor, Content constructorDocTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(ExecutableElement member, Content contentTree); + /** * Add the comments for the given constructor. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/EnumConstantWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/EnumConstantWriter.java index 91c90bb225ab1..835be5e4d3a0e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/EnumConstantWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/EnumConstantWriter.java @@ -75,6 +75,14 @@ Content getEnumConstantsTreeHeader(VariableElement enumConstant, */ void addDeprecated(VariableElement enumConstant, Content enumConstantsTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(VariableElement member, Content contentTree); + /** * Add the comments for the given enum constant. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java index e0d0d68f88829..186aa1b46198c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java @@ -71,6 +71,14 @@ public interface FieldWriter extends MemberWriter { */ void addDeprecated(VariableElement field, Content fieldDocTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(VariableElement member, Content contentTree); + /** * Add the comments for the given field. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java index c4d81ad790e4b..e8616c4ba9727 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java @@ -71,6 +71,14 @@ public interface MethodWriter extends MemberWriter { */ void addDeprecated(ExecutableElement method, Content methodDocTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(ExecutableElement member, Content contentTree); + /** * Add the comments for the given method. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java index edb8c5d19ba78..bf9e044dc0c7a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java @@ -70,6 +70,14 @@ public interface PropertyWriter extends MemberWriter { */ void addDeprecated(ExecutableElement property, Content propertyDocTree); + /** + * Add the preview output for the given member. + * + * @param member the member being documented + * @param annotationDocTree content tree to which the preview information will be added + */ + void addPreview(ExecutableElement member, Content contentTree); + /** * Add the comments for the given property. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index e361abd6bd938..b4e6a5383b4a7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -153,8 +153,8 @@ protected void buildAnnotationTypeMember(Content detailsList) protected void buildAnnotationTypeMemberChildren(Content annotationDocTree) { buildSignature(annotationDocTree); buildDeprecationInfo(annotationDocTree); + buildPreviewInfo(annotationDocTree); buildMemberComments(annotationDocTree); - ((AbstractMemberWriter) writer).addPreviewInfo(currentMember, annotationDocTree); buildTagInfo(annotationDocTree); } @@ -176,6 +176,15 @@ protected void buildDeprecationInfo(Content annotationDocTree) { writer.addDeprecated(currentMember, annotationDocTree); } + /** + * Build the preview information. + * + * @param annotationDocTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content annotationDocTree) { + writer.addPreview(currentMember, annotationDocTree); + } + /** * Build the comments for the member. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java index 1f6b31ff4205d..56d885c023950 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java @@ -134,8 +134,8 @@ protected void buildConstructorDoc(Content detailsList) throws DocletException { buildSignature(constructorDocTree); buildDeprecationInfo(constructorDocTree); + buildPreviewInfo(constructorDocTree); buildConstructorComments(constructorDocTree); - ((AbstractMemberWriter) writer).addPreviewInfo(currentConstructor, constructorDocTree); buildTagInfo(constructorDocTree); memberList.add(writer.getMemberListItem(constructorDocTree)); @@ -163,6 +163,15 @@ protected void buildDeprecationInfo(Content constructorDocTree) { writer.addDeprecated(currentConstructor, constructorDocTree); } + /** + * Build the preview information. + * + * @param constructorDocTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content constructorDocTree) { + writer.addDeprecated(currentConstructor, constructorDocTree); + } + /** * Build the comments for the constructor. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java index cbc056bb4524e..73a2d2e4b3b07 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java @@ -126,8 +126,8 @@ protected void buildEnumConstant(Content detailsList) throws DocletException { buildSignature(enumConstantsTree); buildDeprecationInfo(enumConstantsTree); + buildPreviewInfo(enumConstantsTree); buildEnumConstantComments(enumConstantsTree); - ((AbstractMemberWriter) writer).addPreviewInfo(enumConstant, enumConstantsTree); buildTagInfo(enumConstantsTree); memberList.add(writer.getMemberListItem(enumConstantsTree)); @@ -156,6 +156,15 @@ protected void buildDeprecationInfo(Content enumConstantsTree) { writer.addDeprecated(currentElement, enumConstantsTree); } + /** + * Build the preview information. + * + * @param enumConstantsTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content enumConstantsTree) { + writer.addPreview(currentElement, enumConstantsTree); + } + /** * Build the comments for the enum constant. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java index 9908bb9fcf5cd..5b85918ea302d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java @@ -126,8 +126,8 @@ protected void buildFieldDoc(Content detailsList) throws DocletException { buildSignature(fieldDocTree); buildDeprecationInfo(fieldDocTree); + buildPreviewInfo(fieldDocTree); buildFieldComments(fieldDocTree); - ((AbstractMemberWriter) writer).addPreviewInfo(element, fieldDocTree); buildTagInfo(fieldDocTree); memberList.add(writer.getMemberListItem(fieldDocTree)); @@ -155,6 +155,15 @@ protected void buildDeprecationInfo(Content fieldDocTree) { writer.addDeprecated(currentElement, fieldDocTree); } + /** + * Build the preview information. + * + * @param fieldDocTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content fieldDocTree) { + writer.addPreview(currentElement, fieldDocTree); + } + /** * Build the comments for the field. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java index 8f07db700d295..83451d77af5e0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java @@ -124,8 +124,8 @@ protected void buildMethodDoc(Content detailsList) throws DocletException { buildSignature(methodDocTree); buildDeprecationInfo(methodDocTree); + buildPreviewInfo(methodDocTree); buildMethodComments(methodDocTree); - ((AbstractMemberWriter) writer).addPreviewInfo(method, methodDocTree); buildTagInfo(methodDocTree); memberList.add(writer.getMemberListItem(methodDocTree)); @@ -153,6 +153,15 @@ protected void buildDeprecationInfo(Content methodDocTree) { writer.addDeprecated(currentMethod, methodDocTree); } + /** + * Build the preview information. + * + * @param methodDocTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content methodDocTree) { + writer.addPreview(currentMethod, methodDocTree); + } + /** * Build the comments for the method. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java index a40dc81c7bff1..186673906f216 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java @@ -152,6 +152,15 @@ protected void buildDeprecationInfo(Content propertyDocTree) { writer.addDeprecated(currentProperty, propertyDocTree); } + /** + * Build the preview information. + * + * @param propertyDocTree the content tree to which the documentation will be added + */ + protected void buildPreviewInfo(Content propertyDocTree) { + writer.addPreview(currentProperty, propertyDocTree); + } + /** * Build the comments for the property. Do nothing if * {@link BaseOptions#noComment()} is set to true. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 8e50f966fe08c..958d2d3a589c5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -556,18 +556,10 @@ h1.hidden { } .deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, .module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, -.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { font-weight:bold; } -.preview-label { - font-weight:bold; - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} -.preview-note { - border: 1px solid red; border-radius: 5px; padding: 5px; display:inline-block; font-size: larger -} -.deprecation-comment, .help-footnote, .interface-name { +.deprecation-comment, .help-footnote, .interface-name, .preview-comment { font-style:italic; } .deprecation-block { @@ -584,6 +576,7 @@ h1.hidden { .preview-block { font-size:14px; font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-color:red; border-style:solid; border-width:thin; border-radius:10px; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java index 9e69c325a862e..5ad8e69a11fe2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java @@ -102,6 +102,10 @@ public DocLink relativizeAgainst(DocPath base) { return new DocLink(newPath, fragment); } + public DocLink withFragment(String fragment) { + return new DocLink(path, fragment); + } + // return true if the path begins :// private boolean isAbsoluteURL(DocPath path) { String s = path.getPath(); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java index ba22bfdd4d211..213812f5268fd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java @@ -139,6 +139,9 @@ public static DocPath indexN(int n) { /** The name of the file for the package usage info. */ public static final DocPath PACKAGE_USE = DocPath.create("package-use.html"); + /** The name of the fie for preview elements. */ + public static final DocPath PREVIEW_LIST = DocPath.create("preview-list.html"); + /** The name of the file for all system properties. */ public static final DocPath SYSTEM_PROPERTIES = DocPath.create("system-properties.html"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java new file mode 100644 index 0000000000000..4afde5de019d0 --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.javadoc.internal.doclets.toolkit.util; + +import java.util.*; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ModuleElement; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; + +import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; + +/** + * Build list of all the preview packages, classes, constructors, fields and methods. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class PreviewAPIListBuilder { + /** + * List of deprecated type Lists. + */ + private final Map> previewMap; + private final BaseConfiguration configuration; + private final Utils utils; + public enum PreviewElementKind { + MODULE, + PACKAGE, + INTERFACE, + CLASS, + ENUM, + EXCEPTION, // no ElementKind mapping + ERROR, // no ElementKind mapping + ANNOTATION_TYPE, + FIELD, + METHOD, + CONSTRUCTOR, + ENUM_CONSTANT, + ANNOTATION_TYPE_MEMBER // no ElementKind mapping + }; + /** + * Constructor. + * + * @param configuration the current configuration of the doclet + */ + public PreviewAPIListBuilder(BaseConfiguration configuration) { + this.configuration = configuration; + this.utils = configuration.utils; + previewMap = new EnumMap<>(PreviewElementKind.class); + for (PreviewElementKind kind : PreviewElementKind.values()) { + previewMap.put(kind, + new TreeSet<>(utils.comparators.makeDeprecatedComparator())); + } + buildDeprecatedAPIInfo(); + } + + /** + * Build the sorted list of all the deprecated APIs in this run. + * Build separate lists for deprecated modules, packages, classes, constructors, + * methods and fields. + */ + private void buildDeprecatedAPIInfo() { + SortedSet modules = configuration.modules; + SortedSet mset = previewMap.get(PreviewElementKind.MODULE); + for (Element me : modules) { + if (utils.isPreview(me)) { + mset.add(me); + } + } + SortedSet packages = configuration.packages; + SortedSet pset = previewMap.get(PreviewElementKind.PACKAGE); + for (Element pe : packages) { + if (utils.isPreview(pe)) { + pset.add(pe); + } + } + for (Element e : configuration.getIncludedTypeElements()) { + TypeElement te = (TypeElement)e; + SortedSet eset; + if (utils.isPreview(e)) { + switch (e.getKind()) { + case ANNOTATION_TYPE: + eset = previewMap.get(PreviewElementKind.ANNOTATION_TYPE); + eset.add(e); + break; + case CLASS: + if (utils.isError(te)) { + eset = previewMap.get(PreviewElementKind.ERROR); + } else if (utils.isException(te)) { + eset = previewMap.get(PreviewElementKind.EXCEPTION); + } else { + eset = previewMap.get(PreviewElementKind.CLASS); + } + eset.add(e); + break; + case INTERFACE: + eset = previewMap.get(PreviewElementKind.INTERFACE); + eset.add(e); + break; + case ENUM: + eset = previewMap.get(PreviewElementKind.ENUM); + eset.add(e); + break; + } + } + composeDeprecatedList(previewMap.get(PreviewElementKind.FIELD), + utils.getFields(te)); + composeDeprecatedList(previewMap.get(PreviewElementKind.METHOD), + utils.getMethods(te)); + composeDeprecatedList(previewMap.get(PreviewElementKind.CONSTRUCTOR), + utils.getConstructors(te)); + if (utils.isEnum(e)) { + composeDeprecatedList(previewMap.get(PreviewElementKind.ENUM_CONSTANT), + utils.getEnumConstants(te)); + } + if (utils.isAnnotationType(e)) { + composeDeprecatedList(previewMap.get(PreviewElementKind.ANNOTATION_TYPE_MEMBER), + utils.getAnnotationMembers(te)); + + } + } + } + + /** + * Add the members into a single list of deprecated members. + * + * @param rset set of elements deprecated for removal. + * @param sset set of deprecated elements. + * @param members members to be added in the list. + */ + private void composeDeprecatedList(SortedSet sset, List members) { + for (Element member : members) { + if (utils.isPreview(member)) { + sset.add(member); + } + } + } + + /** + * Return the list of deprecated elements of a given type. + * + * @param kind the PreviewElementKind + * @return + */ + public SortedSet getSet(PreviewElementKind kind) { + return previewMap.get(kind); + } + + /** + * Return true if the list of a given type has size greater than 0. + * + * @param kind the type of list being checked. + */ + public boolean hasDocumentation(PreviewElementKind kind) { + return !previewMap.get(kind).isEmpty(); + } +} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 533e6437a6292..428f7d01d5c5f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -3072,6 +3072,9 @@ public PreviewSummary declaredUsingPreviewAPIs(Element el) { VariableElement ve = (VariableElement) el; usedInDeclaration.addAll(types2Classes(List.of(ve.asType()))); } + case MODULE, PACKAGE -> { + //TODO: annotations? + } default -> throw new IllegalStateException("Unexpected: " + el.getKind()); } PreviewSummary previewAPITypes = getPreviewAPITypes(usedInDeclaration); @@ -3088,6 +3091,11 @@ public PreviewSummary(Set previewAPI, Set reflectivePr this.reflectivePreviewAPI = reflectivePreviewAPI; this.declaredUsingPreviewFeature = declaredUsingPreviewFeature; } + + @Override + public String toString() { + return "PreviewSummary{" + "previewAPI=" + previewAPI + ", reflectivePreviewAPI=" + reflectivePreviewAPI + ", declaredUsingPreviewFeature=" + declaredUsingPreviewFeature + '}'; + } } @@ -3120,4 +3128,15 @@ public Set elementFlags(Element el) { public enum ElementFlag { PREVIEW; } + + public boolean isPreview(Element el) { + PreviewAPIType parentPreviewAPIType = PreviewAPIType.STANDARD; + Element enclosing = el.getEnclosingElement(); + if (enclosing != null && (enclosing.getKind().isClass() || enclosing.getKind().isInterface())) { + parentPreviewAPIType = getPreviewAPIType(el.getEnclosingElement()); + } + PreviewAPIType previewAPIType = getPreviewAPIType(el); + return parentPreviewAPIType == PreviewAPIType.STANDARD && + (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE); + } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java index 261c2d538862c..f6e5b353b2be4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java @@ -36,6 +36,7 @@ import javax.lang.model.type.TypeVariable; import javax.lang.model.type.WildcardType; import javax.lang.model.util.SimpleTypeVisitor9; +import jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.Utils; @@ -204,6 +205,7 @@ private void setBoundsLinkInfo(LinkInfo linkInfo, TypeMirror bound) { linkInfo.typeElement = null; linkInfo.label = null; linkInfo.type = bound; + ((LinkInfoImpl) linkInfo).skipPreview = false; } /** From d88fdd4829d28f79644466442ef2d5cfb9428c8c Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Mon, 5 Oct 2020 10:55:13 +0200 Subject: [PATCH 08/42] More updates to javadoc appearance --- src/java.base/share/classes/module-info.java | 2 - .../html/AbstractExecutableMemberWriter.java | 5 ++- .../formats/html/AbstractMemberWriter.java | 2 +- .../formats/html/AllClassesIndexWriter.java | 5 ++- ...nnotationTypeRequiredMemberWriterImpl.java | 4 +- .../formats/html/DeprecatedListWriter.java | 2 +- .../formats/html/EnumConstantWriterImpl.java | 4 +- .../doclets/formats/html/FieldWriterImpl.java | 4 +- .../formats/html/HtmlDocletWriter.java | 43 ++++++++++++------- .../doclets/formats/html/LinkFactoryImpl.java | 2 +- .../doclets/formats/html/LinkInfoImpl.java | 5 +++ .../formats/html/NestedClassWriterImpl.java | 4 +- .../formats/html/PreviewListWriter.java | 6 +-- .../formats/html/PropertyWriterImpl.java | 4 +- .../doclets/toolkit/resources/stylesheet.css | 1 - .../toolkit/util/links/LinkFactory.java | 1 + 16 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index d20fd4d006b56..4dfddd7e73626 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -138,8 +138,6 @@ jdk.incubator.foreign; exports com.sun.security.ntlm to java.security.sasl; - exports jdk.internal to - jdk.jfr; exports jdk.internal.javac to java.compiler, jdk.compiler, diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java index eff6d391b4499..449089ef7c8ae 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -49,6 +49,7 @@ import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.EXECUTABLE_MEMBER_PARAM; import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.MEMBER; +import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW; import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.MEMBER_TYPE_PARAMS; import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.RECEIVER_TYPE; import static jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl.Kind.THROWS_TYPE; @@ -84,7 +85,7 @@ protected Content getTypeParameters(ExecutableElement member) { } @Override - protected Content getDeprecatedLink(Element member) { + protected Content getDeprecatedOrPreviewLink(Element member) { Content deprecatedLinkContent = new ContentBuilder(); deprecatedLinkContent.add(utils.getFullyQualifiedName(member)); if (!utils.isConstructor(member)) { @@ -97,7 +98,7 @@ protected Content getDeprecatedLink(Element member) { } deprecatedLinkContent.add(signature); - return writer.getDocLink(MEMBER, utils.getEnclosingTypeElement(member), member, deprecatedLinkContent); + return writer.getDocLink(MEMBER_DEPRECATED_PREVIEW, utils.getEnclosingTypeElement(member), member, deprecatedLinkContent); } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 29afb246ff1b4..0c5c2aa3c36a7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -197,7 +197,7 @@ protected abstract void addInheritedSummaryLink(TypeElement typeElement, * * @return a content tree representing the link */ - protected abstract Content getDeprecatedLink(Element member); + protected abstract Content getDeprecatedOrPreviewLink(Element member); /** * Adds the modifier and type for the member in the member summary. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java index 6e213d228c75d..b443e159395d2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java @@ -166,7 +166,10 @@ protected void addTableRow(Table table, TypeElement klass) { Content classLink = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.INDEX, klass)); ContentBuilder description = new ContentBuilder(); - if (utils.isDeprecated(klass)) { + if (utils.isPreview(klass)) { + description.add(contents.previewPhrase); + addSummaryComment(klass, description); + } else if (utils.isDeprecated(klass)) { description.add(getDeprecatedPhrase(klass)); List tags = utils.getDeprecatedTrees(klass); if (!tags.isEmpty()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index 140e608f45d03..e90dbeff42992 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -201,9 +201,9 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedLink(Element member) { + protected Content getDeprecatedOrPreviewLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); - return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); + return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } private TypeMirror getType(Element member) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java index b9a6fc52922b6..e34dcfa01c1cf 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java @@ -427,6 +427,6 @@ protected Content getDeprecatedLink(Element e) { default: writer = new AnnotationTypeOptionalMemberWriterImpl(this, null); } - return writer.getDeprecatedLink(e); + return writer.getDeprecatedOrPreviewLink(e); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java index 9ab4135458402..d17e0908742e1 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java @@ -176,9 +176,9 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedLink(Element member) { + protected Content getDeprecatedOrPreviewLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); - return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); + return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } @Override diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java index 915b1fb4707a6..50782e9f092af 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java @@ -204,9 +204,9 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedLink(Element member) { + protected Content getDeprecatedOrPreviewLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); - return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); + return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } @Override diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index c88c3dfbd22be..93b534d7c5df5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -1035,10 +1035,11 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El ExecutableElement emd = (ExecutableElement) element; return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) - .where(links.getName(getAnchor(emd)))); + .where(links.getName(getAnchor(emd))) + .whereMember(element)); } else if (utils.isVariableElement(element) || utils.isTypeElement(element)) { return getLink(new LinkInfoImpl(configuration, context, typeElement) - .label(label).where(links.getName(element.getSimpleName().toString()))); + .label(label).where(links.getName(element.getSimpleName().toString())).whereMember(element)); } else { return label; } @@ -1216,7 +1217,7 @@ private Content plainOrCode(boolean plain, Content body) { public void addInlineComment(Element element, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(element); List description = ch.getDescription(tag); - addCommentTags(element, tag, description, false, false, false, htmltree); + addCommentTags(element, tag, description, false, false, false, false, htmltree); } /** @@ -1240,7 +1241,7 @@ public Content getDeprecatedPhrase(Element e) { */ public void addInlineDeprecatedComment(Element e, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(e); - addCommentTags(e, ch.getBody(tag), true, false, false, htmltree); + addCommentTags(e, ch.getBody(tag), true, false, false, false, htmltree); } /** @@ -1253,6 +1254,17 @@ public void addSummaryComment(Element element, Content htmltree) { addSummaryComment(element, utils.getFirstSentenceTrees(element), htmltree); } + /** + * Adds the preview content. + * + * @param element the Element for which the summary will be generated + * @param firstSentenceTags the first sentence tags for the doc + * @param htmltree the documentation tree to which the summary will be added + */ + public void addPreviewComment(Element element, List firstSentenceTags, Content htmltree) { + addCommentTags(element, firstSentenceTags, false, true, true, true, htmltree); + } + /** * Adds the summary content. * @@ -1261,13 +1273,13 @@ public void addSummaryComment(Element element, Content htmltree) { * @param htmltree the documentation tree to which the summary will be added */ public void addSummaryComment(Element element, List firstSentenceTags, Content htmltree) { - addCommentTags(element, firstSentenceTags, false, true, true, htmltree); + addCommentTags(element, firstSentenceTags, false, false, true, true, htmltree); } public void addSummaryDeprecatedComment(Element element, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(element); List body = ch.getBody(tag); - addCommentTags(element, ch.getFirstSentenceTrees(body), true, true, true, htmltree); + addCommentTags(element, ch.getFirstSentenceTrees(body), true, false, true, true, htmltree); } /** @@ -1277,7 +1289,7 @@ public void addSummaryDeprecatedComment(Element element, DocTree tag, Content ht * @param htmltree the documentation tree to which the inline comments will be added */ public void addInlineComment(Element element, Content htmltree) { - addCommentTags(element, utils.getFullBody(element), false, false, false, htmltree); + addCommentTags(element, utils.getFullBody(element), false, false, false, false, htmltree); } /** @@ -1291,8 +1303,8 @@ public void addInlineComment(Element element, Content htmltree) { * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Element element, List tags, boolean depr, - boolean first, boolean inSummary, Content htmltree) { - addCommentTags(element, null, tags, depr, first, inSummary, htmltree); + boolean preview, boolean first, boolean inSummary, Content htmltree) { + addCommentTags(element, null, tags, depr, preview, first, inSummary, htmltree); } /** @@ -1307,7 +1319,7 @@ private void addCommentTags(Element element, List tags, boole * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Element element, DocTree holderTag, List tags, boolean depr, - boolean first, boolean inSummary, Content htmltree) { + boolean preview, boolean first, boolean inSummary, Content htmltree) { if (options.noComment()){ return; } @@ -1316,8 +1328,10 @@ private void addCommentTags(Element element, DocTree holderTag, List forWhat.getSimpleName().toString(); case CONSTRUCTOR -> /*TODO?*/((TypeElement) forWhat.getEnclosingElement()).getQualifiedName().toString(); - case ENUM_CONSTANT, FIELD, METHOD -> - ((TypeElement) forWhat.getEnclosingElement()).getQualifiedName() + "." + forWhat.getSimpleName(); + case ENUM_CONSTANT, FIELD, METHOD -> forWhat.getSimpleName().toString(); case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); default -> forWhat.getSimpleName().toString(); }; @@ -2367,7 +2380,7 @@ private Content injectLinks(String key, String className, Set eleme Stream.concat(elements1.stream(), elements2.stream()) .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) .distinct() - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).skipPreview(true))) + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).label(HtmlTree.CODE(new StringContent(te.getSimpleName()))).skipPreview(true))) .forEach(c -> { result.add(sep[0]); result.add(c); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index d9deee44b3c73..2c436c417c7a9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -99,7 +99,7 @@ protected Content getClassLink(LinkInfo linkInfo) { boolean noPreview = classLinkInfo.skipPreview; if (!hasWhere && !noPreview) { flags = utils.elementFlags(typeElement); - } else if (classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG && classLinkInfo.whereMember != null && !noPreview) { + } else if ((classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG || classLinkInfo.context == LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW) && classLinkInfo.whereMember != null && !noPreview) { flags = utils.elementFlags(classLinkInfo.whereMember); } else { flags = EnumSet.noneOf(ElementFlag.class); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 6115003e5e3d2..7905bc4748643 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -58,6 +58,11 @@ public enum Kind { */ MEMBER, + /** + * Indicate that the link appears in member documentation on the Deprecated or Preview page. + */ + MEMBER_DEPRECATED_PREVIEW, + /** * Indicate that the link appears in class use documentation. */ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java index 33777b63c98f8..01b18de8dcfe8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java @@ -146,7 +146,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedLink(Element member) { - return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER, member); + protected Content getDeprecatedOrPreviewLink(Element member) { + return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java index d36f02a2c7192..722e4c8e3a975 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -363,9 +363,9 @@ protected void addPreviewAPI(SortedSet deprList, String id, String head link = getPreviewLink(e); } Content desc = new ContentBuilder(); - List tags = utils.getDeprecatedTrees(e); + List tags = utils.getFirstSentenceTrees(e); if (!tags.isEmpty()) { - addInlineDeprecatedComment(e, tags.get(0), desc); + addPreviewComment(e, tags, desc); } else { desc.add(HtmlTree.EMPTY); } @@ -401,6 +401,6 @@ protected Content getPreviewLink(Element e) { default: writer = new AnnotationTypeOptionalMemberWriterImpl(this, null); } - return writer.getDeprecatedLink(e); + return writer.getDeprecatedOrPreviewLink(e); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java index e3a526e38bded..e4f0b5c1cce88 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java @@ -219,8 +219,8 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedLink(Element member) { - return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, + protected Content getDeprecatedOrPreviewLink(Element member) { + return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, utils.getFullyQualifiedName(member)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 958d2d3a589c5..bad7d68042501 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -576,7 +576,6 @@ h1.hidden { .preview-block { font-size:14px; font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; - border-color:red; border-style:solid; border-width:thin; border-radius:10px; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java index f6e5b353b2be4..1154b2f08739a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java @@ -140,6 +140,7 @@ public Content visitTypeVariable(TypeVariable type, LinkInfo linkInfo) { Content label = newContent(); label.add(utils.getTypeName(type, false)); linkInfo.label = label; + ((LinkInfoImpl) linkInfo).skipPreview = true; link.add(getClassLink(linkInfo)); } else { // No need to link method type parameters. From 1b9a0523c30db37417b5552737246c25cd35976e Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 7 Oct 2020 11:32:57 +0200 Subject: [PATCH 09/42] A post-merge fix. --- .../javadoc/internal/doclets/formats/html/HtmlDocletWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 540661f2fa2ce..befd5e2264fa2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -1032,7 +1032,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El ExecutableElement emd = (ExecutableElement) element; return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) - .where(links.getAnchor(emd))) + .where(links.getAnchor(emd)) .whereMember(element)); } else if (utils.isVariableElement(element) || utils.isTypeElement(element)) { return getLink(new LinkInfoImpl(configuration, context, typeElement) From 7cb5085076b9bcfc2fedca6ab95a7fda51fbb022 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 13 Oct 2020 12:07:45 +0200 Subject: [PATCH 10/42] Cleaning up preview in javadoc. --- .../formats/html/AbstractMemberWriter.java | 7 - .../formats/html/AllClassesIndexWriter.java | 2 +- .../doclets/formats/html/ClassWriterImpl.java | 7 +- .../doclets/formats/html/Contents.java | 4 +- .../doclets/formats/html/HtmlDoclet.java | 9 +- .../formats/html/HtmlDocletWriter.java | 144 ++++++++---------- .../doclets/formats/html/LinkFactoryImpl.java | 32 ++-- .../doclets/formats/html/LinkInfoImpl.java | 21 ++- .../formats/html/ModuleIndexWriter.java | 1 - .../formats/html/ModuleWriterImpl.java | 1 - .../formats/html/PackageWriterImpl.java | 1 - .../formats/html/SubWriterHolderWriter.java | 1 - .../doclets/formats/html/markup/Table.java | 33 ++-- .../html/resources/standard.properties | 11 +- .../internal/doclets/toolkit/WorkArounds.java | 27 +--- .../doclets/toolkit/resources/stylesheet.css | 29 +--- .../toolkit/util/PreviewAPIListBuilder.java | 8 +- .../internal/doclets/toolkit/util/Utils.java | 127 +++++++-------- .../doclets/toolkit/util/links/LinkInfo.java | 7 - 19 files changed, 201 insertions(+), 271 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 0c5c2aa3c36a7..07c6eef7de62d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -39,9 +39,6 @@ import javax.lang.model.type.TypeMirror; import com.sun.source.doctree.DocTree; -import java.util.function.BiConsumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -65,10 +62,6 @@ import static javax.lang.model.element.Modifier.PUBLIC; import static javax.lang.model.element.Modifier.STRICTFP; import static javax.lang.model.element.Modifier.SYNCHRONIZED; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; -import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; -import jdk.javadoc.internal.doclets.toolkit.Content; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * The base class for member writers. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java index baf11813e4b6f..01e6ae976c253 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java @@ -165,7 +165,7 @@ protected void addTableRow(Table table, TypeElement klass) { Content classLink = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.INDEX, klass)); ContentBuilder description = new ContentBuilder(); - if (utils.isPreview(klass)) { + if (utils.isPreviewAPI(klass)) { description.add(contents.previewPhrase); addSummaryComment(klass, description); } else if (utils.isDeprecated(klass)) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 8d1bb5b7b88e5..3ddf121381cb2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -205,7 +205,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { } if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { pre.add(modifiersPart); - pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", new ContentBuilder().add("PREVIEW")))); + pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", contents.previewMark))); pre.add(" "); } else { pre.add(modifiersPart); @@ -240,8 +240,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { pre.add("extends "); Content link = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_SIGNATURE_PARENT_NAME, - superclass) - .checkPreviewAPI(typeElement.getKind() != ElementKind.RECORD)); + superclass)); pre.add(link); } } @@ -278,7 +277,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (isFirst) { pre.add(DocletConstants.NL); pre.add("permits"); - pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", new ContentBuilder().add("PREVIEW")))); + pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", contents.previewMark))); pre.add(" "); isFirst = false; } else { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java index 945756337d587..66f339a1c7c3a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java @@ -154,6 +154,7 @@ public class Contents { public final Content parameters; public final Content previewAPI; public final Content previewLabel; + public final Content previewMark; public final Content previewPhrase; public final Content properties; public final Content propertyLabel; @@ -292,7 +293,8 @@ public class Contents { packagesLabel = getContent("doclet.Packages"); parameters = getContent("doclet.Parameters"); previewAPI = getContent("doclet.Preview_API"); - previewLabel = getContent("doclet.navPreview"); + previewLabel = getContent("doclet.Preview_Label"); + previewMark = getContent("doclet.Preview_Mark"); previewPhrase = getContent("doclet.Preview"); properties = getContent("doclet.Properties"); propertyLabel = getContent("doclet.Property"); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index 744f85b82b15c..d423eabf3c5da 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -160,8 +160,13 @@ protected void generateOtherFiles(DocletEnvironment docEnv, ClassTree classtree) DeprecatedListWriter.generate(configuration); } - if (configuration.getIncludedModuleElements().stream().anyMatch(m -> m.getQualifiedName().contentEquals("java.base"))) { - //XXX: options? + boolean showPreviewTab = + configuration.getIncludedModuleElements() + .stream() + .anyMatch(m -> m.getQualifiedName() + .contentEquals("java.base")); + + if (showPreviewTab) { PreviewListWriter.generate(configuration); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index befd5e2264fa2..c0bb014fad1b7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -27,7 +27,9 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; @@ -36,6 +38,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.function.BiConsumer; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -104,8 +107,12 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; -import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; +import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.DeclarationPreviewLanguageFeatures; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import static com.sun.source.doctree.DocTree.Kind.CODE; import static com.sun.source.doctree.DocTree.Kind.COMMENT; @@ -113,19 +120,14 @@ import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.TEXT; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.function.BiConsumer; -import java.util.stream.Stream; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; -import jdk.javadoc.internal.doclets.toolkit.Content; +import static javax.lang.model.element.ElementKind.CLASS; +import static javax.lang.model.element.ElementKind.ENUM; +import static javax.lang.model.element.ElementKind.ENUM_CONSTANT; +import static javax.lang.model.element.ElementKind.INTERFACE; +import static javax.lang.model.element.ElementKind.METHOD; +import static javax.lang.model.element.ElementKind.PACKAGE; +import static javax.lang.model.element.ElementKind.RECORD; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; -import jdk.javadoc.internal.doclets.toolkit.util.DocPath; -import jdk.javadoc.internal.doclets.toolkit.util.Utils; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.DeclarationPreviewLanguageFeatures; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; /** @@ -662,7 +664,7 @@ public Content getPackageLink(PackageElement packageElement, Content label) { return new ContentBuilder( links.createLink(targetLink, label), new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), - new ContentBuilder().add("PREVIEW"))) + contents.previewMark)) ); } return links.createLink(targetLink, label); @@ -689,7 +691,7 @@ public Content getModuleLink(ModuleElement mdle, Content label) { link = new ContentBuilder( link, new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), - new ContentBuilder().add("PREVIEW"))) + contents.previewMark)) ); } return link; @@ -771,12 +773,6 @@ public Content getTypeParameterLinks(LinkInfoImpl linkInfo) { */ public Content getCrossClassLink(TypeElement classElement, String refMemName, Content label, boolean strong, boolean code) { - return getCrossClassLink(classElement, refMemName, label, strong, code, true); - } - - public Content getCrossClassLink(TypeElement classElement, String refMemName, - Content label, boolean strong, boolean code, - boolean showExternal) { if (classElement != null) { String className = utils.getSimpleName(classElement); PackageElement packageElement = utils.containingPackage(classElement); @@ -797,7 +793,7 @@ class (assuming that it exists). This is definitely a limitation of (label == null) || label.isEmpty() ? defaultLabel : label, strong, resources.getText("doclet.Href_Class_Or_Interface_Title", - utils.getPackageName(packageElement)), "", showExternal); + utils.getPackageName(packageElement)), "", true); } } return null; @@ -2214,14 +2210,7 @@ Content getVerticalSeparator() { } public void addPreviewSummary(Element forWhat, Content target) { - PreviewAPIType parentPreviewAPIType = PreviewAPIType.STANDARD; - Element enclosing = forWhat.getEnclosingElement(); - if (enclosing != null && (enclosing.getKind().isClass() || enclosing.getKind().isInterface())) { - parentPreviewAPIType = utils.getPreviewAPIType(forWhat.getEnclosingElement()); - } - PreviewAPIType previewAPIType = utils.getPreviewAPIType(forWhat); - if (parentPreviewAPIType == PreviewAPIType.STANDARD && - (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE)) { + if (utils.isPreviewAPI(forWhat)) { DocTree previewTree = utils.getPreviewTree(forWhat); Content div = HtmlTree.DIV(HtmlStyle.block); if (previewTree != null) { @@ -2234,93 +2223,86 @@ public void addPreviewSummary(Element forWhat, Content target) { } public void addPreviewInfo(Element forWhat, Content target) { - PreviewAPIType previewAPIType = utils.getPreviewAPIType(forWhat); - if (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE) { + if (utils.isPreviewAPI(forWhat)) { //in Java platform: HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); DocTree previewTree = utils.getPreviewTree(forWhat); if (previewTree != null) { previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); } else { - String simpleName = switch (forWhat.getKind()) { + String name = switch (forWhat.getKind()) { case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); + case CONSTRUCTOR -> ((TypeElement) forWhat.getEnclosingElement()).getSimpleName().toString(); default -> forWhat.getSimpleName().toString(); }; - String fullName = switch (forWhat.getKind()) { - case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> forWhat.getSimpleName().toString(); - case CONSTRUCTOR -> /*TODO?*/((TypeElement) forWhat.getEnclosingElement()).getQualifiedName().toString(); - case ENUM_CONSTANT, FIELD, METHOD -> forWhat.getSimpleName().toString(); - case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); - default -> forWhat.getSimpleName().toString(); - }; - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, replaceParams(resources.getText(previewAPIType == PreviewAPIType.PREVIEW ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(simpleName))))))); - if (previewAPIType == PreviewAPIType.PREVIEW) { - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + boolean isReflectivePreview = utils.isReflectivePreviewAPI(forWhat); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(resources.getText(!isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote", name))))); + if (!isReflectivePreview) { + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)))); } - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(fullName)))))); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)))); } target.add(previewDiv); } else if (forWhat.getKind().isClass() || forWhat.getKind().isInterface()) { + //in custom code: List previewNotes = getPreviewNotes((TypeElement) forWhat); if (!previewNotes.isEmpty()) { + Name name = forWhat.getSimpleName(); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, replaceParams(resources.getText("doclet.PreviewLeadingNote"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName()))))))); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(resources.getText("doclet.PreviewLeadingNote", name))))); HtmlTree ul = new HtmlTree(TagName.UL); ul.setStyle(HtmlStyle.previewComment); for (Content note : previewNotes) { ul.add(HtmlTree.LI(note)); } previewDiv.add(ul); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote1"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName())))))); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, replaceParams(resources.getText("doclet.PreviewTrailingNote2"), (param, result) -> result.add(HtmlTree.CODE(new StringContent(forWhat.getSimpleName())))))); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)))); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)))); target.add(previewDiv); } } } @SuppressWarnings("preview") - public List getPreviewNotes(TypeElement el) { + private List getPreviewNotes(TypeElement el) { String className = el.getSimpleName().toString(); List result = new ArrayList<>(); PreviewSummary previewAPITypes = utils.declaredUsingPreviewAPIs(el); - Set memberPreviewAPI = new HashSet<>(); - Set memberReflectivePreviewAPI = new HashSet<>(); - Set memberDeclaredUsingPreviewFeature = new HashSet<>(); - Set memberPreviewLanguageFeatures = new HashSet<>(); + Set previewAPI = new HashSet<>(previewAPITypes.previewAPI); + Set reflectivePreviewAPI = new HashSet<>(previewAPITypes.reflectivePreviewAPI); + Set declaredUsingPreviewFeature = new HashSet<>(previewAPITypes.declaredUsingPreviewFeature); + Set previewLanguageFeatures = new HashSet<>(); for (Element enclosed : el.getEnclosedElements()) { if (!utils.isIncluded(enclosed)) { continue; } if (!enclosed.getKind().isClass() && !enclosed.getKind().isInterface()) { PreviewSummary memberAPITypes = utils.declaredUsingPreviewAPIs(enclosed); - memberDeclaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); - memberPreviewAPI.addAll(memberAPITypes.previewAPI); - memberReflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); - memberPreviewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(enclosed)); + declaredUsingPreviewFeature.addAll(memberAPITypes.declaredUsingPreviewFeature); + previewAPI.addAll(memberAPITypes.previewAPI); + reflectivePreviewAPI.addAll(memberAPITypes.reflectivePreviewAPI); + previewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(enclosed)); } else if (!utils.previewLanguageFeaturesUsed(enclosed).isEmpty()) { - memberDeclaredUsingPreviewFeature.add((TypeElement) enclosed); + declaredUsingPreviewFeature.add((TypeElement) enclosed); } } - Set previewLanguageFeatures = utils.previewLanguageFeaturesUsed(el); - if (!previewLanguageFeatures.isEmpty() || !memberPreviewLanguageFeatures.isEmpty()) { - Set features = new HashSet<>(); - features.addAll(previewLanguageFeatures); - features.addAll(memberPreviewLanguageFeatures); - if (features.contains(DeclarationPreviewLanguageFeatures.SEALED_PERMITS)) { - features.remove(DeclarationPreviewLanguageFeatures.SEALED); + previewLanguageFeatures.addAll(utils.previewLanguageFeaturesUsed(el)); + if (!previewLanguageFeatures.isEmpty()) { + if (previewLanguageFeatures.contains(DeclarationPreviewLanguageFeatures.SEALED_PERMITS)) { + previewLanguageFeatures.remove(DeclarationPreviewLanguageFeatures.SEALED); } - for (DeclarationPreviewLanguageFeatures feature : features) { + for (DeclarationPreviewLanguageFeatures feature : previewLanguageFeatures) { result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", className, resources.getText("doclet.Declared_Using_Preview." + feature.name()), feature.features)); } } - if (!previewAPITypes.declaredUsingPreviewFeature.isEmpty() || !memberDeclaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, previewAPITypes.declaredUsingPreviewFeature, memberDeclaredUsingPreviewFeature)); + if (!declaredUsingPreviewFeature.isEmpty()) { + result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, declaredUsingPreviewFeature)); } - if (!previewAPITypes.previewAPI.isEmpty() || !memberPreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI", className, previewAPITypes.previewAPI, memberPreviewAPI)); + if (!previewAPI.isEmpty()) { + result.add(injectLinks("doclet.PreviewAPI", className, previewAPI)); } - if (!previewAPITypes.reflectivePreviewAPI.isEmpty() || !memberReflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI", className, previewAPITypes.reflectivePreviewAPI, memberReflectivePreviewAPI)); + if (!reflectivePreviewAPI.isEmpty()) { + result.add(injectLinks("doclet.ReflectivePreviewAPI", className, reflectivePreviewAPI)); } return result; } @@ -2346,22 +2328,22 @@ private Content injectPreviewFeatures(String key, String className, String featu }); } - private Content injectLinks(String key, String className, Set elements1, Set elements2) { + private Content injectLinks(String key, String className, Set elements) { String template = resources.getText(key); return replaceParams(template, (param, result) -> { switch (param) { case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); case "1" -> { String[] sep = new String[] {""}; - Stream.concat(elements1.stream(), elements2.stream()) - .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) - .distinct() - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).label(HtmlTree.CODE(new StringContent(te.getSimpleName()))).skipPreview(true))) - .forEach(c -> { - result.add(sep[0]); - result.add(c); - sep[0] = ", "; - }); + elements.stream() + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .distinct() + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).label(HtmlTree.CODE(new StringContent(te.getSimpleName()))).skipPreview(true))) + .forEach(c -> { + result.add(sep[0]); + result.add(c); + sep[0] = ", "; + }); } } }); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 2c436c417c7a9..2dcb33bc0ed7b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -51,7 +51,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkFactory; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo; @@ -120,7 +119,7 @@ protected Content getClassLink(LinkInfo linkInfo) { if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( filename.fragment("preview"), - new ContentBuilder().add("PREVIEW")))); + m_writer.contents.previewMark))); } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); @@ -129,25 +128,22 @@ protected Content getClassLink(LinkInfo linkInfo) { } } } else { - HtmlTree externalMarkSpan = new HtmlTree(TagName.SPAN); - externalMarkSpan.setStyle(HtmlStyle.externalLink); Content crossLink = m_writer.getCrossClassLink( typeElement, classLinkInfo.where, - label, classLinkInfo.isStrong, true, false); + label, classLinkInfo.isStrong, true); if (crossLink != null) { - externalMarkSpan.add(crossLink); - if (flags.contains(ElementFlag.PREVIEW)) { - externalMarkSpan.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( - typeElement, - "preview", - new ContentBuilder().add("PREVIEW"), - false, false, false))); - } - link.add(externalMarkSpan); - if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { - link.add(getTypeParameterLinks(linkInfo)); - } - return link; + link.add(crossLink); + if (flags.contains(ElementFlag.PREVIEW)) { + link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( + typeElement, + "preview", + m_writer.contents.previewMark, + false, false))); + } + if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { + link.add(getTypeParameterLinks(linkInfo)); + } + return link; } } // Can't link so just write label. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 7905bc4748643..efe9e7c0778c9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -241,7 +241,14 @@ public enum Kind { */ public String where = ""; + /** + * The member this link points to (if any). + */ public Element whereMember; + + /** + * True iff the preview flags should be skipped for this link. + */ public boolean skipPreview; /** @@ -314,14 +321,6 @@ public LinkInfoImpl label(Content label) { return this; } - /** - * Set the checkPreviewAPI flag. - */ - public LinkInfoImpl checkPreviewAPI(boolean checkPreviewAPI) { - this.checkPreviewAPI = checkPreviewAPI; - return this; - } - /** * Set whether or not the link should be strong. */ @@ -355,11 +354,17 @@ public LinkInfoImpl where(String where) { return this; } + /** + * Set the member this link points to (if any). + */ public LinkInfoImpl whereMember(Element el) { this.whereMember = el; return this; } + /** + * Set whether or not the preview flags should be skipped for this link. + */ public LinkInfoImpl skipPreview(boolean skipPreview) { this.skipPreview = skipPreview; return this; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java index 5d9ce1e748c26..9c70f30874825 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java @@ -42,7 +42,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Generate the module index page "index.html". diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java index 9f07c23caa77d..efee93db6befc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java @@ -57,7 +57,6 @@ import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter; import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Class to generate file for each module contents in the right-hand frame. This will list all the diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index c197f41a811f9..1096af127aeca 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -56,7 +56,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.Utils; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * Class to generate file for each package contents in the right-hand diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java index c86d4f770465b..633a140224b22 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java @@ -39,7 +39,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * This abstract class exists to provide functionality needed in the diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java index 6206385edf277..14f8490f90028 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Table.java @@ -84,7 +84,6 @@ public class Table extends Content { private int rowScopeColumnIndex; private List stripedStyles = Arrays.asList(HtmlStyle.altColor, HtmlStyle.rowColor); private final List bodyRows; - private int significantRowCount = -1; private final List bodyRowMasks; private String rowIdPrefix = "i"; private String id; @@ -361,31 +360,25 @@ public void addRow(Element element, List contents) { HtmlTree row = new HtmlTree(TagName.TR); + if (stripedStyles != null) { + int rowIndex = bodyRows.size(); + row.setStyle(stripedStyles.get(rowIndex % 2)); + } int colIndex = 0; for (Content c : contents) { - if (c instanceof HtmlTree && ((HtmlTree) c).tagName == TagName.TD) { - row.add(c); - colIndex++; - significantRowCount--; //XXX - should not happen this way - } else { - HtmlStyle cellStyle = (columnStyles == null || colIndex > columnStyles.size()) - ? null - : columnStyles.get(colIndex); - HtmlTree cell = (colIndex == rowScopeColumnIndex) - ? HtmlTree.TH(cellStyle, "row", c) - : HtmlTree.TD(cellStyle, c); - row.add(cell); - colIndex++; - } - } - significantRowCount++; - if (stripedStyles != null) { - row.setStyle(stripedStyles.get(significantRowCount % 2)); + HtmlStyle cellStyle = (columnStyles == null || colIndex > columnStyles.size()) + ? null + : columnStyles.get(colIndex); + HtmlTree cell = (colIndex == rowScopeColumnIndex) + ? HtmlTree.TH(cellStyle, "row", c) + : HtmlTree.TD(cellStyle, c); + row.add(cell); + colIndex++; } bodyRows.add(row); if (tabMap != null) { - int index = significantRowCount; + int index = bodyRows.size() - 1; row.put(HtmlAttr.ID, (rowIdPrefix + index)); int mask = 0; int maskBit = 1; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index b65b4861d6864..0751653fe4706 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -91,7 +91,8 @@ doclet.see.class_or_package_not_accessible=Tag {0}: reference not accessible: {1 doclet.tag.invalid_usage=invalid usage of tag {0} doclet.Deprecated_API=Deprecated API doclet.Preview_API=Preview API -doclet.navPreview=Preview +doclet.Preview_Label=Preview +doclet.Preview_Mark=PREVIEW doclet.For_Removal=For Removal doclet.Annotation_Types=Annotation Types doclet.Annotation_Type_Members=Annotation Type Elements @@ -269,18 +270,18 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} -doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: +doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. -doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. +doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. doclet.Declared_Using_Preview.RECORD=Records doclet.Declared_Using_Preview.SEALED=Sealed Classes doclet.Declared_Using_Preview.SEALED_PERMITS=Sealed Classes -doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. -doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. +doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. +doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java index 1d8b787f4c47d..ae76aac58c104 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java @@ -25,13 +25,10 @@ package jdk.javadoc.internal.doclets.toolkit; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -48,14 +45,10 @@ import javax.tools.FileObject; import javax.tools.JavaFileManager.Location; -import com.sun.source.tree.CompilationUnitTree; -import com.sun.source.util.JavacTask; import com.sun.source.util.TreePath; -import com.sun.tools.javac.api.BasicJavacTask; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Scope; -import com.sun.tools.javac.code.Source.Feature; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; @@ -66,11 +59,9 @@ import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.model.JavacElements; -import com.sun.tools.javac.model.JavacTypes; import com.sun.tools.javac.util.Names; import jdk.javadoc.internal.doclets.toolkit.util.Utils; -import jdk.javadoc.internal.doclint.DocLint; import jdk.javadoc.internal.tool.ToolEnvironment; import jdk.javadoc.internal.tool.DocEnvImpl; @@ -78,7 +69,6 @@ import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; import static javax.lang.model.element.ElementKind.*; -import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewAPIType; /** * A quarantine class to isolate all the workarounds and bridges to @@ -524,17 +514,14 @@ public PackageElement getAbbreviatedPackageElement(PackageElement pkg) { : ((JavacElements) utils.elementUtils).getPackageElement(encl, parsedPackageName); } - public PreviewAPIType getPreviewAPIType(Element el) { + public boolean isPreviewAPI(Element el) { Symbol sym = (Symbol) el; - if ((sym.flags() & Flags.PREVIEW_API) != 0) { - if ((sym.flags() & Flags.PREVIEW_REFLECTIVE) != 0) { - return PreviewAPIType.REFLECTIVE; - } else { - return PreviewAPIType.PREVIEW; - } - } else { - return PreviewAPIType.STANDARD; - } + return (sym.flags() & Flags.PREVIEW_API) != 0; + } + + public boolean isReflectivePreviewAPI(Element el) { + Symbol sym = (Symbol) el; + return (sym.flags() & Flags.PREVIEW_REFLECTIVE) != 0; } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index bad7d68042501..678a180b763d6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -699,8 +699,8 @@ ul.help-section-list { } /* * Indicator icon for external links. - * / -main a[href*="://"]::after { + */ +main a[href*="://"]:not()::after { content:""; display:inline-block; background-image:url('data:image/svg+xml; utf8, \ @@ -721,31 +721,6 @@ main a[href*="://"]:focus::after { \ '); -}*/ -/* - * Indicator icon for external links. - */ -.external-link::after { - content:""; - display:inline-block; - background-image:url('data:image/svg+xml; utf8, \ - \ - \ - '); - background-size:100% 100%; - width:7px; - height:7px; - margin-left:2px; - margin-bottom:4px; -} -.external-link:hover::after, -.external-link:focus::after { - background-image:url('data:image/svg+xml; utf8, \ - \ - \ - '); } /* diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java index 4afde5de019d0..1e240f454e897 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java @@ -90,21 +90,21 @@ private void buildDeprecatedAPIInfo() { SortedSet modules = configuration.modules; SortedSet mset = previewMap.get(PreviewElementKind.MODULE); for (Element me : modules) { - if (utils.isPreview(me)) { + if (utils.isPreviewAPI(me)) { mset.add(me); } } SortedSet packages = configuration.packages; SortedSet pset = previewMap.get(PreviewElementKind.PACKAGE); for (Element pe : packages) { - if (utils.isPreview(pe)) { + if (utils.isPreviewAPI(pe)) { pset.add(pe); } } for (Element e : configuration.getIncludedTypeElements()) { TypeElement te = (TypeElement)e; SortedSet eset; - if (utils.isPreview(e)) { + if (utils.isPreviewAPI(e)) { switch (e.getKind()) { case ANNOTATION_TYPE: eset = previewMap.get(PreviewElementKind.ANNOTATION_TYPE); @@ -157,7 +157,7 @@ private void buildDeprecatedAPIInfo() { */ private void composeDeprecatedList(SortedSet sset, List members) { for (Element member : members) { - if (utils.isPreview(member)) { + if (utils.isPreviewAPI(member)) { sset.add(member); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 8747c63899b86..55f92e1287f26 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -1710,23 +1710,6 @@ public String getHTMLTitle(Element element) { return sb.toString().trim(); } - private Collection types2Classes(List types) { - List result = new ArrayList<>(); - List todo = new ArrayList<>(types); - - while (!todo.isEmpty()) { - TypeMirror type = todo.remove(todo.size() - 1); - - if (type.getKind() == DECLARED) { - DeclaredType dt = (DeclaredType) type; - result.add((TypeElement) dt.asElement()); - todo.addAll(dt.getTypeArguments()); - } - } - - return result; - } - private static class DocCollator { private final Map keys; private final Collator instance; @@ -2968,10 +2951,10 @@ public String toString() { } /** - * Return true if the given Element is deprecated. + * Return the set of preview language features used to declare the given element. * * @param e the Element to check. - * @return true if the given Element is deprecated. + * @return the set of preview language features used to declare the given element */ @SuppressWarnings("preview") public Set previewLanguageFeaturesUsed(Element e) { @@ -2996,6 +2979,7 @@ public Set previewLanguageFeaturesUsed(Eleme } public enum DeclarationPreviewLanguageFeatures { + SEALED(List.of("sealed")), SEALED_PERMITS(List.of("sealed", "permits")), RECORD(List.of("record")); @@ -3007,25 +2991,6 @@ private DeclarationPreviewLanguageFeatures(List features) { } - public PreviewSummary getPreviewAPITypes(Iterable elements) { //TODO: private/merge into declaredUsingPreviewAPIs? - Set previewAPI = new HashSet<>(); - Set reflectivePreviewAPI = new HashSet<>(); - Set declaredUsingPreviewFeature = new HashSet<>(); - - for (TypeElement type : elements) { - if (!isIncluded(type) && !configuration.extern.isExternal(type)) { - continue; - } - switch (getPreviewAPIType(type)) { - case PREVIEW -> previewAPI.add(type); - case REFLECTIVE -> reflectivePreviewAPI.add(type); - case DECLARED_USING_PREVIEW -> declaredUsingPreviewFeature.add(type); - } - } - - return new PreviewSummary(previewAPI, reflectivePreviewAPI, declaredUsingPreviewFeature); - } - @SuppressWarnings("preview") public PreviewSummary declaredUsingPreviewAPIs(Element el) { List usedInDeclaration = new ArrayList<>(); @@ -3062,8 +3027,45 @@ public PreviewSummary declaredUsingPreviewAPIs(Element el) { } default -> throw new IllegalStateException("Unexpected: " + el.getKind()); } - PreviewSummary previewAPITypes = getPreviewAPITypes(usedInDeclaration); - return previewAPITypes; + + Set previewAPI = new HashSet<>(); + Set reflectivePreviewAPI = new HashSet<>(); + Set declaredUsingPreviewFeature = new HashSet<>(); + + for (TypeElement type : usedInDeclaration) { + if (!isIncluded(type) && !configuration.extern.isExternal(type)) { + continue; + } + if (isPreviewAPI(type)) { + if (isReflectivePreviewAPI(type)) { + reflectivePreviewAPI.add(type); + } else { + previewAPI.add(type); + } + } + if (!previewLanguageFeaturesUsed(type).isEmpty()) { + declaredUsingPreviewFeature.add(type); + } + } + + return new PreviewSummary(previewAPI, reflectivePreviewAPI, declaredUsingPreviewFeature); + } + + private Collection types2Classes(List types) { + List result = new ArrayList<>(); + List todo = new ArrayList<>(types); + + while (!todo.isEmpty()) { + TypeMirror type = todo.remove(todo.size() - 1); + + if (type.getKind() == DECLARED) { + DeclaredType dt = (DeclaredType) type; + result.add((TypeElement) dt.asElement()); + todo.addAll(dt.getTypeArguments()); + } + } + + return result; } public static final class PreviewSummary { @@ -3081,29 +3083,40 @@ public PreviewSummary(Set previewAPI, Set reflectivePr public String toString() { return "PreviewSummary{" + "previewAPI=" + previewAPI + ", reflectivePreviewAPI=" + reflectivePreviewAPI + ", declaredUsingPreviewFeature=" + declaredUsingPreviewFeature + '}'; } - + } - public PreviewAPIType getPreviewAPIType(Element el) { - //TODO: PREVIEW+DECLARED_USING_PREVIEW? - if (!previewLanguageFeaturesUsed(el).isEmpty()) { - return PreviewAPIType.DECLARED_USING_PREVIEW; + /** + * Checks whether the given Element should be marked as a preview API. + * + * Note that is a type is marked as a preview, its members are not. + * + * @param el the element to check + * @return true if and only if the given element should be marked as a preview API + */ + public boolean isPreviewAPI(Element el) { + boolean parentPreviewAPI = false; + Element enclosing = el.getEnclosingElement(); + if (enclosing != null && (enclosing.getKind().isClass() || enclosing.getKind().isInterface())) { + parentPreviewAPI = configuration.workArounds.isPreviewAPI(el.getEnclosingElement()); } - return configuration.workArounds.getPreviewAPIType(el); + boolean previewAPI = configuration.workArounds.isPreviewAPI(el); + return !parentPreviewAPI && previewAPI; } - public enum PreviewAPIType { - STANDARD, - REFLECTIVE, - PREVIEW, - DECLARED_USING_PREVIEW; + public boolean isReflectivePreviewAPI(Element el) { + return isPreviewAPI(el) && configuration.workArounds.isReflectivePreviewAPI(el); } public Set elementFlags(Element el) { Set flags = EnumSet.noneOf(ElementFlag.class); PreviewSummary previewAPIs = declaredUsingPreviewAPIs(el); - if (!previewLanguageFeaturesUsed(el).isEmpty() || configuration.workArounds.getPreviewAPIType(el) != PreviewAPIType.STANDARD || !previewAPIs.previewAPI.isEmpty() || !previewAPIs.reflectivePreviewAPI.isEmpty() || !previewAPIs.declaredUsingPreviewFeature.isEmpty()) { + if (!previewLanguageFeaturesUsed(el).isEmpty() || + configuration.workArounds.isPreviewAPI(el) || + !previewAPIs.previewAPI.isEmpty() || + !previewAPIs.reflectivePreviewAPI.isEmpty() || + !previewAPIs.declaredUsingPreviewFeature.isEmpty()) { flags.add(ElementFlag.PREVIEW); } @@ -3114,14 +3127,4 @@ public enum ElementFlag { PREVIEW; } - public boolean isPreview(Element el) { - PreviewAPIType parentPreviewAPIType = PreviewAPIType.STANDARD; - Element enclosing = el.getEnclosingElement(); - if (enclosing != null && (enclosing.getKind().isClass() || enclosing.getKind().isInterface())) { - parentPreviewAPIType = getPreviewAPIType(el.getEnclosingElement()); - } - PreviewAPIType previewAPIType = getPreviewAPIType(el); - return parentPreviewAPIType == PreviewAPIType.STANDARD && - (previewAPIType == PreviewAPIType.PREVIEW || previewAPIType == PreviewAPIType.REFLECTIVE); - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java index 77224719cc253..d3ba8cd244d6d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkInfo.java @@ -110,13 +110,6 @@ public abstract class LinkInfo { */ public boolean linkToSelf = true; - /** - * By default, the target of the link should be checked if it is a preview API. - * However, for record supertype (java.lang.Record), do not mark the supertype - * as preview. - */ - public boolean checkPreviewAPI = true; - /** * Return an empty instance of a content object. * From 79b89dda0e0bd074097ef183c932ba09e63ee84d Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 14 Oct 2020 12:28:03 +0200 Subject: [PATCH 11/42] Fixing tests. --- .../doclets/formats/html/ClassWriterImpl.java | 6 +- .../formats/html/HtmlDocletWriter.java | 3 +- .../internal/doclets/toolkit/util/Utils.java | 3 +- .../TestDeclaredUsingPreview.java | 38 +++++++---- .../m/pkg/TestPreviewDeclaration.java | 3 +- .../m/pkg/TestPreviewDeclarationUse.java | 4 -- .../testRecordLinks/TestRecordLinks.java | 2 +- .../testRecordTypes/TestRecordTypes.java | 12 ++-- .../testSealedTypes/TestSealedTypes.java | 66 +++++++++---------- .../jdk/javadoc/tool/CheckResourceKeys.java | 3 + 10 files changed, 78 insertions(+), 62 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 3ddf121381cb2..714597a6aa8bc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -199,14 +199,14 @@ public void addClassSignature(String modifiers, Content classInfoTree) { Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); String sep = null; - for (String modifiersPart : modifiers.split(" ")) { + for (String modifiersPart : modifiers.split(" ")) { //TODO: annotations? if (sep != null) { pre.add(sep); } - if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart)) { + if ("record".equals(modifiersPart) || + "sealed".equals(modifiersPart) || "non-sealed".equals(modifiersPart)) { pre.add(modifiersPart); pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", contents.previewMark))); - pre.add(" "); } else { pre.add(modifiersPart); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index c0bb014fad1b7..d496526c5af6b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -682,7 +682,8 @@ public Content getPackageLink(PackageElement packageElement, Content label) { * @return a content for the module link */ public Content getModuleLink(ModuleElement mdle, Content label) { - Set flags = utils.elementFlags(mdle); + Set flags = mdle != null ? utils.elementFlags(mdle) + : EnumSet.noneOf(ElementFlag.class); boolean included = utils.isIncluded(mdle); if (included) { DocLink targetLink = new DocLink(pathToRoot.resolve(docPaths.moduleSummary(mdle))); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 55f92e1287f26..fbe24d56723bb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -2964,7 +2964,8 @@ public Set previewLanguageFeaturesUsed(Eleme result.add(DeclarationPreviewLanguageFeatures.RECORD); } - if (e.getModifiers().contains(Modifier.SEALED)) { + if ((e.getKind().isClass() || e.getKind().isInterface()) && + e.getModifiers().contains(Modifier.SEALED)) { List permits = ((TypeElement) e).getPermittedSubclasses(); boolean hasLinkablePermits = permits.stream() .anyMatch(t -> isLinkable(asTypeElement(t))); diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java index 6904000f84df4..1c9b560fef492 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java @@ -27,11 +27,14 @@ * @summary test generated docs for items declared using preview * @library ../../lib * @modules jdk.javadoc/jdk.javadoc.internal.tool + * jdk.javadoc/jdk.javadoc.internal.doclets.formats.html.resources:+open * @build javadoc.tester.* * @run main TestDeclaredUsingPreview */ import java.nio.file.Paths; +import java.text.MessageFormat; +import java.util.ResourceBundle; import javadoc.tester.JavadocTester; public class TestDeclaredUsingPreview extends JavadocTester { @@ -43,27 +46,38 @@ public static void main(String... args) throws Exception { @Test public void test() { + String doc = "file://" + Paths.get(testSrc, "doc").toAbsolutePath().toString(); javadoc("-d", "out", "-XDforcePreview", "--enable-preview", "-source", System.getProperty("java.specification.version"), "--patch-module", "java.base=" + Paths.get(testSrc, "api").toAbsolutePath().toString(), "--add-exports", "java.base/preview=m", "--module-source-path", testSrc, + "-linkoffline", doc, doc, "m/pkg"); checkExit(Exit.OK); - checkOutput("m/pkg/TestPreviewDeclaration.html", true, - ""); + ResourceBundle bundle = ResourceBundle.getBundle("jdk.javadoc.internal.doclets.formats.html.resources.standard", ModuleLayer.boot().findModule("jdk.javadoc").get()); + + { + String zero = MessageFormat.format(bundle.getString("doclet.PreviewLeadingNote"), "TestPreviewDeclaration"); + String one = MessageFormat.format(bundle.getString("doclet.Declared_Using_Preview"), "TestPreviewDeclaration", "Sealed Classes", "sealed"); + String two = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote1"), "TestPreviewDeclaration"); + String three = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote2"), new Object[0]); + String expectedTemplate = """ +

{0} +
    +
  • {1}
  • +
+
{2}
+
{3}
+
"""; + String expected = MessageFormat.format(expectedTemplate, zero, one, two, three); + checkOutput("m/pkg/TestPreviewDeclaration.html", true, expected); + } + checkOutput("m/pkg/TestPreviewDeclarationUse.html", true, - ""); - checkOutput("m/pkg/TestPreviewDeclarationUse.Impl.html", false, - ""); - checkOutput("m/pkg/TestPreviewDeclarationUse.Impl.html", true, - ""); + "TestPreviewDeclarationPREVIEW"); checkOutput("m/pkg/TestPreviewAPIUse.html", true, - "CorePREVIEW"); } } diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java index 35a379e22cd25..3a2362168c8e7 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java @@ -23,5 +23,6 @@ package pkg; -public record TestPreviewDeclaration(int i) { +public sealed interface TestPreviewDeclaration permits Impl { } +class Impl implements TestPreviewDeclaration {} diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java index 29c5ec96418a7..a28d0f5922ca5 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java @@ -27,8 +27,4 @@ public class TestPreviewDeclarationUse { public TestPreviewDeclaration field; - public sealed interface Sealed {} - public static final class Impl implements Sealed {} - public enum E { A; } - } diff --git a/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java b/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java index 44ec163163213..e2395594f129b 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java @@ -84,7 +84,7 @@ public void bar() { } """, """ + JavadocTest.BarPREVIEW """); checkOutput("example/JavadocTest.Bar.html", true, diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index 9fe92eb43823b..b5345fdadd824 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -77,7 +77,7 @@ public void testRecordKeywordUnnamedPackage(Path base) throws IOException { """

Record R

""", """ - public record R""", + public recordPREVIEW R""", """ R​(int r1)"""); } @@ -99,7 +99,7 @@ public void testRecordKeywordNamedPackage(Path base) throws IOException { """

Record R

""", """ - public record R""", + public recordPREVIEW R""", """ R​(int r1)"""); } @@ -121,7 +121,7 @@ public void testEmptyRecord(Path base) throws IOException { """

Record R

""", """ - public record R""", + public recordPREVIEW R""", """ R()"""); } @@ -147,7 +147,7 @@ public record R(int r1) { }"""); """

Record R

""", """ - public record R""", + public recordPREVIEW R""", """
Record Components:
@@ -179,7 +179,7 @@ public record R(int r1) { }"""); """

Record R<T>

""", """ - public record R<T>""", + public recordPREVIEW R<T>""", """
Type Parameters:
@@ -483,7 +483,7 @@ void testAnnotations(Path base, Set types) throws IOException { checkOutput("p/R.html", true, """ -
public record R("""
+                    
public recordPREVIEW R("""
                         + rcAnno
                         + """
                             int i)
diff --git a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
index aa6d8c9629d13..6ce96eeef35c4 100644
--- a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
+++ b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
@@ -59,7 +59,7 @@ public void testSealedModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed class A");
+                "public sealedPREVIEW class A");
     }
 
     @Test
@@ -75,7 +75,7 @@ public void testSealedModifierInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed interface A");
+                "public sealedPREVIEW interface A");
     }
 
     @Test
@@ -92,10 +92,10 @@ public void testNonSealedModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed class A");
+                "public sealedPREVIEW class A");
 
         checkOutput("p/B.html", true,
-                "public non-sealed class B");
+                "public non-sealedPREVIEW class B");
     }
 
     @Test
@@ -112,10 +112,10 @@ public void testNonSealedModifierInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed interface A");
+                "public sealedPREVIEW interface A");
 
         checkOutput("p/B.html", true,
-                "public non-sealed interface B");
+                "public non-sealedPREVIEW interface B");
     }
 
     @Test
@@ -132,10 +132,10 @@ public void testSealedSubtypeModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed class A");
+                "public sealedPREVIEW class A");
 
         checkOutput("p/B.html", true,
-                "public abstract sealed class B");
+                "public abstract sealedPREVIEW class B");
     }
 
     @Test
@@ -152,10 +152,10 @@ public void testSealedSubtypeInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealed interface A");
+                "public sealedPREVIEW interface A");
 
         checkOutput("p/B.html", true,
-                "public sealed interface B");
+                "public sealedPREVIEW interface B");
     }
 
     @Test
@@ -172,9 +172,9 @@ public void testSinglePermits(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B
"); + + "permitsPREVIEW BPREVIEW
"); } @Test @@ -193,11 +193,11 @@ public void testMultiplePermits(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B, "
-                + "C, "
-                + "D
"); + + "permitsPREVIEW BPREVIEW, " + + "CPREVIEW, " + + "DPREVIEW
"); } @Test @@ -216,10 +216,10 @@ public void testPartialMultiplePermits(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B, "
-                + "C "
+                + "permitsPREVIEW BPREVIEW, "
+                + "CPREVIEW "
                 + "(not exhaustive)
"); } @@ -241,10 +241,10 @@ public void testPartialMultiplePermitsWithSubtypes1(Path base) throws IOExceptio checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B, "
-                + "C, p.D
"); + + "permitsPREVIEW BPREVIEW, " + + "CPREVIEW, p.D
"); } @Test @@ -265,10 +265,10 @@ public void testPartialMultiplePermitsWithSubtypes2(Path base) throws IOExceptio checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B, "
-                + "C "
+                + "permitsPREVIEW BPREVIEW, "
+                + "CPREVIEW "
                 + "(not exhaustive)
"); } @@ -289,11 +289,11 @@ public void testImplicitPermitsAuxiliary(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits B, "
-                + "C, "
-                + "D
"); + + "permitsPREVIEW BPREVIEW, " + + "CPREVIEW, " + + "DPREVIEW
"); } @Test @@ -313,10 +313,10 @@ public void testImplicitPermitsNested(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealed class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permits A.B, "
-                + "A.C, "
-                + "A.D
"); + + "permitsPREVIEW A.BPREVIEW, " + + "A.CPREVIEW, " + + "A.DPREVIEW
"); } } diff --git a/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java b/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java index 302313a1038e5..46ea803f5d5d7 100644 --- a/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java +++ b/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java @@ -149,6 +149,9 @@ void findDeadKeys(Set codeKeys, Set resourceKeys) { // ignore these synthesized keys, tested by usageTests if (rk.matches("main\\.opt\\..*\\.(arg|desc)")) continue; + // ignore this partial key + if (rk.startsWith("doclet.Declared_Using_Preview.")) + continue; if (codeKeys.contains(rk)) continue; From 1425c230467cb6df85f10deab5a3c870a9a5c9df Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 14 Oct 2020 15:09:31 +0200 Subject: [PATCH 12/42] More cleanup. --- .../formats/html/HtmlDocletWriter.java | 143 ++++++++---------- .../html/resources/standard.properties | 8 +- .../doclets/toolkit/resources/stylesheet.css | 2 +- .../internal/doclets/toolkit/util/Utils.java | 12 +- .../TestDeclaredUsingPreview.java | 2 +- 5 files changed, 77 insertions(+), 90 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index d496526c5af6b..87013646bd571 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -38,7 +38,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.function.BiConsumer; +import java.util.stream.Collectors; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -120,13 +120,8 @@ import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.TEXT; -import static javax.lang.model.element.ElementKind.CLASS; -import static javax.lang.model.element.ElementKind.ENUM; -import static javax.lang.model.element.ElementKind.ENUM_CONSTANT; -import static javax.lang.model.element.ElementKind.INTERFACE; -import static javax.lang.model.element.ElementKind.METHOD; import static javax.lang.model.element.ElementKind.PACKAGE; -import static javax.lang.model.element.ElementKind.RECORD; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; @@ -2215,7 +2210,8 @@ public void addPreviewSummary(Element forWhat, Content target) { DocTree previewTree = utils.getPreviewTree(forWhat); Content div = HtmlTree.DIV(HtmlStyle.block); if (previewTree != null) { - div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).first))); + div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, + utils.getPreviewTreeSummaryOrDetails(previewTree, true))); } else { div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); } @@ -2229,19 +2225,31 @@ public void addPreviewInfo(Element forWhat, Content target) { HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); DocTree previewTree = utils.getPreviewTree(forWhat); if (previewTree != null) { - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(new RawHtml(utils.getPreviewTreeSummaryAndDetails(previewTree).second))); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") + .add(utils.getPreviewTreeSummaryOrDetails(previewTree, false))); } else { - String name = switch (forWhat.getKind()) { - case PACKAGE, MODULE -> ((QualifiedNameable) forWhat).getQualifiedName().toString(); - case CONSTRUCTOR -> ((TypeElement) forWhat.getEnclosingElement()).getSimpleName().toString(); - default -> forWhat.getSimpleName().toString(); - }; + String name = (switch (forWhat.getKind()) { + case PACKAGE, MODULE -> + ((QualifiedNameable) forWhat).getQualifiedName(); + case CONSTRUCTOR -> + ((TypeElement) forWhat.getEnclosingElement()).getSimpleName(); + default -> forWhat.getSimpleName(); + }).toString(); boolean isReflectivePreview = utils.isReflectivePreviewAPI(forWhat); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(resources.getText(!isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote", name))))); + String leadingNoteKey = + !isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" + : "doclet.ReflectivePreviewPlatformLeadingNote"; + RawHtml leadingNote = + new RawHtml(resources.getText(leadingNoteKey, name)); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") + .add(HtmlTree.SPAN(HtmlStyle.previewLabel, + leadingNote))); if (!isReflectivePreview) { - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)))); + RawHtml note1 = new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); } - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)))); + RawHtml note2 = new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note2)); } target.add(previewDiv); } else if (forWhat.getKind().isClass() || forWhat.getKind().isInterface()) { @@ -2250,15 +2258,24 @@ public void addPreviewInfo(Element forWhat, Content target) { if (!previewNotes.isEmpty()) { Name name = forWhat.getSimpleName(); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview").add(HtmlTree.SPAN(HtmlStyle.previewLabel, new RawHtml(resources.getText("doclet.PreviewLeadingNote", name))))); + RawHtml leadingNote = new RawHtml(resources.getText("doclet.PreviewLeadingNote", name)); + previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") + .add(HtmlTree.SPAN(HtmlStyle.previewLabel, + leadingNote))); HtmlTree ul = new HtmlTree(TagName.UL); ul.setStyle(HtmlStyle.previewComment); for (Content note : previewNotes) { ul.add(HtmlTree.LI(note)); } previewDiv.add(ul); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)))); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)))); + RawHtml note1 = + new RawHtml(resources.getText("doclet.PreviewTrailingNote1", + name)); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); + RawHtml note2 = + new RawHtml(resources.getText("doclet.PreviewTrailingNote2", + name)); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note2)); target.add(previewDiv); } } @@ -2293,78 +2310,46 @@ private List getPreviewNotes(TypeElement el) { previewLanguageFeatures.remove(DeclarationPreviewLanguageFeatures.SEALED); } for (DeclarationPreviewLanguageFeatures feature : previewLanguageFeatures) { - result.add(injectPreviewFeatures("doclet.Declared_Using_Preview", className, resources.getText("doclet.Declared_Using_Preview." + feature.name()), feature.features)); + String featureDisplayName = + resources.getText("doclet.Declared_Using_Preview." + feature.name()); + String featureCodes = + feature.features + .stream() + .map(f -> "" + f + "") + .collect(Collectors.joining(", ")); + String text = + resources.getText("doclet.Declared_Using_Preview", + className, + featureDisplayName, + featureCodes); + result.add(new RawHtml(text)); } } if (!declaredUsingPreviewFeature.isEmpty()) { - result.add(injectLinks("doclet.UsesDeclaredUsingPreview", className, declaredUsingPreviewFeature)); + result.add(withLinks("doclet.UsesDeclaredUsingPreview", className, declaredUsingPreviewFeature)); } if (!previewAPI.isEmpty()) { - result.add(injectLinks("doclet.PreviewAPI", className, previewAPI)); + result.add(withLinks("doclet.PreviewAPI", className, previewAPI)); } if (!reflectivePreviewAPI.isEmpty()) { - result.add(injectLinks("doclet.ReflectivePreviewAPI", className, reflectivePreviewAPI)); + result.add(withLinks("doclet.ReflectivePreviewAPI", className, reflectivePreviewAPI)); } return result; } - private static final Pattern PARAMETER = Pattern.compile("\\{([0-9])\\}"); - - private Content injectPreviewFeatures(String key, String className, String featureName, List features) { - String template = resources.getText(key); - return replaceParams(template, (param, result) -> { - switch (param) { - case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); - case "1" -> result.add(new HtmlTree(TagName.EM).add(featureName)); - case "2" -> { - String[] sep = new String[] {""}; - features.stream() - .forEach(c -> { - result.add(sep[0]); - result.add(HtmlTree.CODE(new ContentBuilder().add(c))); - sep[0] = ", "; - }); - } - } - }); - } - - private Content injectLinks(String key, String className, Set elements) { - String template = resources.getText(key); - return replaceParams(template, (param, result) -> { - switch (param) { - case "0" -> result.add(HtmlTree.CODE(new StringContent(className))); - case "1" -> { - String[] sep = new String[] {""}; - elements.stream() - .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + private Content withLinks(String key, String className, Set elements) { + return new RawHtml(resources.getText(key, className, elements.stream() + .sorted((te1, te2) -> te1.getSimpleName().toString() + .compareTo(te2.getSimpleName().toString())) .distinct() - .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).label(HtmlTree.CODE(new StringContent(te.getSimpleName()))).skipPreview(true))) - .forEach(c -> { - result.add(sep[0]); - result.add(c); - sep[0] = ", "; - }); - } - } - }); + .map(this::toLink) + .map(link -> getLink(link).toString()) + .collect(Collectors.joining(", ")))); } - private Content replaceParams(String template, BiConsumer fillParams) { - ContentBuilder result = new ContentBuilder(); - int lastEnd = 0; - Matcher m = PARAMETER.matcher(template); - - while (m.find()) { - result.add(template.substring(lastEnd, m.start())); - lastEnd = m.start(); - fillParams.accept(m.group(1), result); - lastEnd = m.end(); - } - - result.add(template.substring(lastEnd)); - - return result; + private LinkInfoImpl toLink(TypeElement te) { + return new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te) + .label(HtmlTree.CODE(new StringContent(te.getSimpleName()))) + .skipPreview(true); } - } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 0751653fe4706..e92c592477c60 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -271,10 +271,10 @@ doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: -doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). -doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. -doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. -doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. +doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). +doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. +doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. +doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. doclet.Declared_Using_Preview.RECORD=Records diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 678a180b763d6..aa799af1bfebe 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -700,7 +700,7 @@ ul.help-section-list { /* * Indicator icon for external links. */ -main a[href*="://"]:not()::after { +main a[href*="://"]::after { content:""; display:inline-block; background-image:url('data:image/svg+xml; utf8, \ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index fbe24d56723bb..1eb51c3583a16 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -126,6 +126,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.toolkit.Content; import static jdk.javadoc.internal.doclets.toolkit.builders.ConstantsSummaryBuilder.MAX_CONSTANT_VALUE_INDEX_LENGTH; @@ -2845,15 +2846,16 @@ public DocTree getPreviewTree(Element element) { .orElse(null); } - public Pair getPreviewTreeSummaryAndDetails(DocTree t) { - //TODO: handle broken trees: + public Content getPreviewTreeSummaryOrDetails(DocTree t, boolean summary) { UnknownInlineTagTree previewTag = (UnknownInlineTagTree) t; List previewContent = previewTag.getContent(); String previewText = ((TextTree) previewContent.get(0)).getBody(); String[] summaryAndDetails = previewText.split("\n\r?\n\r?"); - String summary = summaryAndDetails[0]; - String details = summaryAndDetails.length > 1 ? summaryAndDetails[1] : summaryAndDetails[0]; - return new Pair<>(summary, details); + String rawHTML = + summary ? summaryAndDetails[0] + : summaryAndDetails.length > 1 ? summaryAndDetails[1] + : summaryAndDetails[0]; + return new RawHtml(rawHTML); } public List getFirstSentenceTrees(Element element) { diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java index 1c9b560fef492..a03ac7e8f131d 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java @@ -60,7 +60,7 @@ public void test() { { String zero = MessageFormat.format(bundle.getString("doclet.PreviewLeadingNote"), "TestPreviewDeclaration"); - String one = MessageFormat.format(bundle.getString("doclet.Declared_Using_Preview"), "TestPreviewDeclaration", "Sealed Classes", "sealed"); + String one = MessageFormat.format(bundle.getString("doclet.Declared_Using_Preview"), "TestPreviewDeclaration", "Sealed Classes", "sealed"); String two = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote1"), "TestPreviewDeclaration"); String three = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote2"), new Object[0]); String expectedTemplate = """ From ca11180602644c8495b368c81360dd93b00a2e27 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 14 Oct 2020 15:17:19 +0200 Subject: [PATCH 13/42] Cleaning up whitespaces. --- .../internal/doclets/formats/html/ClassWriterImpl.java | 2 +- .../javadoc/internal/doclets/formats/html/LinkInfoImpl.java | 1 - .../doclets/formats/html/resources/standard.properties | 4 ++-- .../jdk/javadoc/internal/doclets/toolkit/util/Utils.java | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 714597a6aa8bc..310cff52ede56 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -327,7 +327,7 @@ public void addClassDescription(Content classInfoTree) { } } } - + private void addPreviewInfo(Content classInfoTree) { addPreviewInfo(typeElement, classInfoTree); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index efe9e7c0778c9..67693f2908605 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -256,7 +256,6 @@ public enum Kind { */ public String target = ""; public final Utils utils; - /** * Construct a LinkInfo object. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index e92c592477c60..c0d4ae8eae135 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -280,8 +280,8 @@ doclet.PreviewTrailingNote2=Preview features may be removed in a future release, doclet.Declared_Using_Preview.RECORD=Records doclet.Declared_Using_Preview.SEALED=Sealed Classes doclet.Declared_Using_Preview.SEALED_PERMITS=Sealed Classes -doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. -doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. +doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. +doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 1eb51c3583a16..bc5b61352fb65 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -2991,7 +2991,7 @@ public enum DeclarationPreviewLanguageFeatures { private DeclarationPreviewLanguageFeatures(List features) { this.features = features; } - + } @SuppressWarnings("preview") From 26dcc5bf25d336556a96706043c50d67a6df24cd Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 14 Oct 2020 18:59:15 +0200 Subject: [PATCH 14/42] Post-merge fix. --- .../internal/doclets/formats/html/PreviewListWriter.java | 7 ++----- .../internal/doclets/formats/html/markup/HtmlStyle.java | 6 ++++++ .../internal/doclets/toolkit/resources/stylesheet.css | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java index 722e4c8e3a975..7ef88da648582 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -45,8 +45,6 @@ import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; -import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; -import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder.DeprElementKind; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; @@ -343,11 +341,11 @@ protected void addPreviewAPI(SortedSet deprList, String id, String head String tableSummary, TableHeader tableHeader, Content contentTree) { if (deprList.size() > 0) { Content caption = contents.getContent(headingKey); - Table table = new Table(HtmlStyle.deprecatedSummary, HtmlStyle.summaryTable) + Table table = new Table(HtmlStyle.summaryTable) .setCaption(caption) .setHeader(tableHeader) .setId(id) - .setColumnStyles(HtmlStyle.colDeprecatedItemName, HtmlStyle.colLast); + .setColumnStyles(HtmlStyle.colPreviewItemName, HtmlStyle.colLast); for (Element e : deprList) { Content link; switch (e.getKind()) { @@ -377,7 +375,6 @@ protected void addPreviewAPI(SortedSet deprList, String id, String head } protected Content getPreviewLink(Element e) { - //XXX!!!XXX!!!XXX!!! AbstractMemberWriter writer; switch (e.getKind()) { case INTERFACE: diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 13d0c0332801d..d24ee33427510 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -446,6 +446,12 @@ public enum HtmlStyle { */ colLast, + /** + * The class of the cells in a table column used to display the name + * of a deprecated item. + */ + colPreviewItemName, + /** * The class of the second column of cells in a table. * This is typically the column that defines the name of a field or the diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index 00f3b35861368..c40279b7b4650 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -439,7 +439,7 @@ div.table-tabs > button.table-tab { text-align:left; padding: 8px 3px 3px 7px; } -.col-first, .col-second, .col-last, .col-constructor-name, .col-deprecated-item-name { +.col-first, .col-second, .col-last, .col-constructor-name, .col-deprecated-item-name, .col-preview-item-name { vertical-align:top; padding-right:0; padding-top:8px; From 6ba11d659b61d5921fe68ff7d3d16d57c929f674 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 14 Oct 2020 21:18:30 +0200 Subject: [PATCH 15/42] Updating build. --- make/autoconf/spec.gmk.in | 3 +++ make/modules/jdk.compiler/Gendata.gmk | 1 - make/modules/jdk.javadoc/Gendata.gmk | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in index 256aec155ae21..907f8d55a98f6 100644 --- a/make/autoconf/spec.gmk.in +++ b/make/autoconf/spec.gmk.in @@ -654,6 +654,8 @@ INTERIM_LANGTOOLS_ADD_EXPORTS := \ --add-exports java.base/jdk.internal.jmod=jdk.compiler.interim \ --add-exports java.base/jdk.internal.misc=jdk.compiler.interim \ --add-exports java.base/sun.invoke.util=jdk.compiler.interim \ + --add-exports java.base/jdk.internal.javac=java.compiler.interim \ + --add-exports java.base/jdk.internal.javac=jdk.compiler.interim \ # INTERIM_LANGTOOLS_MODULES_COMMA := $(strip $(subst $(SPACE),$(COMMA),$(strip \ $(INTERIM_LANGTOOLS_MODULES)))) @@ -661,6 +663,7 @@ INTERIM_LANGTOOLS_ARGS := \ --limit-modules java.base,jdk.zipfs,$(INTERIM_LANGTOOLS_MODULES_COMMA) \ --add-modules $(INTERIM_LANGTOOLS_MODULES_COMMA) \ --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \ + --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ $(INTERIM_LANGTOOLS_ADD_EXPORTS) \ # JAVAC_MAIN_CLASS = -m jdk.compiler.interim/com.sun.tools.javac.Main diff --git a/make/modules/jdk.compiler/Gendata.gmk b/make/modules/jdk.compiler/Gendata.gmk index 275470ce60050..198c12ef0242b 100644 --- a/make/modules/jdk.compiler/Gendata.gmk +++ b/make/modules/jdk.compiler/Gendata.gmk @@ -60,7 +60,6 @@ $(eval $(call SetupJavaCompilation, COMPILE_CREATE_SYMBOLS, \ DISABLED_WARNINGS := options, \ JAVAC_FLAGS := \ $(INTERIM_LANGTOOLS_ARGS) \ - --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ $(COMPILECREATESYMBOLS_ADD_EXPORTS), \ )) diff --git a/make/modules/jdk.javadoc/Gendata.gmk b/make/modules/jdk.javadoc/Gendata.gmk index 5b4485808c7ca..757a6eb10bde0 100644 --- a/make/modules/jdk.javadoc/Gendata.gmk +++ b/make/modules/jdk.javadoc/Gendata.gmk @@ -58,7 +58,6 @@ $(eval $(call SetupJavaCompilation, COMPILE_CREATE_SYMBOLS, \ DISABLED_WARNINGS := options, \ JAVAC_FLAGS := \ $(INTERIM_LANGTOOLS_ARGS) \ - --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ $(COMPILECREATESYMBOLS_ADD_EXPORTS), \ )) From 994cc72d05f05b99b531adcabbc03e4dc58ed7a9 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 15 Oct 2020 09:29:15 +0200 Subject: [PATCH 16/42] Adding forgotten files. --- .../javadoc/doclet/testDeclaredUsingPreview/doc/element-list | 2 ++ .../testDeclaredUsingPreview/doc/java.base/preview/Core.html | 0 .../doc/java.base/preview/Reflective.html | 0 3 files changed, 2 insertions(+) create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Core.html create mode 100644 test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Reflective.html diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list new file mode 100644 index 0000000000000..c59f8fc41e316 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list @@ -0,0 +1,2 @@ +module:java.base +preview diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Core.html b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Core.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Reflective.html b/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Reflective.html new file mode 100644 index 0000000000000..e69de29bb2d1d From ca78e894e8f1ac9d52499aa9409ff4b00edf30bf Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 15 Oct 2020 09:46:01 +0200 Subject: [PATCH 17/42] Fixing tests. --- .../share/classes/jdk/internal/loader/URLClassPath.java | 1 - .../CantExtendSealedInAnotherModule.java | 2 +- .../CantExtendSealedInAnotherPkg.java | 2 +- test/langtools/tools/javac/enum/FauxEnum3-preview.out | 4 ++++ test/langtools/tools/javac/enum/FauxEnum3.java | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 test/langtools/tools/javac/enum/FauxEnum3-preview.out diff --git a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java index a3336f75489d2..4640b5b3a7dcf 100644 --- a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java +++ b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java @@ -452,7 +452,6 @@ private synchronized Loader getLoader(int index) { push(urls); } } catch (IOException e) { - e.printStackTrace(); // Silently ignore for now... continue; } catch (SecurityException se) { diff --git a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java index d01cfe215905c..c30859543186f 100644 --- a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java +++ b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java @@ -22,6 +22,6 @@ */ // key: compiler.err.class.in.module.cant.extend.sealed.in.diff.module -// key: compiler.note.preview.filename +// key: compiler.note.preview.plural // key: compiler.note.preview.recompile // options: --add-reads mSealed=mSub --enable-preview -source ${jdk.version} diff --git a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java index 26cb9b0583f40..ea46b91ed6cec 100644 --- a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java +++ b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java @@ -22,6 +22,6 @@ */ // key: compiler.err.class.in.unnamed.module.cant.extend.sealed.in.diff.package -// key: compiler.note.preview.filename +// key: compiler.note.preview.plural // key: compiler.note.preview.recompile // options: --enable-preview -source ${jdk.version} diff --git a/test/langtools/tools/javac/enum/FauxEnum3-preview.out b/test/langtools/tools/javac/enum/FauxEnum3-preview.out new file mode 100644 index 0000000000000..79a3e388a447c --- /dev/null +++ b/test/langtools/tools/javac/enum/FauxEnum3-preview.out @@ -0,0 +1,4 @@ +FauxEnum3.java:11:14: compiler.err.enum.types.not.extensible +- compiler.note.preview.filename: FauxEnum3.java, DEFAULT +- compiler.note.preview.recompile +1 error \ No newline at end of file diff --git a/test/langtools/tools/javac/enum/FauxEnum3.java b/test/langtools/tools/javac/enum/FauxEnum3.java index 83bb06f80ee8d..cd1790cc99dee 100644 --- a/test/langtools/tools/javac/enum/FauxEnum3.java +++ b/test/langtools/tools/javac/enum/FauxEnum3.java @@ -5,7 +5,7 @@ * @author Joseph D. Darcy * * @compile/fail/ref=FauxEnum3.out -XDrawDiagnostics FauxEnum3.java - * @compile/fail/ref=FauxEnum3.out -XDrawDiagnostics --enable-preview -source ${jdk.version} FauxEnum3.java + * @compile/fail/ref=FauxEnum3-preview.out -XDrawDiagnostics --enable-preview -source ${jdk.version} FauxEnum3.java */ public final class FauxEnum3 extends SpecializedEnum {} From 42b5add3d24eac8c8bf4aec22d163ca62c07ac00 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 15 Oct 2020 11:37:23 +0200 Subject: [PATCH 18/42] No, jdk.incubator.vector does not need jdk.internal package. --- src/java.base/share/classes/module-info.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 7f64725509c05..e9a8eea29b43a 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -142,8 +142,6 @@ java.compiler, jdk.compiler, jdk.jshell; - exports jdk.internal to // for @HotSpotIntrinsicCandidate - jdk.incubator.vector; exports jdk.internal.access to java.desktop, java.logging, From 2d179d69ea1ce8f01fd3bfcf5eb538e1317f0b37 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 15 Oct 2020 12:58:09 +0200 Subject: [PATCH 19/42] There is not jdk.internal package anymore --- test/jdk/java/lang/ref/CleanerTest.java | 3 +-- test/jdk/java/util/Arrays/TimSortStackSize2.java | 1 - test/langtools/tools/javac/patterns/BreakAndLoops.java | 1 - test/langtools/tools/javac/patterns/ConditionalTest.java | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/test/jdk/java/lang/ref/CleanerTest.java b/test/jdk/java/lang/ref/CleanerTest.java index 1190d7928acc7..49cb9a227722d 100644 --- a/test/jdk/java/lang/ref/CleanerTest.java +++ b/test/jdk/java/lang/ref/CleanerTest.java @@ -55,8 +55,7 @@ * jdk.test.lib.JDKToolLauncher * jdk.test.lib.Platform * jdk.test.lib.process.* - * @modules java.base/jdk.internal - * java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc * java.base/jdk.internal.ref * java.management * @run driver ClassFileInstaller sun.hotspot.WhiteBox diff --git a/test/jdk/java/util/Arrays/TimSortStackSize2.java b/test/jdk/java/util/Arrays/TimSortStackSize2.java index f0ad7318f912d..ecb17268e5b3f 100644 --- a/test/jdk/java/util/Arrays/TimSortStackSize2.java +++ b/test/jdk/java/util/Arrays/TimSortStackSize2.java @@ -27,7 +27,6 @@ * @summary Test TimSort stack size on big arrays * @library /test/lib * @modules java.management - * java.base/jdk.internal * @requires (vm.debug == false) * @build TimSortStackSize2 * @run driver ClassFileInstaller sun.hotspot.WhiteBox diff --git a/test/langtools/tools/javac/patterns/BreakAndLoops.java b/test/langtools/tools/javac/patterns/BreakAndLoops.java index 01d3bb70540b1..2cd65e5c3bdd7 100644 --- a/test/langtools/tools/javac/patterns/BreakAndLoops.java +++ b/test/langtools/tools/javac/patterns/BreakAndLoops.java @@ -27,7 +27,6 @@ * @summary Verify proper scope of binding related to loops and breaks. * @library /tools/lib /tools/javac/lib * @modules - * java.base/jdk.internal * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main diff --git a/test/langtools/tools/javac/patterns/ConditionalTest.java b/test/langtools/tools/javac/patterns/ConditionalTest.java index 828fabfb828c7..645378a993b38 100644 --- a/test/langtools/tools/javac/patterns/ConditionalTest.java +++ b/test/langtools/tools/javac/patterns/ConditionalTest.java @@ -27,7 +27,6 @@ * @summary Verify proper scope of binding related to loops and breaks. * @library /tools/lib /tools/javac/lib * @modules - * java.base/jdk.internal * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main From d23d55b7915c4ba7def03518d784f5d23f1b2d32 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 16 Oct 2020 12:41:52 +0200 Subject: [PATCH 20/42] The Preview taglet is not needed anymore. --- .../classes/build/tools/taglet/Preview.java | 79 ------------------- 1 file changed, 79 deletions(-) delete mode 100644 make/jdk/src/classes/build/tools/taglet/Preview.java diff --git a/make/jdk/src/classes/build/tools/taglet/Preview.java b/make/jdk/src/classes/build/tools/taglet/Preview.java deleted file mode 100644 index 78285b10de6fd..0000000000000 --- a/make/jdk/src/classes/build/tools/taglet/Preview.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package build.tools.taglet; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; -import javax.lang.model.element.Element; -import com.sun.source.doctree.DocTree; -import com.sun.source.doctree.TextTree; -import com.sun.source.doctree.UnknownInlineTagTree; -import jdk.javadoc.doclet.Taglet; -import static jdk.javadoc.doclet.Taglet.Location.*; - -/** - * An block tag to insert a standard warning about a preview API. - */ -public class Preview implements Taglet { - - /** Returns the set of locations in which a taglet may be used. */ - @Override - public Set getAllowedLocations() { - return EnumSet.of(MODULE, PACKAGE, TYPE, CONSTRUCTOR, METHOD, FIELD); - } - - @Override - public boolean isInlineTag() { - return true; - } - - @Override - public String getName() { - return "preview"; - } - - @Override - public String toString(List tags, Element elem) { - UnknownInlineTagTree previewTag = (UnknownInlineTagTree) tags.get(0); - List previewContent = previewTag.getContent(); - String previewText = ((TextTree) previewContent.get(0)).getBody(); - String[] summaryAndDetails = previewText.split("\n\r?\n\r?"); - String summary = summaryAndDetails[0]; - String details = summaryAndDetails.length > 1 ? summaryAndDetails[1] : summaryAndDetails[0]; - StackTraceElement[] stackTrace = new Exception().getStackTrace(); - Predicate isSummary = - el -> el.getClassName().endsWith("HtmlDocletWriter") && - el.getMethodName().equals("addSummaryComment"); - if (Arrays.stream(stackTrace).anyMatch(isSummary)) { - return "
" + summary + "

"; - } - return "

Preview

" + details + "

"; - } -} - From c50d5ec5295ffd998a9614cb31d93f34eb822e65 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 16 Oct 2020 14:10:59 +0200 Subject: [PATCH 21/42] Various cleanup. --- .../com/sun/tools/javac/comp/Check.java | 2 +- .../com/sun/tools/javac/file/FSInfo.java | 4 +- .../doclets/formats/html/ClassWriterImpl.java | 2 +- .../formats/html/HtmlDocletWriter.java | 21 +++-- .../doclets/formats/html/LinkFactoryImpl.java | 7 +- .../toolkit/builders/EnumConstantBuilder.java | 1 - .../toolkit/builders/FieldBuilder.java | 1 - .../toolkit/builders/MethodBuilder.java | 1 - .../internal/doclets/toolkit/util/Utils.java | 78 +++++++++++++++---- .../javadoc/internal/tool/ElementsTable.java | 3 +- .../TestPreview.java} | 13 +++- .../api/preview/Core.java | 0 .../api/preview/Reflective.java | 0 .../doc/element-list | 0 .../doc/java.base/preview/Core.html | 0 .../doc/java.base/preview/Reflective.html | 0 .../m/module-info.java | 0 .../testPreview/m/pkg/DocAnnotation.java | 35 +++++++++ .../testPreview/m/pkg/DocAnnotationUse1.java | 28 +++++++ .../testPreview/m/pkg/DocAnnotationUse2.java | 28 +++++++ .../m/pkg/TestPreviewAPIUse.java | 0 .../m/pkg/TestPreviewDeclaration.java | 0 .../m/pkg/TestPreviewDeclarationUse.java | 0 23 files changed, 188 insertions(+), 36 deletions(-) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview/TestDeclaredUsingPreview.java => testPreview/TestPreview.java} (86%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/api/preview/Core.java (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/api/preview/Reflective.java (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/doc/element-list (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/doc/java.base/preview/Core.html (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/doc/java.base/preview/Reflective.html (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/m/module-info.java (100%) create mode 100644 test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java create mode 100644 test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java create mode 100644 test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/m/pkg/TestPreviewAPIUse.java (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/m/pkg/TestPreviewDeclaration.java (100%) rename test/langtools/jdk/javadoc/doclet/{testDeclaredUsingPreview => testPreview}/m/pkg/TestPreviewDeclarationUse.java (100%) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 38dc62a392521..c421d1d6ba71a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -3554,7 +3554,7 @@ void checkPreview(DiagnosticPosition pos, Symbol other, Symbol s) { } if (declaredUsingPreviewFeature(s)) { if (preview.isEnabled()) { - //for preview disabled do presumably do not need to do anything? + //for preview disabled do presumably so not need to do anything? //If "s" is compiled from source, then there was an error for it already; //if "s" is from classfile, there already was an error for the classfile. preview.markUsesPreview(pos); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java index 6c620f4268bf0..ab0d3d8e3fd32 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java @@ -119,8 +119,8 @@ public List getJarClassPath(Path file) throws IOException { if (url != null) { list.add(Path.of(url.toURI())); } - } catch (URISyntaxException | MalformedURLException ex) { - //ignored per the jar file specification + } catch (URISyntaxException ex) { + throw new IOException(ex); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 310cff52ede56..eebcfa22ed140 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -199,7 +199,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { Content pre = new HtmlTree(TagName.PRE); addAnnotationInfo(typeElement, pre); String sep = null; - for (String modifiersPart : modifiers.split(" ")) { //TODO: annotations? + for (String modifiersPart : modifiers.split(" ")) { if (sep != null) { pre.add(sep); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 87013646bd571..f8be3090c0f63 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -654,7 +654,6 @@ public Content getPackageLink(PackageElement packageElement, Content label) { targetLink = getCrossPackageLink(packageElement); } if (targetLink != null) { - //TODO: external if (flags.contains(ElementFlag.PREVIEW)) { return new ContentBuilder( links.createLink(targetLink, label), @@ -664,7 +663,12 @@ public Content getPackageLink(PackageElement packageElement, Content label) { } return links.createLink(targetLink, label); } else { - //TODO: PREVIEW + if (flags.contains(ElementFlag.PREVIEW)) { + return new ContentBuilder( + label, + new HtmlTree(TagName.SUP).add(contents.previewMark) + ); + } return label; } } @@ -692,7 +696,12 @@ public Content getModuleLink(ModuleElement mdle, Content label) { } return link; } - //TODO: preview + if (flags.contains(ElementFlag.PREVIEW)) { + return new ContentBuilder( + label, + new HtmlTree(TagName.SUP).add(contents.previewMark) + ); + } return label; } @@ -1297,7 +1306,7 @@ private void addCommentTags(Element element, DocTree holderTag, List diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 2dcb33bc0ed7b..f24837952ceca 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -29,7 +29,6 @@ import java.util.EnumSet; import java.util.List; import java.util.Set; -import java.util.function.Function; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -39,8 +38,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; @@ -49,7 +46,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; -import jdk.javadoc.internal.doclets.toolkit.util.Utils; import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkFactory; import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo; @@ -148,6 +144,9 @@ protected Content getClassLink(LinkInfo linkInfo) { } // Can't link so just write label. link.add(label); + if (flags.contains(ElementFlag.PREVIEW)) { + link.add(new HtmlTree(TagName.SUP).add(m_writer.contents.previewMark)); + } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java index 73a2d2e4b3b07..ef0a263e06e0c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java @@ -30,7 +30,6 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; -import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java index 5b85918ea302d..92873461e247c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java @@ -30,7 +30,6 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; -import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java index 83451d77af5e0..26f986a677468 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java @@ -31,7 +31,6 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; -import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Content; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 2ef5d8ba03a47..fa6df02af70d2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -99,6 +99,7 @@ import com.sun.source.doctree.StartElementTree; import com.sun.source.doctree.TextTree; import com.sun.source.doctree.UnknownBlockTagTree; +import com.sun.source.doctree.UnknownInlineTagTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.LineMap; import com.sun.source.util.DocSourcePositions; @@ -119,15 +120,8 @@ import static javax.lang.model.type.TypeKind.*; import static com.sun.source.doctree.DocTree.Kind.*; -import com.sun.source.doctree.UnknownInlineTagTree; -import java.util.function.Function; -import jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter; -import jdk.javadoc.internal.doclets.formats.html.LinkInfoImpl; -import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; -import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; -import jdk.javadoc.internal.doclets.toolkit.Content; +import javax.lang.model.AnnotatedConstruct; +import javax.lang.model.util.SimpleAnnotationValueVisitor14; import static jdk.javadoc.internal.doclets.toolkit.builders.ConstantsSummaryBuilder.MAX_CONSTANT_VALUE_INDEX_LENGTH; /** @@ -2848,7 +2842,7 @@ public DocTree getPreviewTree(Element element) { .orElse(null); } - public Content getPreviewTreeSummaryOrDetails(DocTree t, boolean summary) { + public String getPreviewTreeSummaryOrDetails(DocTree t, boolean summary) { UnknownInlineTagTree previewTag = (UnknownInlineTagTree) t; List previewContent = previewTag.getContent(); String previewText = ((TextTree) previewContent.get(0)).getBody(); @@ -2857,7 +2851,7 @@ public Content getPreviewTreeSummaryOrDetails(DocTree t, boolean summary) { summary ? summaryAndDetails[0] : summaryAndDetails.length > 1 ? summaryAndDetails[1] : summaryAndDetails[0]; - return new RawHtml(rawHTML); + return rawHTML; } public List getFirstSentenceTrees(Element element) { @@ -2999,9 +2993,9 @@ private DeclarationPreviewLanguageFeatures(List features) { @SuppressWarnings("preview") public PreviewSummary declaredUsingPreviewAPIs(Element el) { List usedInDeclaration = new ArrayList<>(); + usedInDeclaration.addAll(annotations2Classes(el)); switch (el.getKind()) { case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> { - //TODO: annotations TypeElement te = (TypeElement) el; for (TypeParameterElement tpe : te.getTypeParameters()) { usedInDeclaration.addAll(types2Classes(tpe.getBounds())); @@ -3012,7 +3006,6 @@ public PreviewSummary declaredUsingPreviewAPIs(Element el) { usedInDeclaration.addAll(types2Classes(te.getRecordComponents().stream().map(c -> c.asType()).collect(Collectors.toList()))); //TODO: annotations on record components??? } case CONSTRUCTOR, METHOD -> { - //TODO: annotations ExecutableElement ee = (ExecutableElement) el; for (TypeParameterElement tpe : ee.getTypeParameters()) { usedInDeclaration.addAll(types2Classes(tpe.getBounds())); @@ -3021,14 +3014,13 @@ public PreviewSummary declaredUsingPreviewAPIs(Element el) { usedInDeclaration.addAll(types2Classes(List.of(ee.getReceiverType()))); usedInDeclaration.addAll(types2Classes(ee.getThrownTypes())); usedInDeclaration.addAll(types2Classes(ee.getParameters().stream().map(p -> p.asType()).collect(Collectors.toList()))); + usedInDeclaration.addAll(annotationValue2Classes(ee.getDefaultValue())); } case FIELD, ENUM_CONSTANT, RECORD_COMPONENT -> { - //TODO: annotations VariableElement ve = (VariableElement) el; usedInDeclaration.addAll(types2Classes(List.of(ve.asType()))); } case MODULE, PACKAGE -> { - //TODO: annotations? } default -> throw new IllegalStateException("Unexpected: " + el.getKind()); } @@ -3063,6 +3055,8 @@ private Collection types2Classes(List types) while (!todo.isEmpty()) { TypeMirror type = todo.remove(todo.size() - 1); + result.addAll(annotations2Classes(type)); + if (type.getKind() == DECLARED) { DeclaredType dt = (DeclaredType) type; result.add((TypeElement) dt.asElement()); @@ -3073,6 +3067,60 @@ private Collection types2Classes(List types) return result; } + private Collection annotations2Classes(AnnotatedConstruct annotated) { + List result = new ArrayList<>(); + + for (AnnotationMirror am : annotated.getAnnotationMirrors()) { + result.addAll(annotation2Classes(am)); + } + + return result; + } + + private Collection annotation2Classes(AnnotationMirror am) { + List result = new ArrayList<>(); + + result.addAll(types2Classes(List.of(am.getAnnotationType()))); + am.getElementValues() + .values() + .stream() + .flatMap(av -> annotationValue2Classes(av).stream()) + .forEach(result::add); + + return result; + } + + private Collection annotationValue2Classes(AnnotationValue value) { + if (value == null) { + return List.of(); + } + + List result = new ArrayList<>(); + + value.accept(new SimpleAnnotationValueVisitor14<>() { + @Override + public Object visitArray(List vals, Object p) { + vals.stream() + .forEach(v -> v.accept(this, null)); + return super.visitArray(vals, p); + } + @Override + public Object visitAnnotation(AnnotationMirror a, Object p) { + result.addAll(annotation2Classes(a)); + return super.visitAnnotation(a, p); + } + + @Override + public Object visitType(TypeMirror t, Object p) { + result.addAll(types2Classes(List.of(t))); + return super.visitType(t, p); + } + + }, null); + + return result; + } + public static final class PreviewSummary { public final Set previewAPI; public final Set reflectivePreviewAPI; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java index 51c1eab3ff316..8c9610f763297 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java @@ -1280,11 +1280,12 @@ private ElementKind getAllowedKind(ElementKind kind) { switch (kind) { case CLASS: case METHOD: case MODULE: case PACKAGE: return kind; - case RECORD: case ANNOTATION_TYPE: case ENUM: case INTERFACE: /*???*/case RECORD_COMPONENT: + case RECORD: case ANNOTATION_TYPE: case ENUM: case INTERFACE: return ElementKind.CLASS; case CONSTRUCTOR: case ENUM_CONSTANT: case EXCEPTION_PARAMETER: case FIELD: case INSTANCE_INIT: case LOCAL_VARIABLE: case PARAMETER: case RESOURCE_VARIABLE: case STATIC_INIT: case TYPE_PARAMETER: + case RECORD_COMPONENT: return ElementKind.METHOD; default: throw new AssertionError("unsupported kind: " + kind); diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java similarity index 86% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java rename to test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index a03ac7e8f131d..b19b6fca74cfc 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/TestDeclaredUsingPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -29,7 +29,7 @@ * @modules jdk.javadoc/jdk.javadoc.internal.tool * jdk.javadoc/jdk.javadoc.internal.doclets.formats.html.resources:+open * @build javadoc.tester.* - * @run main TestDeclaredUsingPreview + * @run main TestPreview */ import java.nio.file.Paths; @@ -37,10 +37,10 @@ import java.util.ResourceBundle; import javadoc.tester.JavadocTester; -public class TestDeclaredUsingPreview extends JavadocTester { +public class TestPreview extends JavadocTester { public static void main(String... args) throws Exception { - TestDeclaredUsingPreview tester = new TestDeclaredUsingPreview(); + TestPreview tester = new TestPreview(); tester.runTests(); } @@ -72,6 +72,7 @@ public void test() {
{3}
"""; String expected = MessageFormat.format(expectedTemplate, zero, one, two, three); + expected = expected.replace("\n", NL); checkOutput("m/pkg/TestPreviewDeclaration.html", true, expected); } @@ -79,5 +80,11 @@ public void test() { "TestPreviewDeclarationPREVIEW"); checkOutput("m/pkg/TestPreviewAPIUse.html", true, "CorePREVIEW"); + checkOutput("m/pkg/DocAnnotation.html", true, + "
"); + checkOutput("m/pkg/DocAnnotationUse1.html", true, + "
"); + checkOutput("m/pkg/DocAnnotationUse2.html", true, + "
"); } } diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Core.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Core.java rename to test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Reflective.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/api/preview/Reflective.java rename to test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list b/test/langtools/jdk/javadoc/doclet/testPreview/doc/element-list similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/element-list rename to test/langtools/jdk/javadoc/doclet/testPreview/doc/element-list diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Core.html b/test/langtools/jdk/javadoc/doclet/testPreview/doc/java.base/preview/Core.html similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Core.html rename to test/langtools/jdk/javadoc/doclet/testPreview/doc/java.base/preview/Core.html diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Reflective.html b/test/langtools/jdk/javadoc/doclet/testPreview/doc/java.base/preview/Reflective.html similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/doc/java.base/preview/Reflective.html rename to test/langtools/jdk/javadoc/doclet/testPreview/doc/java.base/preview/Reflective.html diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/module-info.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/module-info.java rename to test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java new file mode 100644 index 0000000000000..4457f559656b3 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg; + +import java.lang.annotation.Documented; + +@Documented +public @interface DocAnnotation { + + public Class a1() default Object.class; + public Class[] a2() default {}; + public Class a3() default TestPreviewDeclaration.class; + +} diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java new file mode 100644 index 0000000000000..67e92372c7032 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg; + +@DocAnnotation(a1=TestPreviewDeclaration.class) +public class DocAnnotationUse1 { +} diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java new file mode 100644 index 0000000000000..892cef8d29149 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg; + +@DocAnnotation(a2={TestPreviewDeclaration.class}) +public class DocAnnotationUse2 { +} diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewAPIUse.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewAPIUse.java rename to test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclaration.java rename to test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java diff --git a/test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java similarity index 100% rename from test/langtools/jdk/javadoc/doclet/testDeclaredUsingPreview/m/pkg/TestPreviewDeclarationUse.java rename to test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java From efb37a9b7eb63ce252ce86a518154e1f3da833d1 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 16 Oct 2020 16:49:29 +0200 Subject: [PATCH 22/42] Fixing tests. --- test/langtools/jdk/javadoc/doclet/testModules/TestModules.java | 1 + .../jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java index 09d6625f6836b..2ce690f3297c2 100644 --- a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java +++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java @@ -289,6 +289,7 @@ public void testSingleModuleMultiplePkg() { "--show-module-contents=all", "-Xdoclint:none", "--module-source-path", testSrc, + "--add-modules", "moduleC", "--module", "moduleB", "testpkg2mdlB", "testpkgmdlB"); checkExit(Exit.OK); diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index e17ce4befcdbb..17f889d407b8f 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -489,7 +489,7 @@ void testAnnotations(Path base, Set types) throws IOException { + rcAnno + """ int i) - extends java.lang.Record
""", + extends java.lang.RecordPREVIEW
""", "
" + fAnno + """ From 9ce4b0a8f32327347fee1c34ed6ab0580c393794 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Mon, 19 Oct 2020 12:52:11 +0200 Subject: [PATCH 23/42] Reflecting review comments. --- .../com/sun/tools/javac/code/Preview.java | 16 +++++++++++++ .../com/sun/tools/javac/comp/Check.java | 6 +---- .../com/sun/tools/javac/comp/Enter.java | 3 --- .../sun/tools/javac/parser/JavacParser.java | 3 +-- .../doclets/formats/html/ClassWriterImpl.java | 4 ++-- .../formats/html/HtmlDocletWriter.java | 24 +++++++++---------- .../doclets/formats/html/LinkFactoryImpl.java | 4 ++-- .../doclets/formats/html/SectionName.java | 1 + .../preview/DeclaredUsingPreview-source.out | 4 +++- 9 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java index bf1e0c0daf60f..02efbc6d79ad3 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java @@ -46,6 +46,9 @@ import java.util.Map; import java.util.Set; +import static com.sun.tools.javac.code.Flags.RECORD; +import static com.sun.tools.javac.code.Flags.SEALED; +import static com.sun.tools.javac.code.Flags.NON_SEALED; import static com.sun.tools.javac.main.Option.PREVIEW; /** @@ -214,6 +217,19 @@ public Error disabledError(JavaFileObject classfile, int majorVersion) { return Errors.PreviewFeatureDisabledClassfile(classfile, majorVersionToSource.get(majorVersion).name); } + /** + * Check whether the given symbol has been declared using + * a preview language feature. + * + * @param sym Symbol to check + * @return true iff sym has been declared using a preview language feature + */ + public boolean declaredUsingPreviewFeature(Symbol sym) { + return ((sym.flags() & RECORD) != 0 && isPreview(Feature.RECORDS)) || + ((sym.flags() & SEALED) != 0 && isPreview(Feature.SEALED_CLASSES)) || + ((sym.flags() & NON_SEALED) != 0 && isPreview(Feature.SEALED_CLASSES)); + } + /** * Report any deferred diagnostics. */ diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index c421d1d6ba71a..d9445e0d0d70b 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -3552,7 +3552,7 @@ void checkPreview(DiagnosticPosition pos, Symbol other, Symbol s) { deferredLintHandler.report(() -> warnPreviewAPI(pos, Warnings.IsPreviewReflective(s))); } } - if (declaredUsingPreviewFeature(s)) { + if (preview.declaredUsingPreviewFeature(s)) { if (preview.isEnabled()) { //for preview disabled do presumably so not need to do anything? //If "s" is compiled from source, then there was an error for it already; @@ -3562,10 +3562,6 @@ void checkPreview(DiagnosticPosition pos, Symbol other, Symbol s) { } } } - private boolean declaredUsingPreviewFeature(Symbol sym) { - return ((sym.flags() & RECORD) != 0 && preview.isPreview(Feature.RECORDS)) || - ((sym.flags() & SEALED) != 0 && preview.isPreview(Feature.SEALED_CLASSES)); - } /* ************************************************************************* * Check for recursive annotation elements. diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java index dbee35663ca0c..b4dd7d84cc468 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java @@ -35,7 +35,6 @@ import com.sun.tools.javac.code.Kinds.KindName; import com.sun.tools.javac.code.Kinds.KindSelector; import com.sun.tools.javac.code.Scope.*; -import com.sun.tools.javac.code.Source.Feature; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.main.Option.PkgInfo; @@ -105,7 +104,6 @@ public class Enter extends JCTree.Visitor { TypeEnvs typeEnvs; Modules modules; JCDiagnostic.Factory diags; - Preview preview; private final Todo todo; @@ -130,7 +128,6 @@ protected Enter(Context context) { names = Names.instance(context); modules = Modules.instance(context); diags = JCDiagnostic.Factory.instance(context); - preview = Preview.instance(context); predefClassDef = make.ClassDef( make.Modifiers(PUBLIC), diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index 838651f0cf7e4..3f9fa813071f2 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2646,7 +2646,6 @@ List blockStatement() { } } if (isRecordStart() && allowRecords) { - checkSourceLevel(Feature.RECORDS); dc = token.comment(CommentStyle.JAVADOC); return List.of(recordDeclaration(F.at(pos).Modifiers(0), dc)); } else { @@ -3710,7 +3709,6 @@ protected JCStatement classOrRecordOrInterfaceOrEnumDeclaration(JCModifiers mods if (token.kind == CLASS) { return classDeclaration(mods, dc); } if (isRecordStart()) { - checkSourceLevel(Feature.RECORDS); return recordDeclaration(mods, dc); } else if (token.kind == INTERFACE) { return interfaceDeclaration(mods, dc); @@ -4216,6 +4214,7 @@ protected boolean isRecordStart() { (peekToken(TokenKind.IDENTIFIER, TokenKind.LPAREN) || peekToken(TokenKind.IDENTIFIER, TokenKind.EOF) || peekToken(TokenKind.IDENTIFIER, TokenKind.LT))) { + checkSourceLevel(Feature.RECORDS); return true; } else { return false; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index eebcfa22ed140..40604b4f7819a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -206,7 +206,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart) || "non-sealed".equals(modifiersPart)) { pre.add(modifiersPart); - pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", contents.previewMark))); + pre.add(new HtmlTree(TagName.SUP).add(links.createLink(SectionName.PREVIEW, contents.previewMark))); } else { pre.add(modifiersPart); } @@ -277,7 +277,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (isFirst) { pre.add(DocletConstants.NL); pre.add("permits"); - pre.add(new HtmlTree(TagName.SUP).add(HtmlTree.A("#preview", contents.previewMark))); + pre.add(new HtmlTree(TagName.SUP).add(links.createLink(SectionName.PREVIEW, contents.previewMark))); pre.add(" "); isFirst = false; } else { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index f8be3090c0f63..2553327afe98f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -657,8 +657,9 @@ public Content getPackageLink(PackageElement packageElement, Content label) { if (flags.contains(ElementFlag.PREVIEW)) { return new ContentBuilder( links.createLink(targetLink, label), - new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), - contents.previewMark)) + new HtmlTree(TagName.SUP) + .add(links.createLink(targetLink.withFragment(SectionName.PREVIEW.getName()), + contents.previewMark)) ); } return links.createLink(targetLink, label); @@ -690,8 +691,9 @@ public Content getModuleLink(ModuleElement mdle, Content label) { if (flags.contains(ElementFlag.PREVIEW) && label != contents.moduleLabel) { link = new ContentBuilder( link, - new HtmlTree(TagName.SUP).add(links.createLink(targetLink.withFragment("preview"), - contents.previewMark)) + new HtmlTree(TagName.SUP) + .add(links.createLink(targetLink.withFragment(SectionName.PREVIEW.getName()), + contents.previewMark)) ); } return link; @@ -2232,10 +2234,10 @@ public void addPreviewInfo(Element forWhat, Content target) { if (utils.isPreviewAPI(forWhat)) { //in Java platform: HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); + previewDiv.setId(SectionName.PREVIEW.getName()); DocTree previewTree = utils.getPreviewTree(forWhat); if (previewTree != null) { - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") - .add(new RawHtml(utils.getPreviewTreeSummaryOrDetails(previewTree, false)))); + previewDiv.add(new RawHtml(utils.getPreviewTreeSummaryOrDetails(previewTree, false))); } else { String name = (switch (forWhat.getKind()) { case PACKAGE, MODULE -> @@ -2250,9 +2252,8 @@ public void addPreviewInfo(Element forWhat, Content target) { : "doclet.ReflectivePreviewPlatformLeadingNote"; RawHtml leadingNote = new RawHtml(resources.getText(leadingNoteKey, name)); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") - .add(HtmlTree.SPAN(HtmlStyle.previewLabel, - leadingNote))); + previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, + leadingNote)); if (!isReflectivePreview) { RawHtml note1 = new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)); previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); @@ -2268,9 +2269,8 @@ public void addPreviewInfo(Element forWhat, Content target) { Name name = forWhat.getSimpleName(); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); RawHtml leadingNote = new RawHtml(resources.getText("doclet.PreviewLeadingNote", name)); - previewDiv.add(new HtmlTree(TagName.A).put(HtmlAttr.ID, "preview") - .add(HtmlTree.SPAN(HtmlStyle.previewLabel, - leadingNote))); + previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, + leadingNote)); HtmlTree ul = new HtmlTree(TagName.UL); ul.setStyle(HtmlStyle.previewComment); for (Content note : previewNotes) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index f24837952ceca..20fee5016c84a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -114,7 +114,7 @@ protected Content getClassLink(LinkInfo linkInfo) { classLinkInfo.target)); if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( - filename.fragment("preview"), + filename.fragment(SectionName.PREVIEW.getName()), m_writer.contents.previewMark))); } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { @@ -132,7 +132,7 @@ protected Content getClassLink(LinkInfo linkInfo) { if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( typeElement, - "preview", + SectionName.PREVIEW.getName(), m_writer.contents.previewMark, false, false))); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java index f7307426ae823..be6518ebe88b3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java @@ -61,6 +61,7 @@ public enum SectionName { NESTED_CLASS_SUMMARY("nested.class.summary"), OVERVIEW_DESCRIPTION("overview.description"), PACKAGE_DESCRIPTION("package.description"), + PREVIEW("preview.section"), PROPERTY_DETAIL("property.detail"), PROPERTIES_INHERITANCE("properties.inherited.from.class."), PROPERTY_SUMMARY("property.summary"), diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out index e95d5a66b2492..cb3539f920831 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out @@ -1,8 +1,10 @@ DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records) +DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records) DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) DeclaredUsingPreviewDeclarations.java:5:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.record, DeclaredUsingPreviewDeclarations.R DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +DeclaredUsingPreview.java:11:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C2 DeclaredUsingPreviewDeclarations.java:5:33: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C -7 warnings +9 warnings From 2b625f558377da87b793eda7976115a8399c2ad2 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 20 Oct 2020 09:11:31 +0200 Subject: [PATCH 24/42] Using unique sections for preview warning sections, as suggested. --- .../doclets/formats/html/ClassWriterImpl.java | 6 ++++-- .../doclets/formats/html/HtmlDocletWriter.java | 17 ++++++++++++++--- .../doclets/formats/html/LinkFactoryImpl.java | 15 ++++++++++----- .../doclets/formats/html/SectionName.java | 1 - 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 40604b4f7819a..092085683301e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -206,7 +206,8 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if ("record".equals(modifiersPart) || "sealed".equals(modifiersPart) || "non-sealed".equals(modifiersPart)) { pre.add(modifiersPart); - pre.add(new HtmlTree(TagName.SUP).add(links.createLink(SectionName.PREVIEW, contents.previewMark))); + pre.add(new HtmlTree(TagName.SUP).add(links.createLink(getPreviewSectionAnchor(typeElement), + contents.previewMark))); } else { pre.add(modifiersPart); } @@ -277,7 +278,8 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (isFirst) { pre.add(DocletConstants.NL); pre.add("permits"); - pre.add(new HtmlTree(TagName.SUP).add(links.createLink(SectionName.PREVIEW, contents.previewMark))); + pre.add(new HtmlTree(TagName.SUP).add(links.createLink(getPreviewSectionAnchor(typeElement), + contents.previewMark))); pre.add(" "); isFirst = false; } else { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 2553327afe98f..5348066a133d5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -120,6 +120,7 @@ import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.TEXT; +import static javax.lang.model.element.ElementKind.METHOD; import static javax.lang.model.element.ElementKind.PACKAGE; import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; @@ -658,7 +659,7 @@ public Content getPackageLink(PackageElement packageElement, Content label) { return new ContentBuilder( links.createLink(targetLink, label), new HtmlTree(TagName.SUP) - .add(links.createLink(targetLink.withFragment(SectionName.PREVIEW.getName()), + .add(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(packageElement)), contents.previewMark)) ); } @@ -692,7 +693,7 @@ public Content getModuleLink(ModuleElement mdle, Content label) { link = new ContentBuilder( link, new HtmlTree(TagName.SUP) - .add(links.createLink(targetLink.withFragment(SectionName.PREVIEW.getName()), + .add(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(mdle)), contents.previewMark)) ); } @@ -2234,7 +2235,7 @@ public void addPreviewInfo(Element forWhat, Content target) { if (utils.isPreviewAPI(forWhat)) { //in Java platform: HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); - previewDiv.setId(SectionName.PREVIEW.getName()); + previewDiv.setId(getPreviewSectionAnchor(forWhat)); DocTree previewTree = utils.getPreviewTree(forWhat); if (previewTree != null) { previewDiv.add(new RawHtml(utils.getPreviewTreeSummaryOrDetails(previewTree, false))); @@ -2268,6 +2269,7 @@ public void addPreviewInfo(Element forWhat, Content target) { if (!previewNotes.isEmpty()) { Name name = forWhat.getSimpleName(); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); + previewDiv.setId(getPreviewSectionAnchor(forWhat)); RawHtml leadingNote = new RawHtml(resources.getText("doclet.PreviewLeadingNote", name)); previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, leadingNote)); @@ -2361,4 +2363,13 @@ private LinkInfoImpl toLink(TypeElement te) { .label(HtmlTree.CODE(new StringContent(te.getSimpleName()))) .skipPreview(true); } + + public String getPreviewSectionAnchor(Element el) { + return "preview-" + switch (el.getKind()) { + case CONSTRUCTOR, METHOD -> + links.getAnchor((ExecutableElement) el); + case PACKAGE -> getPackageAnchorName((PackageElement) el); + default -> utils.getFullyQualifiedName(el, false); + }; + } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 20fee5016c84a..618d011519ebc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -91,13 +91,18 @@ protected Content getClassLink(LinkInfo linkInfo) { } Content label = classLinkInfo.getClassLinkLabel(configuration); Set flags; - boolean noPreview = classLinkInfo.skipPreview; - if (!hasWhere && !noPreview) { + Element target; + boolean showPreview = !classLinkInfo.skipPreview; + if (!hasWhere && showPreview) { flags = utils.elementFlags(typeElement); - } else if ((classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG || classLinkInfo.context == LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW) && classLinkInfo.whereMember != null && !noPreview) { + target = typeElement; + } else if ((classLinkInfo.context == LinkInfoImpl.Kind.SEE_TAG || classLinkInfo.context == LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW) && + classLinkInfo.whereMember != null && showPreview) { flags = utils.elementFlags(classLinkInfo.whereMember); + target = classLinkInfo.whereMember; } else { flags = EnumSet.noneOf(ElementFlag.class); + target = null; } Content link = new ContentBuilder(); @@ -114,7 +119,7 @@ protected Content getClassLink(LinkInfo linkInfo) { classLinkInfo.target)); if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( - filename.fragment(SectionName.PREVIEW.getName()), + filename.fragment(m_writer.getPreviewSectionAnchor(target)), m_writer.contents.previewMark))); } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { @@ -132,7 +137,7 @@ protected Content getClassLink(LinkInfo linkInfo) { if (flags.contains(ElementFlag.PREVIEW)) { link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( typeElement, - SectionName.PREVIEW.getName(), + m_writer.getPreviewSectionAnchor(target), m_writer.contents.previewMark, false, false))); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java index be6518ebe88b3..f7307426ae823 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SectionName.java @@ -61,7 +61,6 @@ public enum SectionName { NESTED_CLASS_SUMMARY("nested.class.summary"), OVERVIEW_DESCRIPTION("overview.description"), PACKAGE_DESCRIPTION("package.description"), - PREVIEW("preview.section"), PROPERTY_DETAIL("property.detail"), PROPERTIES_INHERITANCE("properties.inherited.from.class."), PROPERTY_SUMMARY("property.summary"), From da4d41e5216df30013e0367ee2261e8548079268 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 20 Oct 2020 11:04:26 +0200 Subject: [PATCH 25/42] Fixing tests. --- .../doclet/testPreview/TestPreview.java | 12 ++-- .../testRecordLinks/TestRecordLinks.java | 2 +- .../testRecordTypes/TestRecordTypes.java | 12 ++-- .../testSealedTypes/TestSealedTypes.java | 60 +++++++++---------- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index b19b6fca74cfc..f0527e4d3adc3 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -64,7 +64,7 @@ public void test() { String two = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote1"), "TestPreviewDeclaration"); String three = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote2"), new Object[0]); String expectedTemplate = """ -
{0} +
{0}
  • {1}
@@ -77,14 +77,14 @@ public void test() { } checkOutput("m/pkg/TestPreviewDeclarationUse.html", true, - "TestPreviewDeclarationPREVIEW"); + "TestPreviewDeclarationPREVIEW"); checkOutput("m/pkg/TestPreviewAPIUse.html", true, - "CorePREVIEW"); + "CorePREVIEW"); checkOutput("m/pkg/DocAnnotation.html", true, - "
"); + "
"); checkOutput("m/pkg/DocAnnotationUse1.html", true, - "
"); + "
"); checkOutput("m/pkg/DocAnnotationUse2.html", true, - "
"); + " """); checkOutput("example/JavadocTest.Bar.html", true, diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index 17f889d407b8f..210a79c591765 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -77,7 +77,7 @@ public void testRecordKeywordUnnamedPackage(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public recordPREVIEW R""", """ R​(int r1)"""); } @@ -99,7 +99,7 @@ public void testRecordKeywordNamedPackage(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public recordPREVIEW R""", """ R​(int r1)"""); } @@ -121,7 +121,7 @@ public void testEmptyRecord(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public recordPREVIEW R""", """ R()"""); } @@ -147,7 +147,7 @@ public record R(int r1) { }"""); """

Record R

""", """ - public recordPREVIEW R""", + public recordPREVIEW R""", """
Record Components:
@@ -179,7 +179,7 @@ public record R(int r1) { }"""); """

Record R<T>

""", """ - public recordPREVIEW R<T>""", + public recordPREVIEW R<T>""", """
Type Parameters:
@@ -485,7 +485,7 @@ void testAnnotations(Path base, Set types) throws IOException { checkOutput("p/R.html", true, """ -
public recordPREVIEW R("""
+                    
public recordPREVIEW R("""
                         + rcAnno
                         + """
                             int i)
diff --git a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
index 75d4e131d7801..0a43bd6062052 100644
--- a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
+++ b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java
@@ -59,7 +59,7 @@ public void testSealedModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW class A");
+                "public sealedPREVIEW class A");
     }
 
     @Test
@@ -75,7 +75,7 @@ public void testSealedModifierInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW interface A");
+                "public sealedPREVIEW interface A");
     }
 
     @Test
@@ -92,10 +92,10 @@ public void testNonSealedModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW class A");
+                "public sealedPREVIEW class A");
 
         checkOutput("p/B.html", true,
-                "public non-sealedPREVIEW class B");
+                "public non-sealedPREVIEW class B");
     }
 
     @Test
@@ -112,10 +112,10 @@ public void testNonSealedModifierInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW interface A");
+                "public sealedPREVIEW interface A");
 
         checkOutput("p/B.html", true,
-                "public non-sealedPREVIEW interface B");
+                "public non-sealedPREVIEW interface B");
     }
 
     @Test
@@ -132,10 +132,10 @@ public void testSealedSubtypeModifierClass(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW class A");
+                "public sealedPREVIEW class A");
 
         checkOutput("p/B.html", true,
-                "public abstract sealedPREVIEW class B");
+                "public abstract sealedPREVIEW class B");
     }
 
     @Test
@@ -152,10 +152,10 @@ public void testSealedSubtypeInterface(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "public sealedPREVIEW interface A");
+                "public sealedPREVIEW interface A");
 
         checkOutput("p/B.html", true,
-                "public sealedPREVIEW interface B");
+                "public sealedPREVIEW interface B");
     }
 
     @Test
@@ -173,9 +173,9 @@ public void testSinglePermits(Path base) throws IOException {
         checkExit(Exit.OK);
 
         checkOutput("p/A.html", true,
-                "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW BPREVIEW
"); + + "permitsPREVIEW BPREVIEW
"); } @Test @@ -195,11 +195,11 @@ public void testMultiplePermits(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW BPREVIEW, "
-                + "CPREVIEW, "
-                + "DPREVIEW
"); + + "permitsPREVIEW BPREVIEW, " + + "CPREVIEW, " + + "DPREVIEW
"); } @Test @@ -219,10 +219,10 @@ public void testPartialMultiplePermits(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW BPREVIEW, "
-                + "CPREVIEW "
+                + "permitsPREVIEW BPREVIEW, "
+                + "CPREVIEW "
                 + "(not exhaustive)
"); } @@ -269,10 +269,10 @@ public void testPartialMultiplePermitsWithSubtypes2(Path base) throws IOExceptio checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW BPREVIEW, "
-                + "CPREVIEW "
+                + "permitsPREVIEW BPREVIEW, "
+                + "CPREVIEW "
                 + "(not exhaustive)
"); } @@ -294,11 +294,11 @@ public void testImplicitPermitsAuxiliary(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW BPREVIEW, "
-                + "CPREVIEW, "
-                + "DPREVIEW
"); + + "permitsPREVIEW BPREVIEW, " + + "CPREVIEW, " + + "DPREVIEW
"); } @Test @@ -319,10 +319,10 @@ public void testImplicitPermitsNested(Path base) throws IOException { checkExit(Exit.OK); checkOutput("p/A.html", true, - "
public sealedPREVIEW class A\n"
+                "
public sealedPREVIEW class A\n"
                 + "extends java.lang.Object\n"
-                + "permitsPREVIEW A.BPREVIEW, "
-                + "A.CPREVIEW, "
-                + "A.DPREVIEW
"); + + "permitsPREVIEW A.BPREVIEW, " + + "A.CPREVIEW, " + + "A.DPREVIEW
"); } } From 49b720df67c54d02ee1dd4dc392d2876e9201944 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 20 Oct 2020 12:26:44 +0200 Subject: [PATCH 26/42] More fixing tests. --- test/langtools/tools/javac/preview/PreviewAutoSuppress.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java index 4e08431473022..33864a4fced63 100644 --- a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java +++ b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java @@ -94,9 +94,10 @@ public class Use { List expected = List.of("Outer.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records)", + "Outer.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records)", "Outer.java:4:5: compiler.warn.declared.using.preview: kindname.record, test.Outer.R", "Use.java:3:8: compiler.warn.declared.using.preview: kindname.record, test.Outer.R", - "3 warnings"); + "4 warnings"); if (!log.equals(expected)) throw new Exception("expected output not found" + log); checkPreviewClassfile(classes.resolve("test").resolve("Outer.class"), From 34169e08750f12acc64a3d55cc57a95ee7f8c727 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 23 Oct 2020 12:49:28 +0200 Subject: [PATCH 27/42] Reflecting review comments. --- .../formats/html/HtmlDocletWriter.java | 33 ++++++++----------- .../doclets/formats/html/LinkFactoryImpl.java | 6 ++-- .../doclets/formats/html/LinkInfoImpl.java | 11 ++----- .../doclets/formats/html/markup/HtmlAttr.java | 1 - .../toolkit/util/links/LinkFactory.java | 2 +- .../doclets/toolkit/util/links/LinkInfo.java | 5 +++ .../doclet/testPreview/TestPreview.java | 1 - 7 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 5348066a133d5..63233d3cec1d3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -112,7 +112,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.Utils.DeclarationPreviewLanguageFeatures; import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; import jdk.javadoc.internal.doclets.toolkit.util.Utils.PreviewSummary; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; import static com.sun.source.doctree.DocTree.Kind.CODE; import static com.sun.source.doctree.DocTree.Kind.COMMENT; @@ -120,9 +119,6 @@ import static com.sun.source.doctree.DocTree.Kind.LINK_PLAIN; import static com.sun.source.doctree.DocTree.Kind.SEE; import static com.sun.source.doctree.DocTree.Kind.TEXT; -import static javax.lang.model.element.ElementKind.METHOD; -import static javax.lang.model.element.ElementKind.PACKAGE; -import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import static jdk.javadoc.internal.doclets.toolkit.util.CommentHelper.SPACER; @@ -1002,7 +998,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getAnchor(ee, isProperty)) - .whereMember(element) + .targetMember(element) .strong(strong)); } @@ -1010,7 +1006,7 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getName(element.getSimpleName().toString())) - .whereMember(element) + .targetMember(element) .strong(strong)); } @@ -1037,10 +1033,10 @@ public Content getDocLink(LinkInfoImpl.Kind context, TypeElement typeElement, El return getLink(new LinkInfoImpl(configuration, context, typeElement) .label(label) .where(links.getAnchor(emd)) - .whereMember(element)); + .targetMember(element)); } else if (utils.isVariableElement(element) || utils.isTypeElement(element)) { return getLink(new LinkInfoImpl(configuration, context, typeElement) - .label(label).where(links.getName(element.getSimpleName().toString())).whereMember(element)); + .label(label).where(links.getName(element.getSimpleName().toString())).targetMember(element)); } else { return label; } @@ -1197,7 +1193,7 @@ private Content plainOrCode(boolean plain, Content body) { public void addInlineComment(Element element, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(element); List description = ch.getDescription(tag); - addCommentTags(element, tag, description, false, false, false, false, htmltree); + addCommentTags(element, tag, description, false, false, false, htmltree); } /** @@ -1221,7 +1217,7 @@ public Content getDeprecatedPhrase(Element e) { */ public void addInlineDeprecatedComment(Element e, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(e); - addCommentTags(e, ch.getBody(tag), true, false, false, false, htmltree); + addCommentTags(e, ch.getBody(tag), true, false, false, htmltree); } /** @@ -1242,7 +1238,7 @@ public void addSummaryComment(Element element, Content htmltree) { * @param htmltree the documentation tree to which the summary will be added */ public void addPreviewComment(Element element, List firstSentenceTags, Content htmltree) { - addCommentTags(element, firstSentenceTags, false, true, true, true, htmltree); + addCommentTags(element, firstSentenceTags, false, true, true, htmltree); } /** @@ -1253,13 +1249,13 @@ public void addPreviewComment(Element element, List firstSent * @param htmltree the documentation tree to which the summary will be added */ public void addSummaryComment(Element element, List firstSentenceTags, Content htmltree) { - addCommentTags(element, firstSentenceTags, false, false, true, true, htmltree); + addCommentTags(element, firstSentenceTags, false, true, true, htmltree); } public void addSummaryDeprecatedComment(Element element, DocTree tag, Content htmltree) { CommentHelper ch = utils.getCommentHelper(element); List body = ch.getBody(tag); - addCommentTags(element, ch.getFirstSentenceTrees(body), true, false, true, true, htmltree); + addCommentTags(element, ch.getFirstSentenceTrees(body), true, true, true, htmltree); } /** @@ -1269,7 +1265,7 @@ public void addSummaryDeprecatedComment(Element element, DocTree tag, Content ht * @param htmltree the documentation tree to which the inline comments will be added */ public void addInlineComment(Element element, Content htmltree) { - addCommentTags(element, utils.getFullBody(element), false, false, false, false, htmltree); + addCommentTags(element, utils.getFullBody(element), false, false, false, htmltree); } /** @@ -1283,8 +1279,8 @@ public void addInlineComment(Element element, Content htmltree) { * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Element element, List tags, boolean depr, - boolean preview, boolean first, boolean inSummary, Content htmltree) { - addCommentTags(element, null, tags, depr, preview, first, inSummary, htmltree); + boolean first, boolean inSummary, Content htmltree) { + addCommentTags(element, null, tags, depr, first, inSummary, htmltree); } /** @@ -1299,7 +1295,7 @@ private void addCommentTags(Element element, List tags, boole * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Element element, DocTree holderTag, List tags, boolean depr, - boolean preview, boolean first, boolean inSummary, Content htmltree) { + boolean first, boolean inSummary, Content htmltree) { if (options.noComment()){ return; } @@ -1308,9 +1304,6 @@ private void addCommentTags(Element element, DocTree holderTag, List{3}
"""; String expected = MessageFormat.format(expectedTemplate, zero, one, two, three); - expected = expected.replace("\n", NL); checkOutput("m/pkg/TestPreviewDeclaration.html", true, expected); } From caa4fd3426bb4b3b024bc9639669f8e005873717 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 23 Oct 2020 15:33:37 +0200 Subject: [PATCH 28/42] Using a more correct way to get URLs. --- .../langtools/jdk/javadoc/doclet/testPreview/TestPreview.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index f554f1c72856f..c3369779e8356 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -46,7 +46,7 @@ public static void main(String... args) throws Exception { @Test public void test() { - String doc = "file://" + Paths.get(testSrc, "doc").toAbsolutePath().toString(); + String doc = Paths.get(testSrc, "doc").toUri().toString(); javadoc("-d", "out", "-XDforcePreview", "--enable-preview", "-source", System.getProperty("java.specification.version"), "--patch-module", "java.base=" + Paths.get(testSrc, "api").toAbsolutePath().toString(), @@ -78,7 +78,7 @@ public void test() { checkOutput("m/pkg/TestPreviewDeclarationUse.html", true, "TestPreviewDeclarationPREVIEW"); checkOutput("m/pkg/TestPreviewAPIUse.html", true, - "CorePREVIEW"); + "CorePREVIEW"); checkOutput("m/pkg/DocAnnotation.html", true, "
"); checkOutput("m/pkg/DocAnnotationUse1.html", true, From 461e7d15672fc6b3e1f52975048b31490e065953 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 23 Oct 2020 18:18:50 +0200 Subject: [PATCH 29/42] Removing unnecessary cast. --- .../internal/doclets/toolkit/util/links/LinkFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java index bf71ecf450b50..2224cb180b134 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java @@ -206,7 +206,7 @@ private void setBoundsLinkInfo(LinkInfo linkInfo, TypeMirror bound) { linkInfo.typeElement = null; linkInfo.label = null; linkInfo.type = bound; - ((LinkInfoImpl) linkInfo).skipPreview = false; + linkInfo.skipPreview = false; } /** From e238784d9b638d80a7f47ff8fa50a282fc958512 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 29 Oct 2020 11:33:12 +0100 Subject: [PATCH 30/42] Reflecting review comments. --- .../html/AbstractExecutableMemberWriter.java | 14 +- .../formats/html/AllClassesIndexWriter.java | 7 +- .../doclets/formats/html/ClassWriterImpl.java | 6 +- .../doclets/formats/html/HelpWriter.java | 9 ++ .../formats/html/HtmlConfiguration.java | 10 +- .../doclets/formats/html/HtmlDoclet.java | 14 +- .../formats/html/HtmlDocletWriter.java | 123 +++++++++--------- .../doclets/formats/html/Navigation.java | 5 +- .../formats/html/PackageWriterImpl.java | 7 - .../formats/html/PreviewListWriter.java | 46 +++---- .../html/resources/standard.properties | 19 +-- .../toolkit/builders/ConstructorBuilder.java | 2 - .../toolkit/resources/doclets.properties | 2 +- .../doclets/toolkit/util/Comparators.java | 10 +- .../util/DeprecatedAPIListBuilder.java | 2 +- .../toolkit/util/PreviewAPIListBuilder.java | 36 ++--- .../internal/doclets/toolkit/util/Utils.java | 48 +++---- .../doclet/testPreview/TestPreview.java | 6 +- 18 files changed, 196 insertions(+), 170 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java index 927903ef0369e..efd18a7383b53 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -86,19 +86,19 @@ protected Content getTypeParameters(ExecutableElement member) { @Override protected Content getDeprecatedOrPreviewLink(Element member) { - Content deprecatedLinkContent = new ContentBuilder(); - deprecatedLinkContent.add(utils.getFullyQualifiedName(member)); + Content content = new ContentBuilder(); + content.add(utils.getFullyQualifiedName(member)); if (!utils.isConstructor(member)) { - deprecatedLinkContent.add("."); - deprecatedLinkContent.add(member.getSimpleName()); + content.add("."); + content.add(member.getSimpleName()); } String signature = utils.flatSignature((ExecutableElement) member, typeElement); if (signature.length() > 2) { - deprecatedLinkContent.add(Entity.ZERO_WIDTH_SPACE); + content.add(Entity.ZERO_WIDTH_SPACE); } - deprecatedLinkContent.add(signature); + content.add(signature); - return writer.getDocLink(MEMBER_DEPRECATED_PREVIEW, utils.getEnclosingTypeElement(member), member, deprecatedLinkContent); + return writer.getDocLink(MEMBER_DEPRECATED_PREVIEW, utils.getEnclosingTypeElement(member), member, content); } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java index 6f2d1e5159950..d01f5225d4745 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java @@ -31,6 +31,7 @@ import javax.lang.model.element.TypeElement; import com.sun.source.doctree.DocTree; +import java.util.Set; import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; @@ -44,6 +45,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.IndexBuilder; import jdk.javadoc.internal.doclets.toolkit.util.IndexItem; +import jdk.javadoc.internal.doclets.toolkit.util.Utils.ElementFlag; /** * Generate the file with list of all the classes in this run. @@ -163,10 +165,11 @@ protected void addTableRow(Table table, TypeElement klass) { Content classLink = getLink(new LinkInfoImpl( configuration, LinkInfoImpl.Kind.INDEX, klass)); ContentBuilder description = new ContentBuilder(); - if (utils.isPreviewAPI(klass)) { + Set flags = utils.elementFlags(klass); + if (flags.contains(ElementFlag.PREVIEW)) { description.add(contents.previewPhrase); addSummaryComment(klass, description); - } else if (utils.isDeprecated(klass)) { + } else if (flags.contains(ElementFlag.DEPRECATED)) { description.add(getDeprecatedPhrase(klass)); List tags = utils.getDeprecatedTrees(klass); if (!tags.isEmpty()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index 092085683301e..c8d152e5da6b4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -86,6 +86,9 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite "java.lang.constant.ConstantDesc", "java.io.Serializable"); + private static final Set previewModifiers + = Set.of("record", "sealed", "non-sealed"); + protected final TypeElement typeElement; protected final ClassTree classtree; @@ -203,8 +206,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (sep != null) { pre.add(sep); } - if ("record".equals(modifiersPart) || - "sealed".equals(modifiersPart) || "non-sealed".equals(modifiersPart)) { + if (previewModifiers.contains(modifiersPart)) { pre.add(modifiersPart); pre.add(new HtmlTree(TagName.SUP).add(links.createLink(getPreviewSectionAnchor(typeElement), contents.previewMark))); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java index 4f9124fdbb99a..60b896cfd0a85 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java @@ -243,6 +243,15 @@ protected void addHelpFileContents(Content contentTree) { contentTree.add(section); } + // Preview + if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.PREVIEW)) { + section = newHelpSection(contents.previewAPI); + Content previewBody = getContent("doclet.help.preview.body", + links.createLink(DocPaths.PREVIEW_LIST, contents.previewAPI)); + section.add(HtmlTree.P(previewBody)); + contentTree.add(section); + } + // Index if (options.createIndex()) { DocPath dp = options.splitIndex() diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java index 19a354d869496..63fcc051dd318 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java @@ -58,6 +58,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; +import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder; /** * Configure the output based on the command-line options. @@ -118,6 +119,13 @@ public class HtmlConfiguration extends BaseConfiguration { */ protected DeprecatedAPIListBuilder deprecatedAPIListBuilder; + /** + * The collection of preview items, if any, to be displayed on the preview-list page, + * or null if the page should not be generated. + * The page will not be generated if there are no preview elements being documented. + */ + protected PreviewAPIListBuilder previewAPIListBuilder; + public final Contents contents; protected final Messages messages; @@ -134,7 +142,7 @@ public class HtmlConfiguration extends BaseConfiguration { // Note: this should (eventually) be merged with Navigation.PageMode, // which performs a somewhat similar role public enum ConditionalPage { - CONSTANT_VALUES, DEPRECATED, SERIALIZED_FORM, SYSTEM_PROPERTIES + CONSTANT_VALUES, DEPRECATED, PREVIEW, SERIALIZED_FORM, SYSTEM_PROPERTIES } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index ed48d6ff27b05..2ff3e42b4149f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -46,6 +46,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.IndexBuilder; +import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder; /** * The class with "start" method, calls individual Writers. @@ -127,6 +128,11 @@ public void generateClassFiles(ClassTree classTree) throws DocletException { configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.DEPRECATED); } } + PreviewAPIListBuilder builder = new PreviewAPIListBuilder(configuration); + if (!builder.isEmpty()) { + configuration.previewAPIListBuilder = builder; + configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.PREVIEW); + } super.generateClassFiles(classTree); } @@ -175,13 +181,7 @@ protected void generateOtherFiles(ClassTree classtree) DeprecatedListWriter.generate(configuration); } - boolean showPreviewTab = - configuration.getIncludedModuleElements() - .stream() - .anyMatch(m -> m.getQualifiedName() - .contentEquals("java.base")); - - if (showPreviewTab) { + if (configuration.conditionalPages.contains((HtmlConfiguration.ConditionalPage.PREVIEW))) { PreviewListWriter.generate(configuration); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 63233d3cec1d3..f5eeda0a0716e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -2212,14 +2212,8 @@ Content getVerticalSeparator() { public void addPreviewSummary(Element forWhat, Content target) { if (utils.isPreviewAPI(forWhat)) { - DocTree previewTree = utils.getPreviewTree(forWhat); Content div = HtmlTree.DIV(HtmlStyle.block); - if (previewTree != null) { - div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, - new RawHtml(utils.getPreviewTreeSummaryOrDetails(previewTree, true)))); - } else { - div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); - } + div.add(HtmlTree.SPAN(HtmlStyle.previewLabel, contents.previewPhrase)); target.add(div); } } @@ -2229,41 +2223,38 @@ public void addPreviewInfo(Element forWhat, Content target) { //in Java platform: HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); previewDiv.setId(getPreviewSectionAnchor(forWhat)); - DocTree previewTree = utils.getPreviewTree(forWhat); - if (previewTree != null) { - previewDiv.add(new RawHtml(utils.getPreviewTreeSummaryOrDetails(previewTree, false))); - } else { - String name = (switch (forWhat.getKind()) { - case PACKAGE, MODULE -> - ((QualifiedNameable) forWhat).getQualifiedName(); - case CONSTRUCTOR -> - ((TypeElement) forWhat.getEnclosingElement()).getSimpleName(); - default -> forWhat.getSimpleName(); - }).toString(); - boolean isReflectivePreview = utils.isReflectivePreviewAPI(forWhat); - String leadingNoteKey = - !isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" - : "doclet.ReflectivePreviewPlatformLeadingNote"; - RawHtml leadingNote = - new RawHtml(resources.getText(leadingNoteKey, name)); - previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, - leadingNote)); - if (!isReflectivePreview) { - RawHtml note1 = new RawHtml(resources.getText("doclet.PreviewTrailingNote1", name)); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); - } - RawHtml note2 = new RawHtml(resources.getText("doclet.PreviewTrailingNote2", name)); - previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note2)); + String name = (switch (forWhat.getKind()) { + case PACKAGE, MODULE -> + ((QualifiedNameable) forWhat).getQualifiedName(); + case CONSTRUCTOR -> + ((TypeElement) forWhat.getEnclosingElement()).getSimpleName(); + default -> forWhat.getSimpleName(); + }).toString(); + Content nameCode = HtmlTree.CODE(new StringContent(name)); + boolean isReflectivePreview = utils.isReflectivePreviewAPI(forWhat); + String leadingNoteKey = + !isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" + : "doclet.ReflectivePreviewPlatformLeadingNote"; + Content leadingNote = + contents.getContent(leadingNoteKey, nameCode); + previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, + leadingNote)); + if (!isReflectivePreview) { + Content note1 = contents.getContent("doclet.PreviewTrailingNote1", nameCode); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); } + Content note2 = contents.getContent("doclet.PreviewTrailingNote2", nameCode); + previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note2)); target.add(previewDiv); } else if (forWhat.getKind().isClass() || forWhat.getKind().isInterface()) { //in custom code: List previewNotes = getPreviewNotes((TypeElement) forWhat); if (!previewNotes.isEmpty()) { Name name = forWhat.getSimpleName(); + Content nameCode = HtmlTree.CODE(new StringContent(name)); HtmlTree previewDiv = HtmlTree.DIV(HtmlStyle.previewBlock); previewDiv.setId(getPreviewSectionAnchor(forWhat)); - RawHtml leadingNote = new RawHtml(resources.getText("doclet.PreviewLeadingNote", name)); + Content leadingNote = contents.getContent("doclet.PreviewLeadingNote", nameCode); previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, leadingNote)); HtmlTree ul = new HtmlTree(TagName.UL); @@ -2272,13 +2263,13 @@ public void addPreviewInfo(Element forWhat, Content target) { ul.add(HtmlTree.LI(note)); } previewDiv.add(ul); - RawHtml note1 = - new RawHtml(resources.getText("doclet.PreviewTrailingNote1", - name)); + Content note1 = + contents.getContent("doclet.PreviewTrailingNote1", + nameCode); previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note1)); - RawHtml note2 = - new RawHtml(resources.getText("doclet.PreviewTrailingNote2", - name)); + Content note2 = + contents.getContent("doclet.PreviewTrailingNote2", + name); previewDiv.add(HtmlTree.DIV(HtmlStyle.previewComment, note2)); target.add(previewDiv); } @@ -2316,17 +2307,8 @@ private List getPreviewNotes(TypeElement el) { for (DeclarationPreviewLanguageFeatures feature : previewLanguageFeatures) { String featureDisplayName = resources.getText("doclet.Declared_Using_Preview." + feature.name()); - String featureCodes = - feature.features - .stream() - .map(f -> "" + f + "") - .collect(Collectors.joining(", ")); - String text = - resources.getText("doclet.Declared_Using_Preview", - className, - featureDisplayName, - featureCodes); - result.add(new RawHtml(text)); + result.add(withPreviewFeatures("doclet.Declared_Using_Preview", className, + featureDisplayName, feature.features)); } } if (!declaredUsingPreviewFeature.isEmpty()) { @@ -2341,20 +2323,36 @@ private List getPreviewNotes(TypeElement el) { return result; } - private Content withLinks(String key, String className, Set elements) { - return new RawHtml(resources.getText(key, className, elements.stream() - .sorted((te1, te2) -> te1.getSimpleName().toString() - .compareTo(te2.getSimpleName().toString())) - .distinct() - .map(this::toLink) - .map(link -> getLink(link).toString()) - .collect(Collectors.joining(", ")))); + private Content withPreviewFeatures(String key, String className, String featureName, List features) { + String[] sep = new String[] {""}; + ContentBuilder featureCodes = new ContentBuilder(); + features.stream() + .forEach(c -> { + featureCodes.add(sep[0]); + featureCodes.add(HtmlTree.CODE(new ContentBuilder().add(c))); + sep[0] = ", "; + }); + return contents.getContent(key, + HtmlTree.CODE(new StringContent(className)), + new HtmlTree(TagName.EM).add(featureName), + featureCodes); } - private LinkInfoImpl toLink(TypeElement te) { - return new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te) - .label(HtmlTree.CODE(new StringContent(te.getSimpleName()))) - .skipPreview(true); + private Content withLinks(String key, String className, Set elements) { + String[] sep = new String[] {""}; + ContentBuilder links = new ContentBuilder(); + elements.stream() + .sorted((te1, te2) -> te1.getSimpleName().toString().compareTo(te2.getSimpleName().toString())) + .distinct() + .map(te -> getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS, te).label(HtmlTree.CODE(new StringContent(te.getSimpleName()))).skipPreview(true))) + .forEach(c -> { + links.add(sep[0]); + links.add(c); + sep[0] = ", "; + }); + return contents.getContent(key, + HtmlTree.CODE(new StringContent(className)), + links); } public String getPreviewSectionAnchor(Element el) { @@ -2365,4 +2363,5 @@ public String getPreviewSectionAnchor(Element el) { default -> utils.getFullyQualifiedName(el, false); }; } + } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index 23a859238c36a..081494421abb9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -322,7 +322,8 @@ private void addMainNavLinks(Content tree) { addDeprecatedLink(tree); } if (documentedPage == PageMode.PREVIEW) { - addActivePageLink(tree, contents.previewLabel, true); //TODO: option + addActivePageLink(tree, contents.previewLabel, + configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)); } else { addPreviewLink(tree); } @@ -885,7 +886,7 @@ private void addDeprecatedLink(Content tree) { } private void addPreviewLink(Content tree) { - if (configuration.getIncludedModuleElements().stream().anyMatch(m -> m.getQualifiedName().contentEquals("java.base"))) { + if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.PREVIEW)) { tree.add(HtmlTree.LI(links.createLink(pathToRoot.resolve(DocPaths.PREVIEW_LIST), contents.previewLabel, "", ""))); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index 06ff797826916..fa4f00a5aaa2d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -33,10 +33,6 @@ import javax.lang.model.element.TypeElement; import com.sun.source.doctree.DocTree; -import com.sun.source.doctree.InlineTagTree; -import com.sun.source.doctree.TextTree; -import com.sun.source.doctree.UnknownInlineTagTree; -import java.util.stream.Collectors; import jdk.javadoc.internal.doclets.formats.html.markup.BodyContents; import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.Entity; @@ -44,8 +40,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr; -import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.formats.html.markup.Table; import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; @@ -55,7 +49,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; -import jdk.javadoc.internal.doclets.toolkit.util.Utils; /** * Class to generate file for each package contents in the right-hand diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java index 7ef88da648582..5d258c6b81439 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -227,23 +227,25 @@ public PreviewListWriter(HtmlConfiguration configuration, DocPath filename) { /** * Get list of all the preview elements. - * Then instantiate DeprecatedListWriter and generate File. + * Then instantiate PreviewListWriter and generate File. * * @param configuration the current configuration of the doclet. - * @throws DocFileIOException if there is a problem writing the deprecated list + * @throws DocFileIOException if there is a problem writing the preview list */ public static void generate(HtmlConfiguration configuration) throws DocFileIOException { - DocPath filename = DocPaths.PREVIEW_LIST; - PreviewListWriter depr = new PreviewListWriter(configuration, filename); - depr.generatePreviewListFile( - new PreviewAPIListBuilder(configuration)); + if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) { + DocPath filename = DocPaths.PREVIEW_LIST; + PreviewListWriter depr = new PreviewListWriter(configuration, filename); + depr.generatePreviewListFile( + new PreviewAPIListBuilder(configuration)); + } } /** - * Generate the deprecated API list. + * Generate the preview API list. * - * @param previewapi list of deprecated API built already. - * @throws DocFileIOException if there is a problem writing the deprecated list + * @param previewapi list of preview API built already. + * @throws DocFileIOException if there is a problem writing the preview list */ protected void generatePreviewListFile(PreviewAPIListBuilder previewapi) throws DocFileIOException { @@ -268,7 +270,7 @@ protected void generatePreviewListFile(PreviewAPIListBuilder previewapi) htmlTree.add(navBar.getContent(Navigation.Position.BOTTOM)); addBottom(htmlTree); bodyContents.setFooter(htmlTree); - String description = "deprecated elements"; + String description = "preview elements"; body.add(bodyContents); printHtmlDocument(null, description, body); } @@ -276,7 +278,7 @@ protected void generatePreviewListFile(PreviewAPIListBuilder previewapi) /** * Add the index link. * - * @param builder the deprecated list builder + * @param builder the preview list builder * @param kind the kind of list being documented * @param contentTree the content tree to which the index link will be added */ @@ -292,7 +294,7 @@ private void addIndexLink(PreviewAPIListBuilder builder, /** * Get the contents list. * - * @param previewapi the deprecated list builder + * @param previewapi the preview list builder * @return a content tree for the contents list */ public Content getContentsList(PreviewAPIListBuilder previewapi) { @@ -312,7 +314,7 @@ public Content getContentsList(PreviewAPIListBuilder previewapi) { } /** - * Get the header for the deprecated API Listing. + * Get the header for the preview API Listing. * * @return a content tree for the header */ @@ -328,25 +330,25 @@ public HtmlTree getHeader() { } /** - * Add deprecated information to the documentation tree + * Add preview information to the documentation tree * - * @param deprList list of deprecated API elements + * @param previewList list of preview API elements * @param id the id attribute of the table - * @param headingKey the caption for the deprecated table - * @param tableSummary the summary for the deprecated table - * @param tableHeader table headers for the deprecated table - * @param contentTree the content tree to which the deprecated table will be added + * @param headingKey the caption for the preview table + * @param tableSummary the summary for the preview table + * @param tableHeader table headers for the preview table + * @param contentTree the content tree to which the preview table will be added */ - protected void addPreviewAPI(SortedSet deprList, String id, String headingKey, + protected void addPreviewAPI(SortedSet previewList, String id, String headingKey, String tableSummary, TableHeader tableHeader, Content contentTree) { - if (deprList.size() > 0) { + if (previewList.size() > 0) { Content caption = contents.getContent(headingKey); Table table = new Table(HtmlStyle.summaryTable) .setCaption(caption) .setHeader(tableHeader) .setId(id) .setColumnStyles(HtmlStyle.colPreviewItemName, HtmlStyle.colLast); - for (Element e : deprList) { + for (Element e : previewList) { Content link; switch (e.getKind()) { case MODULE: diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index c8c4e35d780d8..3d18552c152f0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -196,6 +196,9 @@ doclet.help.deprecated.body=\ The {0} page lists all of the API that have been deprecated. A deprecated API is not \ recommended for use, generally due to shortcomings, and a replacement API is usually given. \ Deprecated APIs may be removed in future implementations. +doclet.help.preview.body=\ + The {0} page lists all of the Preview APIs. \ + Preview APIs may be removed in future implementations. doclet.help.index.head=\ Index doclet.help.index.body=\ @@ -274,18 +277,18 @@ doclet.navClassUse=Use doclet.Error_in_grouplist=Bad -group option: {0} {1} doclet.Groupname_already_used=In -group option, group name already used: {0} doclet.Same_element_name_used=Element name or pattern used twice: {0} -doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: -doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). -doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. -doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. -doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. -doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. +doclet.PreviewLeadingNote={0} relies on preview features of the Java platform: +doclet.Declared_Using_Preview={0} is declared using {1}, a preview feature of the Java language ({2}). +doclet.PreviewAPI={0} refers to one or more preview APIs: {1}. +doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: {1}. +doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. +doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. doclet.Declared_Using_Preview.RECORD=Records doclet.Declared_Using_Preview.SEALED=Sealed Classes doclet.Declared_Using_Preview.SEALED_PERMITS=Sealed Classes -doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. -doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. +doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. +doclet.ReflectivePreviewPlatformLeadingNote={0} is a reflective preview API of the Java platform. # option specifiers doclet.usage.add-stylesheet.parameters=\ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java index 56d885c023950..3b1ce49a8dded 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java @@ -25,13 +25,11 @@ package jdk.javadoc.internal.doclets.toolkit.builders; -import static java.lang.invoke.ConstantBootstraps.enumConstant; import java.util.*; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; -import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.ConstructorWriter; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 7198fe8e080d5..2dce02d11cd66 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -208,7 +208,7 @@ doclet.Use_Table_Summary=Use table, listing {0}, and an explanation doclet.Member_Table_Summary={0} table, listing {1}, and an explanation doclet.fields=fields doclet.Fields=Fields -doclet.Preview=Preview API. +doclet.Preview=Preview. doclet.Properties=Properties doclet.constructors=constructors doclet.Constructors=Constructors diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java index 8c8d14e40db53..10c7094a31fc4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java @@ -124,7 +124,7 @@ public int compare(Element pkg1, Element pkg2) { return packageComparator; } - private Comparator deprecatedComparator = null; + private Comparator summaryComparator = null; /** * Returns a Comparator for deprecated items listed on deprecated list page, by comparing the @@ -132,9 +132,9 @@ public int compare(Element pkg1, Element pkg2) { * * @return a Comparator */ - public Comparator makeDeprecatedComparator() { - if (deprecatedComparator == null) { - deprecatedComparator = new ElementComparator() { + public Comparator makeSummaryComparator() { + if (summaryComparator == null) { + summaryComparator = new ElementComparator() { @Override public int compare(Element e1, Element e2) { int result = compareFullyQualifiedNames(e1, e2); @@ -150,7 +150,7 @@ public int compare(Element e1, Element e2) { } }; } - return deprecatedComparator; + return summaryComparator; } private Comparator serialFieldTreeComparator = null; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java index e2a85f39e2084..1892e6832e3a2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java @@ -78,7 +78,7 @@ public DeprecatedAPIListBuilder(BaseConfiguration configuration) { deprecatedMap = new EnumMap<>(DeprElementKind.class); for (DeprElementKind kind : DeprElementKind.values()) { deprecatedMap.put(kind, - new TreeSet<>(utils.comparators.makeDeprecatedComparator())); + new TreeSet<>(utils.comparators.makeSummaryComparator())); } buildDeprecatedAPIInfo(); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java index 1e240f454e897..c9fb48ed8ff2a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java @@ -45,7 +45,7 @@ */ public class PreviewAPIListBuilder { /** - * List of deprecated type Lists. + * List of preview type Lists. */ private final Map> previewMap; private final BaseConfiguration configuration; @@ -76,17 +76,21 @@ public PreviewAPIListBuilder(BaseConfiguration configuration) { previewMap = new EnumMap<>(PreviewElementKind.class); for (PreviewElementKind kind : PreviewElementKind.values()) { previewMap.put(kind, - new TreeSet<>(utils.comparators.makeDeprecatedComparator())); + new TreeSet<>(utils.comparators.makeSummaryComparator())); } - buildDeprecatedAPIInfo(); + buildPreviewAPIInfo(); + } + + public boolean isEmpty() { + return previewMap.values().stream().allMatch(Set::isEmpty); } /** - * Build the sorted list of all the deprecated APIs in this run. - * Build separate lists for deprecated modules, packages, classes, constructors, + * Build the sorted list of all the preview APIs in this run. + * Build separate lists for preview modules, packages, classes, constructors, * methods and fields. */ - private void buildDeprecatedAPIInfo() { + private void buildPreviewAPIInfo() { SortedSet modules = configuration.modules; SortedSet mset = previewMap.get(PreviewElementKind.MODULE); for (Element me : modules) { @@ -130,18 +134,18 @@ private void buildDeprecatedAPIInfo() { break; } } - composeDeprecatedList(previewMap.get(PreviewElementKind.FIELD), + composePreviewList(previewMap.get(PreviewElementKind.FIELD), utils.getFields(te)); - composeDeprecatedList(previewMap.get(PreviewElementKind.METHOD), + composePreviewList(previewMap.get(PreviewElementKind.METHOD), utils.getMethods(te)); - composeDeprecatedList(previewMap.get(PreviewElementKind.CONSTRUCTOR), + composePreviewList(previewMap.get(PreviewElementKind.CONSTRUCTOR), utils.getConstructors(te)); if (utils.isEnum(e)) { - composeDeprecatedList(previewMap.get(PreviewElementKind.ENUM_CONSTANT), + composePreviewList(previewMap.get(PreviewElementKind.ENUM_CONSTANT), utils.getEnumConstants(te)); } if (utils.isAnnotationType(e)) { - composeDeprecatedList(previewMap.get(PreviewElementKind.ANNOTATION_TYPE_MEMBER), + composePreviewList(previewMap.get(PreviewElementKind.ANNOTATION_TYPE_MEMBER), utils.getAnnotationMembers(te)); } @@ -149,13 +153,13 @@ private void buildDeprecatedAPIInfo() { } /** - * Add the members into a single list of deprecated members. + * Add the members into a single list of preview members. * - * @param rset set of elements deprecated for removal. - * @param sset set of deprecated elements. + * @param rset set of elements preview for removal. + * @param sset set of preview elements. * @param members members to be added in the list. */ - private void composeDeprecatedList(SortedSet sset, List members) { + private void composePreviewList(SortedSet sset, List members) { for (Element member : members) { if (utils.isPreviewAPI(member)) { sset.add(member); @@ -164,7 +168,7 @@ private void composeDeprecatedList(SortedSet sset, List getUsesTrees(Element element) { return getBlockTags(element, USES); } - public DocTree getPreviewTree(Element element) { - return getBody(element).stream() - .filter(t -> t.getKind() == Kind.UNKNOWN_INLINE_TAG) - .filter(t -> "preview".equals(((UnknownInlineTagTree) t).getTagName())) - .findAny() - .orElse(null); - } - - public String getPreviewTreeSummaryOrDetails(DocTree t, boolean summary) { - UnknownInlineTagTree previewTag = (UnknownInlineTagTree) t; - List previewContent = previewTag.getContent(); - String previewText = ((TextTree) previewContent.get(0)).getBody(); - String[] summaryAndDetails = previewText.split("\n\r?\n\r?"); - String rawHTML = - summary ? summaryAndDetails[0] - : summaryAndDetails.length > 1 ? summaryAndDetails[1] - : summaryAndDetails[0]; - return rawHTML; - } - public List getFirstSentenceTrees(Element element) { DocCommentTree dcTree = getDocCommentTree(element); if (dcTree == null) { @@ -3022,7 +3002,7 @@ public PreviewSummary declaredUsingPreviewAPIs(Element el) { } case MODULE, PACKAGE -> { } - default -> throw new IllegalStateException("Unexpected: " + el.getKind()); + default -> throw new IllegalArgumentException("Unexpected: " + el.getKind()); } Set previewAPI = new HashSet<>(); @@ -3142,7 +3122,7 @@ public String toString() { /** * Checks whether the given Element should be marked as a preview API. * - * Note that is a type is marked as a preview, its members are not. + * Note that if a type is marked as a preview, its members are not. * * @param el the element to check * @return true if and only if the given element should be marked as a preview API @@ -3157,14 +3137,33 @@ public boolean isPreviewAPI(Element el) { return !parentPreviewAPI && previewAPI; } + /** + * Checks whether the given Element should be marked as a reflective preview API. + * + * Note that if a type is marked as a preview, its members are not. + * + * @param el the element to check + * @return true if and only if the given element should be marked + * as a reflective preview API + */ public boolean isReflectivePreviewAPI(Element el) { return isPreviewAPI(el) && configuration.workArounds.isReflectivePreviewAPI(el); } + /** + * Return all flags for the given Element. + * + * @param el the element to test + * @return the set of all the element's flags. + */ public Set elementFlags(Element el) { Set flags = EnumSet.noneOf(ElementFlag.class); PreviewSummary previewAPIs = declaredUsingPreviewAPIs(el); + if (isDeprecated(el)) { + flags.add(ElementFlag.DEPRECATED); + } + if (!previewLanguageFeaturesUsed(el).isEmpty() || configuration.workArounds.isPreviewAPI(el) || !previewAPIs.previewAPI.isEmpty() || @@ -3176,7 +3175,12 @@ public Set elementFlags(Element el) { return flags; } + /** + * An element can have flags that place it into some sub-categories, like + * being a preview or a deprecated element. + */ public enum ElementFlag { + DEPRECATED, PREVIEW; } diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index c3369779e8356..1f6fd7b7fa389 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -59,9 +59,9 @@ public void test() { ResourceBundle bundle = ResourceBundle.getBundle("jdk.javadoc.internal.doclets.formats.html.resources.standard", ModuleLayer.boot().findModule("jdk.javadoc").get()); { - String zero = MessageFormat.format(bundle.getString("doclet.PreviewLeadingNote"), "TestPreviewDeclaration"); - String one = MessageFormat.format(bundle.getString("doclet.Declared_Using_Preview"), "TestPreviewDeclaration", "Sealed Classes", "sealed"); - String two = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote1"), "TestPreviewDeclaration"); + String zero = MessageFormat.format(bundle.getString("doclet.PreviewLeadingNote"), "TestPreviewDeclaration"); + String one = MessageFormat.format(bundle.getString("doclet.Declared_Using_Preview"), "TestPreviewDeclaration", "Sealed Classes", "sealed"); + String two = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote1"), "TestPreviewDeclaration"); String three = MessageFormat.format(bundle.getString("doclet.PreviewTrailingNote2"), new Object[0]); String expectedTemplate = """
{0} From 35f2a7850203871946af9747657d5ecac81c9013 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 29 Oct 2020 13:38:42 +0100 Subject: [PATCH 31/42] Finalizing removal of record preview hooks. --- .../doclets/formats/html/ClassWriterImpl.java | 2 +- .../doclets/formats/html/HtmlDocletWriter.java | 1 - .../formats/html/resources/standard.properties | 1 - .../internal/doclets/toolkit/util/Utils.java | 7 +------ .../doclet/testRecordTypes/TestRecordTypes.java | 14 +++++++------- 5 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index c8d152e5da6b4..c3a517b681970 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -87,7 +87,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite "java.io.Serializable"); private static final Set previewModifiers - = Set.of("record", "sealed", "non-sealed"); + = Set.of("sealed", "non-sealed"); protected final TypeElement typeElement; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index f5eeda0a0716e..a8a9391568ae9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -38,7 +38,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 3d18552c152f0..c61b4a0c1789e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -284,7 +284,6 @@ doclet.ReflectivePreviewAPI={0} refers to one or more reflective preview APIs: doclet.UsesDeclaredUsingPreview={0} refers to one or more types which are declared using a preview feature of the Java language: {1}. doclet.PreviewTrailingNote1=Programs can only use {0} when preview features are enabled. doclet.PreviewTrailingNote2=Preview features may be removed in a future release, or upgraded to permanent features of the Java platform. -doclet.Declared_Using_Preview.RECORD=Records doclet.Declared_Using_Preview.SEALED=Sealed Classes doclet.Declared_Using_Preview.SEALED_PERMITS=Sealed Classes doclet.PreviewPlatformLeadingNote={0} is a preview API of the Java platform. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index dacf4913f9309..f3bece17482ec 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -2938,10 +2938,6 @@ public String toString() { public Set previewLanguageFeaturesUsed(Element e) { Set result = new HashSet<>(); - if (e.getKind() == ElementKind.RECORD) { - result.add(DeclarationPreviewLanguageFeatures.RECORD); - } - if ((e.getKind().isClass() || e.getKind().isInterface()) && e.getModifiers().contains(Modifier.SEALED)) { List permits = ((TypeElement) e).getPermittedSubclasses(); @@ -2960,8 +2956,7 @@ public Set previewLanguageFeaturesUsed(Eleme public enum DeclarationPreviewLanguageFeatures { SEALED(List.of("sealed")), - SEALED_PERMITS(List.of("sealed", "permits")), - RECORD(List.of("record")); + SEALED_PERMITS(List.of("sealed", "permits")); public final List features; private DeclarationPreviewLanguageFeatures(List features) { diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index b3c4663d38802..2390eb8b38339 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -75,7 +75,7 @@ public void testRecordKeywordUnnamedPackage(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public record R""", """ R​(int r1)"""); } @@ -96,7 +96,7 @@ public void testRecordKeywordNamedPackage(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public record R""", """ R​(int r1)"""); } @@ -117,7 +117,7 @@ public void testEmptyRecord(Path base) throws IOException { """

Record R

""", """ - public recordPREVIEW R""", + public record R""", """ R()"""); } @@ -142,7 +142,7 @@ public record R(int r1) { }"""); """

Record R

""", """ - public recordPREVIEW R""", + public record R""", """
Record Components:
@@ -173,7 +173,7 @@ public record R(int r1) { }"""); """

Record R<T>

""", """ - public recordPREVIEW R<T>""", + public record R<T>""", """
Type Parameters:
@@ -471,11 +471,11 @@ void testAnnotations(Path base, Set types) throws IOException { checkOutput("p/R.html", true, """ -
public recordPREVIEW R("""
+                    
public record R("""
                         + rcAnno
                         + """
                             int i)
-                            extends java.lang.RecordPREVIEW
""", + extends java.lang.Record
""", "
" + fAnno + """ From cd4741e263253a5ac929e536971929f4c8294238 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 29 Oct 2020 14:06:35 +0100 Subject: [PATCH 32/42] Fixing tests. --- .../jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java b/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java index ef3228618b465..d35298134b915 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordLinks/TestRecordLinks.java @@ -82,7 +82,7 @@ public void bar() { } """, """ + JavadocTest.Bar
"""); checkOutput("example/JavadocTest.Bar.html", true, From d76eb2935506df40e109c53386abf9f966ffb086 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 29 Oct 2020 20:16:31 +0100 Subject: [PATCH 33/42] Updating tests after records are a final feature. --- .../preview/DeclaredUsingPreview-class.out | 6 ++---- .../preview/DeclaredUsingPreview-source.out | 15 ++++++--------- .../javac/preview/DeclaredUsingPreview.java | 1 - .../DeclaredUsingPreviewDeclarations.java | 1 - .../tools/javac/preview/PreviewErrors.java | 17 ++++++++++------- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out index aa152f0b45566..ffd38a5232ba6 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out @@ -1,7 +1,5 @@ - compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations.class, 16 -- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$R.class, 16 - compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C.class, 16 - compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C2.class, 16 -DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.record, DeclaredUsingPreviewDeclarations.R -DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C -6 warnings +DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +4 warnings diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out index cb3539f920831..3630a9e0ac53c 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-source.out @@ -1,10 +1,7 @@ -DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records) -DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.records) +DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) +DeclaredUsingPreviewDeclarations.java:3:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) -DeclaredUsingPreviewDeclarations.java:4:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) -DeclaredUsingPreviewDeclarations.java:5:5: compiler.warn.preview.feature.use.plural: (compiler.misc.feature.sealed.classes) -DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.record, DeclaredUsingPreviewDeclarations.R -DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C -DeclaredUsingPreview.java:11:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C2 -DeclaredUsingPreviewDeclarations.java:5:33: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C -9 warnings +DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +DeclaredUsingPreview.java:10:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C2 +DeclaredUsingPreviewDeclarations.java:4:33: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C +6 warnings diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview.java b/test/langtools/tools/javac/preview/DeclaredUsingPreview.java index 360ff9a53a5f3..403c471d1f613 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreview.java +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview.java @@ -6,7 +6,6 @@ * @compile/ref=DeclaredUsingPreview-class.out -XDrawDiagnostics --enable-preview -source ${jdk.version} -Xlint:preview DeclaredUsingPreview.java */ public class DeclaredUsingPreview { - DeclaredUsingPreviewDeclarations.R r; DeclaredUsingPreviewDeclarations.C c; DeclaredUsingPreviewDeclarations.C2 c2; //TODO: should cause warning? } diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java b/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java index 086735691efc3..0cf8b99791497 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreviewDeclarations.java @@ -1,6 +1,5 @@ ///nodynamiccopyright/ public class DeclaredUsingPreviewDeclarations { - record R(int i) {} sealed class C {} non-sealed class C2 extends C {} } diff --git a/test/langtools/tools/javac/preview/PreviewErrors.java b/test/langtools/tools/javac/preview/PreviewErrors.java index 4bb0e654f9615..7aba78fe86fa1 100644 --- a/test/langtools/tools/javac/preview/PreviewErrors.java +++ b/test/langtools/tools/javac/preview/PreviewErrors.java @@ -91,9 +91,10 @@ public static class Clazz {} .replace("${reflective}", elementType.reflective); } - private static final String RECORD_DECLARATION = """ + private static final String SEALED_DECLARATION = """ package user; - public record R(int i) {} + public sealed interface R {} + final class C implements R {} """; static Map>>> parts = new TreeMap<>(); @@ -126,7 +127,7 @@ public static void main(String... args) throws Exception { out.write("

" + petCount + ". Using an element declared using a preview feature

\n"); out.write("Element declaration:\n"); out.write("
\n");
-                            out.write(RECORD_DECLARATION);
+                            out.write(SEALED_DECLARATION);
                             out.write("\n
\n"); } case LANGUAGE -> { @@ -230,7 +231,7 @@ public void doWork() throws IOException { task.withOption("-XDforcePreview=true"); } case REFER_TO_DECLARATION_CLASS -> { - tb.writeJavaFiles(srcJavaBase, RECORD_DECLARATION); + tb.writeJavaFiles(srcJavaBase, SEALED_DECLARATION); new JavacTask(tb) .outdir(classesJavaBase) @@ -247,7 +248,7 @@ public void doWork() throws IOException { .withOption("java.base/user=ALL-UNNAMED"); } case REFER_TO_DECLARATION_SOURCE -> { - tb.writeJavaFiles(srcJavaBase, RECORD_DECLARATION); + tb.writeJavaFiles(srcJavaBase, SEALED_DECLARATION); task.withOption("--patch-module") .withOption("java.base=" + srcJavaBase.toString()) @@ -349,11 +350,13 @@ public void test(Object o) { case REFER_TO_DECLARATION_SOURCE -> { if (lint == Lint.ENABLE_PREVIEW) { if (suppress == Suppress.YES) { - expected = Set.of("2:8:compiler.warn.preview.feature.use.plural"); + expected = Set.of("2:8:compiler.warn.preview.feature.use.plural", + "3:26:compiler.warn.declared.using.preview"); } else { expected = Set.of("5:13:compiler.warn.declared.using.preview", "5:24:compiler.warn.declared.using.preview", - "2:8:compiler.warn.preview.feature.use.plural"); + "2:8:compiler.warn.preview.feature.use.plural", + "3:26:compiler.warn.declared.using.preview"); } } else { if (suppress == Suppress.YES) { From 2e403900d7b0cf1911609c95871fa8671429da92 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Mon, 2 Nov 2020 19:11:48 +0100 Subject: [PATCH 34/42] Removing trailing whitespace. --- .../javadoc/internal/doclets/formats/html/HtmlDocletWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index b89c58b712ef4..733b28052725d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -2235,7 +2235,7 @@ public void addPreviewInfo(Element forWhat, Content target) { String leadingNoteKey = !isReflectivePreview ? "doclet.PreviewPlatformLeadingNote" : "doclet.ReflectivePreviewPlatformLeadingNote"; - Content leadingNote = + Content leadingNote = contents.getContent(leadingNoteKey, nameCode); previewDiv.add(HtmlTree.SPAN(HtmlStyle.previewLabel, leadingNote)); From 743f516c660b577035cdda4510a0bb97937fd9b2 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 4 Nov 2020 12:04:10 +0100 Subject: [PATCH 35/42] Reflecting review comments. --- .../com/sun/tools/javac/code/Preview.java | 18 +- .../html/AbstractExecutableMemberWriter.java | 2 +- .../formats/html/AbstractMemberWriter.java | 4 +- ...nnotationTypeRequiredMemberWriterImpl.java | 2 +- .../doclets/formats/html/ClassWriterImpl.java | 4 +- .../formats/html/DeprecatedListWriter.java | 374 +----------------- .../formats/html/EnumConstantWriterImpl.java | 2 +- .../doclets/formats/html/FieldWriterImpl.java | 2 +- .../formats/html/HtmlDocletWriter.java | 10 +- .../doclets/formats/html/LinkFactoryImpl.java | 6 +- .../formats/html/ModuleIndexWriter.java | 3 - .../formats/html/NestedClassWriterImpl.java | 2 +- .../formats/html/PreviewListWriter.java | 338 +--------------- .../formats/html/PropertyWriterImpl.java | 2 +- .../formats/html/SummaryListWriter.java | 335 ++++++++++++++++ .../formats/html/markup/HtmlStyle.java | 10 +- .../doclets/formats/html/markup/HtmlTree.java | 11 + .../internal/doclets/toolkit/FieldWriter.java | 2 +- .../doclets/toolkit/MethodWriter.java | 2 +- .../toolkit/resources/doclets.properties | 1 + .../doclets/toolkit/resources/stylesheet.css | 6 +- .../doclets/toolkit/util/Comparators.java | 3 +- .../util/DeprecatedAPIListBuilder.java | 157 +------- .../toolkit/util/PreviewAPIListBuilder.java | 146 +------ .../toolkit/util/SummaryAPIListBuilder.java | 225 +++++++++++ .../internal/doclets/toolkit/util/Utils.java | 4 +- .../share/classes/jdk/jshell/Snippet.java | 1 - .../TestDeprecatedDocs.java | 34 +- .../doclet/testModules/TestModules.java | 2 +- .../doclet/testPreview/TestPreview.java | 36 +- .../testPreview/api/preview/CoreRecord.java | 30 ++ .../api/preview/CoreRecordComponent.java | 29 ++ .../tools/javac/patterns/BindingsTest2.out | 2 +- .../javac/preview/PreviewAutoSuppress.java | 1 + .../tools/javac/preview/PreviewErrors.java | 3 +- 35 files changed, 771 insertions(+), 1038 deletions(-) create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java create mode 100644 test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java create mode 100644 test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java index 8de3520419ec4..54c39ce7fced9 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java @@ -182,14 +182,16 @@ public boolean isEnabled() { * @return true, if given feature is a preview feature. */ public boolean isPreview(Feature feature) { - if (feature == Feature.PATTERN_MATCHING_IN_INSTANCEOF || - feature == Feature.REIFIABLE_TYPES_INSTANCEOF || - feature == Feature.SEALED_CLASSES) - return true; - //Note: this is a backdoor which allows to optionally treat all features as 'preview' (for testing). - //When real preview features will be added, this method can be implemented to return 'true' - //for those selected features, and 'false' for all the others. - return forcePreview; + return switch (feature) { + case PATTERN_MATCHING_IN_INSTANCEOF -> true; + case REIFIABLE_TYPES_INSTANCEOF -> true; + case SEALED_CLASSES -> true; + + //Note: this is a backdoor which allows to optionally treat all features as 'preview' (for testing). + //When real preview features will be added, this method can be implemented to return 'true' + //for those selected features, and 'false' for all the others. + default -> forcePreview; + }; } /** diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java index efd18a7383b53..a248d2c533925 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -85,7 +85,7 @@ protected Content getTypeParameters(ExecutableElement member) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { Content content = new ContentBuilder(); content.add(utils.getFullyQualifiedName(member)); if (!utils.isConstructor(member)) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index c890ecb5a6cbe..b11f25b685054 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -184,13 +184,13 @@ protected abstract void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree); /** - * Returns the deprecated link. + * Returns a link for summary (deprecated, preview) pages. * * @param member the member being linked to * * @return a content tree representing the link */ - protected abstract Content getDeprecatedOrPreviewLink(Element member); + protected abstract Content getSummaryLink(Element member); /** * Adds the modifier and type for the member in the member summary. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index 0c113e554462a..97bedbe45b2f6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -200,7 +200,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index bf8228b19898b..5df3bfa76520f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -209,7 +209,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { } if (previewModifiers.contains(modifiersPart)) { pre.add(modifiersPart); - pre.add(new HtmlTree(TagName.SUP).add(links.createLink(getPreviewSectionAnchor(typeElement), + pre.add(HtmlTree.SUP(links.createLink(getPreviewSectionAnchor(typeElement), contents.previewMark))); } else { pre.add(modifiersPart); @@ -281,7 +281,7 @@ public void addClassSignature(String modifiers, Content classInfoTree) { if (isFirst) { pre.add(DocletConstants.NL); pre.add("permits"); - pre.add(new HtmlTree(TagName.SUP).add(links.createLink(getPreviewSectionAnchor(typeElement), + pre.add(HtmlTree.SUP(links.createLink(getPreviewSectionAnchor(typeElement), contents.previewMark))); pre.add(" "); isFirst = false; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java index caa5e34580c95..ccfdb1acecbe0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java @@ -26,31 +26,16 @@ package jdk.javadoc.internal.doclets.formats.html; import com.sun.source.doctree.DeprecatedTree; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.EnumMap; import java.util.List; -import java.util.SortedSet; import javax.lang.model.element.Element; -import javax.lang.model.element.ModuleElement; -import javax.lang.model.element.PackageElement; - -import com.sun.source.doctree.DocTree; -import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; -import jdk.javadoc.internal.doclets.formats.html.markup.TagName; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; -import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder; -import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder.DeprElementKind; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; -import jdk.javadoc.internal.doclets.toolkit.util.IndexItem; /** * Generate File to list all the deprecated classes and class members with the @@ -63,151 +48,7 @@ * * @see java.util.List */ -public class DeprecatedListWriter extends SubWriterHolderWriter { - - private String getAnchorName(DeprElementKind kind) { - switch (kind) { - case REMOVAL: - return "forRemoval"; - case MODULE: - return "module"; - case PACKAGE: - return "package"; - case INTERFACE: - return "interface"; - case CLASS: - return "class"; - case ENUM: - return "enum"; - case EXCEPTION: - return "exception"; - case ERROR: - return "error"; - case ANNOTATION_TYPE: - return "annotation.type"; - case FIELD: - return "field"; - case METHOD: - return "method"; - case CONSTRUCTOR: - return "constructor"; - case ENUM_CONSTANT: - return "enum.constant"; - case ANNOTATION_TYPE_MEMBER: - return "annotation.type.member"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getHeadingKey(DeprElementKind kind) { - switch (kind) { - case REMOVAL: - return "doclet.For_Removal"; - case MODULE: - return "doclet.Modules"; - case PACKAGE: - return "doclet.Packages"; - case INTERFACE: - return "doclet.Interfaces"; - case CLASS: - return "doclet.Classes"; - case ENUM: - return "doclet.Enums"; - case EXCEPTION: - return "doclet.Exceptions"; - case ERROR: - return "doclet.Errors"; - case ANNOTATION_TYPE: - return "doclet.Annotation_Types"; - case FIELD: - return "doclet.Fields"; - case METHOD: - return "doclet.Methods"; - case CONSTRUCTOR: - return "doclet.Constructors"; - case ENUM_CONSTANT: - return "doclet.Enum_Constants"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.Annotation_Type_Members"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getSummaryKey(DeprElementKind kind) { - switch (kind) { - case REMOVAL: - return "doclet.for_removal"; - case MODULE: - return "doclet.modules"; - case PACKAGE: - return "doclet.packages"; - case INTERFACE: - return "doclet.interfaces"; - case CLASS: - return "doclet.classes"; - case ENUM: - return "doclet.enums"; - case EXCEPTION: - return "doclet.exceptions"; - case ERROR: - return "doclet.errors"; - case ANNOTATION_TYPE: - return "doclet.annotation_types"; - case FIELD: - return "doclet.fields"; - case METHOD: - return "doclet.methods"; - case CONSTRUCTOR: - return "doclet.constructors"; - case ENUM_CONSTANT: - return "doclet.enum_constants"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.annotation_type_members"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getHeaderKey(DeprElementKind kind) { - switch (kind) { - case REMOVAL: - return "doclet.Element"; - case MODULE: - return "doclet.Module"; - case PACKAGE: - return "doclet.Package"; - case INTERFACE: - return "doclet.Interface"; - case CLASS: - return "doclet.Class"; - case ENUM: - return "doclet.Enum"; - case EXCEPTION: - return "doclet.Exceptions"; - case ERROR: - return "doclet.Errors"; - case ANNOTATION_TYPE: - return "doclet.AnnotationType"; - case FIELD: - return "doclet.Field"; - case METHOD: - return "doclet.Method"; - case CONSTRUCTOR: - return "doclet.Constructor"; - case ENUM_CONSTANT: - return "doclet.Enum_Constant"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.Annotation_Type_Member"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private EnumMap writerMap; - - private final Navigation navBar; +public class DeprecatedListWriter extends SummaryListWriter { /** * Constructor. @@ -217,42 +58,8 @@ private String getHeaderKey(DeprElementKind kind) { */ public DeprecatedListWriter(HtmlConfiguration configuration, DocPath filename) { - super(configuration, filename); - this.navBar = new Navigation(null, configuration, PageMode.DEPRECATED, path); - NestedClassWriterImpl classW = new NestedClassWriterImpl(this); - writerMap = new EnumMap<>(DeprElementKind.class); - for (DeprElementKind kind : DeprElementKind.values()) { - switch (kind) { - case REMOVAL: - case MODULE: - case PACKAGE: - case INTERFACE: - case CLASS: - case ENUM: - case EXCEPTION: - case ERROR: - case ANNOTATION_TYPE: - writerMap.put(kind, classW); - break; - case FIELD: - writerMap.put(kind, new FieldWriterImpl(this)); - break; - case METHOD: - writerMap.put(kind, new MethodWriterImpl(this)); - break; - case CONSTRUCTOR: - writerMap.put(kind, new ConstructorWriterImpl(this)); - break; - case ENUM_CONSTANT: - writerMap.put(kind, new EnumConstantWriterImpl(this)); - break; - case ANNOTATION_TYPE_MEMBER: - writerMap.put(kind, new AnnotationTypeOptionalMemberWriterImpl(this, null)); - break; - default: - throw new AssertionError("unknown kind: " + kind); - } - } + super(configuration, filename, PageMode.DEPRECATED, "deprecated elements", + configuration.contents.deprecatedAPI, "doclet.Window_Deprecated_List"); } /** @@ -267,174 +74,31 @@ public static void generate(HtmlConfiguration configuration) throws DocFileIOExc if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) { DocPath filename = DocPaths.DEPRECATED_LIST; DeprecatedListWriter depr = new DeprecatedListWriter(configuration, filename); - depr.generateDeprecatedListFile(configuration.deprecatedAPIListBuilder); + depr.generateSummaryListFile(configuration.deprecatedAPIListBuilder); } } - /** - * Generate the deprecated API list. - * - * @param deprAPI list of deprecated API built already. - * @throws DocFileIOException if there is a problem writing the deprecated list - */ - protected void generateDeprecatedListFile(DeprecatedAPIListBuilder deprAPI) - throws DocFileIOException { - HtmlTree body = getHeader(); - bodyContents.addMainContent(getContentsList(deprAPI)); - String memberTableSummary; - Content content = new ContentBuilder(); - for (DeprElementKind kind : DeprElementKind.values()) { - if (deprAPI.hasDocumentation(kind)) { - memberTableSummary = resources.getText("doclet.Member_Table_Summary", - resources.getText(getHeadingKey(kind)), - resources.getText(getSummaryKey(kind))); - TableHeader memberTableHeader = new TableHeader( - contents.getContent(getHeaderKey(kind)), contents.descriptionLabel); - addDeprecatedAPI(deprAPI.getSet(kind), getAnchorName(kind), - getHeadingKey(kind), memberTableSummary, memberTableHeader, content); - } - } - bodyContents.addMainContent(content); - HtmlTree htmlTree = HtmlTree.FOOTER(); - navBar.setUserFooter(getUserHeaderFooter(false)); - htmlTree.add(navBar.getContent(Navigation.Position.BOTTOM)); - addBottom(htmlTree); - bodyContents.setFooter(htmlTree); - String description = "deprecated elements"; - body.add(bodyContents); - printHtmlDocument(null, description, body); - - if (!deprAPI.isEmpty() && configuration.mainIndex != null) { - configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS, - resources.getText("doclet.Deprecated_API"), path)); - } + @Override + protected void addExtraSection(DeprecatedAPIListBuilder list, Content content) { + addSummaryAPI(list.getForRemoval(), "forRemoval", + "doclet.For_Removal", "doclet.for_removal", + "doclet.Element", content); } - /** - * Add the index link. - * - * @param builder the deprecated list builder - * @param kind the kind of list being documented - * @param contentTree the content tree to which the index link will be added - */ - private void addIndexLink(DeprecatedAPIListBuilder builder, - DeprElementKind kind, Content contentTree) { - if (builder.hasDocumentation(kind)) { - Content li = HtmlTree.LI(links.createLink(getAnchorName(kind), - contents.getContent(getHeadingKey(kind)))); - contentTree.add(li); + @Override + protected void addExtraIndexLink(DeprecatedAPIListBuilder list, Content target) { + if (!list.getForRemoval().isEmpty()) { + addIndexLink("forRemoval", "doclet.For_Removal", target); } } - /** - * Get the contents list. - * - * @param deprapi the deprecated list builder - * @return a content tree for the contents list - */ - public Content getContentsList(DeprecatedAPIListBuilder deprapi) { - Content headContent = contents.deprecatedAPI; - Content heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, - HtmlStyle.title, headContent); - Content div = HtmlTree.DIV(HtmlStyle.header, heading); - Content headingContent = contents.contentsHeading; - div.add(HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING, - headingContent)); - Content ul = new HtmlTree(TagName.UL); - for (DeprElementKind kind : DeprElementKind.values()) { - addIndexLink(deprapi, kind, ul); + protected void addComments(Element e, Content desc) { + List tags = utils.getDeprecatedTrees(e); + if (!tags.isEmpty()) { + addInlineDeprecatedComment(e, tags.get(0), desc); + } else { + desc.add(HtmlTree.EMPTY); } - div.add(ul); - return div; } - /** - * Get the header for the deprecated API Listing. - * - * @return a content tree for the header - */ - public HtmlTree getHeader() { - String title = resources.getText("doclet.Window_Deprecated_List"); - HtmlTree bodyTree = getBody(getWindowTitle(title)); - Content headerContent = new ContentBuilder(); - addTop(headerContent); - navBar.setUserHeader(getUserHeaderFooter(true)); - headerContent.add(navBar.getContent(Navigation.Position.TOP)); - bodyContents.setHeader(headerContent); - return bodyTree; - } - - /** - * Add deprecated information to the documentation tree - * - * @param deprList list of deprecated API elements - * @param id the id attribute of the table - * @param headingKey the caption for the deprecated table - * @param tableSummary the summary for the deprecated table - * @param tableHeader table headers for the deprecated table - * @param contentTree the content tree to which the deprecated table will be added - */ - protected void addDeprecatedAPI(SortedSet deprList, String id, String headingKey, - String tableSummary, TableHeader tableHeader, Content contentTree) { - if (deprList.size() > 0) { - Content caption = contents.getContent(headingKey); - Table table = new Table(HtmlStyle.summaryTable) - .setCaption(caption) - .setHeader(tableHeader) - .setId(id) - .setColumnStyles(HtmlStyle.colDeprecatedItemName, HtmlStyle.colLast); - for (Element e : deprList) { - Content link; - switch (e.getKind()) { - case MODULE: - ModuleElement m = (ModuleElement) e; - link = getModuleLink(m, new StringContent(m.getQualifiedName())); - break; - case PACKAGE: - PackageElement pkg = (PackageElement) e; - link = getPackageLink(pkg, getPackageName(pkg)); - break; - default: - link = getDeprecatedLink(e); - } - Content desc = new ContentBuilder(); - List tags = utils.getDeprecatedTrees(e); - if (!tags.isEmpty()) { - addInlineDeprecatedComment(e, tags.get(0), desc); - } else { - desc.add(HtmlTree.EMPTY); - } - table.addRow(link, desc); - } - // note: singleton list - contentTree.add(HtmlTree.UL(HtmlStyle.blockList, HtmlTree.LI(table))); - } - } - - protected Content getDeprecatedLink(Element e) { - AbstractMemberWriter writer; - switch (e.getKind()) { - case INTERFACE: - case CLASS: - case ENUM: - case ANNOTATION_TYPE: - writer = new NestedClassWriterImpl(this); - break; - case FIELD: - writer = new FieldWriterImpl(this); - break; - case METHOD: - writer = new MethodWriterImpl(this); - break; - case CONSTRUCTOR: - writer = new ConstructorWriterImpl(this); - break; - case ENUM_CONSTANT: - writer = new EnumConstantWriterImpl(this); - break; - default: - writer = new AnnotationTypeOptionalMemberWriterImpl(this, null); - } - return writer.getDeprecatedOrPreviewLink(e); - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java index 7debc2e43b4d8..5ad551a0c7293 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java @@ -176,7 +176,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java index 138229fe4fa38..f005c4c72f0cb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java @@ -203,7 +203,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, name); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 733b28052725d..f96118af5b25d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -654,8 +654,7 @@ public Content getPackageLink(PackageElement packageElement, Content label) { if (flags.contains(ElementFlag.PREVIEW)) { return new ContentBuilder( links.createLink(targetLink, label), - new HtmlTree(TagName.SUP) - .add(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(packageElement)), + HtmlTree.SUP(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(packageElement)), contents.previewMark)) ); } @@ -664,7 +663,7 @@ public Content getPackageLink(PackageElement packageElement, Content label) { if (flags.contains(ElementFlag.PREVIEW)) { return new ContentBuilder( label, - new HtmlTree(TagName.SUP).add(contents.previewMark) + HtmlTree.SUP(contents.previewMark) ); } return label; @@ -688,8 +687,7 @@ public Content getModuleLink(ModuleElement mdle, Content label) { if (flags.contains(ElementFlag.PREVIEW) && label != contents.moduleLabel) { link = new ContentBuilder( link, - new HtmlTree(TagName.SUP) - .add(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(mdle)), + HtmlTree.SUP(links.createLink(targetLink.withFragment(getPreviewSectionAnchor(mdle)), contents.previewMark)) ); } @@ -698,7 +696,7 @@ public Content getModuleLink(ModuleElement mdle, Content label) { if (flags.contains(ElementFlag.PREVIEW)) { return new ContentBuilder( label, - new HtmlTree(TagName.SUP).add(contents.previewMark) + HtmlTree.SUP(contents.previewMark) ); } return label; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 4cb7ac1b8b417..3bfc345be65a8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -118,7 +118,7 @@ protected Content getClassLink(LinkInfo linkInfo) { title, classLinkInfo.target)); if (flags.contains(ElementFlag.PREVIEW)) { - link.add(new HtmlTree(TagName.SUP).add(m_writer.links.createLink( + link.add(HtmlTree.SUP(m_writer.links.createLink( filename.fragment(m_writer.getPreviewSectionAnchor(target)), m_writer.contents.previewMark))); } @@ -135,7 +135,7 @@ protected Content getClassLink(LinkInfo linkInfo) { if (crossLink != null) { link.add(crossLink); if (flags.contains(ElementFlag.PREVIEW)) { - link.add(new HtmlTree(TagName.SUP).add(m_writer.getCrossClassLink( + link.add(HtmlTree.SUP(m_writer.getCrossClassLink( typeElement, m_writer.getPreviewSectionAnchor(target), m_writer.contents.previewMark, @@ -150,7 +150,7 @@ protected Content getClassLink(LinkInfo linkInfo) { // Can't link so just write label. link.add(label); if (flags.contains(ElementFlag.PREVIEW)) { - link.add(new HtmlTree(TagName.SUP).add(m_writer.contents.previewMark)); + link.add(HtmlTree.SUP(m_writer.contents.previewMark)); } if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { link.add(getTypeParameterLinks(linkInfo)); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java index c939169018398..062dde8d7e00b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java @@ -25,7 +25,6 @@ package jdk.javadoc.internal.doclets.formats.html; -import com.sun.source.doctree.DocTree; import jdk.javadoc.internal.doclets.formats.html.markup.Table; import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; @@ -35,8 +34,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; -import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml; import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java index bf65fc9babd8d..4bec3479c6c82 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java @@ -145,7 +145,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java index 5d258c6b81439..35d852408c34a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -25,31 +25,19 @@ package jdk.javadoc.internal.doclets.formats.html; -import jdk.javadoc.internal.doclets.formats.html.markup.Table; -import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; - -import java.util.EnumMap; import java.util.List; -import java.util.SortedSet; import javax.lang.model.element.Element; -import javax.lang.model.element.ModuleElement; -import javax.lang.model.element.PackageElement; import com.sun.source.doctree.DocTree; -import javax.lang.model.element.ElementKind; -import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; -import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; -import jdk.javadoc.internal.doclets.formats.html.markup.TagName; + import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; -import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; import jdk.javadoc.internal.doclets.toolkit.util.DocPath; import jdk.javadoc.internal.doclets.toolkit.util.DocPaths; import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder; -import jdk.javadoc.internal.doclets.toolkit.util.PreviewAPIListBuilder.PreviewElementKind; /** * Generate File to list all the preview elements with the @@ -62,143 +50,7 @@ * * @see java.util.List */ -public class PreviewListWriter extends SubWriterHolderWriter { - - private String getAnchorName(PreviewElementKind kind) { - switch (kind) { - case MODULE: - return "module"; - case PACKAGE: - return "package"; - case INTERFACE: - return "interface"; - case CLASS: - return "class"; - case ENUM: - return "enum"; - case EXCEPTION: - return "exception"; - case ERROR: - return "error"; - case ANNOTATION_TYPE: - return "annotation.type"; - case FIELD: - return "field"; - case METHOD: - return "method"; - case CONSTRUCTOR: - return "constructor"; - case ENUM_CONSTANT: - return "enum.constant"; - case ANNOTATION_TYPE_MEMBER: - return "annotation.type.member"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getHeadingKey(PreviewElementKind kind) { - switch (kind) { - case MODULE: - return "doclet.Modules"; - case PACKAGE: - return "doclet.Packages"; - case INTERFACE: - return "doclet.Interfaces"; - case CLASS: - return "doclet.Classes"; - case ENUM: - return "doclet.Enums"; - case EXCEPTION: - return "doclet.Exceptions"; - case ERROR: - return "doclet.Errors"; - case ANNOTATION_TYPE: - return "doclet.Annotation_Types"; - case FIELD: - return "doclet.Fields"; - case METHOD: - return "doclet.Methods"; - case CONSTRUCTOR: - return "doclet.Constructors"; - case ENUM_CONSTANT: - return "doclet.Enum_Constants"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.Annotation_Type_Members"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getSummaryKey(PreviewElementKind kind) { - switch (kind) { - case MODULE: - return "doclet.modules"; - case PACKAGE: - return "doclet.packages"; - case INTERFACE: - return "doclet.interfaces"; - case CLASS: - return "doclet.classes"; - case ENUM: - return "doclet.enums"; - case EXCEPTION: - return "doclet.exceptions"; - case ERROR: - return "doclet.errors"; - case ANNOTATION_TYPE: - return "doclet.annotation_types"; - case FIELD: - return "doclet.fields"; - case METHOD: - return "doclet.methods"; - case CONSTRUCTOR: - return "doclet.constructors"; - case ENUM_CONSTANT: - return "doclet.enum_constants"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.annotation_type_members"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private String getHeaderKey(PreviewElementKind kind) { - switch (kind) { - case MODULE: - return "doclet.Module"; - case PACKAGE: - return "doclet.Package"; - case INTERFACE: - return "doclet.Interface"; - case CLASS: - return "doclet.Class"; - case ENUM: - return "doclet.Enum"; - case EXCEPTION: - return "doclet.Exceptions"; - case ERROR: - return "doclet.Errors"; - case ANNOTATION_TYPE: - return "doclet.AnnotationType"; - case FIELD: - return "doclet.Field"; - case METHOD: - return "doclet.Method"; - case CONSTRUCTOR: - return "doclet.Constructor"; - case ENUM_CONSTANT: - return "doclet.Enum_Constant"; - case ANNOTATION_TYPE_MEMBER: - return "doclet.Annotation_Type_Member"; - default: - throw new AssertionError("unknown kind: " + kind); - } - } - - private EnumMap writerMap; - - private final Navigation navBar; +public class PreviewListWriter extends SummaryListWriter { /** * Constructor. @@ -208,21 +60,8 @@ private String getHeaderKey(PreviewElementKind kind) { */ public PreviewListWriter(HtmlConfiguration configuration, DocPath filename) { - super(configuration, filename); - this.navBar = new Navigation(null, configuration, PageMode.PREVIEW, path); - NestedClassWriterImpl classW = new NestedClassWriterImpl(this); - writerMap = new EnumMap<>(PreviewElementKind.class); - for (PreviewElementKind kind : PreviewElementKind.values()) { - writerMap.put(kind, switch (kind) { - case MODULE, PACKAGE, INTERFACE, CLASS, ENUM, - EXCEPTION, ERROR, ANNOTATION_TYPE -> classW; - case FIELD -> new FieldWriterImpl(this); - case METHOD -> new MethodWriterImpl(this); - case CONSTRUCTOR -> new ConstructorWriterImpl(this); - case ENUM_CONSTANT -> new EnumConstantWriterImpl(this); - case ANNOTATION_TYPE_MEMBER -> new AnnotationTypeOptionalMemberWriterImpl(this, null); - }); - } + super(configuration, filename, PageMode.PREVIEW, "preview elements", + configuration.contents.previewAPI, "doclet.Window_Preview_List"); } /** @@ -233,173 +72,22 @@ public PreviewListWriter(HtmlConfiguration configuration, DocPath filename) { * @throws DocFileIOException if there is a problem writing the preview list */ public static void generate(HtmlConfiguration configuration) throws DocFileIOException { - if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) { + if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.PREVIEW)) { DocPath filename = DocPaths.PREVIEW_LIST; PreviewListWriter depr = new PreviewListWriter(configuration, filename); - depr.generatePreviewListFile( + depr.generateSummaryListFile( new PreviewAPIListBuilder(configuration)); } } - /** - * Generate the preview API list. - * - * @param previewapi list of preview API built already. - * @throws DocFileIOException if there is a problem writing the preview list - */ - protected void generatePreviewListFile(PreviewAPIListBuilder previewapi) - throws DocFileIOException { - HtmlTree body = getHeader(); - bodyContents.addMainContent(getContentsList(previewapi)); - String memberTableSummary; - Content content = new ContentBuilder(); - for (PreviewElementKind kind : PreviewElementKind.values()) { - if (previewapi.hasDocumentation(kind)) { - memberTableSummary = resources.getText("doclet.Member_Table_Summary", - resources.getText(getHeadingKey(kind)), - resources.getText(getSummaryKey(kind))); - TableHeader memberTableHeader = new TableHeader( - contents.getContent(getHeaderKey(kind)), contents.descriptionLabel); - addPreviewAPI(previewapi.getSet(kind), getAnchorName(kind), - getHeadingKey(kind), memberTableSummary, memberTableHeader, content); - } - } - bodyContents.addMainContent(content); - HtmlTree htmlTree = HtmlTree.FOOTER(); - navBar.setUserFooter(getUserHeaderFooter(false)); - htmlTree.add(navBar.getContent(Navigation.Position.BOTTOM)); - addBottom(htmlTree); - bodyContents.setFooter(htmlTree); - String description = "preview elements"; - body.add(bodyContents); - printHtmlDocument(null, description, body); - } - - /** - * Add the index link. - * - * @param builder the preview list builder - * @param kind the kind of list being documented - * @param contentTree the content tree to which the index link will be added - */ - private void addIndexLink(PreviewAPIListBuilder builder, - PreviewElementKind kind, Content contentTree) { - if (builder.hasDocumentation(kind)) { - Content li = HtmlTree.LI(links.createLink(getAnchorName(kind), - contents.getContent(getHeadingKey(kind)))); - contentTree.add(li); - } - } - - /** - * Get the contents list. - * - * @param previewapi the preview list builder - * @return a content tree for the contents list - */ - public Content getContentsList(PreviewAPIListBuilder previewapi) { - Content headContent = contents.previewAPI; - Content heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, - HtmlStyle.title, headContent); - Content div = HtmlTree.DIV(HtmlStyle.header, heading); - Content headingContent = contents.contentsHeading; - div.add(HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING, - headingContent)); - Content ul = new HtmlTree(TagName.UL); - for (PreviewElementKind kind : PreviewElementKind.values()) { - addIndexLink(previewapi, kind, ul); + @Override + protected void addComments(Element e, Content desc) { + List tags = utils.getFirstSentenceTrees(e); + if (!tags.isEmpty()) { + addPreviewComment(e, tags, desc); + } else { + desc.add(HtmlTree.EMPTY); } - div.add(ul); - return div; } - /** - * Get the header for the preview API Listing. - * - * @return a content tree for the header - */ - public HtmlTree getHeader() { - String title = resources.getText("doclet.Window_Preview_List"); - HtmlTree bodyTree = getBody(getWindowTitle(title)); - Content headerContent = new ContentBuilder(); - addTop(headerContent); - navBar.setUserHeader(getUserHeaderFooter(true)); - headerContent.add(navBar.getContent(Navigation.Position.TOP)); - bodyContents.setHeader(headerContent); - return bodyTree; - } - - /** - * Add preview information to the documentation tree - * - * @param previewList list of preview API elements - * @param id the id attribute of the table - * @param headingKey the caption for the preview table - * @param tableSummary the summary for the preview table - * @param tableHeader table headers for the preview table - * @param contentTree the content tree to which the preview table will be added - */ - protected void addPreviewAPI(SortedSet previewList, String id, String headingKey, - String tableSummary, TableHeader tableHeader, Content contentTree) { - if (previewList.size() > 0) { - Content caption = contents.getContent(headingKey); - Table table = new Table(HtmlStyle.summaryTable) - .setCaption(caption) - .setHeader(tableHeader) - .setId(id) - .setColumnStyles(HtmlStyle.colPreviewItemName, HtmlStyle.colLast); - for (Element e : previewList) { - Content link; - switch (e.getKind()) { - case MODULE: - ModuleElement m = (ModuleElement) e; - link = getModuleLink(m, new StringContent(m.getQualifiedName())); - break; - case PACKAGE: - PackageElement pkg = (PackageElement) e; - link = getPackageLink(pkg, getPackageName(pkg)); - break; - default: - link = getPreviewLink(e); - } - Content desc = new ContentBuilder(); - List tags = utils.getFirstSentenceTrees(e); - if (!tags.isEmpty()) { - addPreviewComment(e, tags, desc); - } else { - desc.add(HtmlTree.EMPTY); - } - table.addRow(link, desc); - } - // note: singleton list - contentTree.add(HtmlTree.UL(HtmlStyle.blockList, HtmlTree.LI(table))); - } - } - - protected Content getPreviewLink(Element e) { - AbstractMemberWriter writer; - switch (e.getKind()) { - case INTERFACE: - case CLASS: - case ENUM: - case ANNOTATION_TYPE: - writer = new NestedClassWriterImpl(this); - break; - case FIELD: - writer = new FieldWriterImpl(this); - break; - case METHOD: - writer = new MethodWriterImpl(this); - break; - case CONSTRUCTOR: - writer = new ConstructorWriterImpl(this); - break; - case ENUM_CONSTANT: - writer = new EnumConstantWriterImpl(this); - break; - default: - writer = new AnnotationTypeOptionalMemberWriterImpl(this, null); - } - return writer.getDeprecatedOrPreviewLink(e); - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java index c04379fb9645f..f184ac19c8f8a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java @@ -218,7 +218,7 @@ protected void addSummaryType(Element member, Content tdSummaryType) { } @Override - protected Content getDeprecatedOrPreviewLink(Element member) { + protected Content getSummaryLink(Element member) { return writer.getDocLink(LinkInfoImpl.Kind.MEMBER_DEPRECATED_PREVIEW, member, utils.getFullyQualifiedName(member)); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java new file mode 100644 index 0000000000000..24fd8a9d3b081 --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java @@ -0,0 +1,335 @@ +/* + * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.javadoc.internal.doclets.formats.html; + +import java.util.SortedSet; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ModuleElement; +import javax.lang.model.element.PackageElement; + +import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; +import jdk.javadoc.internal.doclets.formats.html.markup.Table; +import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; +import jdk.javadoc.internal.doclets.formats.html.markup.TagName; +import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; +import jdk.javadoc.internal.doclets.formats.html.Navigation.PageMode; +import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; +import jdk.javadoc.internal.doclets.toolkit.Content; +import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException; +import jdk.javadoc.internal.doclets.toolkit.util.DocPath; +import jdk.javadoc.internal.doclets.toolkit.util.SummaryAPIListBuilder; +import jdk.javadoc.internal.doclets.toolkit.util.SummaryAPIListBuilder.SummaryElementKind; + +/** + * Generate File to list all the summary elements with the + * appropriate links. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @see java.util.List + */ +public abstract class SummaryListWriter extends SubWriterHolderWriter { + + private String getAnchorName(SummaryElementKind kind) { + return switch (kind) { + case MODULE -> "module"; + case PACKAGE -> "package"; + case INTERFACE -> "interface"; + case CLASS -> "class"; + case ENUM -> "enum"; + case EXCEPTION -> "exception"; + case ERROR -> "error"; + case ANNOTATION_TYPE -> "annotation.type"; + case FIELD -> "field"; + case METHOD -> "method"; + case CONSTRUCTOR -> "constructor"; + case ENUM_CONSTANT -> "enum.constant"; + case ANNOTATION_TYPE_MEMBER -> "annotation.type.member"; + case RECORD -> "record"; + }; + } + + private String getHeadingKey(SummaryElementKind kind) { + return switch (kind) { + case MODULE -> "doclet.Modules"; + case PACKAGE -> "doclet.Packages"; + case INTERFACE -> "doclet.Interfaces"; + case CLASS -> "doclet.Classes"; + case ENUM -> "doclet.Enums"; + case EXCEPTION -> "doclet.Exceptions"; + case ERROR -> "doclet.Errors"; + case ANNOTATION_TYPE -> "doclet.Annotation_Types"; + case FIELD -> "doclet.Fields"; + case METHOD -> "doclet.Methods"; + case CONSTRUCTOR -> "doclet.Constructors"; + case ENUM_CONSTANT -> "doclet.Enum_Constants"; + case ANNOTATION_TYPE_MEMBER -> "doclet.Annotation_Type_Members"; + case RECORD -> "doclet.Records"; + }; + } + + private String getSummaryKey(SummaryElementKind kind) { + return switch (kind) { + case MODULE -> "doclet.modules"; + case PACKAGE -> "doclet.packages"; + case INTERFACE -> "doclet.interfaces"; + case CLASS -> "doclet.classes"; + case ENUM -> "doclet.enums"; + case EXCEPTION -> "doclet.exceptions"; + case ERROR -> "doclet.errors"; + case ANNOTATION_TYPE -> "doclet.annotation_types"; + case FIELD -> "doclet.fields"; + case METHOD -> "doclet.methods"; + case CONSTRUCTOR -> "doclet.constructors"; + case ENUM_CONSTANT -> "doclet.enum_constants"; + case ANNOTATION_TYPE_MEMBER -> "doclet.annotation_type_members"; + case RECORD -> "doclet.record"; + }; + } + + private String getHeaderKey(SummaryElementKind kind) { + return switch (kind) { + case MODULE -> "doclet.Module"; + case PACKAGE -> "doclet.Package"; + case INTERFACE -> "doclet.Interface"; + case CLASS -> "doclet.Class"; + case ENUM -> "doclet.Enum"; + case EXCEPTION -> "doclet.Exceptions"; + case ERROR -> "doclet.Errors"; + case ANNOTATION_TYPE -> "doclet.AnnotationType"; + case FIELD -> "doclet.Field"; + case METHOD -> "doclet.Method"; + case CONSTRUCTOR -> "doclet.Constructor"; + case ENUM_CONSTANT -> "doclet.Enum_Constant"; + case ANNOTATION_TYPE_MEMBER -> "doclet.Annotation_Type_Member"; + case RECORD -> "doclet.Record"; + }; + } + + private final Navigation navBar; + private final String description; + private final Content headContent; + private final String titleKey; + + /** + * Constructor. + * + * @param configuration the configuration for this doclet + * @param filename the file to be generated + * @param pageMode page mode to use + * @param description page description + * @param headContent page heading content + * @param titleKey page title resource key + */ + + public SummaryListWriter(HtmlConfiguration configuration, DocPath filename, + PageMode pageMode, String description, + Content headContent, String titleKey) { + super(configuration, filename); + this.navBar = new Navigation(null, configuration, pageMode, path); + this.description = description; + this.headContent = headContent; + this.titleKey = titleKey; + } + + /** + * Generate the API summary. + * + * @param summaryapi list of API summary built already. + * @throws DocFileIOException if there is a problem writing the summary list + */ + protected void generateSummaryListFile(L summaryapi) + throws DocFileIOException { + HtmlTree body = getHeader(); + bodyContents.addMainContent(getContentsList(summaryapi)); + Content content = new ContentBuilder(); + addExtraSection(summaryapi, content); + for (SummaryElementKind kind : SummaryElementKind.values()) { + if (summaryapi.hasDocumentation(kind)) { + addSummaryAPI(summaryapi.getSet(kind), getAnchorName(kind), + getHeadingKey(kind), getSummaryKey(kind), + getHeaderKey(kind), content); + } + } + bodyContents.addMainContent(content); + HtmlTree htmlTree = HtmlTree.FOOTER(); + navBar.setUserFooter(getUserHeaderFooter(false)); + htmlTree.add(navBar.getContent(Navigation.Position.BOTTOM)); + addBottom(htmlTree); + bodyContents.setFooter(htmlTree); + body.add(bodyContents); + printHtmlDocument(null, description, body); + } + + /** + * Add the index link. + * + * @param builder the summary list builder + * @param kind the kind of list being documented + * @param contentTree the content tree to which the index link will be added + */ + protected void addIndexLink(String anchorName, String headingKey, + Content contentTree) { + Content li = HtmlTree.LI(links.createLink(anchorName, + contents.getContent(headingKey))); + contentTree.add(li); + } + + /** + * Get the contents list. + * + * @param apisummary the summary list builder + * @return a content tree for the contents list + */ + public Content getContentsList(L apisummary) { + Content heading = HtmlTree.HEADING_TITLE(Headings.PAGE_TITLE_HEADING, + HtmlStyle.title, headContent); + Content div = HtmlTree.DIV(HtmlStyle.header, heading); + Content headingContent = contents.contentsHeading; + div.add(HtmlTree.HEADING_TITLE(Headings.CONTENT_HEADING, + headingContent)); + Content ul = new HtmlTree(TagName.UL); + addExtraIndexLink(apisummary, ul); + for (SummaryElementKind kind : SummaryElementKind.values()) { + if (apisummary.hasDocumentation(kind)) { + addIndexLink(getAnchorName(kind), getHeadingKey(kind), ul); + } + } + div.add(ul); + return div; + } + + /** + * Get the header for the API Summary Listing. + * + * @return a content tree for the header + */ + public HtmlTree getHeader() { + String title = resources.getText(titleKey); + HtmlTree bodyTree = getBody(getWindowTitle(title)); + Content headerContent = new ContentBuilder(); + addTop(headerContent); + navBar.setUserHeader(getUserHeaderFooter(true)); + headerContent.add(navBar.getContent(Navigation.Position.TOP)); + bodyContents.setHeader(headerContent); + return bodyTree; + } + + /** + * Add summary information to the documentation tree + * + * @param apiList list of API summary elements + * @param id the id attribute of the table + * @param headingKey the caption for the summary table + * @param tableSummary the summary for the summary table + * @param tableHeader table headers for the summary table + * @param contentTree the content tree to which the summary table will be added + */ + protected void addSummaryAPI(SortedSet apiList, String id, + String headingKey, String summaryKey, + String headerKey, Content contentTree) { + if (apiList.size() > 0) { + String tableSummary = resources.getText("doclet.Member_Table_Summary", + resources.getText(headingKey), + resources.getText(summaryKey)); + TableHeader tableHeader = new TableHeader( + contents.getContent(headerKey), contents.descriptionLabel); + + Content caption = contents.getContent(headingKey); + Table table = new Table(HtmlStyle.summaryTable) + .setCaption(caption) + .setHeader(tableHeader) + .setId(id) + .setColumnStyles(HtmlStyle.colSummaryItemName, HtmlStyle.colLast); + for (Element e : apiList) { + Content link; + switch (e.getKind()) { + case MODULE: + ModuleElement m = (ModuleElement) e; + link = getModuleLink(m, new StringContent(m.getQualifiedName())); + break; + case PACKAGE: + PackageElement pkg = (PackageElement) e; + link = getPackageLink(pkg, getPackageName(pkg)); + break; + default: + link = getSummaryLink(e); + } + Content desc = new ContentBuilder(); + addComments(e, desc); + table.addRow(link, desc); + } + // note: singleton list + contentTree.add(HtmlTree.UL(HtmlStyle.blockList, HtmlTree.LI(table))); + } + } + + /** + * Add summary text for the given element. + * + * @param e the element for which the summary text should be added + * @param desc the target to which the text should be added + */ + protected abstract void addComments(Element e, Content desc); + + protected Content getSummaryLink(Element e) { + AbstractMemberWriter writer = switch (e.getKind()) { + case INTERFACE, CLASS, ENUM, + ANNOTATION_TYPE, RECORD -> new NestedClassWriterImpl(this); + case FIELD -> new FieldWriterImpl(this); + case METHOD -> new MethodWriterImpl(this); + case CONSTRUCTOR -> new ConstructorWriterImpl(this); + case ENUM_CONSTANT -> new EnumConstantWriterImpl(this); + case RECORD_COMPONENT -> + throw new AssertionError("Record components are not supported by SummaryListWriter!"); + default -> new AnnotationTypeOptionalMemberWriterImpl(this, null); + }; + return writer.getSummaryLink(e); + } + + /** + * Add an extra optional section to the content. + * + * @param list the element list + * @param target the target content to which the section should be added + */ + protected void addExtraSection(L list, Content target) { + } + + /** + * Add an extra optional index link. + * + * @param list the element list + * @param target the target content to which the link should be added + */ + protected void addExtraIndexLink(L list, Content target) { + } +} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index d24ee33427510..18b4581733f3e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -426,12 +426,6 @@ public enum HtmlStyle { */ colConstructorName, - /** - * The class of the cells in a table column used to display the name - * of a deprecated item. - */ - colDeprecatedItemName, - /** * The class of the first column of cells in a table. * This is typically the "type and modifiers" column, where the type is @@ -448,9 +442,9 @@ public enum HtmlStyle { /** * The class of the cells in a table column used to display the name - * of a deprecated item. + * of a summary item. */ - colPreviewItemName, + colSummaryItemName, /** * The class of the second column of cells in a table. diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java index b7ee11418aea6..c3a9b4b7d2c45 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java @@ -783,6 +783,17 @@ public static HtmlTree SPAN(String id, HtmlStyle style, Content body) { .add(body); } + /** + * Creates an HTML {@code SUP} element with the given content. + * + * @param body the content + * @return the element + */ + public static HtmlTree SUP(Content body) { + return new HtmlTree(TagName.SUP) + .add(body); + } + /** * Creates an HTML {@code TD} element with the given style and some content. * diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java index 186aa1b46198c..3e648d53b099c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java @@ -72,7 +72,7 @@ public interface FieldWriter extends MemberWriter { void addDeprecated(VariableElement field, Content fieldDocTree); /** - * Add the preview output for the given member. + * Adds the preview output for the given member. * * @param member the member being documented * @param annotationDocTree content tree to which the preview information will be added diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java index e8616c4ba9727..b4efc8a777b51 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/MethodWriter.java @@ -72,7 +72,7 @@ public interface MethodWriter extends MemberWriter { void addDeprecated(ExecutableElement method, Content methodDocTree); /** - * Add the preview output for the given member. + * Adds the preview output for the given member. * * @param member the member being documented * @param annotationDocTree content tree to which the preview information will be added diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 2dce02d11cd66..073d1070a95db 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -145,6 +145,7 @@ doclet.AnnotationTypes=Annotation Types doclet.Exceptions=Exceptions doclet.Errors=Errors doclet.Classes=Classes +doclet.Records=Records doclet.packages=packages doclet.modules=modules doclet.All_Classes=All Classes diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css index c40279b7b4650..130ab7200795c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css @@ -439,7 +439,7 @@ div.table-tabs > button.table-tab { text-align:left; padding: 8px 3px 3px 7px; } -.col-first, .col-second, .col-last, .col-constructor-name, .col-deprecated-item-name, .col-preview-item-name { +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { vertical-align:top; padding-right:0; padding-top:8px; @@ -452,7 +452,7 @@ div.table-tabs > button.table-tab { .col-first, .col-first { font-size:13px; } -.col-second, .col-second, .col-last, .col-constructor-name, .col-deprecated-item-name, .col-last { +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { font-size:13px; } .col-first, .col-second, .col-constructor-name { @@ -467,7 +467,7 @@ div.table-tabs > button.table-tab { .col-first a:link, .col-first a:visited, .col-second a:link, .col-second a:visited, .col-constructor-name a:link, .col-constructor-name a:visited, -.col-deprecated-item-name a:link, .col-deprecated-item-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited, .constant-values-container a:link, .constant-values-container a:visited, .all-classes-container a:link, .all-classes-container a:visited, .all-packages-container a:link, .all-packages-container a:visited { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java index 10c7094a31fc4..a0cfb18c8e540 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java @@ -127,7 +127,8 @@ public int compare(Element pkg1, Element pkg2) { private Comparator summaryComparator = null; /** - * Returns a Comparator for deprecated items listed on deprecated list page, by comparing the + * Returns a Comparator for items listed on summary list pages + * (like deprecated or preview summary pages), by comparing the * fully qualified names, and if those are equal the names of the enclosing modules. * * @return a Comparator diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java index 1892e6832e3a2..46e4ba285bd55 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java @@ -28,9 +28,6 @@ import java.util.*; import javax.lang.model.element.Element; -import javax.lang.model.element.ModuleElement; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; @@ -42,30 +39,8 @@ * This code and its internal interfaces are subject to change or * deletion without notice. */ -public class DeprecatedAPIListBuilder { - /** - * List of deprecated type Lists. - */ - private final Map> deprecatedMap; - private final BaseConfiguration configuration; - private final Utils utils; - - public enum DeprElementKind { - REMOVAL, - MODULE, - PACKAGE, - INTERFACE, - CLASS, - ENUM, - EXCEPTION, // no ElementKind mapping - ERROR, // no ElementKind mapping - ANNOTATION_TYPE, - FIELD, - METHOD, - CONSTRUCTOR, - ENUM_CONSTANT, - ANNOTATION_TYPE_MEMBER // no ElementKind mapping - }; +public class DeprecatedAPIListBuilder extends SummaryAPIListBuilder { + private SortedSet forRemoval; /** * Constructor. @@ -73,131 +48,21 @@ public enum DeprElementKind { * @param configuration the current configuration of the doclet */ public DeprecatedAPIListBuilder(BaseConfiguration configuration) { - this.configuration = configuration; - this.utils = configuration.utils; - deprecatedMap = new EnumMap<>(DeprElementKind.class); - for (DeprElementKind kind : DeprElementKind.values()) { - deprecatedMap.put(kind, - new TreeSet<>(utils.comparators.makeSummaryComparator())); - } - buildDeprecatedAPIInfo(); - } - - public boolean isEmpty() { - return deprecatedMap.values().stream().allMatch(Set::isEmpty); + super(configuration, configuration.utils::isDeprecated); } - /** - * Build the sorted list of all the deprecated APIs in this run. - * Build separate lists for deprecated modules, packages, classes, constructors, - * methods and fields. - */ - private void buildDeprecatedAPIInfo() { - SortedSet rset = deprecatedMap.get(DeprElementKind.REMOVAL); - SortedSet modules = configuration.modules; - SortedSet mset = deprecatedMap.get(DeprElementKind.MODULE); - for (Element me : modules) { - if (utils.isDeprecatedForRemoval(me)) { - rset.add(me); - } - if (utils.isDeprecated(me)) { - mset.add(me); - } - } - SortedSet packages = configuration.packages; - SortedSet pset = deprecatedMap.get(DeprElementKind.PACKAGE); - for (Element pe : packages) { - if (utils.isDeprecatedForRemoval(pe)) { - rset.add(pe); - } - if (utils.isDeprecated(pe)) { - pset.add(pe); - } - } - for (Element e : configuration.getIncludedTypeElements()) { - TypeElement te = (TypeElement)e; - SortedSet eset; - if (utils.isDeprecatedForRemoval(e)) { - rset.add(e); - } - if (utils.isDeprecated(e)) { - switch (e.getKind()) { - case ANNOTATION_TYPE: - eset = deprecatedMap.get(DeprElementKind.ANNOTATION_TYPE); - eset.add(e); - break; - case CLASS: - if (utils.isError(te)) { - eset = deprecatedMap.get(DeprElementKind.ERROR); - } else if (utils.isException(te)) { - eset = deprecatedMap.get(DeprElementKind.EXCEPTION); - } else { - eset = deprecatedMap.get(DeprElementKind.CLASS); - } - eset.add(e); - break; - case INTERFACE: - eset = deprecatedMap.get(DeprElementKind.INTERFACE); - eset.add(e); - break; - case ENUM: - eset = deprecatedMap.get(DeprElementKind.ENUM); - eset.add(e); - break; - } - } - composeDeprecatedList(rset, deprecatedMap.get(DeprElementKind.FIELD), - utils.getFields(te)); - composeDeprecatedList(rset, deprecatedMap.get(DeprElementKind.METHOD), - utils.getMethods(te)); - composeDeprecatedList(rset, deprecatedMap.get(DeprElementKind.CONSTRUCTOR), - utils.getConstructors(te)); - if (utils.isEnum(e)) { - composeDeprecatedList(rset, deprecatedMap.get(DeprElementKind.ENUM_CONSTANT), - utils.getEnumConstants(te)); - } - if (utils.isAnnotationType(e)) { - composeDeprecatedList(rset, deprecatedMap.get(DeprElementKind.ANNOTATION_TYPE_MEMBER), - utils.getAnnotationMembers(te)); - - } + public SortedSet getForRemoval() { + if (forRemoval == null) { + forRemoval = createSummarySet(); } + return forRemoval; } - /** - * Add the members into a single list of deprecated members. - * - * @param rset set of elements deprecated for removal. - * @param sset set of deprecated elements. - * @param members members to be added in the list. - */ - private void composeDeprecatedList(SortedSet rset, SortedSet sset, List members) { - for (Element member : members) { - if (utils.isDeprecatedForRemoval(member)) { - rset.add(member); - } - if (utils.isDeprecated(member)) { - sset.add(member); - } + @Override + protected void handleElement(Element e) { + if (utils.isDeprecatedForRemoval(e)) { + getForRemoval().add(e); } } - /** - * Return the list of deprecated elements of a given type. - * - * @param kind the DeprElementKind - * @return - */ - public SortedSet getSet(DeprElementKind kind) { - return deprecatedMap.get(kind); - } - - /** - * Return true if the list of a given type has size greater than 0. - * - * @param kind the type of list being checked. - */ - public boolean hasDocumentation(DeprElementKind kind) { - return !deprecatedMap.get(kind).isEmpty(); - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java index c9fb48ed8ff2a..d5d2abecbbd3a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java @@ -25,14 +25,6 @@ package jdk.javadoc.internal.doclets.toolkit.util; -import java.util.*; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ModuleElement; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; - import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; /** @@ -43,146 +35,14 @@ * This code and its internal interfaces are subject to change or * deletion without notice. */ -public class PreviewAPIListBuilder { - /** - * List of preview type Lists. - */ - private final Map> previewMap; - private final BaseConfiguration configuration; - private final Utils utils; - public enum PreviewElementKind { - MODULE, - PACKAGE, - INTERFACE, - CLASS, - ENUM, - EXCEPTION, // no ElementKind mapping - ERROR, // no ElementKind mapping - ANNOTATION_TYPE, - FIELD, - METHOD, - CONSTRUCTOR, - ENUM_CONSTANT, - ANNOTATION_TYPE_MEMBER // no ElementKind mapping - }; +public class PreviewAPIListBuilder extends SummaryAPIListBuilder { + /** * Constructor. * * @param configuration the current configuration of the doclet */ public PreviewAPIListBuilder(BaseConfiguration configuration) { - this.configuration = configuration; - this.utils = configuration.utils; - previewMap = new EnumMap<>(PreviewElementKind.class); - for (PreviewElementKind kind : PreviewElementKind.values()) { - previewMap.put(kind, - new TreeSet<>(utils.comparators.makeSummaryComparator())); - } - buildPreviewAPIInfo(); - } - - public boolean isEmpty() { - return previewMap.values().stream().allMatch(Set::isEmpty); - } - - /** - * Build the sorted list of all the preview APIs in this run. - * Build separate lists for preview modules, packages, classes, constructors, - * methods and fields. - */ - private void buildPreviewAPIInfo() { - SortedSet modules = configuration.modules; - SortedSet mset = previewMap.get(PreviewElementKind.MODULE); - for (Element me : modules) { - if (utils.isPreviewAPI(me)) { - mset.add(me); - } - } - SortedSet packages = configuration.packages; - SortedSet pset = previewMap.get(PreviewElementKind.PACKAGE); - for (Element pe : packages) { - if (utils.isPreviewAPI(pe)) { - pset.add(pe); - } - } - for (Element e : configuration.getIncludedTypeElements()) { - TypeElement te = (TypeElement)e; - SortedSet eset; - if (utils.isPreviewAPI(e)) { - switch (e.getKind()) { - case ANNOTATION_TYPE: - eset = previewMap.get(PreviewElementKind.ANNOTATION_TYPE); - eset.add(e); - break; - case CLASS: - if (utils.isError(te)) { - eset = previewMap.get(PreviewElementKind.ERROR); - } else if (utils.isException(te)) { - eset = previewMap.get(PreviewElementKind.EXCEPTION); - } else { - eset = previewMap.get(PreviewElementKind.CLASS); - } - eset.add(e); - break; - case INTERFACE: - eset = previewMap.get(PreviewElementKind.INTERFACE); - eset.add(e); - break; - case ENUM: - eset = previewMap.get(PreviewElementKind.ENUM); - eset.add(e); - break; - } - } - composePreviewList(previewMap.get(PreviewElementKind.FIELD), - utils.getFields(te)); - composePreviewList(previewMap.get(PreviewElementKind.METHOD), - utils.getMethods(te)); - composePreviewList(previewMap.get(PreviewElementKind.CONSTRUCTOR), - utils.getConstructors(te)); - if (utils.isEnum(e)) { - composePreviewList(previewMap.get(PreviewElementKind.ENUM_CONSTANT), - utils.getEnumConstants(te)); - } - if (utils.isAnnotationType(e)) { - composePreviewList(previewMap.get(PreviewElementKind.ANNOTATION_TYPE_MEMBER), - utils.getAnnotationMembers(te)); - - } - } - } - - /** - * Add the members into a single list of preview members. - * - * @param rset set of elements preview for removal. - * @param sset set of preview elements. - * @param members members to be added in the list. - */ - private void composePreviewList(SortedSet sset, List members) { - for (Element member : members) { - if (utils.isPreviewAPI(member)) { - sset.add(member); - } - } - } - - /** - * Return the list of preview elements of a given type. - * - * @param kind the PreviewElementKind - * @return - */ - public SortedSet getSet(PreviewElementKind kind) { - return previewMap.get(kind); - } - - /** - * Return true if the list of a given type has size greater than 0. - * - * @param kind the type of list being checked. - */ - public boolean hasDocumentation(PreviewElementKind kind) { - return !previewMap.get(kind).isEmpty(); + super(configuration, e -> configuration.utils.isPreviewAPI(e)); } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java new file mode 100644 index 0000000000000..acb60433fbba1 --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.javadoc.internal.doclets.toolkit.util; + +import java.util.*; +import java.util.function.Predicate; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ModuleElement; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.RecordComponentElement; +import javax.lang.model.element.TypeElement; + +import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration; + +/** + * Build list of all the summary packages, classes, constructors, fields and methods. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class SummaryAPIListBuilder { + /** + * List of summary type Lists. + */ + private final Map> summaryMap; + private final BaseConfiguration configuration; + protected final Utils utils; + private final Predicate belongsToSummary; + public enum SummaryElementKind { + MODULE, + PACKAGE, + INTERFACE, + CLASS, + ENUM, + RECORD, + EXCEPTION, // no ElementKind mapping + ERROR, // no ElementKind mapping + ANNOTATION_TYPE, + FIELD, + METHOD, + CONSTRUCTOR, + ENUM_CONSTANT, + ANNOTATION_TYPE_MEMBER // no ElementKind mapping + }; + /** + * Constructor. + * + * @param configuration the current configuration of the doclet + */ + public SummaryAPIListBuilder(BaseConfiguration configuration, + Predicate belongsToSummary) { + this.configuration = configuration; + this.utils = configuration.utils; + this.belongsToSummary = belongsToSummary; + summaryMap = new EnumMap<>(SummaryElementKind.class); + for (SummaryElementKind kind : SummaryElementKind.values()) { + summaryMap.put(kind, createSummarySet()); + } + buildSummaryAPIInfo(); + } + + public boolean isEmpty() { + return summaryMap.values().stream().allMatch(Set::isEmpty); + } + + /** + * Build the sorted list of all the summary APIs in this run. + * Build separate lists for summary modules, packages, classes, constructors, + * methods and fields. + */ + private void buildSummaryAPIInfo() { + SortedSet modules = configuration.modules; + SortedSet mset = summaryMap.get(SummaryElementKind.MODULE); + for (Element me : modules) { + if (belongsToSummary.test(me)) { + mset.add(me); + } + handleElement(me); + } + SortedSet packages = configuration.packages; + SortedSet pset = summaryMap.get(SummaryElementKind.PACKAGE); + for (Element pe : packages) { + if (belongsToSummary.test(pe)) { + pset.add(pe); + } + handleElement(pe); + } + for (Element e : configuration.getIncludedTypeElements()) { + TypeElement te = (TypeElement)e; + SortedSet eset; + if (belongsToSummary.test(e)) { + switch (e.getKind()) { + case ANNOTATION_TYPE -> { + eset = summaryMap.get(SummaryElementKind.ANNOTATION_TYPE); + eset.add(e); + } + case CLASS -> { + if (utils.isError(te)) { + eset = summaryMap.get(SummaryElementKind.ERROR); + } else if (utils.isException(te)) { + eset = summaryMap.get(SummaryElementKind.EXCEPTION); + } else { + eset = summaryMap.get(SummaryElementKind.CLASS); + } + eset.add(e); + } + case INTERFACE -> { + eset = summaryMap.get(SummaryElementKind.INTERFACE); + eset.add(e); + } + case ENUM -> { + eset = summaryMap.get(SummaryElementKind.ENUM); + eset.add(e); + } + case RECORD -> { + eset = summaryMap.get(SummaryElementKind.RECORD); + eset.add(e); + } + } + } + handleElement(te); + composeSummaryList(summaryMap.get(SummaryElementKind.FIELD), + utils.getFields(te)); + composeSummaryList(summaryMap.get(SummaryElementKind.METHOD), + utils.getMethods(te)); + composeSummaryList(summaryMap.get(SummaryElementKind.CONSTRUCTOR), + utils.getConstructors(te)); + if (utils.isEnum(e)) { + composeSummaryList(summaryMap.get(SummaryElementKind.ENUM_CONSTANT), + utils.getEnumConstants(te)); + } + if (utils.isRecord(te)) { + for (RecordComponentElement component : te.getRecordComponents()) { + if (belongsToSummary.test(component)) { + throw new AssertionError("record components not supported in summary builders: " + + "component: " + component.getSimpleName() + + " of record: " + te.getQualifiedName()); + } + } + } + if (utils.isAnnotationType(e)) { + composeSummaryList(summaryMap.get(SummaryElementKind.ANNOTATION_TYPE_MEMBER), + utils.getAnnotationMembers(te)); + + } + } + } + + /** + * Add the members into a single list of summary members. + * + * @param rset set of elements summary for removal. + * @param sset set of summary elements. + * @param members members to be added in the list. + */ + private void composeSummaryList(SortedSet sset, List members) { + for (Element member : members) { + if (belongsToSummary.test(member)) { + sset.add(member); + } + handleElement(member); + } + } + + /** + * Return the list of summary elements of a given type. + * + * @param kind the SummaryElementKind + * @return + */ + public SortedSet getSet(SummaryElementKind kind) { + return summaryMap.get(kind); + } + + /** + * Return true if the list of a given type has size greater than 0. + * + * @param kind the type of list being checked. + */ + public boolean hasDocumentation(SummaryElementKind kind) { + return !summaryMap.get(kind).isEmpty(); + } + + /** + * Additional extra processing of an analyzed element. + * + * @param e element to process + */ + protected void handleElement(Element e) {} + + /** + * Create a summary set of elements. + * + * @return a summary set + */ + protected final SortedSet createSummarySet() { + return new TreeSet<>(utils.comparators.makeSummaryComparator()); + } +} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index aa77f65bec16f..cb337b996ea35 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -56,6 +56,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import javax.lang.model.AnnotatedConstruct; import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -82,6 +83,7 @@ import javax.lang.model.util.ElementFilter; import javax.lang.model.util.ElementKindVisitor14; import javax.lang.model.util.Elements; +import javax.lang.model.util.SimpleAnnotationValueVisitor14; import javax.lang.model.util.SimpleElementVisitor14; import javax.lang.model.util.SimpleTypeVisitor9; import javax.lang.model.util.TypeKindVisitor9; @@ -128,8 +130,6 @@ import static javax.lang.model.type.TypeKind.*; import static com.sun.source.doctree.DocTree.Kind.*; -import javax.lang.model.AnnotatedConstruct; -import javax.lang.model.util.SimpleAnnotationValueVisitor14; import static jdk.javadoc.internal.doclets.toolkit.builders.ConstantsSummaryBuilder.MAX_CONSTANT_VALUE_INDEX_LENGTH; /** diff --git a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java index 0297cff8ecd38..68cb02989ca42 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java @@ -242,7 +242,6 @@ public enum SubKind { * @since 14 * */ - @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.RECORDS) RECORD_SUBKIND(Kind.TYPE_DECL), /** diff --git a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java index 2a54b3e615e05..088da2d08c3dc 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java +++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java @@ -289,7 +289,7 @@ public class TestInterface

Enum
Description
- +
enum_test1 passes.
""", @@ -299,7 +299,7 @@ public class TestInterface
Exceptions
Description
- +
exception_test1 passes.
""", @@ -309,25 +309,25 @@ public class TestInterface
Field
Description
- +
- +
annotation_test4 passes.
- +
class_test2 passes. This is the second sentence of deprecated description for a field.
- +
error_test2 passes.
- +
exception_test2 passes.
- +
interface_test2 passes.
@@ -339,25 +339,25 @@ public class TestInterface
Method
Description
- +
- +
annotation_test2 passes.
- +
annotation_test3 passes.
- +
class_test5 passes. This is the second sentence of deprecated description for a method.
- +
class_test7 passes. Overloaded method 2.
- +
class_test6 passes. Overloaded method 1.
""", @@ -367,13 +367,13 @@ public class TestInterface
Constructor
Description
- +
- +
class_test3 passes. This is the second sentence of deprecated description for a constructor.
- +
class_test4 passes. Overloaded constructor.
"""); diff --git a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java index 2ce690f3297c2..b913516d7441e 100644 --- a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java +++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java @@ -1110,7 +1110,7 @@ void checkModuleDeprecation(boolean found) {
  • Modules
  • """, """ - +
    This module is deprecated.
    """); checkOutput("moduleB/module-summary.html", !found, diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index 1f6fd7b7fa389..691308fd4182a 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -45,7 +45,7 @@ public static void main(String... args) throws Exception { } @Test - public void test() { + public void testUserJavadoc() { String doc = Paths.get(testSrc, "doc").toUri().toString(); javadoc("-d", "out", "-XDforcePreview", "--enable-preview", "-source", System.getProperty("java.specification.version"), @@ -86,4 +86,38 @@ public void test() { checkOutput("m/pkg/DocAnnotationUse2.html", true, "
    "); } + + @Test + public void testPreviewAPIJavadoc() { + javadoc("-d", "out", + "--patch-module", "java.base=" + Paths.get(testSrc, "api").toAbsolutePath().toString(), + "--add-exports", "java.base/preview=m", + "--source-path", Paths.get(testSrc, "api").toAbsolutePath().toString(), + "--show-packages=all", + "preview"); + checkExit(Exit.OK); + + checkOutput("preview-list.html", true, + """ +
    +
    Records
    +
    +
    Record
    +
    Description
    + +
    +
    + """, + """ +
    +
    Methods
    +
    +
    Method
    +
    Description
    + +
    +
    Returns the value of the i record component.
    +
    + """); + } } diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java new file mode 100644 index 0000000000000..caac28c4637e6 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package preview; + +import jdk.internal.javac.PreviewFeature; +import jdk.internal.javac.PreviewFeature.Feature; + +@PreviewFeature(feature=Feature.TEST) +public record CoreRecord(int i) { +} diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java new file mode 100644 index 0000000000000..12798a6a55eb2 --- /dev/null +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package preview; + +import jdk.internal.javac.PreviewFeature; +import jdk.internal.javac.PreviewFeature.Feature; + +public record CoreRecordComponent(@PreviewFeature(feature=Feature.TEST) int i) { +} diff --git a/test/langtools/tools/javac/patterns/BindingsTest2.out b/test/langtools/tools/javac/patterns/BindingsTest2.out index 0f17d3112d863..1ad494d4eb5e5 100644 --- a/test/langtools/tools/javac/patterns/BindingsTest2.out +++ b/test/langtools/tools/javac/patterns/BindingsTest2.out @@ -51,4 +51,4 @@ BindingsTest2.java:160:17: compiler.err.unreachable.stmt BindingsTest2.java:185:17: compiler.err.unreachable.stmt - compiler.note.preview.filename: BindingsTest2.java, DEFAULT - compiler.note.preview.recompile -51 errors \ No newline at end of file +51 errors diff --git a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java index 33864a4fced63..5cc8bcb923d89 100644 --- a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java +++ b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java @@ -23,6 +23,7 @@ /* * @test + * @bug 8250768 * @library /tools/lib * @modules * jdk.compiler/com.sun.tools.javac.api diff --git a/test/langtools/tools/javac/preview/PreviewErrors.java b/test/langtools/tools/javac/preview/PreviewErrors.java index 7aba78fe86fa1..ae08e885ec3c0 100644 --- a/test/langtools/tools/javac/preview/PreviewErrors.java +++ b/test/langtools/tools/javac/preview/PreviewErrors.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8226585 + * @bug 8226585 8250768 * @summary Verify behavior w.r.t. preview feature API errors and warnings * @library /tools/lib /tools/javac/lib * @modules @@ -35,7 +35,6 @@ * jdk.jdeps/com.sun.tools.classfile * @build toolbox.ToolBox toolbox.JavacTask * @build combo.ComboTestHelper - * @compile PreviewErrors.java * @run main PreviewErrors */ From e4b02827998fc2e8f19f983aabfb3d720b03d111 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 4 Nov 2020 20:32:50 +0100 Subject: [PATCH 36/42] Cleanup - removing unnecessary code. --- .../formats/html/DeprecatedListWriter.java | 3 +- .../formats/html/SummaryListWriter.java | 33 +++---------------- 2 files changed, 6 insertions(+), 30 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java index ccfdb1acecbe0..ef39ac9a3090c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java @@ -81,8 +81,7 @@ public static void generate(HtmlConfiguration configuration) throws DocFileIOExc @Override protected void addExtraSection(DeprecatedAPIListBuilder list, Content content) { addSummaryAPI(list.getForRemoval(), "forRemoval", - "doclet.For_Removal", "doclet.for_removal", - "doclet.Element", content); + "doclet.For_Removal", "doclet.Element", content); } @Override diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java index a5bd89d305ceb..b688e0d46bd44 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java @@ -96,25 +96,6 @@ private String getHeadingKey(SummaryElementKind kind) { }; } - private String getSummaryKey(SummaryElementKind kind) { - return switch (kind) { - case MODULE -> "doclet.modules"; - case PACKAGE -> "doclet.packages"; - case INTERFACE -> "doclet.interfaces"; - case CLASS -> "doclet.classes"; - case ENUM -> "doclet.enums"; - case EXCEPTION -> "doclet.exceptions"; - case ERROR -> "doclet.errors"; - case ANNOTATION_TYPE -> "doclet.annotation_types"; - case FIELD -> "doclet.fields"; - case METHOD -> "doclet.methods"; - case CONSTRUCTOR -> "doclet.constructors"; - case ENUM_CONSTANT -> "doclet.enum_constants"; - case ANNOTATION_TYPE_MEMBER -> "doclet.annotation_type_members"; - case RECORD -> "doclet.record"; - }; - } - private String getHeaderKey(SummaryElementKind kind) { return switch (kind) { case MODULE -> "doclet.Module"; @@ -173,8 +154,7 @@ protected void generateSummaryListFile(L summaryapi) for (SummaryElementKind kind : SummaryElementKind.values()) { if (summaryapi.hasDocumentation(kind)) { addSummaryAPI(summaryapi.getSet(kind), getAnchorName(kind), - getHeadingKey(kind), getSummaryKey(kind), - getHeaderKey(kind), content); + getHeadingKey(kind), getHeaderKey(kind), content); } } bodyContents.addMainContent(content); @@ -244,14 +224,11 @@ public HtmlTree getHeader() { * @param contentTree the content tree to which the summary table will be added */ protected void addSummaryAPI(SortedSet apiList, String id, - String headingKey, String summaryKey, - String headerKey, Content contentTree) { + String headingKey, String headerKey, + Content contentTree) { if (apiList.size() > 0) { - String tableSummary = resources.getText("doclet.Member_Table_Summary", - resources.getText(headingKey), - resources.getText(summaryKey)); - TableHeader tableHeader = new TableHeader( - contents.getContent(headerKey), contents.descriptionLabel); + TableHeader tableHeader = new TableHeader( + contents.getContent(headerKey), contents.descriptionLabel); Content caption = contents.getContent(headingKey); Table table = new Table(HtmlStyle.summaryTable) From b9e17397cd337643712aecb137b9d308b359c933 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 5 Nov 2020 10:08:56 +0100 Subject: [PATCH 37/42] Removing unnecessary property keys. --- .../doclets/formats/html/resources/standard.properties | 3 --- .../internal/doclets/toolkit/resources/doclets.properties | 8 -------- 2 files changed, 11 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 895252ca7ea5c..876ea54fca817 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -100,9 +100,6 @@ doclet.Preview_Mark=PREVIEW doclet.For_Removal=For Removal doclet.Annotation_Types=Annotation Types doclet.Annotation_Type_Members=Annotation Type Elements -doclet.for_removal=for removal -doclet.annotation_types=annotation types -doclet.annotation_type_members=annotation type elements doclet.Generated_Docs_Untitled=Generated Documentation (Untitled) doclet.Other_Packages=Other Packages doclet.Description=Description diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 073d1070a95db..ac635e47decda 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -158,19 +158,15 @@ doclet.annotationtype=annotation type doclet.annotationtypes=annotation types doclet.Enum=Enum doclet.enum=enum -doclet.enums=enums doclet.interface=interface -doclet.interfaces=interfaces doclet.class=class doclet.classes=classes doclet.Record=Record doclet.record=record doclet.Error=Error doclet.error=error -doclet.errors=errors doclet.Exception=Exception doclet.exception=exception -doclet.exceptions=exceptions doclet.ExportedTo=Exported To Modules doclet.OpenedTo=Opened To Modules doclet.Package_private=(package private) @@ -207,13 +203,10 @@ doclet.dest_dir_create=Creating destination directory: "{0}" doclet.in={0} in {1} doclet.Use_Table_Summary=Use table, listing {0}, and an explanation doclet.Member_Table_Summary={0} table, listing {1}, and an explanation -doclet.fields=fields doclet.Fields=Fields doclet.Preview=Preview. doclet.Properties=Properties -doclet.constructors=constructors doclet.Constructors=Constructors -doclet.methods=methods doclet.Methods=Methods doclet.All_Methods=All Methods doclet.Static_Methods=Static Methods @@ -224,7 +217,6 @@ doclet.Default_Methods=Default Methods doclet.Deprecated_Methods=Deprecated Methods doclet.Annotation_Type_Optional_Members=Optional Elements doclet.Annotation_Type_Required_Members=Required Elements -doclet.enum_constants=enum constants doclet.Enum_Constants=Enum Constants doclet.Nested_Classes=Nested Classes doclet.Modifier=Modifier From 370031f02d25d3486f7742b79348586648508a97 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 5 Nov 2020 10:46:02 +0100 Subject: [PATCH 38/42] Removing obsolette @PreviewFeature. --- .../share/classes/com/sun/source/tree/BindingPatternTree.java | 2 -- .../share/classes/com/sun/source/tree/InstanceOfTree.java | 2 -- .../share/classes/com/sun/source/tree/PatternTree.java | 2 -- src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java | 2 -- .../share/classes/com/sun/source/tree/TreeVisitor.java | 2 -- 5 files changed, 10 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java index 509eb7d433921..247e3edc2a378 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/BindingPatternTree.java @@ -30,8 +30,6 @@ * * @since 16 */ -@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - reflective=true) public interface BindingPatternTree extends PatternTree { /** diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java index 5794978a48de3..ad255bcc6d055 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/InstanceOfTree.java @@ -72,7 +72,5 @@ public interface InstanceOfTree extends ExpressionTree { * @return the tested pattern, or null if this instanceof does not use a pattern * @since 16 */ - @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - reflective=true) PatternTree getPattern(); } diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java index 8176748cb3834..283fa20e63a49 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/PatternTree.java @@ -31,6 +31,4 @@ * * @since 16 */ -@jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - reflective=true) public interface PatternTree extends Tree {} diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java index 88dbf00199cd4..3a6cb0910c9dd 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/Tree.java @@ -224,8 +224,6 @@ public enum Kind { * * @since 16 */ - @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - reflective=true) BINDING_PATTERN(BindingPatternTree.class), /** diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java b/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java index d6c91d00a3a1f..cbb6f720f2040 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/TreeVisitor.java @@ -264,8 +264,6 @@ public interface TreeVisitor { * @return a result value * @since 16 */ - @jdk.internal.javac.PreviewFeature(feature=jdk.internal.javac.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF, - reflective=true) R visitBindingPattern(BindingPatternTree node, P p); /** From 097ae3c12dceb702fe2905f83452a9647d50e6b7 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 5 Nov 2020 12:05:10 +0100 Subject: [PATCH 39/42] Fixing typo. --- .../internal/doclets/toolkit/builders/ConstructorBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java index 3b1ce49a8dded..870d8ded74e61 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java @@ -167,7 +167,7 @@ protected void buildDeprecationInfo(Content constructorDocTree) { * @param constructorDocTree the content tree to which the documentation will be added */ protected void buildPreviewInfo(Content constructorDocTree) { - writer.addDeprecated(currentConstructor, constructorDocTree); + writer.addPreview(currentConstructor, constructorDocTree); } /** From 61264fe47e8238d3f50f9fdcfee4590fca2b4e2a Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 6 Nov 2020 19:20:47 +0100 Subject: [PATCH 40/42] Fixing navigator for the PREVIEW page. --- .../jdk/javadoc/internal/doclets/formats/html/Navigation.java | 2 +- .../internal/doclets/formats/html/SummaryListWriter.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index f6497812282f4..0dd450a8d6b92 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -296,7 +296,7 @@ private void addMainNavLinks(Content tree) { } if (documentedPage == PageMode.PREVIEW) { addActivePageLink(tree, contents.previewLabel, - configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)); + configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.PREVIEW)); } else { addPreviewLink(tree); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java index b688e0d46bd44..a8192ffb225a9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java @@ -115,6 +115,7 @@ private String getHeaderKey(SummaryElementKind kind) { }; } + private final PageMode pageMode; private final String description; private final Content headContent; private final String titleKey; @@ -134,6 +135,7 @@ public SummaryListWriter(HtmlConfiguration configuration, DocPath filename, PageMode pageMode, String description, Content headContent, String titleKey) { super(configuration, filename); + this.pageMode = pageMode; this.description = description; this.headContent = headContent; this.titleKey = titleKey; @@ -209,7 +211,7 @@ public Content getContentsList(L apisummary) { public HtmlTree getHeader() { String title = resources.getText(titleKey); HtmlTree bodyTree = getBody(getWindowTitle(title)); - bodyContents.setHeader(getHeader(PageMode.DEPRECATED)); + bodyContents.setHeader(getHeader(pageMode)); return bodyTree; } From a8046dde96b555c1c846496cfdd7ed8720fb7cfa Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 7 Jan 2021 16:27:03 +0100 Subject: [PATCH 41/42] Fixing tests after a merge. --- .../doclets/formats/html/resources/standard.properties | 2 -- .../internal/doclets/toolkit/resources/doclets.properties | 7 ------- .../doclet/testHtmlTableTags/TestHtmlTableTags.java | 8 ++++---- .../jdk/javadoc/doclet/testPreview/TestPreview.java | 6 +++--- .../javadoc/doclet/testRecordTypes/TestRecordTypes.java | 4 ++-- .../tools/javac/preview/DeclaredUsingPreview-class.out | 6 +++--- 6 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index 379577d8571e3..c4d29ab5326d8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -105,12 +105,10 @@ doclet.Annotation_Types=Annotation Types doclet.Annotation_Interfaces=Annotation Interfaces doclet.Annotation_Type_Members=Annotation Type Elements doclet.Annotation_Interface_Members=Annotation Interface Elements -doclet.for_removal=for removal doclet.annotation_types=annotation types doclet.annotation_interfaces=annotation interfaces doclet.annotation_type_members=annotation type elements doclet.annotation_interface_members=annotation interface elements -doclet.record_classes=record classes doclet.Generated_Docs_Untitled=Generated Documentation (Untitled) doclet.Other_Packages=Other Packages doclet.Description=Description diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 19dcab8940952..f3066c68c7280 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -151,9 +151,6 @@ doclet.AnnotationInterfaces=Annotation Interfaces doclet.Exceptions=Exceptions doclet.Errors=Errors doclet.Classes=Classes -doclet.Records=Records -doclet.packages=packages -doclet.modules=modules doclet.All_Classes=All Classes doclet.All_Superinterfaces=All Superinterfaces: doclet.All_Implemented_Interfaces=All Implemented Interfaces: @@ -173,7 +170,6 @@ doclet.enums=enums doclet.enumclasses=enum classes doclet.interface=interface doclet.class=class -doclet.classes=classes doclet.RecordClass=Record Class doclet.recordclass=record class doclet.Error=Error @@ -214,9 +210,6 @@ doclet.value_tag_invalid_constant=@value tag (which references {0}) can only be doclet.value_tag_invalid_use=@value tag cannot be used here. doclet.dest_dir_create=Creating destination directory: "{0}" doclet.in={0} in {1} -doclet.Use_Table_Summary=Use table, listing {0}, and an explanation -doclet.Member_Table_Summary={0} table, listing {1}, and an explanation -doclet.fields=fields doclet.Fields=Fields doclet.Preview=Preview. doclet.Properties=Properties diff --git a/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java b/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java index c6e5004bc13ac..ab5204a257180 100644 --- a/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java +++ b/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java @@ -672,12 +672,12 @@ void checkHtmlTableContents() { // Deprecated checkOutput("deprecated-list.html", true, """ - +
    don't use this field anymore.
    """, """ - +
    don't use this anymore.
    """); @@ -803,10 +803,10 @@ void checkHtmlTableContentsNoComment() { // Deprecated checkOutput("deprecated-list.html", true, """ - +
    """, """ - +
    """); // Constant values diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index 5d0a8a8acd036..9add8d724e502 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -99,10 +99,10 @@ public void testPreviewAPIJavadoc() { checkOutput("preview-list.html", true, """ -
    -
    Records
    +
    +
    Record Classes
    -
    Record
    +
    Record Class
    Description
    diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index 5af0efc53e9f0..ac8621bd44582 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -524,7 +524,7 @@ public record R(int r1) { }""");
    Record Class
    Description
    - +
    Do not use.
    """); @@ -556,7 +556,7 @@ public record R(@Deprecated int r1) { }""");
    Method
    Description
    - +
    """); } diff --git a/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out index ffd38a5232ba6..cb6f33ab9aad6 100644 --- a/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out +++ b/test/langtools/tools/javac/preview/DeclaredUsingPreview-class.out @@ -1,5 +1,5 @@ -- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations.class, 16 -- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C.class, 16 -- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C2.class, 16 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations.class, 17 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C.class, 17 +- compiler.warn.preview.feature.use.classfile: DeclaredUsingPreviewDeclarations$C2.class, 17 DeclaredUsingPreview.java:9:37: compiler.warn.declared.using.preview: kindname.class, DeclaredUsingPreviewDeclarations.C 4 warnings From 56371c477205349974ce0a1f9cc98d051ce767f7 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 8 Jan 2021 16:13:41 +0100 Subject: [PATCH 42/42] Updating copyright years. --- make/CompileInterimLangtools.gmk | 2 +- make/Docs.gmk | 2 +- make/autoconf/spec.gmk.in | 2 +- make/modules/jdk.compiler/Gendata.gmk | 2 +- make/modules/jdk.javadoc/Gendata.gmk | 2 +- src/java.base/share/classes/java/lang/Class.java | 2 +- src/java.base/share/classes/module-info.java | 2 +- .../share/classes/javax/lang/model/element/Modifier.java | 2 +- .../share/classes/javax/lang/model/element/TypeElement.java | 2 +- .../share/classes/com/sun/source/tree/ClassTree.java | 2 +- .../share/classes/com/sun/tools/javac/api/JavacTaskPool.java | 2 +- .../share/classes/com/sun/tools/javac/code/Flags.java | 2 +- .../share/classes/com/sun/tools/javac/code/Preview.java | 2 +- .../share/classes/com/sun/tools/javac/comp/Attr.java | 2 +- .../share/classes/com/sun/tools/javac/comp/Check.java | 2 +- .../share/classes/com/sun/tools/javac/comp/Modules.java | 2 +- .../share/classes/com/sun/tools/javac/comp/Resolve.java | 2 +- .../share/classes/com/sun/tools/javac/comp/TypeEnter.java | 2 +- .../share/classes/com/sun/tools/javac/jvm/ClassReader.java | 2 +- .../share/classes/com/sun/tools/javac/jvm/ClassWriter.java | 2 +- .../classes/com/sun/tools/javac/resources/compiler.properties | 2 +- .../share/classes/com/sun/tools/javac/util/Names.java | 2 +- .../doclets/formats/html/AbstractExecutableMemberWriter.java | 2 +- .../internal/doclets/formats/html/AbstractMemberWriter.java | 2 +- .../internal/doclets/formats/html/AllClassesIndexWriter.java | 2 +- .../formats/html/AnnotationTypeRequiredMemberWriterImpl.java | 2 +- .../javadoc/internal/doclets/formats/html/ClassUseWriter.java | 2 +- .../javadoc/internal/doclets/formats/html/ClassWriterImpl.java | 2 +- .../internal/doclets/formats/html/ConstructorWriterImpl.java | 2 +- .../jdk/javadoc/internal/doclets/formats/html/Contents.java | 2 +- .../internal/doclets/formats/html/DeprecatedListWriter.java | 2 +- .../internal/doclets/formats/html/EnumConstantWriterImpl.java | 2 +- .../javadoc/internal/doclets/formats/html/FieldWriterImpl.java | 2 +- .../jdk/javadoc/internal/doclets/formats/html/HelpWriter.java | 2 +- .../internal/doclets/formats/html/HtmlConfiguration.java | 2 +- .../jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java | 2 +- .../javadoc/internal/doclets/formats/html/HtmlDocletWriter.java | 2 +- .../javadoc/internal/doclets/formats/html/LinkFactoryImpl.java | 2 +- .../jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java | 2 +- .../javadoc/internal/doclets/formats/html/MethodWriterImpl.java | 2 +- .../internal/doclets/formats/html/ModuleIndexWriter.java | 2 +- .../javadoc/internal/doclets/formats/html/ModuleWriterImpl.java | 2 +- .../jdk/javadoc/internal/doclets/formats/html/Navigation.java | 2 +- .../internal/doclets/formats/html/NestedClassWriterImpl.java | 2 +- .../internal/doclets/formats/html/PackageWriterImpl.java | 2 +- .../internal/doclets/formats/html/PreviewListWriter.java | 2 +- .../internal/doclets/formats/html/PropertyWriterImpl.java | 2 +- .../internal/doclets/formats/html/SubWriterHolderWriter.java | 2 +- .../internal/doclets/formats/html/SummaryListWriter.java | 2 +- .../javadoc/internal/doclets/formats/html/markup/HtmlStyle.java | 2 +- .../javadoc/internal/doclets/formats/html/markup/HtmlTree.java | 2 +- .../javadoc/internal/doclets/formats/html/markup/TagName.java | 2 +- .../internal/doclets/formats/html/resources/standard.properties | 2 +- .../doclets/toolkit/AnnotationTypeRequiredMemberWriter.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/FieldWriter.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/WorkArounds.java | 2 +- .../toolkit/builders/AnnotationTypeRequiredMemberBuilder.java | 2 +- .../internal/doclets/toolkit/builders/ConstructorBuilder.java | 2 +- .../internal/doclets/toolkit/builders/EnumConstantBuilder.java | 2 +- .../javadoc/internal/doclets/toolkit/builders/FieldBuilder.java | 2 +- .../internal/doclets/toolkit/builders/MethodBuilder.java | 2 +- .../internal/doclets/toolkit/builders/PropertyBuilder.java | 2 +- .../internal/doclets/toolkit/resources/doclets.properties | 2 +- .../jdk/javadoc/internal/doclets/toolkit/util/Comparators.java | 2 +- .../internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/util/DocLink.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java | 2 +- .../internal/doclets/toolkit/util/PreviewAPIListBuilder.java | 2 +- .../internal/doclets/toolkit/util/SummaryAPIListBuilder.java | 2 +- .../jdk/javadoc/internal/doclets/toolkit/util/Utils.java | 2 +- .../internal/doclets/toolkit/util/links/LinkFactory.java | 2 +- .../share/classes/jdk/javadoc/internal/tool/ElementsTable.java | 2 +- .../java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java | 2 +- test/jdk/java/lang/ref/CleanerTest.java | 2 +- test/jdk/java/util/Arrays/TimSortStackSize2.java | 2 +- .../javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java | 2 +- .../jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java | 2 +- test/langtools/jdk/javadoc/doclet/testModules/TestModules.java | 2 +- test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java | 2 +- .../jdk/javadoc/doclet/testPreview/api/preview/Core.java | 2 +- .../jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java | 2 +- .../doclet/testPreview/api/preview/CoreRecordComponent.java | 2 +- .../jdk/javadoc/doclet/testPreview/api/preview/Reflective.java | 2 +- .../langtools/jdk/javadoc/doclet/testPreview/m/module-info.java | 2 +- .../jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java | 2 +- .../jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java | 2 +- .../jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java | 2 +- .../jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java | 2 +- .../doclet/testPreview/m/pkg/TestPreviewDeclaration.java | 2 +- .../doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java | 2 +- .../jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java | 2 +- .../jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java | 2 +- .../jdk/javadoc/doclet/testStylesheet/TestStylesheet.java | 2 +- test/langtools/jdk/javadoc/tool/CheckResourceKeys.java | 2 +- .../CantExtendSealedInAnotherModule.java | 2 +- .../CantExtendSealedInAnotherPkg.java | 2 +- test/langtools/tools/javac/diags/examples/SealedTypes.java | 2 +- test/langtools/tools/javac/patterns/ConditionalTest.java | 2 +- test/langtools/tools/javac/preview/PreviewAutoSuppress.java | 2 +- .../tools/javac/processing/model/element/TestSealed.java | 2 +- .../tools/javac/sealed/SealedDiffConfigurationsTest.java | 2 +- 103 files changed, 103 insertions(+), 103 deletions(-) diff --git a/make/CompileInterimLangtools.gmk b/make/CompileInterimLangtools.gmk index 0480087acab7a..e860169891f5b 100644 --- a/make/CompileInterimLangtools.gmk +++ b/make/CompileInterimLangtools.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/make/Docs.gmk b/make/Docs.gmk index b6b737bae0b4b..6d9522b784a0a 100644 --- a/make/Docs.gmk +++ b/make/Docs.gmk @@ -1,4 +1,4 @@ -# Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in index b7eb7e79a5e9e..81c7e534e761f 100644 --- a/make/autoconf/spec.gmk.in +++ b/make/autoconf/spec.gmk.in @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/make/modules/jdk.compiler/Gendata.gmk b/make/modules/jdk.compiler/Gendata.gmk index 198c12ef0242b..85815e5524b1e 100644 --- a/make/modules/jdk.compiler/Gendata.gmk +++ b/make/modules/jdk.compiler/Gendata.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/make/modules/jdk.javadoc/Gendata.gmk b/make/modules/jdk.javadoc/Gendata.gmk index 1e46ff84ad11c..78432cd6a68a9 100644 --- a/make/modules/jdk.javadoc/Gendata.gmk +++ b/make/modules/jdk.javadoc/Gendata.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 46accd6af8433..bc942cb370d13 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 21c81b0b03e5a..50fd8efe02aa8 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java index 0ec28283e0a75..8ba4ab6a2be4b 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/Modifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java index 0aedfa9c97906..ac0783095220c 100644 --- a/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java +++ b/src/java.compiler/share/classes/javax/lang/model/element/TypeElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java index 2a0930543ff91..463bdf2749827 100644 --- a/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java +++ b/src/jdk.compiler/share/classes/com/sun/source/tree/ClassTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java index cfcf84fc4baca..411eb6aec14a8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java index 59304695882ae..76b7044b13c32 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java index 0a112e5cd5c0b..4cf32630daa83 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Preview.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index e60077d8ddea7..9e8b4caa1159e 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 1d64b911dd1f5..f3d9d69aeb4aa 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java index 534c7a9c1b731..e88f46c297ea8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index 3b0196aafc798..4e98268f20da7 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java index 024a15027bc24..fde8aaa116bb2 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java index 623f0112de78d..8ef6a4a6a98ef 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index 4c5280e60752c..3eb788975cb60 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 70ca8d72cbaa3..850dd03b5fb71 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java index 6261799d2f9bc..26e0b7577aaab 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java index 86340d16697b1..3d3cecc254d3f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java index 0ccad8b764066..38dacf35f802c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java index 8f4baa5fb61bc..0e566b2b6ca92 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AllClassesIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index fc0e50cf73f56..25eb53fddaf3d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java index 78542fefac2c8..038bc3f752be0 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index c9fe44dc1fecd..2ef98c2eb01ee 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java index dbe5cdfa44f4c..af0f6466d8a69 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java index dbfc9736ad30a..dc61bf801b066 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Contents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java index ef39ac9a3090c..943472a263578 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java index 257f878668368..0c8f32ee08dae 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/EnumConstantWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java index b90bc178c8b4b..2fe6e8ec325a6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/FieldWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java index 2e994a4cd2625..ddab4e374a767 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java index 6e3b4718d6243..21ad94f70ca34 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index 25f754de20ac5..403ba2f687987 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java index 9787c1ce06e24..b4eb2066f9183 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java index 18587e1883dd9..73bb866b4ead2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java index 0f88a3ba4e680..e3661bfcdb709 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java index de57f246b972b..001863e1b377a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java index 062dde8d7e00b..a2cad03d4a4c4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java index 7f9726b9ed26c..1b7013ba1214e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index acfb0b428a206..ec731b181f0ee 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java index 4bec3479c6c82..4beed2ee89408 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/NestedClassWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java index ec566ec74398c..e0c114eb127e5 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java index 35d852408c34a..667e9266b6811 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PreviewListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java index 0a99bea027365..0d0106a484a27 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PropertyWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java index 2038d3d2d740f..de136060babe6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SubWriterHolderWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java index c0b2a47afa680..5c6ee8be672a8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SummaryListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java index 8bc35166e934b..02c9aee9f0dcb 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java index c3a9b4b7d2c45..919f668830dd2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java index 5133ce27f47fc..a60166cde5382 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/TagName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties index c4d29ab5326d8..2f6ef2dc5ffe1 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java index 8edc9f4b644c8..4d1d0e32841df 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/AnnotationTypeRequiredMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java index cb408bbea6a64..dd12824670c96 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/ConstructorWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java index 3e648d53b099c..0364d97a6e31d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/FieldWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java index bf9e044dc0c7a..05ae66b0dc443 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/PropertyWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java index ae76aac58c104..33ed2e9798ac7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index b4e6a5383b4a7..6fb8775e37308 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java index 870d8ded74e61..002dd588912fa 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java index ef0a263e06e0c..20972c8764493 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java index 92873461e247c..f98cc7a7fc5fd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java index 26f986a677468..a751de2ae11b6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java index 186673906f216..4a31f1d9c00a9 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index f3066c68c7280..24ec216fd061a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java index a0cfb18c8e540..b5b716fc8dd41 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java index 46e4ba285bd55..d96cca5fe806e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java index 5ad8e69a11fe2..2e5a2c251bd18 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocLink.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java index e128fe82cd954..6d057f7f1cecd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java index d5d2abecbbd3a..6ca4c01ca30e7 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/PreviewAPIListBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java index 28712e231e88e..4cab29bb164e6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/SummaryAPIListBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java index 46584ccd6434b..dc4fe1153c943 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java index 2224cb180b134..d2de0fd28b3b4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java index 8c9610f763297..5cdce91f9c61f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ElementsTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java b/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java index f171de9155a54..fb458bb309c9c 100644 --- a/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java +++ b/test/jdk/java/lang/invoke/defineHiddenClass/PreviewHiddenClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/jdk/java/lang/ref/CleanerTest.java b/test/jdk/java/lang/ref/CleanerTest.java index 49cb9a227722d..5d77459a47070 100644 --- a/test/jdk/java/lang/ref/CleanerTest.java +++ b/test/jdk/java/lang/ref/CleanerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/jdk/java/util/Arrays/TimSortStackSize2.java b/test/jdk/java/util/Arrays/TimSortStackSize2.java index ecb17268e5b3f..30f60fe9ccbff 100644 --- a/test/jdk/java/util/Arrays/TimSortStackSize2.java +++ b/test/jdk/java/util/Arrays/TimSortStackSize2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java index 23f6354ade4ab..0e82da1378a8a 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java +++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java b/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java index ab5204a257180..714b7420448c2 100644 --- a/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java +++ b/test/langtools/jdk/javadoc/doclet/testHtmlTableTags/TestHtmlTableTags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java index ccff39886e5d5..9bc1a16353a7f 100644 --- a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java +++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java index 9add8d724e502..24af7cfe13476 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/TestPreview.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java index 765d99caad74f..d2cf31c2e898b 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Core.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java index caac28c4637e6..0cfd84d197c36 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java index 12798a6a55eb2..bb081c6c6513b 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/CoreRecordComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java index eff7e0c43bde6..d4e39595871cb 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/api/preview/Reflective.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java index 5bcec70250651..28d4629808393 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java index 4457f559656b3..d6b5b3d9f83f2 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java index 67e92372c7032..be1435468100a 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java index 892cef8d29149..0f95e684e46f1 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/DocAnnotationUse2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java index e6ebbc0f17d32..1eb59b84628a2 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewAPIUse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java index 3a2362168c8e7..81ae744423f7c 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclaration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java index a28d0f5922ca5..74cbe30959ffc 100644 --- a/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java +++ b/test/langtools/jdk/javadoc/doclet/testPreview/m/pkg/TestPreviewDeclarationUse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java index ac8621bd44582..0ecd564b1f067 100644 --- a/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java index 17512f7a6d133..7c13190fe7125 100644 --- a/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java +++ b/test/langtools/jdk/javadoc/doclet/testSealedTypes/TestSealedTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java b/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java index 9ad16f646a434..6cc1d10797959 100644 --- a/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java +++ b/test/langtools/jdk/javadoc/doclet/testStylesheet/TestStylesheet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java b/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java index 8b2cedbc82f60..e82b062289584 100644 --- a/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java +++ b/test/langtools/jdk/javadoc/tool/CheckResourceKeys.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java index c30859543186f..2ff3575c21d91 100644 --- a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java +++ b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherModule/CantExtendSealedInAnotherModule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java index ea46b91ed6cec..c421689fc3226 100644 --- a/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java +++ b/test/langtools/tools/javac/diags/examples/CantExtendSealedInAnotherPkg/CantExtendSealedInAnotherPkg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/diags/examples/SealedTypes.java b/test/langtools/tools/javac/diags/examples/SealedTypes.java index 43e8c10fc0577..bcf32afd817de 100644 --- a/test/langtools/tools/javac/diags/examples/SealedTypes.java +++ b/test/langtools/tools/javac/diags/examples/SealedTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/patterns/ConditionalTest.java b/test/langtools/tools/javac/patterns/ConditionalTest.java index 4a3327ec518de..de6063620118a 100644 --- a/test/langtools/tools/javac/patterns/ConditionalTest.java +++ b/test/langtools/tools/javac/patterns/ConditionalTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java index 5cc8bcb923d89..59266dc27dfdf 100644 --- a/test/langtools/tools/javac/preview/PreviewAutoSuppress.java +++ b/test/langtools/tools/javac/preview/PreviewAutoSuppress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/processing/model/element/TestSealed.java b/test/langtools/tools/javac/processing/model/element/TestSealed.java index 1859ff25ce3ee..70ca7c25afb91 100644 --- a/test/langtools/tools/javac/processing/model/element/TestSealed.java +++ b/test/langtools/tools/javac/processing/model/element/TestSealed.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java index 780a64a09bc4d..92beb53e88d44 100644 --- a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java +++ b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it