On Mon, 7 Mar 2022 11:22:29 GMT, Peter Levart <plev...@openjdk.org> 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