On Mon, 28 Feb 2022 18:20:13 GMT, ExE Boss <[email protected]> wrote:
>> It does because of the AccessFlags.MODULE constant.
>
>> 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);
}
}
-------------
PR: https://git.openjdk.java.net/jdk/pull/7445