PsiAnchor (@NotNull PsiElement element) { if (element instanceof PsiFile) { VirtualFile virtualFile = ((PsiFile)element).getVirtualFile(); if (virtualFile != null) return new PsiFileReference(virtualFile, (PsiFile)element); return new HardReference(element); } if (element instanceof PsiDirectory) { VirtualFile virtualFile = ((PsiDirectory)element).getVirtualFile(); return new PsiDirectoryReference(virtualFile, element.getProject()); } PsiFile file = element.getContainingFile(); if (file == null) { return new HardReference(element); } VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null || virtualFile instanceof VirtualFileWindow) return new HardReference(element); PsiAnchor stubRef = createStubReference(element, file); if (stubRef != null) return stubRef; if (!element.isPhysical()) { return wrapperOrHardReference(element); } TextRange textRange = element.getTextRange(); if (textRange == null) { return wrapperOrHardReference(element); } Language lang = null; FileViewProvider viewProvider = file.getViewProvider(); for (Language l : viewProvider.getLanguages()) { if (viewProvider.getPsi(l) == file) { lang = l; break; } } if (lang == null) { return wrapperOrHardReference(element); } return new TreeRangeReference(file, textRange.getStartOffset(), textRange.getEndOffset(), Identikit.fromPsi(element, lang), virtualFile); }