Move implicit parent skip code 95/98995/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 14 Dec 2021 21:41:44 +0000 (22:41 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 14 Dec 2021 21:52:19 +0000 (22:52 +0100)
We have an implicit contract between AbstractResumedStatement and
StatementContextWriter during lookup. Since the structure is defined
in AbstractResumedStatement, we should keep the logic together.

Also fix a slight wart, where we would over-allocate implicit parent's
StatementMap.

JIRA: YANGTOOLS-1383
Change-Id: I167e13015d4fb8d348db140702af89ae005e1077
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextWriter.java

index 89df4c0852eca9126ef55db136316b94a9b28398..9346f701eecad291f2a5f042572d26f0d4b6f586 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
@@ -20,6 +21,7 @@ import org.eclipse.jdt.annotation.Nullable;
 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.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
@@ -175,7 +177,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         final var implicitParent = definition().getImplicitParentFor(this, def.getPublicView());
         if (implicitParent.isPresent()) {
             return createImplicitParent(offset, implicitParent.orElseThrow(), ref, argument)
-                .createSubstatement(offset, def, ref, argument);
+                .createSubstatement(0, def, ref, argument);
         }
 
         final AbstractResumedStatement<X, Y, Z> ret = new SubstatementContext<>(this, def, ref, argument);
@@ -246,7 +248,13 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
      * @return Substatement, or null if substatement does not exist.
      */
     final AbstractResumedStatement<?, ?, ?> lookupSubstatement(final int offset) {
-        return substatements.get(offset);
+        var ret = substatements.get(offset);
+        if (ret != null) {
+            while (ret.origin() == StatementOrigin.CONTEXT) {
+                ret = verifyNotNull(ret.substatements.get(0));
+            }
+        }
+        return ret;
     }
 
     final void resizeSubstatements(final int expectedSize) {
@@ -263,7 +271,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
 
     private AbstractResumedStatement<?, ?, ?> createImplicitParent(final int offset,
             final StatementSupport<?, ?, ?> implicitParent, final StatementSourceReference ref, final String argument) {
-        final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(implicitParent);
-        return createSubstatement(offset, def, ImplicitSubstatement.of(ref), argument);
+        return createSubstatement(offset, new StatementDefinitionContext<>(implicitParent),
+            ImplicitSubstatement.of(ref), argument);
     }
 }
index 940e47f8f5365fbf93cb478eab8a51e97e9dbb31..29a794a32f30dc5fe4c3758982a517696e78026b 100644 (file)
@@ -102,16 +102,6 @@ final class StatementContextWriter implements StatementWriter {
 
     private static @Nullable AbstractResumedStatement<?, ?, ?> lookupDeclaredChild(
             final AbstractResumedStatement<?, ?, ?> current, final int childId) {
-        if (current == null) {
-            return null;
-        }
-
-        // Fast path: we are entering a statement which was emitted in previous phase
-        AbstractResumedStatement<?, ?, ?> existing = current.lookupSubstatement(childId);
-        while (existing != null && StatementOrigin.CONTEXT == existing.origin()) {
-            existing = existing.lookupSubstatement(childId);
-        }
-
-        return existing;
+        return current == null ? null : current.lookupSubstatement(childId);
     }
 }