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();
}