Improve ParserNamespace type safety 56/102156/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 18 Aug 2022 20:56:19 +0000 (22:56 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 18 Aug 2022 21:29:47 +0000 (23:29 +0200)
Specify concrete argument types to prevent any shenaningans.

JIRA: YANGTOOLS-1453
Change-Id: I1d82058e92f2afe0de740df1093ea43f12cb7244
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
14 files changed:
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceStorageSupport.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReplicaStatementContext.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/RevisionImport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/meta/BelongsToStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/meta/IncludeStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/ParserNamespaces.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/SourceParserNamespaces.java

index a6dff4a62925b15cd7c89b7c5d3158a68046efa6..110b34623e6f0d4a441bf09c2e0016cb8d1eaf54 100644 (file)
@@ -178,12 +178,11 @@ final class ModifierImpl implements ModelActionBuilder {
     }
 
     @Override
-    public <K, E extends EffectiveStatement<?, ?>> Prerequisite<StmtContext<?, ?, E>> requiresCtxPath(
-            final StmtContext<?, ?, ?> context, final ParserNamespace<K, ? extends StmtContext<?, ?, ?>> namespace,
-            final Iterable<K> keys, final ModelProcessingPhase phase) {
+    public <K, C extends StmtContext<?, ?, ?>> Prerequisite<C> requiresCtxPath(final StmtContext<?, ?, ?> context,
+            final ParserNamespace<K, C> namespace, final Iterable<K> keys, final ModelProcessingPhase phase) {
         checkNotRegistered();
 
-        final var ret = new PhaseRequirementInNamespacePath<StmtContext<?, ?, E>, K>(EFFECTIVE_MODEL, keys);
+        final var ret = new PhaseRequirementInNamespacePath<C, K>(EFFECTIVE_MODEL, keys);
         addReq(ret);
         addBootstrap(() -> ret.hookOnto(context, namespace));
         return ret;
index ffa6b83d1f9924fe1a09aa6d41a7f46d6d186b99..7d21fbf7c941c612f7fcc1c201a06d4f8d1803ab 100644 (file)
@@ -15,8 +15,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
@@ -99,12 +97,11 @@ abstract class NamespaceStorageSupport implements NamespaceStorageNode {
      * @param key Key
      * @param value Context value
      * @param <K> namespace key type
-     * @param <D> declared statement type
-     * @param <E> effective statement type
+     * @param <C> context type
      * @throws NamespaceNotAvailableException when the namespace is not available.
      */
-    public final <K, D extends DeclaredStatement<?>, E extends EffectiveStatement<?, D>> void addContextToNamespace(
-            final ParserNamespace<K, StmtContext<?, D, E>> type, final K key, final StmtContext<?, D, E> value) {
+    public final <K, C extends StmtContext<?, ?, ?>> void addContextToNamespace(
+            final ParserNamespace<K, ? super C> type, final K key, final C value) {
         getBehaviourRegistry().getNamespaceBehaviour(type).addTo(this, key, value);
     }
 
index 77b916330c0a109aebde2443099a04aed1576cd9..f7c1f4344cba7ce5f174b29af28d2a05e25bb651 100644 (file)
@@ -166,8 +166,8 @@ final class ReplicaStatementContext<A, D extends DeclaredStatement<A>, E extends
 
     @Override
     @Deprecated
-    public <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
-            final ParserNamespace<K, StmtContext<?, Y, Z>> namespace, final KT key, final StmtContext<?, Y, Z> stmt) {
+    public <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+            final ParserNamespace<K, ? super C> namespace, final KT key, final C stmt) {
         throw new UnsupportedOperationException();
     }
 
index 583bf61d53fc5131650e18e00eda2197943baec2..c0213e1715deba9127c6d04f2e35fde5848710ce 100644 (file)
@@ -717,8 +717,8 @@ abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E extends
     }
 
     @Override
-    public final <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
-            final ParserNamespace<K, StmtContext<?, Y, Z>> namespace, final KT key, final StmtContext<?, Y, Z> stmt) {
+    public final <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+            final ParserNamespace<K, ? super C> namespace, final KT key, final C stmt) {
         addContextToNamespace(namespace, key, stmt);
     }
 
index 7659f9ff52b7082f53c19074211c4d9e7b12d081..da1ab4373aecd2884f89831a1d79e17fb31a81f5 100644 (file)
@@ -26,8 +26,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
@@ -90,8 +88,8 @@ public final class ImportStatementSupport
 
         final Unqualified moduleName = stmt.getArgument();
         final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE);
-        final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> imported =
-            importAction.requiresCtx(stmt, ParserNamespaces.PRELINKAGE_MODULE, moduleName, SOURCE_PRE_LINKAGE);
+        final var imported = importAction.requiresCtx(stmt, ParserNamespaces.PRELINKAGE_MODULE, moduleName,
+            SOURCE_PRE_LINKAGE);
         final Prerequisite<Mutable<?, ?, ?>> rootPrereq = importAction.mutatesCtx(stmt.getRoot(), SOURCE_PRE_LINKAGE);
 
         importAction.apply(new InferenceAction() {
index 63b4b294c41fda076348045d49dc1b533c0d961e..ba958951854f24bce728fa7cbeaef5b595e99260 100644 (file)
@@ -44,7 +44,7 @@ final class RevisionImport {
         final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_LINKAGE);
         final Unqualified moduleName = stmt.getArgument();
         final Revision revision = firstAttributeOf(stmt.declaredSubstatements(), RevisionDateStatement.class);
-        final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> imported;
+        final Prerequisite<StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> imported;
         if (revision == null) {
             imported = importAction.requiresCtx(stmt, ParserNamespaces.MODULE,
                 NamespaceKeyCriterion.latestRevisionModule(moduleName), SOURCE_LINKAGE);
index 69fbdeb400644f45a7bedc3c28163f9b23907f15..020c00981df1528f059e083c7c8dd3def228a2c1 100644 (file)
@@ -18,8 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
@@ -35,7 +33,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Infere
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceParserNamespaces;
@@ -59,9 +56,9 @@ public final class BelongsToStatementSupport
             final Mutable<Unqualified, BelongsToStatement, BelongsToEffectiveStatement> belongsToCtx) {
         ModelActionBuilder belongsToAction = belongsToCtx.newInferenceAction(ModelProcessingPhase.SOURCE_LINKAGE);
 
-        final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> belongsToPrereq =
-            belongsToAction.requiresCtx(belongsToCtx, SourceParserNamespaces.MODULE_FOR_BELONGSTO,
-                belongsToCtx.getArgument(), ModelProcessingPhase.SOURCE_LINKAGE);
+        final var belongsToPrereq = belongsToAction.requiresCtx(belongsToCtx,
+            SourceParserNamespaces.MODULE_FOR_BELONGSTO, belongsToCtx.getArgument(),
+            ModelProcessingPhase.SOURCE_LINKAGE);
 
         belongsToAction.apply(new InferenceAction() {
             @Override
index a7c38abc7dd97cd89e28c362b44cf3d9652c4999..d95ffc94c514ae4afac5f52881752da670f0cc5a 100644 (file)
@@ -86,7 +86,8 @@ public final class IncludeStatementSupport
         final StmtContext<Revision, ?, ?> revision = findFirstDeclaredSubstatement(stmt, RevisionDateStatement.class);
 
         final ModelActionBuilder includeAction = stmt.newInferenceAction(SOURCE_LINKAGE);
-        final Prerequisite<StmtContext<?, SubmoduleStatement, SubmoduleEffectiveStatement>> requiresCtxPrerequisite;
+        final Prerequisite<StmtContext<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement>>
+            requiresCtxPrerequisite;
         if (revision == null) {
             requiresCtxPrerequisite = includeAction.requiresCtx(stmt, ParserNamespaces.SUBMODULE,
                 NamespaceKeyCriterion.latestRevisionModule(submoduleName), SOURCE_LINKAGE);
index d3d9e7d3cdf921dc2a2501581cd2d77ba5bcffb4..0ce63172232d42e5848922fc33d68b672195628a 100644 (file)
@@ -33,7 +33,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveSt
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
@@ -152,8 +151,8 @@ abstract class AbstractTypeStatementSupport extends AbstractTypeSupport<TypeStat
         }
 
         final ModelActionBuilder typeAction = stmt.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
-        final Prerequisite<StmtContext<?, TypedefStatement, TypedefEffectiveStatement>> typePrereq =
-            typeAction.requiresCtx(stmt, ParserNamespaces.TYPE, typeQName, ModelProcessingPhase.EFFECTIVE_MODEL);
+        final var typePrereq = typeAction.requiresCtx(stmt, ParserNamespaces.TYPE, typeQName,
+            ModelProcessingPhase.EFFECTIVE_MODEL);
         typeAction.mutatesEffectiveCtx(stmt.getParentContext());
 
         /*
index 15f547ce7b0539f31b4128d62f7e57989ff1e5d8..349254ce89cd6425e834b7801686a80562a1e4be 100644 (file)
@@ -29,8 +29,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
@@ -101,8 +99,7 @@ public final class UsesStatementSupport
         final ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
         final QName groupingName = usesNode.argument();
 
-        final Prerequisite<StmtContext<?, GroupingStatement, GroupingEffectiveStatement>> sourceGroupingPre =
-            usesAction.requiresCtx(usesNode, ParserNamespaces.GROUPING, groupingName,
+        final var sourceGroupingPre = usesAction.requiresCtx(usesNode, ParserNamespaces.GROUPING, groupingName,
                 ModelProcessingPhase.EFFECTIVE_MODEL);
         final Prerequisite<? extends Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesEffectiveCtx(
             usesNode.getParentContext());
index 6de878081fbf8e04cef42f5806983a8cde61735f..d6a0b59f3b31d41bd3e6f4a0b09eed703ee153a9 100644 (file)
@@ -38,8 +38,9 @@ public final class ParserNamespaces {
      * identifier namespace, where each extension is identified by a QName formed from the defining module's QNameModule
      * and the identifier specified in extension statement's argument.
      */
-    public static final @NonNull ParserNamespace<QName, StmtContext<?, ExtensionStatement, ExtensionEffectiveStatement>>
-        EXTENSION = new ParserNamespace<>("extension");
+    public static final @NonNull ParserNamespace<QName,
+        StmtContext<QName, ExtensionStatement, ExtensionEffectiveStatement>> EXTENSION =
+        new ParserNamespace<>("extension");
 
     /**
      * Feature namespace. All feature names defined in a module and its submodules share the same feature identifier
@@ -47,7 +48,7 @@ public final class ParserNamespaces {
      * name.
      */
     public static final @NonNull ParserNamespace<QName,
-        StmtContext<?, FeatureStatement, FeatureEffectiveStatement>> FEATURE = new ParserNamespace<>("feature");
+        StmtContext<QName, FeatureStatement, FeatureEffectiveStatement>> FEATURE = new ParserNamespace<>("feature");
 
     /**
      * Grouping namespace. * All grouping names defined within a parent node or at the top level of the module
@@ -58,27 +59,28 @@ public final class ParserNamespaces {
      * This means that any descendant node may use that grouping, and it MUST NOT define a grouping with the same name.
      */
     public static final @NonNull ParserNamespace<QName,
-        StmtContext<?, GroupingStatement, GroupingEffectiveStatement>> GROUPING = new ParserNamespace<>("grouping");
+        StmtContext<QName, GroupingStatement, GroupingEffectiveStatement>> GROUPING = new ParserNamespace<>("grouping");
 
     /**
      * Identity namespace. All identity names defined in a module and its submodules share the same identity identifier
      * namespace.
      */
     public static final @NonNull ParserNamespace<QName,
-        StmtContext<?, IdentityStatement, IdentityEffectiveStatement>> IDENTITY = new ParserNamespace<>("identity");
+        StmtContext<QName, IdentityStatement, IdentityEffectiveStatement>> IDENTITY = new ParserNamespace<>("identity");
 
     /**
      * Module namespace. All modules known to the reactor are populated to this namespace. Each module is identified
      * by a {@link SourceIdentifier}.
      */
     public static final @NonNull ParserNamespace<SourceIdentifier,
-        StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> MODULE = new ParserNamespace<>("module");
+        StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> MODULE = new ParserNamespace<>("module");
 
     /**
      * Submodule equivalent of {@link #MODULE}.
      */
     public static final @NonNull ParserNamespace<SourceIdentifier,
-        StmtContext<?, SubmoduleStatement, SubmoduleEffectiveStatement>> SUBMODULE = new ParserNamespace<>("submodule");
+        StmtContext<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement>> SUBMODULE =
+        new ParserNamespace<>("submodule");
 
     /**
      * Derived types namespace. All derived type names defined within a parent node or at the top level of the module
@@ -93,20 +95,22 @@ public final class ParserNamespaces {
      * (e.g. RFC6020/RFC7950 for YANG 1.0/1.1).
      */
     public static final @NonNull ParserNamespace<QName,
-        StmtContext<?, TypedefStatement, TypedefEffectiveStatement>> TYPE = new ParserNamespace<>("typedef");
+        StmtContext<QName, TypedefStatement, TypedefEffectiveStatement>> TYPE = new ParserNamespace<>("typedef");
 
     /**
      * A derived namespace allowing lookup of modules based on their {@link QNameModule}.
      */
-    public static final @NonNull ParserNamespace<QNameModule, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
-        NAMESPACE_TO_MODULE = new ParserNamespace<>("namespace-to-module");
+    public static final @NonNull ParserNamespace<QNameModule,
+        StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> NAMESPACE_TO_MODULE =
+        new ParserNamespace<>("namespace-to-module");
 
     /**
      * Intermediate-stage namespace equivalent to {@link #MODULE} except it is keyed by module names. This namespace is
      * used to resolve inter-module references before actual linkage occurs.
      */
-    public static final @NonNull ParserNamespace<Unqualified, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
-        PRELINKAGE_MODULE = new ParserNamespace<>("prelinkage-module");
+    public static final @NonNull ParserNamespace<Unqualified,
+        StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> PRELINKAGE_MODULE =
+        new ParserNamespace<>("prelinkage-module");
 
     private ParserNamespaces() {
         // Hidden on purpose
index 6d2a5aa789697c687199c6553f93ba215e4015db..1487c91e5b39b6ba3fde19acf127eb5d7f5fe873 100644 (file)
@@ -175,9 +175,8 @@ public interface ModelActionBuilder {
     <K, C extends StmtContext<?, ?, ?>> @NonNull Prerequisite<C> requiresCtx(StmtContext<?, ?, ?> context,
         @NonNull ParserNamespace<K, C> namespace, NamespaceKeyCriterion<K> criterion, ModelProcessingPhase phase);
 
-    <K, E extends EffectiveStatement<?, ?>> @NonNull Prerequisite<StmtContext<?, ?, E>> requiresCtxPath(
-        StmtContext<?, ?, ?> context, ParserNamespace<K, ? extends StmtContext<?, ?, ?>> namespace, Iterable<K> keys,
-            ModelProcessingPhase phase);
+    <K, C extends StmtContext<?, ?, ?>> @NonNull Prerequisite<C> requiresCtxPath(StmtContext<?, ?, ?> context,
+        ParserNamespace<K, C> namespace, Iterable<K> keys, ModelProcessingPhase phase);
 
     /**
      * Action mutates the effective model of specified statement. This is a shorthand for
index 26a4a89635b4d1760221c86291348b45f1b551d0..f53ca549e97db3a69a742a327391ed0c039b126f 100644 (file)
@@ -264,9 +264,8 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
          * @param stmt
          *            to be added to namespace map
          */
-        // FIXME: cleanup the capture here: we really want to capture 'StmtContext<?, Y, Z>'
-        <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
-            @NonNull ParserNamespace<K, StmtContext<?, Y, Z>> namespace, KT key, StmtContext<?, Y, Z> stmt);
+        <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+            @NonNull ParserNamespace<K, ? super C> namespace, KT key, C stmt);
 
         /**
          * Set version of root statement context.
index 6ddc9fd9a09ae793d9f156986450702d25cae692..1780f27156a84cd5845dc69886d0359fce5c46aa 100644 (file)
@@ -46,8 +46,9 @@ public final class SourceParserNamespaces {
      * plain name.
      */
     // FIXME: Better name?
-    public static final @NonNull ParserNamespace<Unqualified, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
-        MODULE_FOR_BELONGSTO = new ParserNamespace<>("module-belongsto");
+    public static final @NonNull ParserNamespace<Unqualified,
+        StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> MODULE_FOR_BELONGSTO =
+        new ParserNamespace<>("module-belongsto");
 
     /**
      * Pre-linkage source-specific mapping of prefixes to module namespaces.
@@ -88,7 +89,7 @@ public final class SourceParserNamespaces {
     /**
      * Global mapping of modules to QNameModules.
      */
-    public static final @NonNull ParserNamespace<StmtContext<?,?,?>, QNameModule> MODULECTX_TO_QNAME =
+    public static final @NonNull ParserNamespace<StmtContext<?, ?, ?>, QNameModule> MODULECTX_TO_QNAME =
         new ParserNamespace<>("modulectx-to-qnamemodule");
 
     public static final @NonNull ParserNamespace<Empty, Set<QName>> SUPPORTED_FEATURES =