[ONOS-6692] Leafref linking fix for path predicate.

Change-Id: I4952e57f40104e81484e3ca4953381e0d0743d09
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
index 3607eec..cc893db 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
@@ -873,15 +873,25 @@
             throws DataModelException {
 
         YangLeaf leaf = getLeaf(leftAxisName, (YangLeavesHolder) node);
-        if (leaf != null) {
-            return leaf;
-        }
         YangLeafList leafList = getLeafList(leftAxisName,
                                             (YangLeavesHolder) node);
-        if (leafList == null) {
+        if (leaf == null && leafList == null) {
+            if (node instanceof YangAugmentableNode) {
+                List<YangAugment> augList = ((YangAugmentableNode) node)
+                        .getAugmentedInfoList();
+                for (YangAugment aug : augList) {
+                    leaf = getLeaf(leftAxisName, aug);
+                    leafList = getLeafList(leftAxisName, aug);
+                    if (leaf != null || leafList != null) {
+                        break;
+                    }
+                }
+            }
+        }
+        if (leaf == null && leafList == null) {
             throw getDataModelExc(TGT_LEAF_ERR, leafRef);
         }
-        return leafList;
+        return (leaf != null) ? leaf : leafList;
     }
 
     /**
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
index 01a47f9..66dc468 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
@@ -530,4 +530,36 @@
         YangPluginConfig.compileCode(COMP);
         deleteDirectory(DIR);
     }
+
+    /**
+     * Checks leaf-ref linking with augmented nodes in predicate for open
+     * config YANG files.
+     *
+     * @throws IOException            if any error occurs during IO on files
+     * @throws ParserException        if any error occurs during parsing
+     * @throws MojoExecutionException if any mojo operation fail
+     */
+    @Test
+    public void processLeafRefAugment() throws IOException,
+            ParserException, MojoExecutionException {
+
+        deleteDirectory(DIR);
+        String dir = "src/test/resources/leafreflinker/oc-leafref";
+
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(dir)) {
+            paths.add(Paths.get(file));
+        }
+
+        utilManager.createYangFileInfoSet(paths);
+        utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
+        utilManager.resolveDependenciesUsingLinker();
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        utilManager.translateToJava(yangPluginConfig);
+        YangPluginConfig.compileCode(COMP);
+        deleteDirectory(DIR);
+    }
 }
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
index 946682d..b9938ba 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
@@ -36,11 +36,9 @@
 import org.onosproject.yang.compiler.datamodel.YangPathOperator;
 import org.onosproject.yang.compiler.datamodel.YangPathPredicate;
 import org.onosproject.yang.compiler.datamodel.YangRelativePath;
-import org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus;
-import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.linker.exceptions.LinkerException;
 import org.onosproject.yang.compiler.linker.impl.YangLinkerManager;
-import org.onosproject.yang.compiler.linker.impl.YangLinkerUtils;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.tool.YangCompilerManager;
 
@@ -57,7 +55,14 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.onosproject.yang.compiler.datamodel.YangNodeType.MODULE_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.RESOLVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.ENUMERATION;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
+import static org.onosproject.yang.compiler.linker.impl.YangLinkerUtils.updateFilePriority;
 import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getYangFiles;
 
 /**
@@ -65,12 +70,11 @@
  */
 public class IntraFileLeafrefLinkingTest {
 
-    @Rule
-    public ExpectedException thrown = ExpectedException.none();
-
     private final YangCompilerManager utilManager =
             new YangCompilerManager();
     private final YangLinkerManager yangLinkerManager = new YangLinkerManager();
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
 
     /**
      * Checks self resolution when grouping and uses are siblings.
@@ -97,7 +101,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -129,14 +133,14 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("network-ref"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.DERIVED));
+                   is(DERIVED));
     }
 
     /**
@@ -163,7 +167,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -197,14 +201,14 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("remove"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.DERIVED));
+                   is(DERIVED));
     }
 
     /**
@@ -232,7 +236,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -266,14 +270,14 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("remove"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
 
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.ENUMERATION));
+                   is(ENUMERATION));
     }
 
     /**
@@ -300,7 +304,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -331,16 +335,16 @@
         // Check whether the information in the leaf is correct.
         assertThat(leafInfo.getName(), is("network-ref"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.UINT8));
+                   is(UINT8));
     }
 
     /**
@@ -368,7 +372,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -399,16 +403,16 @@
         // Check whether the information in the leaf is correct.
         assertThat(leafInfo.getName(), is("network-ref"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.UINT8));
+                   is(UINT8));
     }
 
     /**
@@ -438,7 +442,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -472,7 +476,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         //Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -502,7 +506,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -531,17 +535,17 @@
 
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("network-id"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
 
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.UINT8));
+                   is(UINT8));
     }
 
     /**
@@ -568,7 +572,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -602,14 +606,14 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("remove"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.ENUMERATION));
+                   is(ENUMERATION));
     }
 
     /**
@@ -637,7 +641,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -671,14 +675,14 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("remove"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
 
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.ENUMERATION));
+                   is(ENUMERATION));
     }
 
     /**
@@ -705,7 +709,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -740,7 +744,7 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo.getName(), is("ifname"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
         assertThat(leafref.getPathType(), Is.is(YangPathArgType.ABSOLUTE_PATH));
 
@@ -759,7 +763,7 @@
         // Check whether the information in the leaf is correct under grouping.
         assertThat(leafInfo1.getName(), is("status"));
         assertThat(leafInfo1.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo1.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo1.getDataType().getDataType(), is(LEAFREF));
 
         YangLeafRef leafref1 = (YangLeafRef) leafInfo1.getDataType().getDataTypeExtendedInfo();
         assertThat(leafref1.getPathType(), is(YangPathArgType.ABSOLUTE_PATH));
@@ -812,7 +816,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -848,10 +852,10 @@
 
         YangLeaf leafInfo2 = (YangLeaf) leafref.getReferredLeafOrLeafList();
         assertThat(leafref.getReferredLeafOrLeafList(), is(leafInfo2));
-        assertThat(leafref.getResolvableStatus(), Is.is(ResolvableStatus.RESOLVED));
+        assertThat(leafref.getResolvableStatus(), Is.is(RESOLVED));
 
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.STRING));
+                   is(STRING));
     }
 
 
@@ -879,7 +883,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -915,7 +919,7 @@
         List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
         YangIfFeature ifFeature = ifFeatureList.iterator().next();
         assertThat(ifFeature.getName().getName(), is("local-storage"));
-        assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+        assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
 
         ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
         YangLeaf yangLeaf = listOfLeafInModule.next();
@@ -923,12 +927,12 @@
 
         YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
 
-        assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
+        assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT64));
 
         List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
         YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
         assertThat(ifFeatureInLeafref.getName().getName(), is("local-storage"));
-        assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+        assertThat(ifFeatureInLeafref.getResolvableStatus(), is(RESOLVED));
     }
 
     /**
@@ -955,7 +959,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -991,7 +995,7 @@
         List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
         YangIfFeature ifFeature = ifFeatureList.iterator().next();
         assertThat(ifFeature.getName().getName(), is("local-storage"));
-        assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+        assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
 
         ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
         YangLeaf yangLeaf = listOfLeafInModule.next();
@@ -999,18 +1003,18 @@
 
         YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
 
-        assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
+        assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT64));
 
         List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
         YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
 
         assertThat(ifFeatureInLeafref.getName().getName(), is("main-storage"));
-        assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+        assertThat(ifFeatureInLeafref.getResolvableStatus(), is(RESOLVED));
 
         YangIfFeature ifFeatureInLeafref1 = ifFeatureListInLeafref.iterator().next();
 
         assertThat(ifFeatureInLeafref1.getName().getName(), is("main-storage"));
-        assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+        assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(RESOLVED));
     }
 
     /**
@@ -1038,7 +1042,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1074,16 +1078,16 @@
         // Check whether the information in the leaf is correct.
         assertThat(leafInfo.getName(), is("src-tp-ref"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.UINT8));
+                   is(UINT8));
     }
 
     /**
@@ -1112,7 +1116,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1158,16 +1162,16 @@
         // Check whether the information in the leaf is correct.
         assertThat(leafInfo.getName(), is("network-id-ref"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.DERIVED));
+                   is(DERIVED));
     }
 
     /**
@@ -1195,7 +1199,7 @@
         // Add references to import list.
         yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
 
-        YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
 
         // Carry out inter-file linking.
         yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1229,15 +1233,148 @@
         // Check whether the information in the leaf is correct.
         assertThat(leafInfo.getName(), is("reference"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+        assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
         YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
 
         // Check whether leafref type got resolved.
         assertThat(leafref.getResolvableStatus(),
-                   is(ResolvableStatus.RESOLVED));
+                   is(RESOLVED));
 
         // Check the effective type for the leaf.
         assertThat(leafref.getEffectiveDataType().getDataType(),
-                   is(YangDataTypes.UINT8));
+                   is(UINT8));
+    }
+
+    /**
+     * Checks leaf-ref resolution with path predicate having augmented nodes.
+     */
+    @Test
+    public void processLeafRefToAugment() throws IOException, ParserException {
+
+        String searchDir = "src/test/resources/leafreflinker/interfile" +
+                "/interfileaugment";
+
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        utilManager.createYangFileInfoSet(paths);
+        utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
+
+        yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
+        yangLinkerManager.addRefToYangFilesImportList(
+                utilManager.getYangNodeSet());
+        updateFilePriority(utilManager.getYangNodeSet());
+        yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
+
+        Iterator<YangNode> mIt = utilManager.getYangNodeSet().iterator();
+        YangNode node;
+        YangNode module2 = null;
+        YangNode module3 = null;
+        YangNode module4 = null;
+        while (mIt.hasNext()) {
+            node = mIt.next();
+            if (node.getName().equals("module2")) {
+                module2 = node;
+            } else if (node.getName().equals("module3")) {
+                module3 = node;
+            } else {
+                module4 = node;
+            }
+        }
+        assertThat((module4 instanceof YangModule), is(true));
+        YangModule mod4 = (YangModule) module4;
+        assertThat(mod4.getName(), is("module4"));
+
+        YangNode aug4 = mod4.getChild();
+        assertThat((aug4 instanceof YangAugment), is(true));
+        YangAugment augment4 = (YangAugment) aug4;
+
+        YangNode valid = augment4.getChild();
+        assertThat((valid instanceof YangContainer), is(true));
+        YangContainer valCont = (YangContainer) valid;
+
+        ListIterator<YangLeaf> it4 = valCont.getListOfLeaf().listIterator();
+        YangLeaf leaf4 = it4.next();
+
+        assertThat((module2 instanceof YangModule), is(true));
+        YangModule mod2 = (YangModule) module2;
+        assertThat(mod2.getName(), is("module2"));
+
+        YangNode cont1 = mod2.getChild();
+        assertThat((cont1 instanceof YangContainer), is(true));
+        YangContainer c1 = (YangContainer) cont1;
+
+        YangNode cont2 = c1.getChild();
+        assertThat((cont2 instanceof YangList), is(true));
+        YangList c2 = (YangList) cont2;
+
+        ListIterator<YangLeaf> it3 = c2.getListOfLeaf().listIterator();
+        YangLeaf leaf3 = it3.next();
+
+        List<YangAugment> augList = c2.getAugmentedInfoList();
+        YangAugment nameAug = augList.iterator().next();
+        ListIterator<YangLeaf> it1 = nameAug.getListOfLeaf().listIterator();
+        YangLeaf leaf1 = it1.next();
+
+        YangNode aug2 = cont1.getNextSibling();
+        assertThat((aug2 instanceof YangAugment), is(true));
+        YangAugment augment2 = (YangAugment) aug2;
+        ListIterator<YangLeaf> it2 = augment2.getListOfLeaf().listIterator();
+        YangLeaf leaf2 = it2.next();
+
+        assertThat((module3 instanceof YangModule), is(true));
+        YangModule mod3 = (YangModule) module3;
+        assertThat(mod3.getName(), is("module3"));
+
+        YangNode aug = mod3.getChild();
+        assertThat((aug instanceof YangAugment), is(true));
+        YangAugment aug1 = (YangAugment) aug;
+
+        ListIterator<YangLeaf> it = aug1.getListOfLeaf().listIterator();
+        YangLeaf leafInfo = it.next();
+        YangType<?> type = leafInfo.getDataType();
+
+        assertThat(leafInfo.getName(), is("per"));
+        assertThat(type.getDataTypeName(), is("leafref"));
+        assertThat(type.getDataType(), is(LEAFREF));
+
+        YangLeafRef leafRef = (YangLeafRef) (type.getDataTypeExtendedInfo());
+        assertThat(leafRef.getResolvableStatus(), is(RESOLVED));
+        assertThat(leafRef.getEffectiveDataType().getDataType(), is(STRING));
+
+        List<YangAtomicPath> atom = leafRef.getAtomicPath();
+        Iterator<YangAtomicPath> atIt = atom.iterator();
+        YangAtomicPath a = atIt.next();
+        assertThat(a.getResolvedNode(), is(c1));
+        a = atIt.next();
+        assertThat(a.getResolvedNode(), is(c2));
+
+        List<YangPathPredicate> pathPre = a.getPathPredicatesList();
+        YangPathPredicate path = pathPre.iterator().next();
+        assertThat(path.getLeftAxisNode(), is(leaf1));
+        assertThat(path.getRightAxisNode(), is(leaf2));
+        assertThat(leafRef.getReferredLeafOrLeafList(), is(leaf3));
+
+        leafInfo = it.next();
+        type = leafInfo.getDataType();
+
+        assertThat(leafInfo.getName(), is("val"));
+        assertThat(type.getDataTypeName(), is("leafref"));
+        assertThat(type.getDataType(), is(LEAFREF));
+
+        leafRef = (YangLeafRef) (type.getDataTypeExtendedInfo());
+        assertThat(leafRef.getResolvableStatus(), is(RESOLVED));
+        assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT8));
+
+        atom = leafRef.getAtomicPath();
+        atIt = atom.iterator();
+        a = atIt.next();
+        assertThat(a.getResolvedNode(), is(c1));
+        a = atIt.next();
+        assertThat(a.getResolvedNode(), is(valCont));
+        assertThat(leafRef.getReferredLeafOrLeafList(), is(leaf4));
     }
 }
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang
new file mode 100644
index 0000000..fedf735
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang
@@ -0,0 +1,14 @@
+module module1 {
+
+    namespace "urn:ietf:params:xml:ns:aug:module:1";
+
+    prefix mod-a;
+
+    container cont{
+        container val {
+            leaf-list create {
+                type string;
+            }
+        }
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang
new file mode 100644
index 0000000..6c970a7
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang
@@ -0,0 +1,25 @@
+module module2 {
+
+    namespace "urn:ietf:params:xml:ns:aug:module:2";
+
+    prefix mod-b;
+
+    import module1 {
+        prefix mod-a;
+    }
+
+    container cont1 {
+        list cont2 {
+            key "ll";
+            leaf ll {
+                type string;
+            }
+        }
+    }
+
+    augment "/mod-a:cont/mod-a:val" {
+        leaf arg {
+            type string;
+        }
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang
new file mode 100644
index 0000000..a8a1188
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang
@@ -0,0 +1,39 @@
+module module3 {
+
+    namespace "urn:ietf:params:xml:ns:aug:module:3";
+
+    prefix mod-c;
+
+    import module1 {
+        prefix mod-a;
+    }
+
+    import module2 {
+        prefix mod-b;
+    }
+
+    import module4 {
+        prefix mod-d;
+    }
+
+    augment "/mod-a:cont/mod-a:val" {
+        leaf per {
+            type leafref {
+                 path "/mod-b:cont1/mod-b:cont2[mod-b:name=current()/"+
+                 "../mod-b:arg]/mod-b:ll";
+            }
+        }
+
+        leaf val {
+            type leafref {
+                 path "/mod-b:cont1/mod-d:validate/mod-d:referred";
+            }
+        }
+    }
+
+    augment "/mod-b:cont1/mod-b:cont2" {
+        leaf name {
+            type string;
+        }
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang
new file mode 100644
index 0000000..1053bb3
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang
@@ -0,0 +1,18 @@
+module module4 {
+
+    namespace "urn:ietf:params:xml:ns:aug:module:4";
+
+    prefix mod-d;
+
+    import module2 {
+        prefix mod-b;
+    }
+
+    augment "/mod-b:cont1" {
+        container validate {
+            leaf referred {
+                type uint8;
+            }
+        }
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang
new file mode 100644
index 0000000..d556342
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang
@@ -0,0 +1,23 @@
+module openconfig-interfaces {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/interfaces";
+
+  prefix "oc-if";
+
+  grouping interfaces-top {
+    container interfaces {
+      list interface {
+        key "name";
+        leaf name {
+          type string;
+        }
+        container state {
+        }
+      }
+    }
+  }
+
+  uses interfaces-top;
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang
new file mode 100644
index 0000000..9da9e32
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang
@@ -0,0 +1,48 @@
+module openconfig-platform-transceiver {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/platform/transceiver";
+
+  prefix "oc-transceiver";
+
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-interfaces { prefix oc-if; }
+
+  revision 2016-12-22;
+
+
+  grouping physical-channel-top {
+    container physical-channels {
+      list channel {
+        key "index";
+
+        leaf index {
+          type string;
+        }
+    }
+  }
+  }
+
+  grouping port-transceiver-top {
+    container transceiver {
+      uses physical-channel-top;
+    }
+  }
+
+  augment "/oc-platform:components/oc-platform:component" {
+    uses port-transceiver-top;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    leaf-list physical-channel {
+      type leafref {
+        path "/oc-platform:components/" +
+          "oc-platform:component[oc-platform:name=current()/../oc-platform:hardware-port]/" +
+          "oc-transceiver:transceiver/" +
+          "oc-transceiver:physical-channels/oc-transceiver:channel/" +
+          "oc-transceiver:index";
+      }
+    }
+  }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang
new file mode 100644
index 0000000..e46369b
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang
@@ -0,0 +1,35 @@
+module openconfig-platform {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/platform";
+
+  prefix "oc-platform";
+import openconfig-interfaces { prefix oc-if; }
+
+  revision 2016-12-22;
+
+
+
+  grouping platform-component-top {
+    container components {
+      list component {
+        key "name";
+        leaf name {
+          type string;
+        }
+      }
+    }
+  }
+
+  uses platform-component-top;
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    leaf hardware-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+    }
+  }
+}