Do not access TypeNamespace during build 73/94073/2
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 5 Dec 2020 13:31:04 +0000 (14:31 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 5 Dec 2020 14:30:15 +0000 (15:30 +0100)
Rather than accessing TypeNamespace use a statement-local namespace
to store the reference to the type (which we ignored so far). This
allows us to wipe TypeNamespace when RootStatementContext is done.

JIRA: YANGTOOLS-1198
Change-Id: I017673ae6314f86ea4e9562a5072a7e7b2865649
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BaseTypeNamespace.java [new file with mode: 0644]

index a6e9743f8b2156cabf4804a70ef4053800cb1477..1869d6213b3d18be51bb5b1707da37735cf86843 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
@@ -55,9 +56,8 @@ public final class RootStatementContext<A, D extends DeclaredStatement<A>, E ext
     // These namespaces are well-known and not needed after the root is cleaned up
     private static final Map<Class<?>, SweptNamespace> SWEPT_NAMESPACES = ImmutableMap.of(
         GroupingNamespace.class, new SweptNamespace(GroupingNamespace.class),
-        // FIXME: YANGTOOLS-1198: sweep TypeNamespace
-        // TypeNamespace.class, new SweptNamespace(TypeNamespace.class),
-        SchemaTreeNamespace.class, new SweptNamespace(SchemaTreeNamespace.class));
+        SchemaTreeNamespace.class, new SweptNamespace(SchemaTreeNamespace.class),
+        TypeNamespace.class, new SweptNamespace(TypeNamespace.class));
 
     private final @NonNull SourceSpecificContext sourceContext;
     private final A argument;
index 049e9e1017729164b3b13c8e525b21799e9891f2..8f428251662e42353be528582d0dd51fd52567ce 100644 (file)
@@ -103,6 +103,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc.RpcStatementRFC79
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.status.StatusStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleStatementRFC6020Support;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleStatementRFC7950Support;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type.BaseTypeNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type.TypeStatementRFC6020Support;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type.TypeStatementRFC7950Support;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.typedef.TypedefStatementSupport;
@@ -229,6 +230,7 @@ public final class RFC7950Reactors {
             .addSupport(IdentityNamespace.BEHAVIOUR)
             .addSupport(DefaultStatementSupport.getInstance())
             .addSupport(StatusStatementSupport.getInstance())
+            .addSupport(BaseTypeNamespace.BEHAVIOUR)
             .addVersionSpecificSupport(VERSION_1, TypeStatementRFC6020Support.getInstance())
             .addVersionSpecificSupport(VERSION_1_1, TypeStatementRFC7950Support.getInstance())
             .addSupport(UnitsStatementSupport.getInstance())
index 336c268218603dd28bc9bd1eabd45211128dd1be..2637518739f31c850c7704a52817af207ef626b6 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.collect.ImmutableMap;
 import java.math.BigDecimal;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -30,7 +31,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;
@@ -169,6 +169,8 @@ abstract class AbstractTypeStatementSupport
 
         // if it is yang built-in type, no prerequisite is needed, so simply return
         if (BUILT_IN_TYPES.containsKey(stmt.argument())) {
+            // FIXME: consider populating BaseTypeNamespace here, which could be done quite efficiently, moving the
+            //        logic from resolveType()
             return;
         }
 
@@ -179,13 +181,13 @@ abstract class AbstractTypeStatementSupport
         typeAction.mutatesEffectiveCtx(stmt.getParentContext());
 
         /*
-         * If the type does not exist, throw new InferenceException.
-         * Otherwise perform no operation.
+         * If the type does not exist, throw an InferenceException.
+         * If the type exists, store a reference to it in BaseTypeNamespace.
          */
         typeAction.apply(new InferenceAction() {
             @Override
             public void apply(final InferenceContext ctx) {
-                // Intentional NOOP
+                stmt.addToNs(BaseTypeNamespace.class, Empty.getInstance(), typePrereq.resolve(ctx));
             }
 
             @Override
@@ -310,6 +312,11 @@ abstract class AbstractTypeStatementSupport
      * @throws SourceException if the target type cannot be found
      */
     private static @NonNull TypeEffectiveStatement<TypeStatement> resolveType(final Current<String, ?> ctx) {
+        final StmtContext<?, ?, ?> baseType = ctx.namespaceItem(BaseTypeNamespace.class, Empty.getInstance());
+        if (baseType != null) {
+            return ((TypedefEffectiveStatement) baseType.buildEffective()).asTypeEffectiveStatement();
+        }
+
         final String argument = ctx.getArgument();
         switch (argument) {
             case BINARY:
@@ -339,12 +346,7 @@ abstract class AbstractTypeStatementSupport
             case UINT64:
                 return BuiltinEffectiveStatement.UINT64;
             default:
-                // FIXME: YANGTOOLS-1198: this lookup needs to be done during inference and a replica needs to be
-                //                        stored in a local namespace.
-                final QName qname = StmtContextUtils.parseNodeIdentifier(ctx.caerbannog(), argument);
-                final StmtContext<?, TypedefStatement, TypedefEffectiveStatement> typedef = SourceException.throwIfNull(
-                    ctx.getFromNamespace(TypeNamespace.class, qname), ctx, "Type '%s' not found", qname);
-                return typedef.buildEffective().asTypeEffectiveStatement();
+                throw new IllegalStateException("Unhandled type argument " + argument);
         }
     }
 
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BaseTypeNamespace.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BaseTypeNamespace.java
new file mode 100644 (file)
index 0000000..3f1cea4
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.common.Empty;
+import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+@Beta
+public interface BaseTypeNamespace extends IdentifierNamespace<Empty, StmtContext<?, ?, ?>> {
+    NamespaceBehaviour<Empty, StmtContext<?, ?, ?>, @NonNull BaseTypeNamespace> BEHAVIOUR =
+        NamespaceBehaviour.statementLocal(BaseTypeNamespace.class);
+}