Bug 3670 (part 3/5): Use of new statement parser in yang-maven-plugin
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / GroupingUtils.java
index e6f496b0a46febf11d5c7e5fbc1dbec577f9321c..83a37469650deff8b982956ef3f5064000cb8729 100644 (file)
@@ -12,7 +12,6 @@ import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.RootStatementContext;
 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType;
 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace;
-import java.util.Iterator;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.TypeOfCopy;
 import java.util.Collection;
@@ -37,9 +36,10 @@ public final class GroupingUtils {
     }
 
     /**
-     * @param sourceGrpStmtCtx
-     * @param targetCtx
-     * @throws SourceException
+     * @param sourceGrpStmtCtx source grouping statement context
+     * @param targetCtx target context
+     * @param usesNode uses node
+     * @throws SourceException instance of SourceException
      */
     public static void copyFromSourceToTarget(
             StatementContextBase<?, ?, ?> sourceGrpStmtCtx,
@@ -69,7 +69,7 @@ public final class GroupingUtils {
                                 TypeOfCopy.ADDED_BY_USES);
                 targetCtx.addEffectiveSubstatement(copy);
                 usesNode.addAsEffectOfStatement(copy);
-            } else if (isReusedByUses(originalStmtCtx)) {
+            } else if (isReusedByUsesOnTop(originalStmtCtx)) {
                 targetCtx.addEffectiveSubstatement(originalStmtCtx);
                 usesNode.addAsEffectOfStatement(originalStmtCtx);
             }
@@ -90,7 +90,7 @@ public final class GroupingUtils {
                                 TypeOfCopy.ADDED_BY_USES);
                 targetCtx.addEffectiveSubstatement(copy);
                 usesNode.addAsEffectOfStatement(copy);
-            } else if (isReusedByUses(originalStmtCtx)) {
+            } else if (isReusedByUsesOnTop(originalStmtCtx)) {
                 targetCtx.addEffectiveSubstatement(originalStmtCtx);
                 usesNode.addAsEffectOfStatement(originalStmtCtx);
             }
@@ -120,14 +120,7 @@ public final class GroupingUtils {
                 QName targetQName = (QName) targetStmtArgument;
                 QNameModule targetQNameModule = targetQName.getModule();
 
-                QName sourceQName = (QName) sourceStmtArgument;
-                QNameModule sourceQNameModule = sourceQName.getModule();
-
-                if (targetQNameModule.equals(sourceQNameModule)) {
-                    return null;
-                } else {
-                    return targetQNameModule;
-                }
+                return targetQNameModule;
             } else {
                 return null;
             }
@@ -148,12 +141,30 @@ public final class GroupingUtils {
         noCopyDefSet.add(Rfc6020Mapping.TYPEDEF);
         noCopyDefSet.add(Rfc6020Mapping.TYPE);
 
+        final Set<StatementDefinition> noCopyFromGroupingSet = new HashSet<>();
+        noCopyFromGroupingSet.add(Rfc6020Mapping.DESCRIPTION);
+        noCopyFromGroupingSet.add(Rfc6020Mapping.REFERENCE);
+
         StatementDefinition def = stmtContext.getPublicDefinition();
-        return !noCopyDefSet.contains(def);
+        boolean dontCopyFromParentGrouping = noCopyFromGroupingSet.contains(def) && stmtContext.getParentContext()
+                .getPublicDefinition().equals(Rfc6020Mapping.GROUPING);
+
+        return !noCopyDefSet.contains(def) && !dontCopyFromParentGrouping;
     }
 
     public static boolean isReusedByUses(StmtContext<?, ?, ?> stmtContext) {
 
+        Set<StatementDefinition> reusedDefSet = new HashSet<>();
+        reusedDefSet.add(Rfc6020Mapping.TYPEDEF);
+        reusedDefSet.add(Rfc6020Mapping.TYPE);
+        reusedDefSet.add(Rfc6020Mapping.USES);
+
+        StatementDefinition def = stmtContext.getPublicDefinition();
+        return reusedDefSet.contains(def);
+    }
+
+    public static boolean isReusedByUsesOnTop(StmtContext<?, ?, ?> stmtContext) {
+
         Set<StatementDefinition> reusedDefSet = new HashSet<>();
         reusedDefSet.add(Rfc6020Mapping.TYPEDEF);
         reusedDefSet.add(Rfc6020Mapping.TYPE);