From 0d042c5478e6ecda4bf4328960f8a632984da879 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 5 Jun 2012 18:24:18 +0200 Subject: [PATCH] [^anima] recreate completion file copy when the previous one is outdated --- .../completion/CodeCompletionHandlerBase.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index c5ed564d4f56..4715b4e5d53f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -776,6 +776,16 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { public static final Key>> FILE_COPY_KEY = Key.create("CompletionFileCopy"); + private static boolean isCopyUpToDate(Document document, @NotNull PsiFile file) { + if (!file.isValid()) { + return false; + } + // the psi file cache might have been cleared by some external activity, + // in which case PSI-document sync may stop working + PsiFile current = PsiDocumentManager.getInstance(file.getProject()).getPsiFile(document); + return current != null && current.getViewProvider().getPsi(file.getLanguage()) == file; + } + private static PsiFile createFileCopy(PsiFile file) { final VirtualFile virtualFile = file.getVirtualFile(); if (file.isPhysical() && virtualFile != null && virtualFile.getFileSystem() == LocalFileSystem.getInstance() @@ -784,7 +794,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { final SoftReference> reference = file.getUserData(FILE_COPY_KEY); if (reference != null) { final Pair pair = reference.get(); - if (pair != null && pair.first.isValid() && pair.first.getClass().equals(file.getClass())) { + if (pair != null && pair.first.getClass().equals(file.getClass()) && isCopyUpToDate(pair.second, pair.first)) { final PsiFile copy = pair.first; if (copy.getViewProvider().getModificationStamp() > file.getViewProvider().getModificationStamp()) { ((PsiModificationTrackerImpl) file.getManager().getModificationTracker()).incCounter();