summaryrefslogtreecommitdiff
path: root/platform/core-impl/src/com/intellij/pom/core/impl/PomModelImpl.java
diff options
context:
space:
mode:
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.java17
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