Search effective statements instaead of StmtContexts 73/93973/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 30 Nov 2020 07:50:33 +0000 (08:50 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 30 Nov 2020 09:34:37 +0000 (10:34 +0100)
When we are searching for the appropriate namespace/prefix, we want
to be referring to the effective statements we have at hand rather
than dropping back to StmtContext.

JIRA: YANGTOOLS-1186
Change-Id: Ic2c3c94498ef11f807a56e3dd533b31c28c97f26
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/submodule/SubmoduleEffectiveStatementImpl.java

index ab8532d9e0e65a86fa1917ff9a08ad94256d0bc4..b6c285161d80a7720c3dcaefe2ce551a2bb577d2 100644 (file)
@@ -47,7 +47,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat;
@@ -55,9 +54,9 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffec
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
 
 @Beta
 public abstract class AbstractEffectiveModule<D extends DeclaredStatement<UnqualifiedQName>,
@@ -214,11 +213,13 @@ public abstract class AbstractEffectiveModule<D extends DeclaredStatement<Unqual
                 .toString();
     }
 
-    protected static final @NonNull String findPrefix(final StmtContext<?, ?, ?> stmt, final String type,
-            final String name) {
-        return SourceException.throwIfNull(
-            StmtContextUtils.firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class),
-            stmt.sourceReference(), "Unable to resolve prefix for %s %s.", type, name);
+    protected static final @NonNull String findPrefix(final StatementSourceReference ref,
+            final Collection<? extends EffectiveStatement<?, ?>> substatements, final String type, final String name) {
+        return substatements.stream()
+            .filter(PrefixEffectiveStatement.class::isInstance)
+            .map(prefix -> ((PrefixEffectiveStatement) prefix).argument())
+            .findAny()
+            .orElseThrow(() -> new SourceException(ref, "Unable to resolve prefix for %s %s.", type, name));
     }
 
     // Alright. this is quite ugly
index 90af24d2068b15946edbe5af48e2a7f1c9f61925..72c80f175e56ae8cf2c40aad8a71d8c85b471222 100644 (file)
@@ -61,7 +61,7 @@ final class ModuleEffectiveStatementImpl extends AbstractEffectiveModule<ModuleS
     ModuleEffectiveStatementImpl(final Current<UnqualifiedQName, ModuleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
             final Collection<? extends Submodule> submodules) {
-        super(stmt, substatements, findPrefix(stmt.caerbannog(), "module", stmt.getRawArgument()));
+        super(stmt, substatements, findPrefix(stmt.sourceReference(), substatements, "module", stmt.getRawArgument()));
 
         qnameModule = verifyNotNull(stmt.getFromNamespace(ModuleCtxToModuleQName.class, stmt.caerbannog()));
         this.submodules = ImmutableList.copyOf(submodules);
index ae2a0453d12c37caaafb85c3e036e6ddb9fb4521..fb8fc62443be4699c96bcbb63dd705054c7b3224 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule;
 
 import static com.google.common.base.Preconditions.checkState;
-import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -29,7 +28,7 @@ import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
 import org.opendaylight.yangtools.yang.model.api.Submodule;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
-import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement.PrefixToEffectiveModuleNamespace;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement.QNameModuleToPrefixNamespace;
@@ -37,11 +36,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveModule;
+import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
 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.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToModuleCtx;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
@@ -59,10 +58,10 @@ final class SubmoduleEffectiveStatementImpl
 
     SubmoduleEffectiveStatementImpl(final Current<UnqualifiedQName, SubmoduleStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        super(stmt, substatements, findSubmodulePrefix(stmt.caerbannog()));
+        super(stmt, substatements, findSubmodulePrefix(stmt, substatements));
 
         final QNameModule belongsToModuleQName = stmt.getFromNamespace(ModuleNameToModuleQName.class,
-            firstAttributeOf(stmt.caerbannog().declaredSubstatements(), BelongsToStatement.class));
+            findBelongsTo(stmt, substatements).argument());
 
         final Builder<String, ModuleEffectiveStatement> prefixToModuleBuilder = ImmutableMap.builder();
         appendPrefixes(stmt, prefixToModuleBuilder);
@@ -146,11 +145,19 @@ final class SubmoduleEffectiveStatementImpl
         }
     }
 
-    private static @NonNull String findSubmodulePrefix(final StmtContext<UnqualifiedQName, ?, ?> ctx) {
-        final String name = ctx.getRawArgument();
-        final StmtContext<?, ?, ?> belongsTo = SourceException.throwIfNull(
-            StmtContextUtils.findFirstDeclaredSubstatement(ctx, BelongsToStatement.class), ctx.sourceReference(),
-            "Unable to find belongs-to statement in submodule %s.", name);
-        return findPrefix(belongsTo, "submodule", name);
+    private static @NonNull BelongsToEffectiveStatement findBelongsTo(final CommonStmtCtx stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.stream()
+            .filter(BelongsToEffectiveStatement.class::isInstance)
+            .map(BelongsToEffectiveStatement.class::cast)
+            .findAny().orElseThrow(() -> new SourceException(stmt.sourceReference(),
+                "Unable to find belongs-to statement in submodule %s.", stmt.rawArgument()));
+    }
+
+    private static @NonNull String findSubmodulePrefix(final CommonStmtCtx stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        final String name = stmt.getRawArgument();
+        final BelongsToEffectiveStatement belongsTo = findBelongsTo(stmt, substatements);
+        return findPrefix(stmt.sourceReference(), belongsTo.effectiveSubstatements(), "submodule", name);
     }
 }