Bug 5200: Yang parser doesn't fill error-app-tag and error-message in constraints
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / DeclaredEffectiveStatementBase.java
index 88ed942844aac749b65e860f176510569b6cc44a..212a65e8137163f6383125cadf80cbb037e8375f 100644 (file)
@@ -12,10 +12,13 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
 
-public abstract class DeclaredEffectiveStatementBase<A, D extends DeclaredStatement<A>>
-        extends EffectiveStatementBase<A, D> {
+public abstract class DeclaredEffectiveStatementBase<A, D extends DeclaredStatement<A>> extends
+        EffectiveStatementBase<A, D> {
 
+    private final StatementSource statementSource;
+    private final A argument;
     private final D declaredInstance;
 
     public DeclaredEffectiveStatementBase(final StmtContext<A, D, ?> ctx) {
@@ -34,8 +37,21 @@ public abstract class DeclaredEffectiveStatementBase<A, D extends DeclaredStatem
      *            method of EffectiveStatementBase class. The main purpose of
      *            this is to allow the build of recursive extension definitions.
      */
-    protected DeclaredEffectiveStatementBase(final StmtContext<A, D, ?> ctx, boolean buildUnknownSubstatements) {
+    protected DeclaredEffectiveStatementBase(StmtContext<A, D, ?> ctx, final boolean buildUnknownSubstatements) {
         super(ctx, buildUnknownSubstatements);
+
+        this.argument = ctx.getStatementArgument();
+        this.statementSource = ctx.getStatementSource();
+
+        /*
+         * Share original instance of declared statement between all effective
+         * statements which have been copied or derived from this original
+         * declared statement.
+         */
+        StatementContextBase<A, D, ?> originalCtx = (StatementContextBase<A, D, ?>) ctx.getOriginalCtx();
+        if (originalCtx != null) {
+            ctx = originalCtx;
+        }
         declaredInstance = Verify.verifyNotNull(ctx.buildDeclared(), "Statement %s failed to build declared statement",
                 ctx);
     }
@@ -46,17 +62,17 @@ public abstract class DeclaredEffectiveStatementBase<A, D extends DeclaredStatem
     }
 
     @Override
-    public final A argument() {
-        return declaredInstance.argument();
+    public A argument() {
+        return argument;
     }
 
     @Override
     public final StatementSource getStatementSource() {
-        return declaredInstance.getStatementSource();
+        return statementSource;
     }
 
     @Override
     public final D getDeclared() {
         return declaredInstance;
     }
-}
+}
\ No newline at end of file