diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java')
-rw-r--r-- | platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java b/platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java index ba5858c52993..2ca35e4227e9 100644 --- a/platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java +++ b/platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java @@ -301,15 +301,30 @@ public class PomModelImpl extends UserDataHolderBase implements PomModel { final PsiToDocumentSynchronizer synchronizer = manager.getSynchronizer(); final PsiElement changeScope = transaction.getChangeScope(); LOG.assertTrue(changeScope != null); - BlockSupportImpl.sendBeforeChildrenChangeEvent((PsiManagerImpl)PsiManager.getInstance(myProject), changeScope, true); + final PsiFile containingFileByTree = getContainingFileByTree(changeScope); + if (changeScope.isPhysical() && synchronizer.toProcessPsiEvent() && isDocumentUncommitted(containingFileByTree)) { + // fail-fast to prevent any psi modifications that would cause psi/document text mismatch + // PsiToDocumentSynchronizer assertions happen inside event processing and are logged by PsiManagerImpl.fireEvent instead of being rethrown + // so it's important to throw something outside event processing + throw new IllegalStateException("Attempt to modify PSI for non-committed Document!"); + } + BlockSupportImpl.sendBeforeChildrenChangeEvent((PsiManagerImpl)PsiManager.getInstance(myProject), changeScope, true); Document document = containingFileByTree == null ? null : manager.getCachedDocument(containingFileByTree); if(document != null) { synchronizer.startTransaction(myProject, document, changeScope); } } + private boolean isDocumentUncommitted(@Nullable PsiFile file) { + if (file == null) return false; + + PsiDocumentManager manager = PsiDocumentManager.getInstance(myProject); + Document cachedDocument = manager.getCachedDocument(file); + return cachedDocument != null && manager.isUncommited(cachedDocument); + } + @Nullable private static PsiFile getContainingFileByTree(@NotNull final PsiElement changeScope) { // there could be pseudo physical trees (JSPX/JSP/etc.) which must not translate |