IJPL-339 replace setViewProvider with changeViewProvider and dropViewProviders

GitOrigin-RevId: a96e9b80a8d17e6facbe90e2a3cdd493774e414e
This commit is contained in:
Max Medvedev
2025-11-14 23:26:52 +00:00
committed by intellij-monorepo-bot
parent e2ca1b7da2
commit b60cc80d2f
11 changed files with 50 additions and 28 deletions
@@ -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;
@@ -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) {
@@ -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
@@ -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());
}
}
@@ -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;
}
@@ -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);
}
}
@@ -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 <i>usually</i> does not require a write lock for non-physical files.
* <p>
* 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 <i>usually</i> 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<PsiFile> getAllCachedFiles();
@@ -145,7 +145,7 @@ public final class FileManagerImpl implements FileManagerEx {
return;
}
if (!CodeInsightContextUtil.isEventSystemEnabled(viewProviders)) {
setViewProvider(vFile, null);
dropViewProviders(vFile);
return;
}
@@ -159,13 +159,13 @@ public final class FileManagerImpl implements FileManagerEx {
event.setPropertyName(PsiTreeChangeEvent.PROP_UNLOADED_PSI);
myManager.beforePropertyChange(event);
setViewProvider(vFile, null);
dropViewProviders(vFile);
myManager.propertyChanged(event);
} else {
event.setParent(parentDir);
myManager.beforeChildrenChange(event);
setViewProvider(vFile, null);
dropViewProviders(vFile);
myManager.childrenChanged(event);
}
}
@@ -316,21 +316,16 @@ public final class FileManagerImpl implements FileManagerEx {
@Override
public void setViewProvider(@NotNull VirtualFile vFile, @Nullable FileViewProvider viewProvider) {
// todo IJPL-339 investigate if we need a context here
if (viewProvider == null) {
// Let's drop all providers.
// Please add a new method if you need to drop only a single provider. But this seems to be a suspicious idea,
// because shouldn't you drop other providers as well?
dropAllProviders(vFile);
dropViewProviders(vFile);
}
else {
changeFileProvider(vFile, viewProvider);
changeViewProvider(vFile, viewProvider);
}
}
private void changeFileProvider(@NotNull VirtualFile vFile,
@NotNull FileViewProvider viewProvider) {
@Override
public void changeViewProvider(@NotNull VirtualFile vFile, @NotNull FileViewProvider viewProvider) {
if (vFile instanceof LightVirtualFile) {
FileViewProvider prev = getRawCachedViewProvider(vFile, CodeInsightContexts.anyContext());
if (prev == viewProvider) return;
@@ -359,7 +354,8 @@ public final class FileManagerImpl implements FileManagerEx {
}
}
private void dropAllProviders(@NotNull VirtualFile vFile) {
@Override
public void dropViewProviders(@NotNull VirtualFile vFile) {
if (vFile instanceof LightVirtualFile) {
FileViewProvider oldProvider = vFile.getUserData(myPsiHardRefKey);
if (oldProvider != null) {
@@ -110,6 +110,16 @@ public final class MockFileManager implements FileManager {
myViewProviders.put(vFile, viewProvider);
}
@Override
public void changeViewProvider(@NotNull VirtualFile vFile, @NotNull FileViewProvider viewProvider) {
myViewProviders.put(vFile, viewProvider);
}
@Override
public void dropViewProviders(@NotNull VirtualFile vFile) {
myViewProviders.remove(vFile);
}
@Override
public @NotNull List<PsiFile> getAllCachedFiles() {
throw new UnsupportedOperationException("Method getAllCachedFiles is not yet implemented in " + getClass().getName());
@@ -107,7 +107,7 @@ private class PsiVFSListener(private val project: Project) {
val psiFile = fileManager.getCachedPsiFileInner(vFile, anyContext())
var element: PsiElement?
if (psiFile != null) {
fileManager.setViewProvider(vFile, null)
fileManager.dropViewProviders(vFile)
element = psiFile
}
else {
@@ -141,7 +141,7 @@ private class PsiVFSListener(private val project: Project) {
private fun clearViewProvider(vFile: VirtualFile, why: String) {
DebugUtil.performPsiModification<RuntimeException>(why) {
fileManager.setViewProvider(vFile, null)
fileManager.dropViewProviders(vFile)
}
}
@@ -305,7 +305,7 @@ private class PsiVFSListener(private val project: Project) {
manager.childRemoved(treeEvent)
}
else if (!FileManagerImpl.areViewProvidersEquivalent(fileViewProvider, oldFileViewProvider!!)) {
fileManager.setViewProvider(vFile, fileViewProvider)
fileManager.changeViewProvider(vFile, fileViewProvider)
treeEvent.oldChild = oldPsiFile
treeEvent.newChild = newPsiFile
@@ -322,7 +322,7 @@ private class PsiVFSListener(private val project: Project) {
}
}
else if (newPsiFile != null) {
fileManager.setViewProvider(vFile, fileViewProvider)
fileManager.changeViewProvider(vFile, fileViewProvider)
if (parentDir != null) {
treeEvent.child = newPsiFile
manager.childAdded(treeEvent)
@@ -455,7 +455,9 @@ private class PsiVFSListener(private val project: Project) {
ApplicationManager.getApplication().runWriteAction(ExternalChangeActionUtil.externalChangeAction {
val treeEvent = PsiTreeChangeEventImpl(manager)
if (oldElement == null) {
fileManager.setViewProvider(vFile, newViewProvider)
if (newViewProvider != null) {
fileManager.changeViewProvider(vFile, newViewProvider)
}
treeEvent.parent = newParentDir
treeEvent.child = newElement
manager.childAdded(treeEvent)
@@ -476,7 +478,7 @@ private class PsiVFSListener(private val project: Project) {
manager.childMoved(treeEvent)
}
else {
fileManager.setViewProvider(vFile, newViewProvider)
fileManager.changeViewProvider(vFile, newViewProvider)
val treeRemoveEvent = PsiTreeChangeEventImpl(manager)
treeRemoveEvent.parent = oldParentDir
treeRemoveEvent.child = oldElement
@@ -118,7 +118,7 @@ internal class FileContextTest {
}
writeAction {
psiManager.fileManager.setViewProvider(virtualFile, null)
psiManager.fileManager.dropViewProviders(virtualFile)
}
}
while (true)