private PsiFile getPsiFileByLocation()

in src/java/org/jetbrains/plugins/clojure/debugger/ClojurePositionManager.java [184:239]


  private PsiFile getPsiFileByLocation(final Project project, final Location location) {
    final Ref<PsiFile> result = new Ref<PsiFile>(null);
    ApplicationManager.getApplication().runReadAction(new Runnable() {
      public void run() {
        if (location == null) return;
        final ReferenceType refType = location.declaringType();
        if (refType == null) return;

        String fileName = null;
        try {
          fileName = location.sourceName();
        } catch (AbsentInformationException ignore) {}

        final String originalQName = refType.name().replace('/', '.');
        final GlobalSearchScope searchScope = myDebugProcess.getSearchScope();
        int dollar = originalQName.indexOf('$');
        final String qName = dollar >= 0 ? originalQName.substring(0, dollar) : originalQName;
        final ClNs[] nses = ClojureShortNamesCache.getInstance(project).getNsByQualifiedName(qName, searchScope);
        if (nses.length == 1) {
          final PsiFile containingFile = nses[0].getContainingFile();
          if (fileName == null || containingFile.getName().equals(fileName)) {
            result.set(containingFile);
            return;
          }
        }


        DirectoryIndex directoryIndex = DirectoryIndex.getInstance(project);
        int dotIndex = qName.lastIndexOf(".");
        String packageName = dotIndex >= 0 ? qName.substring(0, dotIndex) : "";
        Query<VirtualFile> query = directoryIndex.getDirectoriesByPackageName(packageName, true);
        if (fileName == null) {
          fileName = dotIndex >= 0 ? qName.substring(dotIndex + 1) : qName;
          fileName += ".clj";
        }


        final String finalFileName = fileName;
        query.forEach(new Processor<VirtualFile>() {
          public boolean process(VirtualFile vDir) {
            VirtualFile vFile = vDir.findChild(finalFileName);
            if (vFile != null) {
              PsiFile psiFile = PsiManager.getInstance(project).findFile(vFile);
              if (psiFile instanceof ClojureFile) {
                result.set(psiFile);
                return false;
              }
            }
            return true;
          }
        });
      }
    });

    return result.get();
  }