Esempio n. 1
0
 @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;
 }
Esempio n. 2
0
  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
  }