summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/psi/stubs/StubProcessingHelper.java
blob: 92844c7d00b1307c3e1e27d9d51ca0d0810b0adf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.intellij.psi.stubs;

import com.intellij.diagnostic.LogMessageEx;
import com.intellij.openapi.diagnostic.Attachment;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiCompiledElement;
import com.intellij.psi.impl.source.PsiFileWithStubSupport;
import com.intellij.util.indexing.FileBasedIndex;

import java.util.List;

/**
 * Author: dmitrylomov
 */
public class StubProcessingHelper extends StubProcessingHelperBase {
  private final FileBasedIndex myFileBasedIndex;

  public StubProcessingHelper(FileBasedIndex fileBasedIndex) {
    myFileBasedIndex = fileBasedIndex;
  }

  @Override
  protected void onInternalError(final VirtualFile file) {
    // requestReindex() may want to acquire write lock (for indices not requiring content loading)
    // thus, because here we are under read lock, need to use invoke later
    ApplicationManager.getApplication().invokeLater(new Runnable() {
      @Override
      public void run() {
        myFileBasedIndex.requestReindex(file);
      }
    }, ModalityState.NON_MODAL);
  }


  @Override
  protected Object stubTreeAndIndexDoNotMatch(StubTree stubTree,
                                            PsiFileWithStubSupport psiFile,
                                            List<StubElement<?>> plained,
                                            VirtualFile virtualFile,
                                            StubTree stubTreeFromIndex) {
    String details = "Please report the problem to JetBrains with the file attached";
    details += "\npsiFile" + psiFile;
    details += "\npsiFile.class" + psiFile.getClass();
    details += "\npsiFile.lang" + psiFile.getLanguage();
    String fileText = psiFile instanceof PsiCompiledElement ? "compiled" : psiFile.getText();
    return LogMessageEx.createEvent("PSI and index do not match",
                                    details,
                                    new Attachment(virtualFile != null ? virtualFile.getPath() + "_file.txt" : "vFile.txt", fileText),
                                    new Attachment("stubTree.txt", ((PsiFileStubImpl)stubTree.getRoot()).printTree()),
                                    new Attachment("stubTreeFromIndex.txt", stubTreeFromIndex == null
                                                                            ? "null"
                                                                            : ((PsiFileStubImpl)stubTreeFromIndex.getRoot()).printTree()));
  }
}