Modified construction of built-in yang types.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / parser / impl / YangParserListenerImpl.java
index 46265529daddb5897c4695017885cb2232b54433..d7394e62291db2ca98e6be896cc551a4b800e08e 100644 (file)
@@ -58,6 +58,8 @@ import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.util.YangTypesConverter;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.AnyXmlBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ChoiceBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ChoiceCaseBuilder;
@@ -72,7 +74,7 @@ import org.opendaylight.controller.yang.parser.builder.impl.ListSchemaNodeBuilde
 import org.opendaylight.controller.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.NotificationBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.RpcDefinitionBuilder;
-import org.opendaylight.controller.yang.parser.builder.impl.TypedefBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.UnionTypeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.util.RefineHolder;
 import org.slf4j.Logger;
@@ -239,6 +241,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String augmentPath = stringFromNode(ctx);
         AugmentationSchemaBuilder builder = moduleBuilder.addAugment(
                 augmentPath, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(augmentPath);
 
         for (int i = 0; i < ctx.getChildCount(); i++) {
@@ -263,6 +266,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitAugment_stmt(YangParser.Augment_stmtContext ctx) {
         final String augment = actualPath.pop();
         logger.debug("exiting augment " + augment);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -292,8 +296,9 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String typedefName = stringFromNode(ctx);
         QName typedefQName = new QName(namespace, revision, yangModelPrefix,
                 typedefName);
-        TypedefBuilder builder = moduleBuilder.addTypedef(typedefQName,
+        TypeDefinitionBuilder builder = moduleBuilder.addTypedef(typedefQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(typedefName);
 
         builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
@@ -306,6 +311,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitTypedef_stmt(YangParser.Typedef_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -334,8 +340,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 moduleBuilder.setType(type, actualPath);
             } else {
                 if ("union".equals(typeName)) {
-                    moduleBuilder.addUnionType(actualPath, namespace, revision,
-                            line);
+                    List<String> typePath = new ArrayList<String>(actualPath);
+                    typePath.add(typeName);
+
+                    SchemaPath p = createActualSchemaPath(typePath, namespace,
+                            revision, yangModelPrefix);
+                    UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(
+                            actualPath, namespace, revision, line);
+                    moduleBuilder.enterNode(unionBuilder);
+                    unionBuilder.setPath(p);
                 } else if ("identityref".equals(typeName)) {
                     SchemaPath path = createActualSchemaPath(actualPath,
                             namespace, revision, yangModelPrefix);
@@ -343,9 +356,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                             getIdentityrefBase(typeBody), actualPath, path,
                             line);
                 } else {
-                    List<String> typePath = new ArrayList<String>(actualPath);
-                    typePath.remove(0);
-                    type = parseTypeBody(typeName, typeBody, typePath,
+                    type = parseTypeBody(typeName, typeBody, actualPath,
                             namespace, revision, yangModelPrefix);
                     moduleBuilder.setType(type, actualPath);
                 }
@@ -382,6 +393,11 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitType_stmt(YangParser.Type_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+
+        final String typeName = stringFromNode(ctx);
+        if ("union".equals(typeName)) {
+            moduleBuilder.exitNode();
+        }
     }
 
     @Override
@@ -389,11 +405,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String groupName = stringFromNode(ctx);
         QName groupQName = new QName(namespace, revision, yangModelPrefix,
                 groupName);
-        GroupingBuilder groupBuilder = moduleBuilder.addGrouping(groupQName,
+        GroupingBuilder builder = moduleBuilder.addGrouping(groupQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath("grouping");
         updatePath(groupName);
-        parseSchemaNodeArgs(ctx, groupBuilder);
+        parseSchemaNodeArgs(ctx, builder);
     }
 
     @Override
@@ -401,6 +418,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         String actContainer = actualPath.pop();
         actContainer += "-" + actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -408,19 +426,20 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String containerName = stringFromNode(ctx);
         QName containerQName = new QName(namespace, revision, yangModelPrefix,
                 containerName);
-        ContainerSchemaNodeBuilder containerBuilder = moduleBuilder
-                .addContainerNode(containerQName, actualPath, ctx.getStart().getLine());
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(
+                containerQName, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(containerName);
 
-        containerBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, containerBuilder);
-        parseConstraints(ctx, containerBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
 
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             final ParseTree childNode = ctx.getChild(i);
             if (childNode instanceof Presence_stmtContext) {
-                containerBuilder.setPresence(true);
+                builder.setPresence(true);
                 break;
             }
         }
@@ -430,6 +449,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitContainer_stmt(Container_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -437,14 +457,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String leafName = stringFromNode(ctx);
         QName leafQName = new QName(namespace, revision, yangModelPrefix,
                 leafName);
-        LeafSchemaNodeBuilder leafBuilder = moduleBuilder.addLeafNode(
-                leafQName, actualPath, ctx.getStart().getLine());
+        LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(leafQName,
+                actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(leafName);
 
-        leafBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, leafBuilder);
-        parseConstraints(ctx, leafBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
 
         String defaultStr = null;
         String unitsStr = null;
@@ -456,21 +477,23 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 unitsStr = stringFromNode(child);
             }
         }
-        leafBuilder.setDefaultStr(defaultStr);
-        leafBuilder.setUnits(unitsStr);
+        builder.setDefaultStr(defaultStr);
+        builder.setUnits(unitsStr);
     }
 
     @Override
     public void exitLeaf_stmt(YangParser.Leaf_stmtContext ctx) {
         final String actLeaf = actualPath.pop();
         logger.debug("exiting " + actLeaf);
+        moduleBuilder.exitNode();
     }
 
     @Override
     public void enterUses_stmt(YangParser.Uses_stmtContext ctx) {
         final String groupingPathStr = stringFromNode(ctx);
-        moduleBuilder.addUsesNode(groupingPathStr, actualPath, ctx.getStart()
-                .getLine());
+        UsesNodeBuilder builder = moduleBuilder.addUsesNode(groupingPathStr,
+                actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(groupingPathStr);
     }
 
@@ -478,6 +501,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitUses_stmt(YangParser.Uses_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -485,6 +509,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         String refineString = stringFromNode(ctx);
         RefineHolder refine = parseRefine(ctx);
         moduleBuilder.addRefine(refine, actualPath);
+        moduleBuilder.enterNode(refine);
         updatePath(refineString);
     }
 
@@ -492,6 +517,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitRefine_stmt(YangParser.Refine_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -499,20 +525,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String leafListName = stringFromNode(ctx);
         QName leafListQName = new QName(namespace, revision, yangModelPrefix,
                 leafListName);
-        LeafListSchemaNodeBuilder leafListBuilder = moduleBuilder
-                .addLeafListNode(leafListQName, actualPath, ctx.getStart()
-                        .getLine());
+        LeafListSchemaNodeBuilder builder = moduleBuilder.addLeafListNode(
+                leafListQName, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(leafListName);
 
-        parseSchemaNodeArgs(ctx, leafListBuilder);
-        parseConstraints(ctx, leafListBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
 
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             final ParseTree childNode = ctx.getChild(i);
             if (childNode instanceof Ordered_by_stmtContext) {
                 final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;
                 final boolean userOrdered = parseUserOrdered(orderedBy);
-                leafListBuilder.setUserOrdered(userOrdered);
+                builder.setUserOrdered(userOrdered);
                 break;
             }
         }
@@ -522,6 +550,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitLeaf_list_stmt(YangParser.Leaf_list_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -529,14 +558,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String containerName = stringFromNode(ctx);
         QName containerQName = new QName(namespace, revision, yangModelPrefix,
                 containerName);
-        ListSchemaNodeBuilder listBuilder = moduleBuilder.addListNode(
+        ListSchemaNodeBuilder builder = moduleBuilder.addListNode(
                 containerQName, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(containerName);
 
-        listBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, listBuilder);
-        parseConstraints(ctx, listBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
 
         String keyDefinition = "";
         for (int i = 0; i < ctx.getChildCount(); ++i) {
@@ -544,12 +574,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
             if (childNode instanceof Ordered_by_stmtContext) {
                 final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;
                 final boolean userOrdered = parseUserOrdered(orderedBy);
-                listBuilder.setUserOrdered(userOrdered);
+                builder.setUserOrdered(userOrdered);
             } else if (childNode instanceof Key_stmtContext) {
                 keyDefinition = stringFromNode(childNode);
                 List<QName> key = createListKey(keyDefinition, namespace,
                         revision, yangModelPrefix);
-                listBuilder.setKeyDefinition(key);
+                builder.setKeyDefinition(key);
             }
         }
     }
@@ -558,6 +588,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitList_stmt(List_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -565,20 +596,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String anyXmlName = stringFromNode(ctx);
         QName anyXmlQName = new QName(namespace, revision, yangModelPrefix,
                 anyXmlName);
-        AnyXmlBuilder anyXmlBuilder = moduleBuilder.addAnyXml(anyXmlQName,
+        AnyXmlBuilder builder = moduleBuilder.addAnyXml(anyXmlQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(anyXmlName);
 
-        anyXmlBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, anyXmlBuilder);
-        parseConstraints(ctx, anyXmlBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
     }
 
     @Override
     public void exitAnyxml_stmt(YangParser.Anyxml_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -586,21 +619,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String choiceName = stringFromNode(ctx);
         QName choiceQName = new QName(namespace, revision, yangModelPrefix,
                 choiceName);
-        ChoiceBuilder choiceBuilder = moduleBuilder.addChoice(choiceQName,
+        ChoiceBuilder builder = moduleBuilder.addChoice(choiceQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
 
         updatePath(choiceName);
-        choiceBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, choiceBuilder);
-        parseConstraints(ctx, choiceBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
 
         // set 'default' case
         for (int i = 0; i < ctx.getChildCount(); i++) {
             ParseTree child = ctx.getChild(i);
             if (child instanceof Default_stmtContext) {
                 String defaultCase = stringFromNode(child);
-                choiceBuilder.setDefaultCase(defaultCase);
+                builder.setDefaultCase(defaultCase);
                 break;
             }
         }
@@ -610,6 +644,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitChoice_stmt(YangParser.Choice_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -617,20 +652,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String caseName = stringFromNode(ctx);
         QName choiceQName = new QName(namespace, revision, yangModelPrefix,
                 caseName);
-        ChoiceCaseBuilder caseBuilder = moduleBuilder.addCase(choiceQName,
+        ChoiceCaseBuilder builder = moduleBuilder.addCase(choiceQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
 
         updatePath(caseName);
-        caseBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, caseBuilder);
-        parseConstraints(ctx, caseBuilder.getConstraints());
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
     }
 
     @Override
     public void exitCase_stmt(YangParser.Case_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -638,20 +675,21 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String notificationName = stringFromNode(ctx);
         QName notificationQName = new QName(namespace, revision,
                 yangModelPrefix, notificationName);
-        NotificationBuilder notificationBuilder = moduleBuilder
-                .addNotification(notificationQName, actualPath, ctx.getStart()
-                        .getLine());
+        NotificationBuilder builder = moduleBuilder.addNotification(
+                notificationQName, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(notificationName);
 
-        notificationBuilder.setPath(createActualSchemaPath(actualPath,
-                namespace, revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, notificationBuilder);
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
     }
 
     @Override
     public void exitNotification_stmt(YangParser.Notification_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     // Unknown types
@@ -692,12 +730,14 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
                 yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
+        moduleBuilder.enterNode(builder);
     }
 
     @Override
     public void exitIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -707,6 +747,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 rpcName);
         RpcDefinitionBuilder rpcBuilder = moduleBuilder.addRpc(rpcQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(rpcBuilder);
         updatePath(rpcName);
 
         rpcBuilder.setPath(createActualSchemaPath(actualPath, namespace,
@@ -718,28 +759,51 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitRpc_stmt(YangParser.Rpc_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
     public void enterInput_stmt(YangParser.Input_stmtContext ctx) {
-        updatePath("input");
+        final String input = "input";
+        QName rpcQName = new QName(namespace, revision, yangModelPrefix, input);
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(
+                rpcQName, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
+        updatePath(input);
+
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
     }
 
     @Override
     public void exitInput_stmt(YangParser.Input_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
     public void enterOutput_stmt(YangParser.Output_stmtContext ctx) {
-        updatePath("output");
+        final String output = "output";
+        QName rpcQName = new QName(namespace, revision, yangModelPrefix, output);
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(
+                rpcQName, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
+        updatePath(output);
+
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
+                yangModelPrefix));
+        parseSchemaNodeArgs(ctx, builder);
+        parseConstraints(ctx, builder.getConstraints());
     }
 
     @Override
     public void exitOutput_stmt(YangParser.Output_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -749,6 +813,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 featureName);
         FeatureBuilder featureBuilder = moduleBuilder.addFeature(featureQName,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(featureBuilder);
         updatePath(featureName);
 
         featureBuilder.setPath(createActualSchemaPath(actualPath, namespace,
@@ -760,6 +825,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitFeature_stmt(YangParser.Feature_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
@@ -769,6 +835,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         String deviate = null;
         DeviationBuilder builder = moduleBuilder.addDeviation(targetPath,
                 actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(targetPath);
 
         for (int i = 0; i < ctx.getChildCount(); i++) {
@@ -793,12 +860,14 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitDeviation_stmt(YangParser.Deviation_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     @Override
     public void enterConfig_stmt(YangParser.Config_stmtContext ctx) {
         boolean configuration = parseConfig(ctx);
-        moduleBuilder.addConfiguration(configuration, actualPath);
+        moduleBuilder.addConfiguration(configuration, actualPath, ctx
+                .getStart().getLine());
     }
 
     @Override
@@ -808,6 +877,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                 yangModelPrefix, identityName);
         IdentitySchemaNodeBuilder builder = moduleBuilder.addIdentity(
                 identityQName, actualPath, ctx.getStart().getLine());
+        moduleBuilder.enterNode(builder);
         updatePath(identityName);
 
         builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
@@ -827,6 +897,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void exitIdentity_stmt(YangParser.Identity_stmtContext ctx) {
         final String actContainer = actualPath.pop();
         logger.debug("exiting " + actContainer);
+        moduleBuilder.exitNode();
     }
 
     public ModuleBuilder getModuleBuilder() {