diff --git a/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtilBase.java b/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtilBase.java index 51ea14c36bdd..256c24cde28f 100644 --- a/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtilBase.java +++ b/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtilBase.java @@ -444,7 +444,7 @@ public class InjectedLanguageUtilBase { PsiManagerEx psiManagerEx = PsiManagerEx.getInstanceEx(project); DebugUtil.performPsiModification("injected clearCaches", () -> - psiManagerEx.getFileManager().setViewProvider(virtualFile, null)); + psiManagerEx.getFileManager().dropViewProviders(virtualFile)); VirtualFile delegate = virtualFile.getDelegate(); if (!delegate.isValid()) return; diff --git a/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/MultipleRootsInjectedFileViewProvider.java b/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/MultipleRootsInjectedFileViewProvider.java index 69b0e0e8705f..6d1bc12848c8 100644 --- a/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/MultipleRootsInjectedFileViewProvider.java +++ b/platform/analysis-impl/src/com/intellij/psi/impl/source/tree/injected/MultipleRootsInjectedFileViewProvider.java @@ -102,7 +102,7 @@ class MultipleRootsInjectedFileViewProvider extends MultiplePsiFilesPerDocumentF @Override public final void forceCachedPsi(@NotNull PsiFile psiFile) { myRoots.put(psiFile.getLanguage(), (PsiFileImpl)psiFile); - getManager().getFileManager().setViewProvider(getVirtualFile(), this); + getManager().getFileManager().changeViewProvider(getVirtualFile(), this); } public void doNotInterruptMeWhileImPatchingLeaves(@NotNull Runnable runnable) { diff --git a/platform/core-impl/api-dump-experimental.txt b/platform/core-impl/api-dump-experimental.txt index df96ba8a6315..cdea176fabe3 100644 --- a/platform/core-impl/api-dump-experimental.txt +++ b/platform/core-impl/api-dump-experimental.txt @@ -102,7 +102,9 @@ f:com.intellij.psi.impl.PsiModificationTrackerImpl f:com.intellij.psi.impl.file.PsiFileImplUtil - *s:setNonPhysicalFileDeleteHandler(com.intellij.psi.PsiFile,java.util.function.Consumer):V com.intellij.psi.impl.file.impl.FileManager +- *a:changeViewProvider(com.intellij.openapi.vfs.VirtualFile,com.intellij.psi.FileViewProvider):V - *a:createFileViewProvider(com.intellij.openapi.vfs.VirtualFile,com.intellij.codeInsight.multiverse.CodeInsightContext,Z):com.intellij.psi.FileViewProvider +- *a:dropViewProviders(com.intellij.openapi.vfs.VirtualFile):V - *a:findCachedViewProvider(com.intellij.openapi.vfs.VirtualFile,com.intellij.codeInsight.multiverse.CodeInsightContext):com.intellij.psi.FileViewProvider - *a:findCachedViewProviders(com.intellij.openapi.vfs.VirtualFile):java.util.List - *a:findFile(com.intellij.openapi.vfs.VirtualFile,com.intellij.codeInsight.multiverse.CodeInsightContext):com.intellij.psi.PsiFile diff --git a/platform/core-impl/src/com/intellij/psi/AbstractFileViewProvider.java b/platform/core-impl/src/com/intellij/psi/AbstractFileViewProvider.java index 5c749cc1ac75..82d5b0bdad2f 100644 --- a/platform/core-impl/src/com/intellij/psi/AbstractFileViewProvider.java +++ b/platform/core-impl/src/com/intellij/psi/AbstractFileViewProvider.java @@ -182,9 +182,8 @@ public abstract class AbstractFileViewProvider extends UserDataHolderBase implem if (!isPhysical()) { FileManager fileManager = getManager().getFileManager(); VirtualFile virtualFile = getVirtualFile(); - // todo IJPL-339 check no real context is used here??? if (fileManager.findCachedViewProvider(virtualFile) == null && getCachedPsiFiles().isEmpty()) { - fileManager.setViewProvider(virtualFile, this); + fileManager.changeViewProvider(virtualFile, this); } } return getPsiInner(target); @@ -399,7 +398,7 @@ public abstract class AbstractFileViewProvider extends UserDataHolderBase implem public final void markInvalidated() { invalidateCachedPsi(); for (AbstractFileViewProvider copy : getKnownCopies()) { - myManager.getFileManager().setViewProvider(copy.getVirtualFile(), null); + myManager.getFileManager().dropViewProviders(copy.getVirtualFile()); } } diff --git a/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java b/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java index f6d2dad41aeb..f0636fdfa90b 100644 --- a/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java +++ b/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java @@ -48,7 +48,7 @@ public class DummyHolderViewProvider extends AbstractFileViewProvider { @Override public PsiFile getCachedPsi(@NotNull Language target) { - getManager().getFileManager().setViewProvider(getVirtualFile(), this); + getManager().getFileManager().changeViewProvider(getVirtualFile(), this); return target == getBaseLanguage() ? myHolder : null; } diff --git a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java index 9a7585498784..eac08fb7351f 100644 --- a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java +++ b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java @@ -254,6 +254,6 @@ public class SingleRootFileViewProvider extends AbstractFileViewProvider impleme if (prev != psiFile && prev instanceof PsiFileEx) { DebugUtil.performPsiModification(getClass().getName() + " PSI change", () -> ((PsiFileEx)prev).markInvalidated()); } - getManager().getFileManager().setViewProvider(getVirtualFile(), this); + getManager().getFileManager().changeViewProvider(getVirtualFile(), this); } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManager.java b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManager.java index c15c1da03f03..fa724946dcd7 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManager.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManager.java @@ -63,10 +63,23 @@ public interface FileManager { @Nullable FileViewProvider findCachedViewProvider(@NotNull VirtualFile vFile, @NotNull CodeInsightContext context); + /** @deprecated use {@link #changeViewProvider(VirtualFile, FileViewProvider)} or {@link #dropViewProviders(VirtualFile)} instead. */ + @Deprecated + void setViewProvider(@NotNull VirtualFile vFile, @Nullable FileViewProvider viewProvider); + + /** + * Requires write lock for physical files, and usually does not require a write lock for non-physical files. + *
+ * If a file has several view providers, all of them will be invalidated.
+ */
+ @ApiStatus.Experimental
+ void changeViewProvider(@NotNull VirtualFile vFile, @NotNull FileViewProvider viewProvider);
+
/**
* Requires write lock for physical files, and usually does not require a write lock for non-physical files.
*/
- void setViewProvider(@NotNull VirtualFile vFile, @Nullable FileViewProvider viewProvider);
+ @ApiStatus.Experimental
+ void dropViewProviders(@NotNull VirtualFile vFile);
@NotNull
List