Move declaredInstance out of StatementContextBase
[yangtools.git] / yang / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / AbstractResumedStatement.java
index 7c7f0db7b66b956d6d14559bd57015efe449d5bb..db3202a522806c1a98f16f6750aaed150a1ed5f9 100644 (file)
@@ -13,6 +13,7 @@ import static java.util.Objects.requireNonNull;
 import java.util.Collection;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
@@ -39,6 +40,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
     private final String rawArgument;
 
     private StatementMap substatements = StatementMap.empty();
+    private @Nullable D declaredInstance;
 
     // Copy constructor
     AbstractResumedStatement(final AbstractResumedStatement<A, D, E> original) {
@@ -46,6 +48,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         this.statementDeclSource = original.statementDeclSource;
         this.rawArgument = original.rawArgument;
         this.substatements = original.substatements;
+        this.declaredInstance = original.declaredInstance;
     }
 
     AbstractResumedStatement(final StatementDefinitionContext<A, D, E> def, final StatementSourceReference ref,
@@ -87,6 +90,18 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         return substatements.values();
     }
 
+    @Override
+    public final D buildDeclared() {
+        final D existing = declaredInstance;
+        if (existing != null) {
+            return existing;
+        }
+        final ModelProcessingPhase phase = getCompletedPhase();
+        checkState(phase == ModelProcessingPhase.FULL_DECLARATION || phase == ModelProcessingPhase.EFFECTIVE_MODEL,
+                "Cannot build declared instance after phase %s", phase);
+        return declaredInstance = definition().getFactory().createDeclared(this);
+    }
+
     @Override
     public @NonNull StatementDefinition getDefinition() {
         return getPublicDefinition();