On Mon, 7 Mar 2022 11:22:29 GMT, Peter Levart <[email protected]> wrote:
>>> It does because of the AccessFlags.MODULE constant.
>>
>> But that’s exactly what the unqualified `MODULE` identifier refers to, and
>> there’s no other bare `MODULE` identifier in scope that would shadow the
>> `AccessFlag.MODULE` constant from the POV of `AccessFlag.LocationToFlags`.
>
> This is just implementation detail, but I think the reverse mapping from
> Location to AccessFlag(s) could be established implicitly during the
> initialization of the AccessFlag enum since it is only used from within code
> of that enum class. Like this:
>
>
> Index: src/java.base/share/classes/java/lang/reflect/AccessFlag.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> diff --git a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java
> b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java
> --- a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java
> (revision 1498060544413cb67de8b1a82fbbf15d388d62c3)
> +++ b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java (date
> 1646651355828)
> @@ -26,8 +26,13 @@
> package java.lang.reflect;
>
> import java.util.Collections;
> +import java.util.EnumMap;
> +import java.util.EnumSet;
> +import java.util.HashMap;
> import java.util.Map;
> import java.util.Set;
> +import java.util.function.Function;
> +
> import static java.util.Map.entry;
>
> /**
> @@ -248,6 +253,14 @@
> this.mask = mask;
> this.sourceModifier = sourceModifier;
> this.locations = locations;
> + for (var location : locations) {
> + LocationToFlags.MAP.computeIfAbsent(location, new Function<>() {
> + @Override
> + public Set<AccessFlag> apply(Location location) {
> + return EnumSet.noneOf(AccessFlag.class);
> + }
> + }).add(this);
> + }
> }
>
> /**
> @@ -283,7 +296,7 @@
> */
> public static Set<AccessFlag> maskToAccessFlags(int mask, Location
> location) {
> Set<AccessFlag> result = java.util.EnumSet.noneOf(AccessFlag.class);
> - for (var accessFlag : LocationToFlags.locationToFlags.get(location))
> {
> + for (var accessFlag : LocationToFlags.MAP.get(location)) {
> int accessMask = accessFlag.mask();
> if ((mask & accessMask) != 0) {
> result.add(accessFlag);
> @@ -363,34 +376,7 @@
> }
>
> private static class LocationToFlags {
> - private static Map<Location, Set<AccessFlag>> locationToFlags =
> - Map.ofEntries(entry(Location.CLASS,
> - Set.of(PUBLIC, FINAL, SUPER,
> - INTERFACE, ABSTRACT,
> - SYNTHETIC, ANNOTATION,
> - ENUM, AccessFlag.MODULE)),
> - entry(Location.FIELD,
> - Set.of(PUBLIC, PRIVATE, PROTECTED,
> - STATIC, FINAL, VOLATILE,
> - TRANSIENT, SYNTHETIC, ENUM)),
> - entry(Location.METHOD,
> - Set.of(PUBLIC, PRIVATE, PROTECTED,
> - STATIC, FINAL, SYNCHRONIZED,
> - BRIDGE, VARARGS, NATIVE,
> - ABSTRACT, STRICT, SYNTHETIC)),
> - entry(Location.INNER_CLASS,
> - Set.of(PUBLIC, PRIVATE, PROTECTED,
> - STATIC, FINAL, INTERFACE, ABSTRACT,
> - SYNTHETIC, ANNOTATION, ENUM)),
> - entry(Location.METHOD_PARAMETER,
> - Set.of(FINAL, SYNTHETIC, MANDATED)),
> - entry(Location.MODULE,
> - Set.of(OPEN, SYNTHETIC, MANDATED)),
> - entry(Location.MODULE_REQUIRES,
> - Set.of(TRANSITIVE, STATIC_PHASE, SYNTHETIC,
> MANDATED)),
> - entry(Location.MODULE_EXPORTS,
> - Set.of(SYNTHETIC, MANDATED)),
> - entry(Location.MODULE_OPENS,
> - Set.of(SYNTHETIC, MANDATED)));
> + private static final Map<Location, Set<AccessFlag>> MAP =
> + new EnumMap<>(Location.class);
> }
> }
@plevart
In your code, you might want to avoid allocating a new `Function` instance for
every call of `LocationToFlags.MAP.computeIfAbsent(…)`.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7445