diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java index 1da3409e775b..73c93a96f3e7 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java @@ -357,6 +357,13 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen protected boolean finishCommitInWriteAction(@NotNull final Document document, @NotNull final List> finishProcessors, final boolean synchronously) { + return finishCommitInWriteAction(document, finishProcessors, synchronously, false); + } + + protected boolean finishCommitInWriteAction(@NotNull final Document document, + @NotNull final List> finishProcessors, + final boolean synchronously, + boolean forceNoPsiCommit) { ApplicationManager.getApplication().assertIsDispatchThread(); if (myProject.isDisposed()) return false; assert !(document instanceof DocumentWindow); @@ -366,7 +373,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen getSmartPointerManager().fastenBelts(virtualFile); } - FileViewProvider viewProvider = getCachedViewProvider(document); + FileViewProvider viewProvider = forceNoPsiCommit ? null : getCachedViewProvider(document); myIsCommitInProgress = true; boolean success = true; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java index 3c1a8c6bbad1..b59b4c8d4f7f 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java @@ -53,6 +53,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import java.util.Collection; +import java.util.Collections; import java.util.List; //todo listen & notifyListeners readonly events? @@ -124,7 +125,13 @@ public class PsiDocumentManagerImpl extends PsiDocumentManagerBase implements Se if (PomModelImpl.isAllowPsiModification() // it can happen that document(forUseInNonAWTThread=true) outside write action caused this && ApplicationManager.getApplication().isWriteAccessAllowed()) { - commitAllDocuments(); + // commit document to avoid OOME + for (Document document : myUncommittedDocuments) { + if (document != event.getDocument()) { + finishCommitInWriteAction(document, Collections.emptyList(), true, true); + break; + } + } } } } @@ -139,11 +146,12 @@ public class PsiDocumentManagerImpl extends PsiDocumentManagerBase implements Se @Override protected boolean finishCommitInWriteAction(@NotNull Document document, @NotNull List> finishProcessors, - boolean synchronously) { + boolean synchronously, + boolean forceNoPsiCommit) { if (ApplicationManager.getApplication().isWriteAccessAllowed()) { // can be false for non-physical PSI EditorWindowImpl.disposeInvalidEditors(); } - return super.finishCommitInWriteAction(document, finishProcessors, synchronously); + return super.finishCommitInWriteAction(document, finishProcessors, synchronously, forceNoPsiCommit); } @Override