X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=parser%2Fyang-parser-reactor%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Freactor%2FReactorStmtCtx.java;h=724bbf486fc7c71b1fd36fa2a6d4fd72f5c74276;hb=refs%2Fchanges%2F44%2F102144%2F12;hp=4fd73c7b94619a8e93f91241222f4774313d2e44;hpb=5747f2b4226c16696469d5098a34e92cd29ee0f1;p=yangtools.git diff --git a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java index 4fd73c7b94..724bbf486f 100644 --- a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java +++ b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java @@ -17,6 +17,7 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Stream; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.Empty; @@ -42,11 +43,12 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.ExecutionOrder; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry; import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory; 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.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceParserNamespaces; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -190,10 +192,10 @@ abstract class ReactorStmtCtx, E extends Effec public abstract RootStatementContext getRoot(); @Override - public abstract Collection> mutableDeclaredSubstatements(); + public abstract Collection> mutableDeclaredSubstatements(); @Override - public final @NonNull Registry getBehaviourRegistry() { + public final Registry getBehaviourRegistry() { return getRoot().getBehaviourRegistryImpl(); } @@ -234,14 +236,8 @@ abstract class ReactorStmtCtx, E extends Effec @Override public final QName moduleName() { - final RootStatementContext root = getRoot(); - return QName.create(StmtContextUtils.getRootModuleQName(root), root.getRawArgument()); - } - - @Override - @Deprecated(since = "7.0.9", forRemoval = true) - public final EffectiveStatement original() { - return getOriginalCtx().map(StmtContext::buildEffective).orElse(null); + final var root = getRoot(); + return QName.create(StmtContextUtils.getModuleQName(root), root.getRawArgument()); } // @@ -298,22 +294,17 @@ abstract class ReactorStmtCtx, E extends Effec } protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper.add("definition", definition()).add("rawArgument", rawArgument()) - .add("refCount", refString()); + return toStringHelper.add("definition", definition()).add("argument", argument()).add("refCount", refString()); } private String refString() { final int current = refcount; - switch (current) { - case REFCOUNT_DEFUNCT: - return "DEFUNCT"; - case REFCOUNT_SWEEPING: - return "SWEEPING"; - case REFCOUNT_SWEPT: - return "SWEPT"; - default: - return String.valueOf(refcount); - } + return switch (current) { + case REFCOUNT_DEFUNCT -> "DEFUNCT"; + case REFCOUNT_SWEEPING -> "SWEEPING"; + case REFCOUNT_SWEPT -> "SWEPT"; + default -> String.valueOf(refcount); + }; } /** @@ -330,24 +321,23 @@ abstract class ReactorStmtCtx, E extends Effec // @Override - public final > V namespaceItem(final Class<@NonNull N> type, + public final > V namespaceItem(final @NonNull N type, final T key) { return getBehaviourRegistry().getNamespaceBehaviour(type).getFrom(this, key); } @Override - public final > Map namespace(final Class<@NonNull N> type) { + public final > Map namespace(final @NonNull N type) { return getNamespace(type); } @Override - public final > - Map localNamespacePortion(final Class<@NonNull N> type) { + public final > Map localNamespacePortion(final @NonNull N type) { return getLocalNamespace(type); } @Override - protected > void onNamespaceElementAdded(final Class type, final K key, + protected > void onNamespaceElementAdded(final N type, final K key, final V value) { // definition().onNamespaceElementAdded(this, type, key, value); } @@ -369,9 +359,11 @@ abstract class ReactorStmtCtx, E extends Effec QNameModule targetModule); @Override - public final ReactorStmtCtx replicaAsChildOf(final Mutable parent) { + public final ReplicaStatementContext replicaAsChildOf(final Mutable parent) { checkArgument(parent instanceof StatementContextBase, "Unsupported parent %s", parent); - return replicaAsChildOf((StatementContextBase) parent); + final var ret = replicaAsChildOf((StatementContextBase) parent); + definition().onStatementAdded(ret); + return ret; } abstract @NonNull ReplicaStatementContext replicaAsChildOf(@NonNull StatementContextBase parent); @@ -389,12 +381,6 @@ abstract class ReactorStmtCtx, E extends Effec } private @NonNull E loadEffective() { - // Creating an effective statement does not strictly require a declared instance -- there are statements like - // 'input', which are implicitly defined. - // Our implementation design makes an invariant assumption that buildDeclared() has been called by the time - // we attempt to create effective statement: - declared(); - final E ret = createEffective(); effectiveInstance = ret; // we have called createEffective(), substatements are no longer guarded by us. Let's see if we can clear up @@ -407,6 +393,20 @@ abstract class ReactorStmtCtx, E extends Effec abstract @NonNull E createEffective(); + /** + * Routing of the request to build an effective statement from {@link InferredStatementContext} towards the original + * definition site. This is needed to pick the correct instantiation method: for declared statements we will + * eventually land in {@link AbstractResumedStatement}, for underclared statements that will be + * {@link UndeclaredStmtCtx}. + * + * @param factory Statement factory + * @param ctx Inferred statement context, i.e. where the effective statement is instantiated + * @return Built effective stateue + */ + abstract @NonNull E createInferredEffective(@NonNull StatementFactory factory, + @NonNull InferredStatementContext ctx, Stream> declared, + Stream> effective); + /** * Attach an effective copy of this statement. This essentially acts as a map, where we make a few assumptions: *
    @@ -467,8 +467,9 @@ abstract class ReactorStmtCtx, E extends Effec // // + // Non-final form ImplicitStmtCtx @Override - public final boolean isSupportedToBuildEffective() { + public boolean isSupportedToBuildEffective() { return isSupportedToBuildEffective; } @@ -493,7 +494,8 @@ abstract class ReactorStmtCtx, E extends Effec */ if (isParentSupportedByFeatures()) { // If the set of supported features has not been provided, all features are supported by default. - final Set supportedFeatures = getFromNamespace(SupportedFeaturesNamespace.class, Empty.value()); + final Set supportedFeatures = getFromNamespace(SourceParserNamespaces.SUPPORTED_FEATURES, + Empty.value()); if (supportedFeatures == null || StmtContextUtils.checkFeatureSupport(this, supportedFeatures)) { flags |= SET_SUPPORTED_BY_FEATURES; return true; @@ -651,17 +653,17 @@ abstract class ReactorStmtCtx, E extends Effec } final Object argument = argument(); - if (argument instanceof QName) { - return ((QName) argument).getModule(); + if (argument instanceof QName qname) { + return qname.getModule(); } - if (argument instanceof String) { + if (argument instanceof String str) { // FIXME: This may yield illegal argument exceptions - return StmtContextUtils.qnameFromArgument(getOriginalCtx().orElse(this), (String) argument).getModule(); + return StmtContextUtils.qnameFromArgument(getOriginalCtx().orElse(this), str).getModule(); } - if (argument instanceof SchemaNodeIdentifier + if (argument instanceof SchemaNodeIdentifier sni && (producesDeclared(AugmentStatement.class) || producesDeclared(RefineStatement.class) || producesDeclared(DeviationStatement.class))) { - return ((SchemaNodeIdentifier) argument).lastNodeIdentifier().getModule(); + return sni.lastNodeIdentifier().getModule(); } return coerceParent().effectiveNamespace();