SLING-9657 - Same-name JS Use dependencies are not always correctly resolved

* make sure overlays are handled
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
index 2a916e8..b150c1e 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
@@ -69,7 +69,7 @@
                     String driverType = request.getResource().getResourceType();
                     Resource driver = resolveResource(driverType);
                     if (driver != null) {
-                        Resource hierarchyResource = getChildResource(callerType, driver);
+                        Resource hierarchyResource = getHierarchyResource(callerType, driver);
                         while (hierarchyResource != null && scriptResource == null) {
                             if (dependency.startsWith("..")) {
                                 // relative path
@@ -162,36 +162,58 @@
         return caller;
     }
 
-    private Resource getChildResource(@NotNull Resource callerType, @NotNull Resource driverType) {
-        if (callerType.getPath().equals(driverType.getPath())) {
-            return callerType;
+    private Resource getHierarchyResource(@NotNull Resource caller, @NotNull Resource driver) {
+        if (caller.getPath().equals(driver.getPath())) {
+            return caller;
         }
-        if (isResourceType(callerType, driverType.getPath())) {
-            return callerType;
+        if (isResourceType(caller, driver)) {
+            return caller;
         }
-        if (isResourceType(driverType, callerType.getPath())) {
-            return driverType;
+        if (isResourceType(driver, caller)) {
+            return driver;
+        }
+        int callerOverlayIndex = 0;
+        int driverOverlayIndex = 0;
+        String callerRelativePath = null;
+        String driverRelativePath = null;
+        int spIndex = 0;
+        for (String sp : scriptingResourceResolver.getSearchPath()) {
+            if (caller.getPath().startsWith(sp)) {
+                callerRelativePath = caller.getPath().substring(sp.length());
+                callerOverlayIndex = spIndex;
+            }
+            if (driver.getPath().startsWith(sp)) {
+                driverRelativePath = driver.getPath().substring(sp.length());
+                driverOverlayIndex = spIndex;
+            }
+            if (callerRelativePath != null && driverRelativePath != null) {
+                break;
+            }
+            spIndex++;
+        }
+        if (callerRelativePath != null && callerRelativePath.equals(driverRelativePath)) {
+            if (callerOverlayIndex < driverOverlayIndex) {
+                return caller;
+            }
+            return driver;
         }
         return null;
     }
 
-    private boolean isResourceType(@NotNull Resource resource, String type) {
-        Resource typeResource = resolveResource(type);
-        if (typeResource != null) {
-            if (typeResource.getPath().equals(resource.getPath())) {
-                return true;
-            }
-            String resourceSuperType = resource.getResourceSuperType();
-            while (resourceSuperType != null) {
-                Resource intermediateType = resolveResource(resourceSuperType);
-                if (intermediateType != null) {
-                    if (intermediateType.getPath().equals(typeResource.getPath())) {
-                        return true;
-                    }
-                    resourceSuperType = intermediateType.getResourceSuperType();
-                } else {
-                    return false;
+    private boolean isResourceType(@NotNull Resource resource, @NotNull Resource parent) {
+        if (parent.getPath().equals(resource.getPath())) {
+            return true;
+        }
+        String resourceSuperType = resource.getResourceSuperType();
+        while (resourceSuperType != null) {
+            Resource intermediateType = resolveResource(resourceSuperType);
+            if (intermediateType != null) {
+                if (intermediateType.getPath().equals(parent.getPath())) {
+                    return true;
                 }
+                resourceSuperType = intermediateType.getResourceSuperType();
+            } else {
+                return false;
             }
         }
         return false;