From: Robert Varga Date: Sat, 5 Dec 2020 13:31:04 +0000 (+0100) Subject: Do not access TypeNamespace during build X-Git-Tag: v7.0.0~369 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=e83f373de212e0fb3771191866ebe259f1a974e7;p=yangtools.git Do not access TypeNamespace during build 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 --- diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java index a6e9743f8b..1869d6213b 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java @@ -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, E ext // These namespaces are well-known and not needed after the root is cleaned up private static final Map, 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; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java index 049e9e1017..8f42825166 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java @@ -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()) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java index 336c268218..2637518739 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java @@ -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 resolveType(final Current 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 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 index 0000000000..3f1cea4440 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BaseTypeNamespace.java @@ -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> { + NamespaceBehaviour, @NonNull BaseTypeNamespace> BEHAVIOUR = + NamespaceBehaviour.statementLocal(BaseTypeNamespace.class); +}