From 22ce8dff14ae1200997123b40f41830be8100c67 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 10 Nov 2023 16:50:53 +0000 Subject: [PATCH 1/7] Move DocLint-specific method from Env.AccessKind --- .../share/classes/jdk/javadoc/internal/doclint/Env.java | 6 ------ .../classes/jdk/javadoc/internal/doclint/Messages.java | 8 +++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java index aa88ccd981c3b..65f75dbb2388d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java @@ -77,12 +77,6 @@ public enum AccessKind { PROTECTED, PUBLIC; - static boolean accepts(String opt) { - for (AccessKind g: values()) - if (opt.equals(StringUtils.toLowerCase(g.name()))) return true; - return false; - } - static AccessKind of(Set mods) { if (mods.contains(Modifier.PUBLIC)) return AccessKind.PUBLIC; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java index 7d38e511d037f..abc2826584dab 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java @@ -195,7 +195,13 @@ private static boolean isValidOption(String opt) { int sep = opt.indexOf("/"); String grp = opt.substring(begin, (sep != -1) ? sep : opt.length()); return ((begin == 0 && grp.equals("all")) || Group.accepts(grp)) - && ((sep == -1) || AccessKind.accepts(opt.substring(sep + 1))); + && ((sep == -1) || accepts(opt.substring(sep + 1))); + } + + static boolean accepts(String opt) { + for (AccessKind g: AccessKind.values()) + if (opt.equals(StringUtils.toLowerCase(g.name()))) return true; + return false; } Options(Stats stats) { From 002c891c2c49033a91f9e770b6be0dceac7ff9cc Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 17 Nov 2023 10:18:46 +0000 Subject: [PATCH 2/7] Merge two AccessKind into tool.AccessKind --- .../doclets/toolkit/BaseConfiguration.java | 4 +-- .../jdk/javadoc/internal/doclint/DocLint.java | 3 +- .../jdk/javadoc/internal/doclint/Env.java | 23 ++------------ .../javadoc/internal/doclint/Messages.java | 20 ++++++------ .../jdk/javadoc/internal/tool/AccessKind.java | 31 ++++++++++++++----- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java index f3749677b9eb7..2b2a2054520ca 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java @@ -73,7 +73,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberCache; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclint.DocLint; -import jdk.javadoc.internal.doclint.Env; +import jdk.javadoc.internal.tool.AccessKind; /** * Configure the output based on the options. Doclets should subclass @@ -657,7 +657,7 @@ private boolean isDocLintGroupEnabled(jdk.javadoc.internal.doclint.Messages.Grou // set DocLint options per access kind (as is common with javac.) // A more sophisticated solution might be to derive the access kind from the // element owning the comment, and its enclosing elements. - return doclint != null && doclint.isGroupEnabled(group, Env.AccessKind.PUBLIC); + return doclint != null && doclint.isGroupEnabled(group, AccessKind.PUBLIC); } // } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java index 0139f95b74b4c..1a83f1a78e52b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java @@ -64,6 +64,7 @@ import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.StringUtils.DamerauLevenshteinDistance; +import jdk.javadoc.internal.tool.AccessKind; /** * Multi-function entry point for the doc check utility. @@ -410,7 +411,7 @@ public boolean isValidOption(String opt) { return false; } - public boolean isGroupEnabled(Messages.Group group, Env.AccessKind accessKind) { + public boolean isGroupEnabled(Messages.Group group, AccessKind accessKind) { return env.messages.isEnabled(group, accessKind); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java index 65f75dbb2388d..cbf460b3b37b3 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2023, 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 @@ -62,32 +62,13 @@ import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.MatchingUtils; import com.sun.tools.javac.util.StringUtils; +import jdk.javadoc.internal.tool.AccessKind; /** * Utility container for current execution environment, * providing the current declaration and its doc comment. */ public class Env { - /** - * Access kinds for declarations. - */ - public enum AccessKind { - PRIVATE, - PACKAGE, - PROTECTED, - PUBLIC; - - static AccessKind of(Set mods) { - if (mods.contains(Modifier.PUBLIC)) - return AccessKind.PUBLIC; - else if (mods.contains(Modifier.PROTECTED)) - return AccessKind.PROTECTED; - else if (mods.contains(Modifier.PRIVATE)) - return AccessKind.PRIVATE; - else - return AccessKind.PACKAGE; - } - } /** Message handler. */ final Messages messages; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java index abc2826584dab..32227998def07 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java @@ -43,7 +43,7 @@ import com.sun.source.tree.Tree; import com.sun.tools.javac.api.JavacTrees; import com.sun.tools.javac.util.StringUtils; -import jdk.javadoc.internal.doclint.Env.AccessKind; +import jdk.javadoc.internal.tool.AccessKind; /** * Message reporting for DocLint. @@ -109,7 +109,7 @@ void setStatsEnabled(boolean b) { stats.setEnabled(b); } - boolean isEnabled(Group group, Env.AccessKind ak) { + boolean isEnabled(Group group, AccessKind ak) { return options.isEnabled(group, ak); } @@ -176,7 +176,7 @@ String localize(String code, Object... args) { * Handler for (sub)options specific to message handling. */ static class Options { - Map map = new HashMap<>(); + Map map = new HashMap<>(); private final Stats stats; static boolean isValidOptions(String opts) { @@ -209,11 +209,11 @@ static boolean accepts(String opt) { } /** Determine if a message group is enabled for a particular access level. */ - boolean isEnabled(Group g, Env.AccessKind access) { + boolean isEnabled(Group g, AccessKind access) { if (map.isEmpty()) - map.put("all", Env.AccessKind.PROTECTED); + map.put("all", AccessKind.PROTECTED); - Env.AccessKind ak = map.get(g.optName()); + AccessKind ak = map.get(g.optName()); if (ak != null && access.compareTo(ak) >= 0) return true; @@ -229,7 +229,7 @@ boolean isEnabled(Group g, Env.AccessKind access) { void setOptions(String opts) { if (opts == null) - setOption(ALL, Env.AccessKind.PRIVATE); + setOption(ALL, AccessKind.PRIVATE); else { for (String opt: opts.split(",")) setOption(StringUtils.toLowerCase(opt.trim())); @@ -244,16 +244,16 @@ private void setOption(String arg) throws IllegalArgumentException { int sep = arg.indexOf("/"); if (sep > 0) { - Env.AccessKind ak = Env.AccessKind.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); + AccessKind ak = AccessKind.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); setOption(arg.substring(0, sep), ak); } else { setOption(arg, null); } } - private void setOption(String opt, Env.AccessKind ak) { + private void setOption(String opt, AccessKind ak) { map.put(opt, (ak != null) ? ak - : opt.startsWith("-") ? Env.AccessKind.PUBLIC : Env.AccessKind.PRIVATE); + : opt.startsWith("-") ? AccessKind.PUBLIC : AccessKind.PRIVATE); } private static final String ALL = "all"; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java index 2e07a421acbb6..ddfb0ebb07eaf 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2023, 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 @@ -25,16 +25,33 @@ package jdk.javadoc.internal.tool; +import java.util.Set; +import javax.lang.model.element.Modifier; + /** * The access value kinds. */ public enum AccessKind { - /** Limits access to public entities */ - PUBLIC, - /** Limits access to public and protected entities */ - PROTECTED, + + // DO NOT REORDER THESE CONSTANTS OR CODE WILL BREAK + + /** No limits */ + PRIVATE, /** Limits access to public, protected and package private entities */ PACKAGE, - /** No limits */ - PRIVATE; + /** Limits access to public and protected entities */ + PROTECTED, + /** Limits access to public entities */ + PUBLIC; + + public static AccessKind of(Set mods) { + if (mods.contains(Modifier.PUBLIC)) + return AccessKind.PUBLIC; + else if (mods.contains(Modifier.PROTECTED)) + return AccessKind.PROTECTED; + else if (mods.contains(Modifier.PRIVATE)) + return AccessKind.PRIVATE; + else + return AccessKind.PACKAGE; + } } From 5eec5cd6279145a98022642542822e0303c9c6e8 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 17 Nov 2023 10:35:45 +0000 Subject: [PATCH 3/7] Rename AccessKind to reflect its level semantics "Level" matches relevant comments better than "Kind" does. --- .../doclets/toolkit/BaseConfiguration.java | 8 ++-- .../jdk/javadoc/internal/doclint/DocLint.java | 6 +-- .../jdk/javadoc/internal/doclint/Env.java | 16 +++---- .../javadoc/internal/doclint/Messages.java | 38 +++++++-------- .../{AccessKind.java => AccessLevel.java} | 14 +++--- .../javadoc/internal/tool/ElementsTable.java | 46 +++++++++---------- .../javadoc/internal/tool/ToolOptions.java | 46 +++++++++---------- 7 files changed, 87 insertions(+), 87 deletions(-) rename src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/{AccessKind.java => AccessLevel.java} (87%) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java index 2b2a2054520ca..db8b855eb721b 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java @@ -73,7 +73,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberCache; import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberTable; import jdk.javadoc.internal.doclint.DocLint; -import jdk.javadoc.internal.tool.AccessKind; +import jdk.javadoc.internal.tool.AccessLevel; /** * Configure the output based on the options. Doclets should subclass @@ -654,10 +654,10 @@ public boolean isDocLintSyntaxGroupEnabled() { private boolean isDocLintGroupEnabled(jdk.javadoc.internal.doclint.Messages.Group group) { // Use AccessKind.PUBLIC as a stand-in, since it is not common to - // set DocLint options per access kind (as is common with javac.) - // A more sophisticated solution might be to derive the access kind from the + // set DocLint options per access level (as is common with javac.) + // A more sophisticated solution might be to derive the access level from the // element owning the comment, and its enclosing elements. - return doclint != null && doclint.isGroupEnabled(group, AccessKind.PUBLIC); + return doclint != null && doclint.isGroupEnabled(group, AccessLevel.PUBLIC); } // } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java index 1a83f1a78e52b..9767eff0dd6b4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/DocLint.java @@ -64,7 +64,7 @@ import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; import com.sun.tools.javac.util.StringUtils.DamerauLevenshteinDistance; -import jdk.javadoc.internal.tool.AccessKind; +import jdk.javadoc.internal.tool.AccessLevel; /** * Multi-function entry point for the doc check utility. @@ -411,8 +411,8 @@ public boolean isValidOption(String opt) { return false; } - public boolean isGroupEnabled(Messages.Group group, AccessKind accessKind) { - return env.messages.isEnabled(group, accessKind); + public boolean isGroupEnabled(Messages.Group group, AccessLevel accessLevel) { + return env.messages.isEnabled(group, accessLevel); } private String localize(String code, Object... args) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java index cbf460b3b37b3..5259aefc3ab3a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java @@ -62,7 +62,7 @@ import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.MatchingUtils; import com.sun.tools.javac.util.StringUtils; -import jdk.javadoc.internal.tool.AccessKind; +import jdk.javadoc.internal.tool.AccessLevel; /** * Utility container for current execution environment, @@ -111,12 +111,12 @@ public class Env { /** The comment current being analyzed. */ DocCommentTree currDocComment; /** - * The access kind of the declaration containing the comment currently being analyzed. - * This is the minimum (most restrictive) access kind of the declaration itself + * The access level of the declaration containing the comment currently being analyzed. + * This is the minimum (most restrictive) access level of the declaration itself * and that of its containers. For example, a public method in a private class is * noted as private. */ - AccessKind currAccess; + AccessLevel currAccess; /** The set of methods, if any, that the current declaration overrides. */ Set currOverriddenMethods; @@ -194,17 +194,17 @@ void setCurrent(TreePath path, DocCommentTree comment) { currElement = trees.getElement(currPath); currOverriddenMethods = ((JavacTypes) types).getOverriddenMethods(currElement); - AccessKind ak = AccessKind.PUBLIC; + AccessLevel al = AccessLevel.PUBLIC; for (TreePath p = path; p != null; p = p.getParentPath()) { Element e = trees.getElement(p); if (e != null && e.getKind() != ElementKind.PACKAGE && e.getKind() != ElementKind.MODULE) { - ak = min(ak, AccessKind.of(e.getModifiers())); + al = min(al, AccessLevel.of(e.getModifiers())); } } - currAccess = ak; + currAccess = al; } - AccessKind getAccessKind() { + AccessLevel getAccessLevel() { return currAccess; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java index 32227998def07..758f2600b8b1c 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java @@ -43,7 +43,7 @@ import com.sun.source.tree.Tree; import com.sun.tools.javac.api.JavacTrees; import com.sun.tools.javac.util.StringUtils; -import jdk.javadoc.internal.tool.AccessKind; +import jdk.javadoc.internal.tool.AccessLevel; /** * Message reporting for DocLint. @@ -109,8 +109,8 @@ void setStatsEnabled(boolean b) { stats.setEnabled(b); } - boolean isEnabled(Group group, AccessKind ak) { - return options.isEnabled(group, ak); + boolean isEnabled(Group group, AccessLevel al) { + return options.isEnabled(group, al); } void reportStats(PrintWriter out) { @@ -176,7 +176,7 @@ String localize(String code, Object... args) { * Handler for (sub)options specific to message handling. */ static class Options { - Map map = new HashMap<>(); + Map map = new HashMap<>(); private final Stats stats; static boolean isValidOptions(String opts) { @@ -199,7 +199,7 @@ private static boolean isValidOption(String opt) { } static boolean accepts(String opt) { - for (AccessKind g: AccessKind.values()) + for (AccessLevel g: AccessLevel.values()) if (opt.equals(StringUtils.toLowerCase(g.name()))) return true; return false; } @@ -209,18 +209,18 @@ static boolean accepts(String opt) { } /** Determine if a message group is enabled for a particular access level. */ - boolean isEnabled(Group g, AccessKind access) { + boolean isEnabled(Group g, AccessLevel access) { if (map.isEmpty()) - map.put("all", AccessKind.PROTECTED); + map.put("all", AccessLevel.PROTECTED); - AccessKind ak = map.get(g.optName()); - if (ak != null && access.compareTo(ak) >= 0) + AccessLevel al = map.get(g.optName()); + if (al != null && access.compareTo(al) >= 0) return true; - ak = map.get(ALL); - if (ak != null && access.compareTo(ak) >= 0) { - ak = map.get(g.notOptName()); - if (ak == null || access.compareTo(ak) > 0) // note >, not >= + al = map.get(ALL); + if (al != null && access.compareTo(al) >= 0) { + al = map.get(g.notOptName()); + if (al == null || access.compareTo(al) > 0) // note >, not >= return true; } @@ -229,7 +229,7 @@ boolean isEnabled(Group g, AccessKind access) { void setOptions(String opts) { if (opts == null) - setOption(ALL, AccessKind.PRIVATE); + setOption(ALL, AccessLevel.PRIVATE); else { for (String opt: opts.split(",")) setOption(StringUtils.toLowerCase(opt.trim())); @@ -244,16 +244,16 @@ private void setOption(String arg) throws IllegalArgumentException { int sep = arg.indexOf("/"); if (sep > 0) { - AccessKind ak = AccessKind.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); - setOption(arg.substring(0, sep), ak); + AccessLevel al = AccessLevel.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); + setOption(arg.substring(0, sep), al); } else { setOption(arg, null); } } - private void setOption(String opt, AccessKind ak) { - map.put(opt, (ak != null) ? ak - : opt.startsWith("-") ? AccessKind.PUBLIC : AccessKind.PRIVATE); + private void setOption(String opt, AccessLevel al) { + map.put(opt, (al != null) ? al + : opt.startsWith("-") ? AccessLevel.PUBLIC : AccessLevel.PRIVATE); } private static final String ALL = "all"; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java similarity index 87% rename from src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java rename to src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java index ddfb0ebb07eaf..adb92bee32334 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessKind.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java @@ -29,9 +29,9 @@ import javax.lang.model.element.Modifier; /** - * The access value kinds. + * The access levels. */ -public enum AccessKind { +public enum AccessLevel { // DO NOT REORDER THESE CONSTANTS OR CODE WILL BREAK @@ -44,14 +44,14 @@ public enum AccessKind { /** Limits access to public entities */ PUBLIC; - public static AccessKind of(Set mods) { + public static AccessLevel of(Set mods) { if (mods.contains(Modifier.PUBLIC)) - return AccessKind.PUBLIC; + return AccessLevel.PUBLIC; else if (mods.contains(Modifier.PROTECTED)) - return AccessKind.PROTECTED; + return AccessLevel.PROTECTED; else if (mods.contains(Modifier.PRIVATE)) - return AccessKind.PRIVATE; + return AccessLevel.PRIVATE; else - return AccessKind.PACKAGE; + return AccessLevel.PACKAGE; } } 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 e915fc5f34c70..a54bccbe16321 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 @@ -192,7 +192,7 @@ public class ElementsTable { private final ModifierFilter accessFilter; - private final AccessKind expandRequires; + private final AccessLevel expandRequires; final boolean xclasses; @@ -605,8 +605,8 @@ private void computeSpecifiedModules() throws ToolException { return; } - final boolean expandAll = expandRequires.equals(AccessKind.PRIVATE) - || expandRequires.equals(AccessKind.PACKAGE); + final boolean expandAll = expandRequires.equals(AccessLevel.PRIVATE) + || expandRequires.equals(AccessLevel.PACKAGE); Set result = new LinkedHashSet<>(); ListBuffer queue = new ListBuffer<>(); @@ -657,13 +657,13 @@ private Set getAllModulePackages(ModuleElement mdle) throws Tool } private Set computeModulePackages() throws ToolException { - AccessKind accessValue = accessFilter.getAccessValue(ElementKind.PACKAGE); - final boolean documentAllModulePackages = (accessValue == AccessKind.PACKAGE || - accessValue == AccessKind.PRIVATE); + AccessLevel accessValue = accessFilter.getAccessValue(ElementKind.PACKAGE); + final boolean documentAllModulePackages = (accessValue == AccessLevel.PACKAGE || + accessValue == AccessLevel.PRIVATE); accessValue = accessFilter.getAccessValue(ElementKind.MODULE); - final boolean moduleDetailedMode = (accessValue == AccessKind.PACKAGE || - accessValue == AccessKind.PRIVATE); + final boolean moduleDetailedMode = (accessValue == AccessLevel.PACKAGE || + accessValue == AccessLevel.PRIVATE); Set expandedModulePackages = new LinkedHashSet<>(); for (ModuleElement mdle : specifiedModuleElements) { @@ -1186,11 +1186,11 @@ static class ModifierFilter { ElementKind.MODULE); // all possible access levels allowed for each element - private final EnumMap> filterMap = + private final EnumMap> filterMap = new EnumMap<>(ElementKind.class); // the specified access level for each element - private final EnumMap accessMap = + private final EnumMap accessMap = new EnumMap<>(ElementKind.class); /** @@ -1200,7 +1200,7 @@ static class ModifierFilter { */ ModifierFilter(ToolOptions options) { - AccessKind accessValue = null; + AccessLevel accessValue = null; for (ElementKind kind : ALLOWED_KINDS) { accessValue = switch (kind) { case METHOD -> options.showMembersAccess(); @@ -1214,20 +1214,20 @@ static class ModifierFilter { } } - static EnumSet getFilterSet(AccessKind accessValue) { + static EnumSet getFilterSet(AccessLevel accessValue) { return switch (accessValue) { - case PUBLIC -> EnumSet.of(AccessKind.PUBLIC); - case PROTECTED -> EnumSet.of(AccessKind.PUBLIC, AccessKind.PROTECTED); - case PACKAGE -> EnumSet.of(AccessKind.PUBLIC, AccessKind.PROTECTED, AccessKind.PACKAGE); - case PRIVATE -> EnumSet.allOf(AccessKind.class); + case PUBLIC -> EnumSet.of(AccessLevel.PUBLIC); + case PROTECTED -> EnumSet.of(AccessLevel.PUBLIC, AccessLevel.PROTECTED); + case PACKAGE -> EnumSet.of(AccessLevel.PUBLIC, AccessLevel.PROTECTED, AccessLevel.PACKAGE); + case PRIVATE -> EnumSet.allOf(AccessLevel.class); }; } - public AccessKind getAccessValue(ElementKind kind) { + public AccessLevel getAccessValue(ElementKind kind) { if (!ALLOWED_KINDS.contains(kind)) { throw new IllegalArgumentException("not allowed: " + kind); } - return accessMap.getOrDefault(kind, AccessKind.PROTECTED); + return accessMap.getOrDefault(kind, AccessLevel.PROTECTED); } /** @@ -1238,15 +1238,15 @@ public AccessKind getAccessValue(ElementKind kind) { */ public boolean checkModifier(Element e) { Set modifiers = e.getModifiers(); - AccessKind fflag = AccessKind.PACKAGE; + AccessLevel fflag = AccessLevel.PACKAGE; if (modifiers.contains(Modifier.PUBLIC)) { - fflag = AccessKind.PUBLIC; + fflag = AccessLevel.PUBLIC; } else if (modifiers.contains(Modifier.PROTECTED)) { - fflag = AccessKind.PROTECTED; + fflag = AccessLevel.PROTECTED; } else if (modifiers.contains(Modifier.PRIVATE)) { - fflag = AccessKind.PRIVATE; + fflag = AccessLevel.PRIVATE; } - EnumSet filterSet = filterMap.get(getAllowedKind(e.getKind())); + EnumSet filterSet = filterMap.get(getAllowedKind(e.getKind())); return filterSet.contains(fflag); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java index 07f53f7092447..039f0869999f8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java @@ -85,7 +85,7 @@ public class ToolOptions { /** * Argument for command-line option {@code --expand-requires}. */ - private AccessKind expandRequires; + private AccessLevel expandRequires; /** * Argument for command-line option {@code --ignore-source-errors}. @@ -106,22 +106,22 @@ public class ToolOptions { /** * Argument for command-line option {@code --show-members}. */ - private AccessKind showMembersAccess; + private AccessLevel showMembersAccess; /** * Argument for command-line option {@code --show-types}. */ - private AccessKind showTypesAccess; + private AccessLevel showTypesAccess; /** * Argument for command-line option {@code --show-packages}. */ - private AccessKind showPackagesAccess; + private AccessLevel showPackagesAccess; /** * Argument for command-line option {@code --show-module-contents}. */ - private AccessKind showModuleContents; + private AccessLevel showModuleContents; /** * Argument for command-line option {@code -quiet}. @@ -717,7 +717,7 @@ List excludes() { /** * Argument for command-line option {@code --expand-requires}. */ - AccessKind expandRequires() { + AccessLevel expandRequires() { return expandRequires; } @@ -746,28 +746,28 @@ boolean rejectWarnings() { /** * Argument for command-line option {@code --show-members}. */ - AccessKind showMembersAccess() { + AccessLevel showMembersAccess() { return showMembersAccess; } /** * Argument for command-line option {@code --show-types}. */ - AccessKind showTypesAccess() { + AccessLevel showTypesAccess() { return showTypesAccess; } /** * Argument for command-line option {@code --show-packages}. */ - AccessKind showPackagesAccess() { + AccessLevel showPackagesAccess() { return showPackagesAccess; } /** * Argument for command-line option {@code --show-module-contents}. */ - AccessKind showModuleContents() { + AccessLevel showModuleContents() { return showModuleContents; } @@ -886,10 +886,10 @@ public boolean handleFileManagerOption(com.sun.tools.javac.main.Option option, S private void setExpandRequires(String arg) throws OptionException { switch (arg) { case "transitive": - expandRequires = AccessKind.PUBLIC; + expandRequires = AccessLevel.PUBLIC; break; case "all": - expandRequires = AccessKind.PRIVATE; + expandRequires = AccessLevel.PRIVATE; break; default: throw illegalOptionValue(arg); @@ -899,10 +899,10 @@ private void setExpandRequires(String arg) throws OptionException { private void setShowModuleContents(String arg) throws OptionException { switch (arg) { case "api": - showModuleContents = AccessKind.PUBLIC; + showModuleContents = AccessLevel.PUBLIC; break; case "all": - showModuleContents = AccessKind.PRIVATE; + showModuleContents = AccessLevel.PRIVATE; break; default: throw illegalOptionValue(arg); @@ -912,10 +912,10 @@ private void setShowModuleContents(String arg) throws OptionException { private void setShowPackageAccess(String arg) throws OptionException { switch (arg) { case "exported": - showPackagesAccess = AccessKind.PUBLIC; + showPackagesAccess = AccessLevel.PUBLIC; break; case "all": - showPackagesAccess = AccessKind.PRIVATE; + showPackagesAccess = AccessLevel.PRIVATE; break; default: throw illegalOptionValue(arg); @@ -948,20 +948,20 @@ private void setSimpleAccessOption(String arg) throws OptionException { * -private, so on, in addition to the new ones such as * --show-types:public and so on. */ - private AccessKind getAccessValue(String arg) throws OptionException { + private AccessLevel getAccessValue(String arg) throws OptionException { int colon = arg.indexOf(':'); String value = (colon > 0) ? arg.substring(colon + 1) : arg; switch (value) { case "public": - return AccessKind.PUBLIC; + return AccessLevel.PUBLIC; case "protected": - return AccessKind.PROTECTED; + return AccessLevel.PROTECTED; case "package": - return AccessKind.PACKAGE; + return AccessLevel.PACKAGE; case "private": - return AccessKind.PRIVATE; + return AccessLevel.PRIVATE; default: throw illegalOptionValue(value); } @@ -971,14 +971,14 @@ private AccessKind getAccessValue(String arg) throws OptionException { * Sets all access members to PROTECTED; this is the default. */ private void setAccessDefault() { - setAccess(AccessKind.PROTECTED); + setAccess(AccessLevel.PROTECTED); } /* * This sets access to all the allowed kinds in the * access members. */ - private void setAccess(AccessKind accessValue) { + private void setAccess(AccessLevel accessValue) { for (ElementKind kind : ElementsTable.ModifierFilter.ALLOWED_KINDS) { switch (kind) { case METHOD: From c837727fc36885f5ee05e0faa6ba78783a59f746 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 17 Nov 2023 12:20:14 +0000 Subject: [PATCH 4/7] Clean up --- .../jdk/javadoc/internal/doclint/Env.java | 10 +-- .../javadoc/internal/doclint/Messages.java | 6 +- .../javadoc/internal/tool/ElementsTable.java | 4 +- .../javadoc/internal/tool/ToolOptions.java | 73 ++++++------------- 4 files changed, 29 insertions(+), 64 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java index 5259aefc3ab3a..90a80fc9e73ad 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java @@ -194,18 +194,14 @@ void setCurrent(TreePath path, DocCommentTree comment) { currElement = trees.getElement(currPath); currOverriddenMethods = ((JavacTypes) types).getOverriddenMethods(currElement); - AccessLevel al = AccessLevel.PUBLIC; + var level = AccessLevel.PUBLIC; for (TreePath p = path; p != null; p = p.getParentPath()) { Element e = trees.getElement(p); if (e != null && e.getKind() != ElementKind.PACKAGE && e.getKind() != ElementKind.MODULE) { - al = min(al, AccessLevel.of(e.getModifiers())); + level = min(level, AccessLevel.of(e.getModifiers())); } } - currAccess = al; - } - - AccessLevel getAccessLevel() { - return currAccess; + currAccess = level; } long getPos(TreePath p) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java index 758f2600b8b1c..8867b7711bf37 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java @@ -199,8 +199,8 @@ private static boolean isValidOption(String opt) { } static boolean accepts(String opt) { - for (AccessLevel g: AccessLevel.values()) - if (opt.equals(StringUtils.toLowerCase(g.name()))) return true; + for (var level: AccessLevel.values()) + if (opt.equals(StringUtils.toLowerCase(level.name()))) return true; return false; } @@ -244,7 +244,7 @@ private void setOption(String arg) throws IllegalArgumentException { int sep = arg.indexOf("/"); if (sep > 0) { - AccessLevel al = AccessLevel.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); + var al = AccessLevel.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); setOption(arg.substring(0, sep), al); } else { setOption(arg, null); 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 a54bccbe16321..32f9876419b4d 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 @@ -1199,10 +1199,8 @@ static class ModifierFilter { * @param options the tool options */ ModifierFilter(ToolOptions options) { - - AccessLevel accessValue = null; for (ElementKind kind : ALLOWED_KINDS) { - accessValue = switch (kind) { + var accessValue = switch (kind) { case METHOD -> options.showMembersAccess(); case CLASS -> options.showTypesAccess(); case PACKAGE -> options.showPackagesAccess(); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java index 039f0869999f8..8a28e168c41f6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java @@ -885,40 +885,25 @@ public boolean handleFileManagerOption(com.sun.tools.javac.main.Option option, S private void setExpandRequires(String arg) throws OptionException { switch (arg) { - case "transitive": - expandRequires = AccessLevel.PUBLIC; - break; - case "all": - expandRequires = AccessLevel.PRIVATE; - break; - default: - throw illegalOptionValue(arg); + case "transitive" -> expandRequires = AccessLevel.PUBLIC; + case "all" -> expandRequires = AccessLevel.PRIVATE; + default -> throw illegalOptionValue(arg); } } private void setShowModuleContents(String arg) throws OptionException { switch (arg) { - case "api": - showModuleContents = AccessLevel.PUBLIC; - break; - case "all": - showModuleContents = AccessLevel.PRIVATE; - break; - default: - throw illegalOptionValue(arg); + case "api" -> showModuleContents = AccessLevel.PUBLIC; + case "all" -> showModuleContents = AccessLevel.PRIVATE; + default -> throw illegalOptionValue(arg); } } private void setShowPackageAccess(String arg) throws OptionException { switch (arg) { - case "exported": - showPackagesAccess = AccessLevel.PUBLIC; - break; - case "all": - showPackagesAccess = AccessLevel.PRIVATE; - break; - default: - throw illegalOptionValue(arg); + case "exported" -> showPackagesAccess = AccessLevel.PUBLIC; + case "all" -> showPackagesAccess = AccessLevel.PRIVATE; + default -> throw illegalOptionValue(arg); } } @@ -953,18 +938,13 @@ private AccessLevel getAccessValue(String arg) throws OptionException { String value = (colon > 0) ? arg.substring(colon + 1) : arg; - switch (value) { - case "public": - return AccessLevel.PUBLIC; - case "protected": - return AccessLevel.PROTECTED; - case "package": - return AccessLevel.PACKAGE; - case "private": - return AccessLevel.PRIVATE; - default: - throw illegalOptionValue(value); - } + return switch (value) { + case "public" -> AccessLevel.PUBLIC; + case "protected" -> AccessLevel.PROTECTED; + case "package" -> AccessLevel.PACKAGE; + case "private" -> AccessLevel.PRIVATE; + default -> throw illegalOptionValue(value); + }; } /* @@ -975,26 +955,17 @@ private void setAccessDefault() { } /* - * This sets access to all the allowed kinds in the + * Sets access level to all the allowed kinds in the * access members. */ private void setAccess(AccessLevel accessValue) { for (ElementKind kind : ElementsTable.ModifierFilter.ALLOWED_KINDS) { switch (kind) { - case METHOD: - showMembersAccess = accessValue; - break; - case CLASS: - showTypesAccess = accessValue; - break; - case PACKAGE: - showPackagesAccess = accessValue; - break; - case MODULE: - showModuleContents = accessValue; - break; - default: - throw new AssertionError("unknown element kind:" + kind); + case METHOD -> showMembersAccess = accessValue; + case CLASS -> showTypesAccess = accessValue; + case PACKAGE -> showPackagesAccess = accessValue; + case MODULE -> showModuleContents = accessValue; + default -> throw new AssertionError("unknown element kind:" + kind); } } } From 2265d5f41c32fe992c0395e4ac6159c6a721f57d Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 17 Nov 2023 14:51:31 +0000 Subject: [PATCH 5/7] Clean up more --- .../classes/jdk/javadoc/internal/doclint/Messages.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java index 8867b7711bf37..2e6bc6f339b1a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Messages.java @@ -176,7 +176,7 @@ String localize(String code, Object... args) { * Handler for (sub)options specific to message handling. */ static class Options { - Map map = new HashMap<>(); + private final Map map = new HashMap<>(); private final Stats stats; static boolean isValidOptions(String opts) { @@ -211,7 +211,7 @@ static boolean accepts(String opt) { /** Determine if a message group is enabled for a particular access level. */ boolean isEnabled(Group g, AccessLevel access) { if (map.isEmpty()) - map.put("all", AccessLevel.PROTECTED); + map.put(ALL, AccessLevel.PROTECTED); AccessLevel al = map.get(g.optName()); if (al != null && access.compareTo(al) >= 0) @@ -220,8 +220,7 @@ boolean isEnabled(Group g, AccessLevel access) { al = map.get(ALL); if (al != null && access.compareTo(al) >= 0) { al = map.get(g.notOptName()); - if (al == null || access.compareTo(al) > 0) // note >, not >= - return true; + return al == null || access.compareTo(al) > 0; // note >, not >= } return false; From ed52bdafb795b497046ebd42ec8f4bd8dabadd00 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Fri, 17 Nov 2023 17:44:14 +0000 Subject: [PATCH 6/7] Aggressively simplify code Embraces enum ordering. At least for now. Also adds comments and changes language to match that of JLS. --- .../jdk/javadoc/internal/doclint/Env.java | 19 ++++----- .../javadoc/internal/tool/AccessLevel.java | 22 ++++++++-- .../javadoc/internal/tool/ElementsTable.java | 40 +++++-------------- .../javadoc/internal/tool/ToolOptions.java | 4 +- 4 files changed, 36 insertions(+), 49 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java index 90a80fc9e73ad..f576da1d4851d 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Env.java @@ -112,7 +112,7 @@ public class Env { DocCommentTree currDocComment; /** * The access level of the declaration containing the comment currently being analyzed. - * This is the minimum (most restrictive) access level of the declaration itself + * This is the most limiting access level of the declaration itself * and that of its containers. For example, a public method in a private class is * noted as private. */ @@ -194,14 +194,18 @@ void setCurrent(TreePath path, DocCommentTree comment) { currElement = trees.getElement(currPath); currOverriddenMethods = ((JavacTypes) types).getOverriddenMethods(currElement); - var level = AccessLevel.PUBLIC; + // It's convenient to use AccessLevel to model effects that nesting has + // on access. While very similar, those are not the same concept. + var mostLimitingSoFar = AccessLevel.PUBLIC; for (TreePath p = path; p != null; p = p.getParentPath()) { Element e = trees.getElement(p); if (e != null && e.getKind() != ElementKind.PACKAGE && e.getKind() != ElementKind.MODULE) { - level = min(level, AccessLevel.of(e.getModifiers())); + var level = AccessLevel.of(e.getModifiers()); + mostLimitingSoFar = mostLimitingSoFar.compareTo(level) <= 0 + ? mostLimitingSoFar : level; } } - currAccess = level; + currAccess = mostLimitingSoFar; } long getPos(TreePath p) { @@ -330,11 +334,4 @@ private List getSuppressWarningsValue(Element e) { } return List.of(); } - - - private > T min(T item1, T item2) { - return (item1 == null) ? item2 - : (item2 == null) ? item1 - : item1.compareTo(item2) <= 0 ? item1 : item2; - } } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java index adb92bee32334..1916d6c777663 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java @@ -30,20 +30,34 @@ /** * The access levels. + * + * These constants are ordered by their access limiting power. The bigger the + * {@link #ordinal() ordinal} of a constant, the more limiting power that + * constant has. + * + * That has a few useful implications. For example, the levels can be compared + * by {@link #compareTo}. It also means that {@code AccessLevel.values()[0]} and + * {@code AccessLevel.values()[values.length() - 1] and the constants with the + * smallest and the biggest limiting powers respectively. */ public enum AccessLevel { - // DO NOT REORDER THESE CONSTANTS OR CODE WILL BREAK - - /** No limits */ + /** Does not limit access */ PRIVATE, - /** Limits access to public, protected and package private entities */ + /** Limits access to entities that are public, protected, or declared with package access */ PACKAGE, /** Limits access to public and protected entities */ PROTECTED, /** Limits access to public entities */ PUBLIC; + static { // self-test to catch unintended reordering of the constants + assert PRIVATE.ordinal() == 0 + && PACKAGE.ordinal() == 1 + && PROTECTED.ordinal() == 2 + && PUBLIC.ordinal() == 3; + } + public static AccessLevel of(Set mods) { if (mods.contains(Modifier.PUBLIC)) return AccessLevel.PUBLIC; 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 32f9876419b4d..7f4f31844f5af 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 @@ -1185,12 +1185,8 @@ static class ModifierFilter { ElementKind.PACKAGE, ElementKind.MODULE); - // all possible access levels allowed for each element - private final EnumMap> filterMap = - new EnumMap<>(ElementKind.class); - - // the specified access level for each element - private final EnumMap accessMap = + // the allowed access level for each element kind + private final EnumMap allowedAccess = new EnumMap<>(ElementKind.class); /** @@ -1207,25 +1203,15 @@ static class ModifierFilter { case MODULE -> options.showModuleContents(); default -> throw new AssertionError("unknown element: " + kind); }; - accessMap.put(kind, accessValue); - filterMap.put(kind, getFilterSet(accessValue)); + allowedAccess.put(kind, accessValue); } } - static EnumSet getFilterSet(AccessLevel accessValue) { - return switch (accessValue) { - case PUBLIC -> EnumSet.of(AccessLevel.PUBLIC); - case PROTECTED -> EnumSet.of(AccessLevel.PUBLIC, AccessLevel.PROTECTED); - case PACKAGE -> EnumSet.of(AccessLevel.PUBLIC, AccessLevel.PROTECTED, AccessLevel.PACKAGE); - case PRIVATE -> EnumSet.allOf(AccessLevel.class); - }; - } - public AccessLevel getAccessValue(ElementKind kind) { if (!ALLOWED_KINDS.contains(kind)) { throw new IllegalArgumentException("not allowed: " + kind); } - return accessMap.getOrDefault(kind, AccessLevel.PROTECTED); + return allowedAccess.getOrDefault(kind, AccessLevel.PROTECTED); } /** @@ -1235,21 +1221,13 @@ public AccessLevel getAccessValue(ElementKind kind) { * @return whether the modifiers pass this filter */ public boolean checkModifier(Element e) { - Set modifiers = e.getModifiers(); - AccessLevel fflag = AccessLevel.PACKAGE; - if (modifiers.contains(Modifier.PUBLIC)) { - fflag = AccessLevel.PUBLIC; - } else if (modifiers.contains(Modifier.PROTECTED)) { - fflag = AccessLevel.PROTECTED; - } else if (modifiers.contains(Modifier.PRIVATE)) { - fflag = AccessLevel.PRIVATE; - } - EnumSet filterSet = filterMap.get(getAllowedKind(e.getKind())); - return filterSet.contains(fflag); + var access = AccessLevel.of(e.getModifiers()); + return allowedAccess.get(toTrackedKind(e.getKind())).compareTo(access) <= 0; } - // convert a requested element kind to an allowed access kind - private ElementKind getAllowedKind(ElementKind kind) { + // convert the requested element kind to a tracked access kind + // (access is tracked for certain kinds only) + private ElementKind toTrackedKind(ElementKind kind) { return switch (kind) { case CLASS, METHOD, MODULE, PACKAGE -> kind; case RECORD, ANNOTATION_TYPE, ENUM, INTERFACE -> ElementKind.CLASS; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java index 8a28e168c41f6..d478e878a5cef 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOptions.java @@ -935,9 +935,7 @@ private void setSimpleAccessOption(String arg) throws OptionException { */ private AccessLevel getAccessValue(String arg) throws OptionException { int colon = arg.indexOf(':'); - String value = (colon > 0) - ? arg.substring(colon + 1) - : arg; + String value = (colon > 0) ? arg.substring(colon + 1) : arg; return switch (value) { case "public" -> AccessLevel.PUBLIC; case "protected" -> AccessLevel.PROTECTED; From 2def7bf93e93670b9350c7da50e4708ac4ce61b6 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Mon, 20 Nov 2023 17:24:33 +0000 Subject: [PATCH 7/7] Remove assert, but implement Comparable explicitly --- .../classes/jdk/javadoc/internal/tool/AccessLevel.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java index 1916d6c777663..97481fa2f0845 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/AccessLevel.java @@ -40,7 +40,7 @@ * {@code AccessLevel.values()[values.length() - 1] and the constants with the * smallest and the biggest limiting powers respectively. */ -public enum AccessLevel { +public enum AccessLevel implements Comparable { /** Does not limit access */ PRIVATE, @@ -51,13 +51,6 @@ public enum AccessLevel { /** Limits access to public entities */ PUBLIC; - static { // self-test to catch unintended reordering of the constants - assert PRIVATE.ordinal() == 0 - && PACKAGE.ordinal() == 1 - && PROTECTED.ordinal() == 2 - && PUBLIC.ordinal() == 3; - } - public static AccessLevel of(Set mods) { if (mods.contains(Modifier.PUBLIC)) return AccessLevel.PUBLIC;