From: Robert Varga Date: Mon, 27 Jan 2020 20:16:55 +0000 (+0100) Subject: Make declared statement inheritance a StatementContextBase property X-Git-Tag: v5.0.0~189 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=af62dc4257be32f92c6e8506fa8dabfe8a9976cd;p=yangtools.git Make declared statement inheritance a StatementContextBase property We have inconsistencies between handling of inference-time and build-time declared statements. When a declared statement is created in reactor, its declared view will be materialized at the statement itself, not in the original context. This means statements which are subject to (even unused!) inference will create a disconnected declared view. Statements which are not infered, will correctly reuse declared instances with their origin. Fix this by making following of getOriginalCtx() an implementation given in StatementContextBase, resulting in centralized code and consistent results. JIRA: YANGTOOLS-652 Change-Id: Id8afb814821398e416afbfc6c9e3aeeb789f94a8 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java index f6245602b2..3378efde40 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java @@ -109,6 +109,11 @@ final class InferredStatementContext, E extend return Optional.of(prototype); } + @Override + D createDeclared() { + return prototype.buildDeclared(); + } + @Override InferredStatementContext reparent(final StatementContextBase newParent) { return new InferredStatementContext<>(this, newParent); diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java index 9c02ab20fa..30da6de9d7 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java @@ -507,7 +507,11 @@ public abstract class StatementContextBase, E } checkArgument(completedPhase == ModelProcessingPhase.FULL_DECLARATION || completedPhase == ModelProcessingPhase.EFFECTIVE_MODEL); - return declaredInstance = definition.getFactory().createDeclared(this); + return declaredInstance = createDeclared(); + } + + @NonNull D createDeclared() { + return definition.getFactory().createDeclared(this); } @Override diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseQNameStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseQNameStatementSupport.java index f359a485d2..d03945d75f 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseQNameStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseQNameStatementSupport.java @@ -33,7 +33,7 @@ public abstract class BaseQNameStatementSupport ctx) { - final D declared = BaseStatementSupport.buildDeclared(ctx); + final D declared = ctx.buildDeclared(); final ImmutableList> substatements = BaseStatementSupport.buildEffectiveSubstatements(ctx); return substatements.isEmpty() ? createEmptyEffective(ctx, declared) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseStatementSupport.java index c7650293fc..97f64a9975 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseStatementSupport.java @@ -7,8 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; -import static com.google.common.base.Verify.verifyNotNull; - import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; import java.util.ArrayList; @@ -53,7 +51,7 @@ public abstract class BaseStatementSupport, @Override public final E createEffective(final StmtContext ctx) { - final D declared = buildDeclared(ctx); + final D declared = ctx.buildDeclared(); final ImmutableList> substatements = buildEffectiveSubstatements(ctx); return substatements.isEmpty() ? createEmptyEffective(ctx, declared) : createEffective(ctx, declared, substatements); @@ -80,17 +78,6 @@ public abstract class BaseStatementSupport, return stmt != null ? stmt.argument() : defValue; } - static final > @NonNull D buildDeclared(final StmtContext ctx) { - /* - * Share original instance of declared statement between all effective - * statements which have been copied or derived from this original - * declared statement. - */ - @SuppressWarnings("unchecked") - final StmtContext lookupCtx = (StmtContext) ctx.getOriginalCtx().orElse(ctx); - return verifyNotNull(lookupCtx.buildDeclared(), "Statement %s failed to build declared statement", lookupCtx); - } - /** * Create a set of substatements. This method is split out so it can be overridden in * ExtensionEffectiveStatementImpl to leak a not-fully-initialized instance. diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/DeclaredEffectiveStatementBase.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/DeclaredEffectiveStatementBase.java index 859e09d835..fad96f27a7 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/DeclaredEffectiveStatementBase.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/DeclaredEffectiveStatementBase.java @@ -30,7 +30,7 @@ public abstract class DeclaredEffectiveStatementBase