refactor [platform]: introduce PsiDocumentManagerEx and remove downcasts to PsiDocumentManagerBase

GitOrigin-RevId: 2870b0fc778ee4d9349dd465db92107abd25dbbd
This commit is contained in:
Andrey Zaytsev
2025-11-25 19:25:37 +00:00
committed by intellij-monorepo-bot
parent 44860a567a
commit 853cd06936
44 changed files with 228 additions and 89 deletions
@@ -12,6 +12,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.testFramework.LightVirtualFileBase;
import com.intellij.util.ObjectUtils;
import com.intellij.util.PathUtil;
@@ -177,6 +178,6 @@ public class GridUtilCore {
if (oldFile instanceof LightVirtualFileBase lf) {
lf.setValid(false);
}
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(psiFile.getProject())).associatePsi(document, psiFile);
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(psiFile.getProject())).associatePsi(document, psiFile);
}
}
@@ -16,6 +16,7 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.refactoring.extractMethod.ExtractMethodProcessor;
import com.intellij.ui.*;
import com.intellij.ui.content.Content;
@@ -140,7 +141,7 @@ class PreviewPanel extends BorderLayoutPanel implements Disposable, UiDataProvid
myUpdateAlarm.cancelAllRequests();
myUpdateAlarm.addRequest(() -> {
if (myProject.isDisposed()) return;
PsiDocumentManagerBase documentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject);
PsiDocumentManagerEx documentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject);
documentManager.cancelAndRunWhenAllCommitted("ExtractMethodPreview", this::updateImmediately);
}, 300);
}
@@ -16,6 +16,7 @@ import com.intellij.psi.*
import com.intellij.psi.PsiLanguageInjectionHost.Shred
import com.intellij.psi.codeStyle.CodeStyleManager
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.psi.impl.source.resolve.FileContextUtil
import com.intellij.psi.impl.source.tree.injected.changesHandler.*
import com.intellij.psi.util.createSmartPointer
@@ -31,7 +32,7 @@ internal class JavaInjectedFileChangesHandler(shreds: List<Shred>, editor: Edito
myHostDocument.addDocumentListener(object : DocumentListener {
override fun documentChanged(event: DocumentEvent) {
if (UndoManager.getInstance(myProject).isUndoInProgress) {
(PsiDocumentManager.getInstance(myProject) as PsiDocumentManagerBase).addRunOnCommit(myHostDocument) { thisDoc ->
(PsiDocumentManager.getInstance(myProject) as PsiDocumentManagerEx).addRunOnCommit(myHostDocument) { thisDoc ->
rebuildMarkers(markersWholeRange(markers) ?: failAndReport("can't get marker range in undo", event))
}
}
@@ -8,6 +8,7 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.testFramework.PlatformTestUtil;
import org.jetbrains.annotations.NotNull;
@@ -36,7 +37,7 @@ public class I18nQuickFixTest extends LightQuickFixParameterizedTestCase {
protected void tearDown() throws Exception {
try {
// avoid "memory/disk conflict" when the document for changed annotation.xml stays in memory
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(getProject())).clearUncommittedDocuments();
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(getProject())).clearUncommittedDocuments();
}
catch (Throwable e) {
addSuppressedException(e);
@@ -18,6 +18,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.search.JavaNullMethodArgumentUtil;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.search.GlobalSearchScope;
@@ -39,7 +40,7 @@ public class ConcurrentIndexTest extends JavaCodeInsightFixtureTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(getProject())).disableBackgroundCommit(getProject());
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(getProject())).disableBackgroundCommit(getProject());
}
public void test_concurrent_switching_with_checkCanceled() throws ExecutionException, InterruptedException {
@@ -55,7 +55,7 @@ class PsiJavaModuleModificationTrackerTest : LightJavaCodeInsightFixtureTestCase
val file = fixture.configureByText("manifest.mf", "${PsiJavaModule.AUTO_MODULE_NAME} = M1\n")
doTestIncremented {
WriteCommandAction.runWriteCommandAction(fixture.project) {
val documentManager = PsiDocumentManagerBase.getInstance(fixture.project)
val documentManager = PsiDocumentManager.getInstance(fixture.project)
val document = documentManager.getDocument(file)!!
document.setText("${PsiJavaModule.AUTO_MODULE_NAME} = M2\n")
documentManager.commitDocument(document)
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiCompiledFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiFileEx;
import com.intellij.util.ArrayUtil;
import com.intellij.util.concurrency.ThreadingAssertions;
@@ -60,7 +61,7 @@ public final class TextEditorBackgroundHighlighter implements BackgroundEditorHi
return List.of();
}
PsiDocumentManagerBase documentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(project);
PsiDocumentManagerEx documentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(project);
Document document = editor.getDocument();
if (!documentManager.isCommitted(document)) {
LOG.error(document + documentManager.someDocumentDebugInfo(document));
@@ -134,7 +135,7 @@ public final class TextEditorBackgroundHighlighter implements BackgroundEditorHi
public static @Nullable PsiFile getCachedFileToHighlight(@NotNull Project project,
@NotNull VirtualFile virtualFile,
@NotNull CodeInsightContext context) {
PsiDocumentManagerBase psiDocumentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(project);
PsiDocumentManagerEx psiDocumentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(project);
PsiFile psiFile = psiDocumentManager.getRawCachedFile(virtualFile, context);
if (psiFile instanceof PsiCompiledFile compiled) {
psiFile = (PsiFile)compiled.getCachedMirror();
@@ -25,6 +25,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.source.resolve.FileContextUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ObjectUtils;
@@ -422,7 +423,7 @@ public final class InjectedLanguageManagerImpl extends InjectedLanguageManager i
public @NotNull DocumentWindow freezeWindow(@NotNull DocumentWindow document) {
Place shreds = ((DocumentWindowImpl)document).getShreds();
Project project = shreds.getHostPointer().getProject();
DocumentEx delegate = ((PsiDocumentManagerBase)PsiDocumentManager.getInstance(project)).getLastCommittedDocument(document.getDelegate());
DocumentEx delegate = ((PsiDocumentManagerEx)PsiDocumentManager.getInstance(project)).getLastCommittedDocument(document.getDelegate());
Place place = new Place(ContainerUtil.map(shreds, shred -> ((ShredImpl)shred).withPsiRange()));
return new DocumentWindowImpl(delegate, place);
}
@@ -336,7 +336,7 @@ public final class InjectedLanguageUtil extends InjectedLanguageUtilBase {
@NotNull ProgressIndicator indicator,
@NotNull ASTNode oldRoot,
@NotNull ASTNode newRoot,
@NotNull PsiDocumentManagerBase documentManager) {
@NotNull PsiDocumentManager documentManager) {
Language language = injectedPsiFile.getLanguage();
InjectedFileViewProvider provider = (InjectedFileViewProvider)injectedPsiFile.getViewProvider();
VirtualFile oldInjectedVFile = provider.getVirtualFile();
@@ -52,7 +52,7 @@ import java.util.*;
@ApiStatus.Internal
public final class InjectionRegistrarImpl implements MultiHostRegistrar {
private final PsiDocumentManagerBase myDocumentManagerBase;
private final PsiDocumentManagerEx myDocumentManagerBase;
private List<PsiFile> resultFiles;
private List<Pair<ReferenceInjector, Place>> resultReferences;
private Language myLanguage;
@@ -78,7 +78,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
FileViewProvider viewProvider = myHostPsiFile.getViewProvider();
if (viewProvider instanceof InjectedFileViewProvider) throw new IllegalArgumentException(viewProvider +" must not be injected");
myHostVirtualFile = viewProvider.getVirtualFile();
myDocumentManagerBase = (PsiDocumentManagerBase)docManager;
myDocumentManagerBase = (PsiDocumentManagerEx)docManager;
myHostDocument = (DocumentEx)viewProvider.getDocument();
}
@@ -245,7 +245,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
@NotNull PsiFile hostPsiFile,
@NotNull VirtualFile hostVirtualFile,
@NotNull DocumentEx hostDocument,
@NotNull PsiDocumentManagerBase documentManager) {
@NotNull PsiDocumentManagerEx documentManager) {
boolean isAncestor = false;
for (PlaceInfo info : placeInfos) {
isAncestor |= PsiTreeUtil.isAncestor(contextElement, info.host, false);
@@ -294,7 +294,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
}
private static @NotNull PsiFile createOrMergeInjectedFile(@NotNull PsiFile hostPsiFile,
@NotNull PsiDocumentManagerBase documentManager,
@NotNull PsiDocumentManagerEx documentManager,
@NotNull Place place,
@NotNull DocumentWindowImpl documentWindow,
@NotNull PsiFile injectedPsiFile,
@@ -409,7 +409,8 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
@NotNull PsiFile hostPsiFile,
@NotNull VirtualFile hostVirtualFile,
@NotNull DocumentEx hostDocument,
@NotNull List<PlaceInfo> placeInfos, @NotNull PsiDocumentManagerBase documentManager) {
@NotNull List<PlaceInfo> placeInfos,
@NotNull PsiDocumentManager documentManager) {
return msg + ".\n" +
"OK let's see. Host file: " + hostPsiFile + " in '" + hostVirtualFile.getPresentableUrl() + "' (" + hostPsiFile.getLanguage()+") " +
(documentManager.isUncommited(hostDocument) ? " (uncommitted)" : "") + "\n" +
@@ -433,7 +434,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
return node;
}
private static void assertEverythingIsAllright(@NotNull PsiDocumentManagerBase documentManager,
private static void assertEverythingIsAllright(@NotNull PsiDocumentManagerEx documentManager,
@NotNull DocumentWindowImpl documentWindow,
@NotNull PsiFile psiFile) {
InjectedFileViewProvider injectedFileViewProvider = (InjectedFileViewProvider)psiFile.getViewProvider();
@@ -572,7 +573,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
@NotNull ProgressIndicator indicator,
@NotNull ASTNode oldRoot,
@NotNull ASTNode newRoot,
@NotNull PsiDocumentManagerBase documentManager) {
@NotNull PsiDocumentManager documentManager) {
Project project = hostPsiFile.getProject();
String newText = oldDocumentWindow.getText();
FileASTNode oldNode = oldInjectedPsi.getNode();
@@ -683,7 +684,7 @@ public final class InjectionRegistrarImpl implements MultiHostRegistrar {
@NotNull CharSequence documentText,
@NotNull List<PlaceInfo> placeInfos,
@NotNull StringBuilder decodedChars,
@NotNull String fileName, @NotNull PsiDocumentManagerBase documentManager) {
@NotNull String fileName, @NotNull PsiDocumentManager documentManager) {
VirtualFileWindowImpl virtualFile = new VirtualFileWindowImpl(fileName, hostVirtualFile, documentWindow, language, decodedChars);
Language finalLanguage = forcedLanguage == null ? LanguageSubstitutors.getInstance().substituteLanguage(language, virtualFile, project) : forcedLanguage;
InjectedFileViewProvider viewProvider = InjectedFileViewProvider.create(PsiManagerEx.getInstanceEx(project), virtualFile, documentWindow, finalLanguage);
@@ -16,6 +16,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.impl.DebugUtil;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiToDocumentSynchronizer;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtilBase;
import org.jetbrains.annotations.NotNull;
@@ -62,7 +63,7 @@ public final class FormattingDocumentModelImpl implements FormattingDocumentMode
final Document document = PsiDocumentManager.getInstance(project).getDocument(psiFile);
if (document != null) {
if (PsiDocumentManager.getInstance(project).isUncommited(document)) return null;
PsiToDocumentSynchronizer synchronizer = ((PsiDocumentManagerBase)PsiDocumentManager.getInstance(project)).getSynchronizer();
PsiToDocumentSynchronizer synchronizer = ((PsiDocumentManagerEx)PsiDocumentManager.getInstance(project)).getSynchronizer();
if (synchronizer.isDocumentAffectedByTransactions(document)) return null;
}
return document;
@@ -35,6 +35,7 @@ import com.intellij.pom.tree.events.impl.TreeChangeImpl;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.file.impl.FileManager;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
@@ -443,7 +444,7 @@ public final class PostprocessReformattingAspectImpl extends PostprocessReformat
for (PsiFile file : viewProvider.getAllFiles()) {
if (file.getUserData(REPARSE_PENDING) != null || rootsToReparse.contains(file)) {
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).reparseFileFromText((PsiFileImpl)file);
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject)).reparseFileFromText((PsiFileImpl)file);
file.putUserData(REPARSE_PENDING, null);
}
}
+1 -1
View File
@@ -77,9 +77,9 @@ a:com.intellij.openapi.fileEditor.impl.FileDocumentManagerBase
- getLanguage():com.intellij.lang.Language
- getReferences():com.intellij.psi.PsiReference[]
a:com.intellij.psi.impl.PsiDocumentManagerBase
- com.intellij.psi.PsiDocumentManager
- com.intellij.openapi.Disposable
- com.intellij.openapi.editor.event.DocumentListener
- com.intellij.psi.PsiDocumentManager
- *:getPsiFile(com.intellij.openapi.editor.Document,com.intellij.codeInsight.multiverse.CodeInsightContext):com.intellij.psi.PsiFile
*:com.intellij.psi.impl.PsiDocumentTransactionListenerBackgroundable
- com.intellij.psi.impl.PsiDocumentTransactionListener
+1 -8
View File
@@ -1890,23 +1890,20 @@ f:com.intellij.psi.impl.PsiCachedValueImpl$SoftTracked
- com.intellij.psi.util.CachedValue
- <init>(com.intellij.psi.PsiManager,com.intellij.psi.util.CachedValueProvider):V
a:com.intellij.psi.impl.PsiDocumentManagerBase
- com.intellij.psi.PsiDocumentManager
- com.intellij.openapi.Disposable
- com.intellij.openapi.editor.event.DocumentListener
- com.intellij.psi.PsiDocumentManager
- p:<init>(com.intellij.openapi.project.Project):V
- associatePsi(com.intellij.openapi.editor.Document,com.intellij.psi.PsiFile):V
- beforeDocumentChange(com.intellij.openapi.editor.event.DocumentEvent):V
- p:beforeDocumentChangeOnUnlockedDocument(com.intellij.psi.FileViewProvider):V
- bulkUpdateFinished(com.intellij.openapi.editor.Document):V
- bulkUpdateStarting(com.intellij.openapi.editor.Document):V
- cancelAndRunWhenAllCommitted(java.lang.Object,java.lang.Runnable):Z
- s:checkConsistency(com.intellij.psi.PsiFile,com.intellij.openapi.editor.Document):Z
- commitAllDocuments():V
- commitAllDocumentsUnderProgress():Z
- commitAndRunReadAction(com.intellij.openapi.util.Computable):java.lang.Object
- commitAndRunReadAction(java.lang.Runnable):V
- commitDocument(com.intellij.openapi.editor.Document):V
- disableBackgroundCommit(com.intellij.openapi.Disposable):V
- dispose():V
- doPostponedOperationsAndUnblockDocument(com.intellij.openapi.editor.Document):V
- documentChanged(com.intellij.openapi.editor.event.DocumentEvent):V
@@ -1915,8 +1912,6 @@ a:com.intellij.psi.impl.PsiDocumentManagerBase
- getCachedDocument(com.intellij.psi.PsiFile):com.intellij.openapi.editor.Document
- f:getCachedPsiFile(com.intellij.openapi.editor.Document):com.intellij.psi.PsiFile
- getDocument(com.intellij.psi.PsiFile):com.intellij.openapi.editor.Document
- getEventsSinceCommit(com.intellij.openapi.editor.Document):java.util.List
- getLastCommittedDocument(com.intellij.openapi.editor.Document):com.intellij.openapi.editor.ex.DocumentEx
- getLastCommittedDocument(com.intellij.psi.PsiFile):com.intellij.openapi.editor.Document
- getLastCommittedStamp(com.intellij.openapi.editor.Document):J
- getLastCommittedText(com.intellij.openapi.editor.Document):java.lang.CharSequence
@@ -1928,14 +1923,12 @@ a:com.intellij.psi.impl.PsiDocumentManagerBase
- hasUncommitedDocuments():Z
- isCommitInProgress():Z
- isCommitted(com.intellij.openapi.editor.Document):Z
- isDefaultProject():Z
- isDocumentBlockedByPsi(com.intellij.openapi.editor.Document):Z
- isUncommited(com.intellij.openapi.editor.Document):Z
- performForCommittedDocument(com.intellij.openapi.editor.Document,java.lang.Runnable):V
- performLaterWhenAllCommitted(com.intellij.openapi.application.ModalityState,java.lang.Runnable):V
- performLaterWhenAllCommitted(java.lang.Runnable):V
- performWhenAllCommitted(java.lang.Runnable):Z
- reparseFileFromText(com.intellij.psi.impl.source.PsiFileImpl):V
- reparseFiles(java.util.Collection,Z):V
- someDocumentDebugInfo(com.intellij.openapi.editor.Document):java.lang.String
a:com.intellij.psi.impl.PsiElementBase
@@ -6,7 +6,7 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.DocumentCommitProcessor;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import org.jetbrains.annotations.NotNull;
final class MockDocumentCommitProcessor implements DocumentCommitProcessor {
@@ -16,7 +16,7 @@ final class MockDocumentCommitProcessor implements DocumentCommitProcessor {
@Override
public void commitAsynchronously(@NotNull Project project,
@NotNull PsiDocumentManagerBase documentManager,
@NotNull PsiDocumentManagerEx documentManager,
@NotNull Document document,
@NotNull Object reason,
@NotNull ModalityState modality) {
@@ -178,7 +178,7 @@ public class PomModelImpl extends UserDataHolderBase implements PomModel {
}
private void commitTransaction(@NotNull PsiFile containingFileByTree, @Nullable Document document) {
final PsiDocumentManagerBase manager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject);
final PsiDocumentManagerEx manager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject);
final PsiToDocumentSynchronizer synchronizer = manager.getSynchronizer();
boolean isFromCommit = manager.isCommitInProgress();
@@ -255,7 +255,7 @@ public class PomModelImpl extends UserDataHolderBase implements PomModel {
@Contract("_,null -> null")
private @Nullable Document startTransaction(@NotNull PomTransaction transaction, @Nullable PsiFile psiFile) {
final PsiDocumentManagerBase manager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject);
final PsiDocumentManagerEx manager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject);
final PsiToDocumentSynchronizer synchronizer = manager.getSynchronizer();
final PsiElement changeScope = transaction.getChangeScope();
@@ -9,6 +9,7 @@ import com.intellij.pom.tree.events.impl.TreeChangeEventImpl;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiManagerImpl;
import org.jetbrains.annotations.NotNull;
@@ -27,7 +28,7 @@ public final class PsiEventWrapperAspect implements PomModelAspect {
PsiFile file = (PsiFile)changeSet.getRootElement().getPsi();
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(file.getProject())).getSynchronizer().processEvents(changeSet, file);
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(file.getProject())).getSynchronizer().processEvents(changeSet, file);
if (PomModelImpl.shouldFirePhysicalPsiEvents(file)) {
PsiManagerImpl.runWriteActionOnEdtRegardlessOfCurrentThread(() -> changeSet.fireEvents());
@@ -337,7 +337,7 @@ public abstract class AbstractFileViewProvider extends UserDataHolderBase implem
return;
}
if (document != null &&
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myManager.getProject())).getSynchronizer().isInSynchronization(document)) {
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(myManager.getProject())).getSynchronizer().isInSynchronization(document)) {
return;
}
@@ -15,6 +15,7 @@ import com.intellij.openapi.vfs.VirtualFileUtil;
import com.intellij.openapi.vfs.limits.FileSizeLimit;
import com.intellij.psi.impl.DebugUtil;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiFileEx;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.util.PsiUtilCore;
@@ -65,8 +66,8 @@ public class SingleRootFileViewProvider extends AbstractFileViewProvider impleme
super(manager, virtualFile, eventSystemEnabled);
myBaseLanguage = language;
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(manager.getProject());
if (documentManager instanceof PsiDocumentManagerBase) {
((PsiDocumentManagerBase)documentManager).assertFileIsFromCorrectProject(virtualFile);
if (documentManager instanceof PsiDocumentManagerEx) {
((PsiDocumentManagerEx)documentManager).assertFileIsFromCorrectProject(virtualFile);
}
}
@@ -81,8 +81,7 @@ public final class ChangedPsiRangeUtil {
if (!file.getViewProvider().supportsIncrementalReparse(file.getLanguage())) {
return new ProperTextRange(0, psiLength);
}
List<DocumentEvent> events = ((PsiDocumentManagerBase)PsiDocumentManager.getInstance(file.getProject())).getEventsSinceCommit(
document);
List<DocumentEvent> events = ((PsiDocumentManagerEx)PsiDocumentManager.getInstance(file.getProject())).getEventsSinceCommit(document);
int prefix = Integer.MAX_VALUE;
int suffix = Integer.MAX_VALUE;
int lengthBeforeEvent = psiLength;
@@ -252,7 +252,7 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
viewProvider.beforeContentsSynchronized();
Document document = viewProvider.getDocument();
PsiDocumentManagerBase documentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(file.getProject());
PsiDocumentManagerEx documentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(file.getProject());
PsiToDocumentSynchronizer.DocumentChangeTransaction transaction = documentManager.getSynchronizer().getTransaction(document);
if (transaction == null) {
@@ -14,7 +14,7 @@ public interface DocumentCommitProcessor {
void commitSynchronously(@NotNull Document document, @NotNull Project project, @NotNull PsiFile psiFile);
void commitAsynchronously(@NotNull Project project,
@NotNull PsiDocumentManagerBase documentManager,
@NotNull PsiDocumentManagerEx documentManager,
@NotNull Document document,
@NonNls @NotNull Object reason,
@NotNull ModalityState modality);
@@ -51,7 +51,6 @@ import com.intellij.util.concurrency.ThreadingAssertions;
import com.intellij.util.concurrency.annotations.RequiresEdt;
import com.intellij.util.containers.CollectionFactory;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.EdtInvocationManager;
import org.jetbrains.annotations.*;
import java.util.*;
@@ -60,7 +59,7 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
public abstract class PsiDocumentManagerBase extends PsiDocumentManager implements DocumentListener, Disposable {
public abstract class PsiDocumentManagerBase extends PsiDocumentManagerEx implements DocumentListener, Disposable {
private static final Logger LOG = Logger.getInstance(PsiDocumentManagerBase.class);
private static final Key<Document> HARD_REF_TO_DOCUMENT = Key.create("HARD_REFERENCE_TO_DOCUMENT");
@@ -141,6 +140,14 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
return psiFile;
}
@Override
@ApiStatus.Internal
public @NotNull Project getProject() {
return myProject;
}
@Override
@ApiStatus.Internal
public void associatePsi(@NotNull Document document, @NotNull PsiFile file) {
if (file.getProject() != myProject) {
throw new IllegalArgumentException("Method associatePsi() called with file from the wrong project. Expected: "+myProject+" but got: "+file.getProject());
@@ -171,12 +178,14 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
* It's guaranteed to not perform any expensive ops like creating files/reparse/resurrecting PsiFile from temp comatose state.
*/
@ApiStatus.Internal
@Override
public final @Nullable PsiFile getRawCachedFile(@NotNull VirtualFile virtualFile, @NotNull CodeInsightContext context) {
FileManagerEx manager = ((FileManagerEx)getFileManager());
return manager.getRawCachedFile(virtualFile, context);
}
@ApiStatus.Internal
@Override
public final @NotNull @Unmodifiable List<FileViewProvider> getCachedViewProviders(@NotNull Document document) {
VirtualFile virtualFile = getVirtualFile(document);
if (virtualFile == null) return Collections.emptyList();
@@ -339,6 +348,8 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
* The action will be executed in EDT.
* @return true if action has been run immediately, or false if action was scheduled for execution later.
*/
@Override
@ApiStatus.Internal
public boolean cancelAndRunWhenAllCommitted(@NonNls @NotNull Object key, @NotNull Runnable action) {
ThreadingAssertions.assertEventDispatchThread();
if (myProject.isDisposed()) {
@@ -379,6 +390,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
* {@code addRunOnCommit(document, d->d.getText())}
*/
@ApiStatus.Internal
@Override
public void addRunOnCommit(@NotNull Document document, @NotNull Consumer<? super @NotNull Document> action) {
List<Consumer<? super Document>> actions = documentCommitActions.computeIfAbsent(document, __ -> ContainerUtil.createConcurrentList());
actions.add(ThreadContext.captureThreadContext(action));
@@ -423,6 +435,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@ApiStatus.Internal
@Override
public boolean isEventSystemEnabled(@NotNull Document document) {
return ReadAction.compute(() -> {
List<FileViewProvider> viewProviders = getCachedViewProviders(document);
@@ -431,6 +444,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@ApiStatus.Internal
@Override
public boolean finishCommit(@NotNull Document document,
@NotNull @Unmodifiable List<? extends BooleanRunnable> finishProcessors,
@NotNull @Unmodifiable List<? extends BooleanRunnable> reparseInjectedProcessors,
@@ -535,6 +549,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@ApiStatus.Internal
@Override
public void forceReload(@Nullable VirtualFile virtualFile, @NotNull @Unmodifiable List<? extends FileViewProvider> viewProviders) {
if (!viewProviders.isEmpty()) {
DebugUtil.performPsiModification("psi.forceReload", () -> {
@@ -596,6 +611,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
// true if the PSI is being modified and events being sent
@Override
public boolean isCommitInProgress() {
return myIsCommitInProgress.get() != null || isFullReparseInProgress();
}
@@ -893,6 +909,8 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
return document == null ? null : getLastCommittedDocument(document);
}
@Override
@ApiStatus.Internal
public @NotNull DocumentEx getLastCommittedDocument(@NotNull Document document) {
if (document instanceof FrozenDocument) return (DocumentEx)document;
@@ -929,6 +947,8 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
throw new UnsupportedOperationException();
}
@Override
@ApiStatus.Internal
public @NotNull @Unmodifiable List<DocumentEvent> getEventsSinceCommit(@NotNull Document document) {
assert document instanceof DocumentImpl : document;
UncommittedInfo info = getUncommittedInfo(document);
@@ -951,11 +971,13 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@ApiStatus.Internal
@Override
public @NotNull Map<Document, Throwable> getUncommitedDocumentsWithTraces() {
return Collections.unmodifiableMap(myUncommittedDocumentTraces);
}
@ApiStatus.Internal
@Override
public boolean isInUncommittedSet(@NotNull Document document) {
return myUncommittedDocuments.contains(getTopLevelDocument(document));
}
@@ -1165,6 +1187,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@ApiStatus.Internal
@Override
public void handleCommitWithoutPsi(@NotNull Document document) {
UncommittedInfo prevInfo = clearUncommittedInfo(document);
if (prevInfo == null) {
@@ -1287,6 +1310,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
@TestOnly
@ApiStatus.Internal
@Override
public void clearUncommittedDocuments() {
myUncommittedDocuments.clear();
myUncommittedDocumentTraces.clear();
@@ -1294,6 +1318,8 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
@TestOnly
@Override
@ApiStatus.Internal
public void disableBackgroundCommit(@NotNull Disposable parentDisposable) {
assert myPerformBackgroundCommit;
myPerformBackgroundCommit = false;
@@ -1303,10 +1329,13 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
@Override
public void dispose() {}
@Override
public @NotNull PsiToDocumentSynchronizer getSynchronizer() {
return mySynchronizer;
}
@Override
@ApiStatus.Internal
public void reparseFileFromText(@NotNull PsiFileImpl file) {
if (isCommitInProgress()) {
throw new IllegalStateException("Re-entrant commit is not allowed");
@@ -1336,22 +1365,25 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
}
}
@NotNull
@ApiStatus.Internal
public @Unmodifiable List<BooleanRunnable> reparseChangedInjectedFragments(@NotNull Document hostDocument,
@NotNull PsiFile hostPsiFile,
@NotNull TextRange range,
@NotNull ProgressIndicator indicator,
@NotNull ASTNode oldRoot,
@NotNull ASTNode newRoot) {
@Override
public @NotNull @Unmodifiable List<BooleanRunnable> reparseChangedInjectedFragments(@NotNull Document hostDocument,
@NotNull PsiFile hostPsiFile,
@NotNull TextRange range,
@NotNull ProgressIndicator indicator,
@NotNull ASTNode oldRoot,
@NotNull ASTNode newRoot) {
return Collections.emptyList();
}
@TestOnly
@Override
@ApiStatus.Internal
public boolean isDefaultProject() {
return myProject.isDefault();
}
@Override
public @NonNls String someDocumentDebugInfo(@NotNull Document document) {
@NotNull List<FileViewProvider> viewProviders = getCachedViewProviders(document);
return "cachedProvider: " + viewProviders +
@@ -1365,6 +1397,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen
* Try to find the project the {@code virtualFile} belongs to (from the directory structure the file located in) and make sure it's the same as {@link #myProject}
*/
@ApiStatus.Internal
@Override
public void assertFileIsFromCorrectProject(@NotNull VirtualFile virtualFile) {}
@TestOnly
@@ -0,0 +1,86 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.impl;
import com.intellij.codeInsight.multiverse.CodeInsightContext;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.PsiFileImpl;
import org.jetbrains.annotations.*;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
@ApiStatus.Internal
public abstract class PsiDocumentManagerEx extends PsiDocumentManager implements Disposable {
public abstract @NotNull Project getProject();
public abstract void associatePsi(@NotNull Document document, @NotNull PsiFile file);
public abstract @Nullable PsiFile getRawCachedFile(@NotNull VirtualFile virtualFile, @NotNull CodeInsightContext context);
public abstract @NotNull @Unmodifiable List<FileViewProvider> getCachedViewProviders(@NotNull Document document);
public abstract boolean cancelAndRunWhenAllCommitted(@NonNls @NotNull Object key, @NotNull Runnable action);
public abstract void addRunOnCommit(@NotNull Document document, @NotNull Consumer<? super @NotNull Document> action);
public abstract boolean isEventSystemEnabled(@NotNull Document document);
public abstract boolean finishCommit(@NotNull Document document,
@NotNull @Unmodifiable List<? extends BooleanRunnable> finishProcessors,
@NotNull @Unmodifiable List<? extends BooleanRunnable> reparseInjectedProcessors,
boolean synchronously,
@NotNull Object reason);
public abstract void forceReload(@Nullable VirtualFile virtualFile,
@NotNull @Unmodifiable List<? extends FileViewProvider> viewProviders);
// true if the PSI is being modified and events being sent
public abstract boolean isCommitInProgress();
public abstract @NotNull DocumentEx getLastCommittedDocument(@NotNull Document document);
public abstract @NotNull @Unmodifiable List<DocumentEvent> getEventsSinceCommit(@NotNull Document document);
public abstract @NotNull Map<Document, Throwable> getUncommitedDocumentsWithTraces();
public abstract boolean isInUncommittedSet(@NotNull Document document);
public abstract void handleCommitWithoutPsi(@NotNull Document document);
@TestOnly
public abstract void clearUncommittedDocuments();
@TestOnly
public abstract void disableBackgroundCommit(@NotNull Disposable parentDisposable);
public abstract @NotNull PsiToDocumentSynchronizer getSynchronizer();
public abstract void reparseFileFromText(@NotNull PsiFileImpl file);
@NotNull
public abstract @Unmodifiable List<BooleanRunnable> reparseChangedInjectedFragments(@NotNull Document hostDocument,
@NotNull PsiFile hostPsiFile,
@NotNull TextRange range,
@NotNull ProgressIndicator indicator,
@NotNull ASTNode oldRoot,
@NotNull ASTNode newRoot);
@TestOnly
public abstract boolean isDefaultProject();
public abstract @NonNls String someDocumentDebugInfo(@NotNull Document document);
public abstract void assertFileIsFromCorrectProject(@NotNull VirtualFile virtualFile);
}
@@ -44,13 +44,13 @@ public class PsiToDocumentSynchronizer {
private static final Logger LOG = Logger.getInstance(PsiToDocumentSynchronizer.class);
private static final Key<Boolean> PSI_DOCUMENT_ATOMIC_ACTION = Key.create("PSI_DOCUMENT_ATOMIC_ACTION");
private final PsiDocumentManagerBase myPsiDocumentManager;
private final PsiDocumentManagerEx myPsiDocumentManager;
private final MessageBus myBus;
private final Map<Document, Pair<DocumentChangeTransaction, Integer>> myTransactionsMap = new ConcurrentHashMap<>();
private volatile Document mySyncDocument;
PsiToDocumentSynchronizer(@NotNull PsiDocumentManagerBase psiDocumentManager, @NotNull MessageBus bus) {
PsiToDocumentSynchronizer(@NotNull PsiDocumentManagerEx psiDocumentManager, @NotNull MessageBus bus) {
myPsiDocumentManager = psiDocumentManager;
myBus = bus;
myBus.connect(psiDocumentManager)
@@ -16,6 +16,7 @@ import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -81,7 +82,7 @@ final class FileElementInfo extends SmartPointerElementInfo {
Segment getPsiRange(@NotNull SmartPointerManagerEx manager) {
Document currentDoc = FileDocumentManager.getInstance().getCachedDocument(myVirtualFile);
Document committedDoc = currentDoc == null ? null :
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).getLastCommittedDocument(currentDoc);
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject)).getLastCommittedDocument(currentDoc);
return committedDoc == null ? getRange(manager) : new TextRange(0, committedDoc.getTextLength());
}
@@ -15,6 +15,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.FreeThreadedFileViewProvider;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -103,7 +104,7 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo {
private PsiFile getInjectedFileIn(@NotNull PsiElement hostContext,
@NotNull PsiFile hostFile,
@NotNull TextRange rangeInHostFile) {
PsiDocumentManagerBase docManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(getProject());
PsiDocumentManagerEx docManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(getProject());
PsiFile[] result = {null};
PsiLanguageInjectionHost.InjectedPsiVisitor visitor = (injectedPsi, places) -> {
Document document = docManager.getDocument(injectedPsi);
@@ -178,7 +179,7 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo {
Project project = injectedFile.getProject();
DocumentWindow documentWindow = ((VirtualFileWindow)virtualFile).getDocumentWindow();
if (psi) {
documentWindow = (DocumentWindow) ((PsiDocumentManagerBase) PsiDocumentManager.getInstance(project)).getLastCommittedDocument(documentWindow);
documentWindow = (DocumentWindow) ((PsiDocumentManagerEx) PsiDocumentManager.getInstance(project)).getLastCommittedDocument(documentWindow);
}
int start = documentWindow.hostToInjected(hostRange.getStartOffset());
int end = documentWindow.hostToInjected(hostRange.getEndOffset());
@@ -14,6 +14,7 @@ import com.intellij.openapi.util.*;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -227,7 +228,7 @@ public class SelfElementInfo extends SmartPointerElementInfo {
if (hasRange()) {
Document document = getDocumentToSynchronize();
if (document != null) {
PsiDocumentManagerBase documentManager = manager.getPsiDocumentManager();
PsiDocumentManagerEx documentManager = manager.getPsiDocumentManager();
List<DocumentEvent> events = documentManager.getEventsSinceCommit(document);
if (!events.isEmpty()) {
SmartPointerTracker tracker = manager.getTracker(getVirtualFile());
@@ -247,7 +248,7 @@ public class SelfElementInfo extends SmartPointerElementInfo {
public static Segment calcActualRangeAfterDocumentEvents(@NotNull PsiFile containingFile, @NotNull Document document, @NotNull Segment segment, boolean isSegmentGreedy) {
Project project = containingFile.getProject();
PsiDocumentManagerBase documentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(project);
PsiDocumentManagerEx documentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(project);
List<DocumentEvent> events = documentManager.getEventsSinceCommit(document);
if (!events.isEmpty()) {
SmartPointerManagerEx pointerManager = (SmartPointerManagerEx)SmartPointerManager.getInstance(project);
@@ -9,6 +9,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -40,5 +41,5 @@ public abstract class SmartPointerManagerEx extends SmartPointerManager {
public abstract Project getProject();
@NotNull
public abstract PsiDocumentManagerBase getPsiDocumentManager();
public abstract PsiDocumentManagerEx getPsiDocumentManager();
}
@@ -15,6 +15,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.containers.CollectionFactory;
@@ -32,13 +33,13 @@ import static com.intellij.reference.SoftReference.dereference;
public final class SmartPointerManagerImpl extends SmartPointerManagerEx implements Disposable {
private static final Logger LOG = Logger.getInstance(SmartPointerManagerImpl.class);
private final Project myProject;
private final PsiDocumentManagerBase myPsiDocManager;
private final PsiDocumentManagerEx myPsiDocManager;
private final Key<WeakReference<SmartPointerTracker>> LIGHT_TRACKER_KEY;
private final ConcurrentMap<VirtualFile, SmartPointerTracker> myPhysicalTrackers = CollectionFactory.createConcurrentWeakValueMap();
public SmartPointerManagerImpl(@NotNull Project project) {
myProject = project;
myPsiDocManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(project);
myPsiDocManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(project);
LIGHT_TRACKER_KEY = Key.create("SMART_POINTERS " + (project.isDefault() ? "default" : project.hashCode()));
}
@@ -243,7 +244,7 @@ public final class SmartPointerManagerImpl extends SmartPointerManagerEx impleme
@ApiStatus.Internal
@Override
@NotNull
public PsiDocumentManagerBase getPsiDocumentManager() {
public PsiDocumentManagerEx getPsiDocumentManager() {
return myPsiDocManager;
}
}
@@ -18,6 +18,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.FreeThreadedFileViewProvider;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.stubs.LanguageStubDescriptor;
@@ -201,7 +202,7 @@ public class SmartPsiElementPointerImpl<E extends PsiElement> implements SmartPo
Document document = FileDocumentManager.getInstance().getCachedDocument(virtualFile);
if (document != null &&
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(project)).getSynchronizer().isDocumentAffectedByTransactions(document)) {
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(project)).getSynchronizer().isDocumentAffectedByTransactions(document)) {
LOG.error("Smart pointers must not be created during PSI changes");
}
@@ -1143,8 +1143,8 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF
private void checkWritable() {
PsiDocumentManager docManager = PsiDocumentManager.getInstance(getProject());
if (docManager instanceof PsiDocumentManagerBase &&
!((PsiDocumentManagerBase)docManager).isCommitInProgress() &&
if (docManager instanceof PsiDocumentManagerEx &&
!((PsiDocumentManagerEx)docManager).isCommitInProgress() &&
!(myViewProvider instanceof FreeThreadedFileViewProvider)) {
CheckUtil.checkWritable(this);
}
@@ -83,7 +83,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
override fun commitAsynchronously(
project: Project,
documentManager: PsiDocumentManagerBase,
documentManager: PsiDocumentManagerEx,
document: Document,
reason: Any,
modality: ModalityState,
@@ -94,7 +94,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
}
@Suppress("SuspiciousPackagePrivateAccess")
require(documentManager.myProject === project) { "Wrong project: $project; expected: ${documentManager.myProject}" }
require(documentManager.project === project) { "Wrong project: $project; expected: ${documentManager.project}" }
TransactionGuard.getInstance().assertWriteSafeContext(modality)
@@ -123,7 +123,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
val publishedDocumentCommitRequests: ConcurrentMap<Document, Job> = CollectionFactory.createConcurrentWeakMap()
}
private fun commitDocumentWithCoroutines(document: Document, task: CommitTask, documentManager: PsiDocumentManagerBase) {
private fun commitDocumentWithCoroutines(document: Document, task: CommitTask, documentManager: PsiDocumentManagerEx) {
val service = task.myProject.service<PerProjectDocumentCommitRegistry>()
val job = service.scope.launch(commitDispatcher, start = CoroutineStart.LAZY) {
commitDispatcherSuspender.acquire()
@@ -157,7 +157,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
job.start()
}
private fun ReadAndWriteScope.doCommitInReadAndWriteScope(task: CommitTask, documentManager: PsiDocumentManagerBase): ReadResult<Unit> {
private fun ReadAndWriteScope.doCommitInReadAndWriteScope(task: CommitTask, documentManager: PsiDocumentManagerEx): ReadResult<Unit> {
if (isExpired(task, documentManager)) {
return value(Unit)
}
@@ -170,7 +170,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
}
}
private fun isExpired(task: CommitTask, docManager: PsiDocumentManagerBase): Boolean {
private fun isExpired(task: CommitTask, docManager: PsiDocumentManagerEx): Boolean {
return isDisposed || task.isExpired(docManager)
}
@@ -181,7 +181,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
"Must not call sync commit with unopened project: $project; Disposed: ${project.isDisposed()}; Open: ${project.isOpen()}"
}
val documentManager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val documentManager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
val task = CommitTask(project, document, "Sync commit", ModalityState.defaultModalityState())
commitUnderProgress(task, synchronously = true, documentManager)()
@@ -189,7 +189,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
@RequiresReadLock
// returns finish commit Runnable (to be invoked later in EDT) or null on failure
private fun commitUnderProgress(task: CommitTask, synchronously: Boolean, documentManager: PsiDocumentManagerBase): () -> Unit {
private fun commitUnderProgress(task: CommitTask, synchronously: Boolean, documentManager: PsiDocumentManagerEx): () -> Unit {
if (!synchronously) {
ApplicationManager.getApplication().assertIsNonDispatchThread()
}
@@ -388,7 +388,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
null
}
}
fun isExpired(documentManager: PsiDocumentManagerBase): Boolean {
fun isExpired(documentManager: PsiDocumentManagerEx): Boolean {
val document = stillValidDocument()
val expired = myProject.isDisposed() ||
document == null ||
@@ -408,7 +408,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
oldFileNode: FileASTNode,
changedPsiRange: ProperTextRange,
outReparseInjectedProcessors: MutableList<BooleanRunnable>,
documentManager: PsiDocumentManagerBase,
documentManager: PsiDocumentManagerEx,
): BooleanRunnable {
if (!synchronously) {
ApplicationManager.getApplication().assertIsNonDispatchThread()
@@ -471,7 +471,7 @@ class DocumentCommitThread : DocumentCommitProcessor, Disposable {
private fun handleCommitWithoutPsi(
task: CommitTask,
documentManager: PsiDocumentManagerBase,
documentManager: PsiDocumentManagerEx,
): BooleanRunnable {
return BooleanRunnable {
val document = task.myDocumentRef.get() ?: return@BooleanRunnable false
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiFile
import com.intellij.psi.PsiLanguageInjectionHost.Shred
import com.intellij.psi.createSmartPointer
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.psi.impl.source.resolve.FileContextUtil
import com.intellij.util.SmartList
import com.intellij.util.containers.ContainerUtil
@@ -35,7 +36,7 @@ internal class IndentAwareInjectedFileChangesHandler(shreds: List<Shred>, editor
myHostDocument.addDocumentListener(object : DocumentListener {
override fun documentChanged(event: DocumentEvent) {
if (UndoManager.getInstance(myProject).isUndoInProgress) {
(PsiDocumentManager.getInstance(myProject) as PsiDocumentManagerBase).addRunOnCommit(myHostDocument) { thisDoc ->
(PsiDocumentManager.getInstance(myProject) as PsiDocumentManagerEx).addRunOnCommit(myHostDocument) { thisDoc ->
rebuildMarkers(markersWholeRange(markers) ?: failAndReport("can't get marker range in undo", event))
}
}
@@ -14,7 +14,7 @@ import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import kotlinx.coroutines.Runnable
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
@@ -152,7 +152,7 @@ fun AppUIExecutor.coroutineDispatchingContext(): ContinuationInterceptor {
internal class WithDocumentsCommitted(private val project: Project, private val modality: ModalityState) : ContextConstraint {
override fun isCorrectContext(): Boolean {
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
return !manager.isCommitInProgress && !manager.hasEventSystemEnabledUncommittedDocuments()
}
@@ -166,7 +166,7 @@ internal class WithDocumentsCommitted(private val project: Project, private val
""
}
else {
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
", isCommitInProgress()=${manager.isCommitInProgress}" +
", hasEventSystemEnabledUncommittedDocuments()=${manager.hasEventSystemEnabledUncommittedDocuments()}"
}
@@ -6,13 +6,14 @@ import com.intellij.openapi.application.ReadConstraint
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
internal class CommittedDocumentsConstraint(
private val project: Project,
) : ReadConstraint {
override fun isSatisfied(): Boolean {
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val manager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
return !manager.isCommitInProgress && !manager.hasEventSystemEnabledUncommittedDocuments()
}
@@ -6,6 +6,7 @@ import com.intellij.openapi.editor.impl.event.EditorEventMulticasterImpl;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import org.jetbrains.annotations.TestOnly;
import org.junit.Assert;
@@ -35,7 +36,7 @@ public final class EditorListenerTracker {
// listeners may hang on default project which comes and goes unpredictably, so just ignore them
afterList.removeIf(listener -> {
//noinspection CastConflictsWithInstanceof
if (listener instanceof PsiDocumentManager && ((PsiDocumentManagerBase)listener).isDefaultProject()) {
if (listener instanceof PsiDocumentManager && ((PsiDocumentManagerEx)listener).isDefaultProject()) {
return true;
}
@@ -52,6 +52,7 @@ import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl;
import com.intellij.testFramework.common.TestApplicationKt;
@@ -245,7 +246,7 @@ public abstract class HeavyPlatformTestCase extends UsefulTestCase implements Da
if (myProject != null) {
CodeStyle.setTemporarySettings(myProject, CodeStyle.createTestSettings());
InjectedLanguageManagerImpl.pushInjectors(myProject);
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).clearUncommittedDocuments();
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject)).clearUncommittedDocuments();
IndexingTestUtil.waitUntilIndexesAreReady(myProject, getIndexingTimeout());
}
@@ -10,6 +10,7 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.backend.observation.Observation
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.testFramework.common.DEFAULT_TEST_TIMEOUT
import com.intellij.testFramework.common.DEFAULT_TEST_TIMEOUT_MS
import com.intellij.testFramework.concurrency.waitForPromiseAndPumpEdt
@@ -75,7 +76,7 @@ object TestObservation {
if (!Registry.`is`("ide.activity.tracking.enable.debug")) {
return "Enable 'ide.activity.tracking.enable.debug' registry option to collect uncommited document traces"
}
val psiDocumentManager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val psiDocumentManager = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
return psiDocumentManager.uncommitedDocumentsWithTraces.entries
.joinToString("\n") {
it.key.toString() + ": " + it.value.stackTraceToString()
@@ -8,6 +8,7 @@ import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
@@ -47,7 +48,7 @@ public class GroovyStubsTest extends LightJavaCodeInsightFixtureTestCase {
}
public void testStubIndexMismatch() {
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(getProject())).disableBackgroundCommit(myFixture.getTestRootDisposable());
((PsiDocumentManagerEx)PsiDocumentManager.getInstance(getProject())).disableBackgroundCommit(myFixture.getTestRootDisposable());
VirtualFile vFile = myFixture.getTempDirFixture().createFile("foo.groovy");
final Project project = myFixture.getProject();
@@ -25,6 +25,7 @@ import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.psi.search.FilenameIndex
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.testFramework.ExtensionTestUtil
@@ -43,7 +44,7 @@ fun commitAllDocuments() {
}
ProjectManagerEx.getInstanceEx().openProjects.forEach { project ->
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
runInEdtAndWait {
psiDocumentManagerBase.clearUncommittedDocuments()
@@ -53,7 +54,7 @@ fun commitAllDocuments() {
}
fun commitDocument(project: Project, document: Document) {
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
runInEdtAndWait {
psiDocumentManagerBase.commitDocument(document)
}
@@ -16,6 +16,7 @@ import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.*
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl
@@ -70,7 +71,7 @@ class PerformanceSuite {
}
ProjectManagerEx.getInstanceEx().openProjects.forEach { project ->
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
val psiDocumentManagerBase = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
runInEdtAndWait {
psiDocumentManagerBase.clearUncommittedDocuments()
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.intellij.psi.impl.PsiDocumentManagerEx
import com.intellij.psi.xml.XmlAttributeValue
import com.intellij.psi.xml.XmlElement
import com.intellij.psi.xml.XmlFile
@@ -41,7 +42,7 @@ class MavenModelVersionSyncronizerImpl(
}
private var applying = false
private val pdm = PsiDocumentManager.getInstance(project) as PsiDocumentManagerBase
private val pdm = PsiDocumentManager.getInstance(project) as PsiDocumentManagerEx
fun listenForDocumentChanges() {
Disposer.register(editor.disposable, this)
@@ -29,6 +29,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.core.impl.PomModelImpl;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiDocumentManagerEx;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.psi.impl.source.tree.TreeUtil;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtilBase;
@@ -56,7 +57,7 @@ final class XmlTagNameSynchronizerImpl implements DocumentListener, CaretListene
private static final Key<XmlTagNameSynchronizerImpl> SYNCHRONIZER_KEY = XmlTagNameSynchronizer.Companion.getSYNCHRONIZER_KEY$intellij_xml_impl();
private static final Key<Couple<RangeMarker>> MARKERS_KEY = Key.create("tag.name.synchronizer.markers");
private static final TreeSet<Segment> allMarkers = new TreeSet<>(Comparator.comparingInt(Segment::getStartOffset));
private final PsiDocumentManagerBase myDocumentManager;
private final PsiDocumentManagerEx myDocumentManager;
private final Language myLanguage;
private final EditorImpl myEditor;
private final Project myProject;
@@ -65,7 +66,7 @@ final class XmlTagNameSynchronizerImpl implements DocumentListener, CaretListene
XmlTagNameSynchronizerImpl(EditorImpl editor, Project project, Language language) {
myEditor = editor;
myLanguage = language;
myDocumentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(project);
myDocumentManager = (PsiDocumentManagerEx)PsiDocumentManager.getInstance(project);
myProject = project;
}