@Nullable public static StubIndexReference createStubReference( @NotNull PsiElement element, @NotNull PsiFile containingFile) { if (element instanceof StubBasedPsiElement && element.isPhysical() && (element instanceof PsiCompiledElement || canHaveStub(containingFile))) { final StubBasedPsiElement elt = (StubBasedPsiElement) element; final IStubElementType elementType = elt.getElementType(); if (elt.getStub() != null || elementType.shouldCreateStub(element.getNode())) { int index = calcStubIndex((StubBasedPsiElement) element); if (index != -1) { return new StubIndexReference( containingFile, index, containingFile.getLanguage(), elementType); } } } return null; }
public static int calcStubIndex(@NotNull StubBasedPsiElement psi) { if (psi instanceof PsiFile) { return 0; } final StubElement liveStub = psi.getStub(); if (liveStub != null) { return ((StubBase) liveStub).id; } PsiFileImpl file = (PsiFileImpl) psi.getContainingFile(); final StubTree stubTree = file.calcStubTree(); for (StubElement<?> stb : stubTree.getPlainList()) { if (stb.getPsi() == psi) { return ((StubBase) stb).id; } } return -1; // it is possible via custom stub builder intentionally not producing stubs for // stubbed elements }