@Nullable
  private PsiClass mapClass(@NotNull PsiClass psiClass) {
    String qualifiedName = psiClass.getQualifiedName();
    if (qualifiedName == null) {
      return psiClass;
    }

    PsiFile file = psiClass.getContainingFile();
    if (file == null || !file.getViewProvider().isPhysical()) {
      return psiClass;
    }

    final VirtualFile vFile = file.getVirtualFile();
    if (vFile == null) {
      return psiClass;
    }

    final FileIndexFacade index = FileIndexFacade.getInstance(file.getProject());
    if (!index.isInSource(vFile)
        && !index.isInLibrarySource(vFile)
        && !index.isInLibraryClasses(vFile)) {
      return psiClass;
    }

    return JavaPsiFacade.getInstance(psiClass.getProject())
        .findClass(qualifiedName, myResolveScope);
  }
 private boolean checkClassUnderSources(final PsiElement element, final Project project) {
   final PsiFile file = element.getContainingFile();
   if (file != null && file.getVirtualFile() != null) {
     final FileIndexFacade indexFacade = FileIndexFacade.getInstance(project);
     final VirtualFile vf = file.getVirtualFile();
     return indexFacade.isInSource(vf) || indexFacade.isInSourceContent(vf);
   }
   return false;
 }
 private FileScope(@NotNull Project project, @Nullable VirtualFile virtualFile) {
   super(project);
   myVirtualFile = virtualFile;
   final FileIndexFacade facade = FileIndexFacade.getInstance(project);
   myModule =
       virtualFile == null || project.isDefault() ? null : facade.getModuleForFile(virtualFile);
   mySearchOutsideContent =
       virtualFile != null
           && myModule == null
           && !facade.isInLibraryClasses(virtualFile)
           && !facade.isInLibrarySource(virtualFile);
 }
 @NotNull
 private static Collection<VirtualFile> filterOutIgnored(
     @NotNull Project project, @NotNull Collection<VirtualFile> files) {
   final ChangeListManager changeListManager = ChangeListManager.getInstance(project);
   final FileIndexFacade fileIndex = FileIndexFacade.getInstance(project);
   return ContainerUtil.filter(
       files,
       new Condition<VirtualFile>() {
         @Override
         public boolean value(VirtualFile file) {
           return !changeListManager.isIgnoredFile(file) && !fileIndex.isExcludedFile(file);
         }
       });
 }
 @NotNull
 @Override
 public GlobalSearchScope buildProjectScope() {
   final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject);
   if (projectRootManager == null) {
     return new EverythingGlobalScope(myProject) {
       @Override
       public boolean isSearchInLibraries() {
         return false;
       }
     };
   }
   return new ProjectScopeImpl(myProject, FileIndexFacade.getInstance(myProject));
 }
 private boolean hasFilesOutOfProjectRoots() {
   if (myHasFilesOutOfProjectRoots == null) {
     myHasFilesOutOfProjectRoots = false;
     Project project = getProject();
     if (project != null && !project.isDefault()) {
       for (VirtualFile file : myFiles) {
         if (FileIndexFacade.getInstance(project).getModuleForFile(file) == null) {
           myHasFilesOutOfProjectRoots = true;
           break;
         }
       }
     }
   }
   return myHasFilesOutOfProjectRoots;
 }
  void handleCommitWithoutPsi(@NotNull Document document) {
    final Pair<CharSequence, Long> prevPair = myLastCommittedTexts.remove(document);
    if (prevPair == null) {
      return;
    }

    if (!myProject.isInitialized() || myProject.isDisposed()) {
      return;
    }

    myUncommittedDocuments.remove(document);

    VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
    if (virtualFile == null || !FileIndexFacade.getInstance(myProject).isInContent(virtualFile)) {
      return;
    }

    final PsiFile psiFile = getPsiFile(document);
    if (psiFile == null) {
      return;
    }

    // we can end up outside write action here if the document has forUseInNonAWTThread=true
    ApplicationManager.getApplication()
        .runWriteAction(
            new ExternalChangeAction() {
              @Override
              public void run() {
                psiFile.getViewProvider().beforeContentsSynchronized();
                synchronized (PsiLock.LOCK) {
                  final int oldLength = prevPair.first.length();
                  PsiManagerImpl manager = (PsiManagerImpl) psiFile.getManager();
                  BlockSupportImpl.sendBeforeChildrenChangeEvent(manager, psiFile, true);
                  BlockSupportImpl.sendBeforeChildrenChangeEvent(manager, psiFile, false);
                  if (psiFile instanceof PsiFileImpl) {
                    ((PsiFileImpl) psiFile).onContentReload();
                  }
                  BlockSupportImpl.sendAfterChildrenChangedEvent(
                      manager, psiFile, oldLength, false);
                  BlockSupportImpl.sendAfterChildrenChangedEvent(manager, psiFile, oldLength, true);
                }
                psiFile.getViewProvider().contentsSynchronized();
              }
            });
  }
  @NotNull
  @Override
  public PsiClass[] getClasses(@NotNull PsiDirectory dir) {
    LOG.assertTrue(dir.isValid());

    boolean onlyCompiled =
        FileIndexFacade.getInstance(dir.getProject()).isInLibraryClasses(dir.getVirtualFile());

    List<PsiClass> classes = null;
    for (PsiFile file : dir.getFiles()) {
      if (onlyCompiled && !(file instanceof ClsFileImpl)) {
        continue;
      }
      if (file instanceof PsiClassOwner && file.getViewProvider().getLanguages().size() == 1) {
        PsiClass[] psiClasses = ((PsiClassOwner) file).getClasses();
        if (psiClasses.length == 0) continue;
        if (classes == null) classes = new ArrayList<PsiClass>();
        ContainerUtil.addAll(classes, psiClasses);
      }
    }
    return classes == null ? PsiClass.EMPTY_ARRAY : classes.toArray(new PsiClass[classes.size()]);
  }
 @NotNull
 @Override
 public GlobalSearchScope buildContentScope() {
   return new CoreProjectScopeBuilder.ContentSearchScope(
       myProject, FileIndexFacade.getInstance(myProject));
 }