From f304a9390acd6f3fcfdc6f0c67a24ccd115e31ec Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 16 Sep 2011 13:16:13 +0400 Subject: [PATCH] assertion --- .../impl/source/tree/CompositeElement.java | 39 +++++++++++-------- .../impl/SurroundWithTemplateHandler.java | 20 ++++++---- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index fc4e393e85cc..bc1614c70fae 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -32,10 +32,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLock; import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.FreeThreadedFileViewProvider; -import com.intellij.psi.impl.source.DummyHolder; -import com.intellij.psi.impl.source.DummyHolderFactory; -import com.intellij.psi.impl.source.PsiElementArrayConstructor; -import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.psi.impl.source.*; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; @@ -104,26 +101,20 @@ public class CompositeElement extends TreeElement { public void clearCaches() { if (ASSERT_THREADING) { - PsiElement wrapper = myWrapper; - FileElement fileElement = null; - PsiFile psiFile = null; boolean ok = ApplicationManager.getApplication().isWriteAccessAllowed() || Thread.holdsLock(START_OFFSET_LOCK) || - (fileElement = TreeUtil.getFileElement(this)) == null || - wrapper != null && !wrapper.isPhysical() || - (psiFile = (PsiFile)fileElement.getPsi()) == null || - psiFile instanceof DummyHolder || - psiFile.getViewProvider() instanceof FreeThreadedFileViewProvider || - !psiFile.isPhysical(); + isNonPhysicalOrInjected(); if (!ok) { + FileElement fileElement; + PsiFile psiFile; LOG.error("Threading assertion. " + " Under write: " + ApplicationManager.getApplication().isWriteAccessAllowed() + "; Thread.holdsLock(START_OFFSET_LOCK): " + Thread.holdsLock(START_OFFSET_LOCK) + "; Thread.holdsLock(PsiLock.LOCK): " + Thread.holdsLock(PsiLock.LOCK) + - "; wrapper: " + wrapper + - "; wrapper.isPhysical(): " + (wrapper != null && wrapper.isPhysical()) + - "; fileElement: " +fileElement + - "; psiFile: " + psiFile + + "; wrapper: " + myWrapper + + "; wrapper.isPhysical(): " + (myWrapper != null && myWrapper.isPhysical()) + + "; fileElement: " +(fileElement = TreeUtil.getFileElement(this))+ + "; psiFile: " + (psiFile = fileElement == null ? null : (PsiFile)fileElement.getPsi()) + "; psiFile.getViewProvider(): " + (psiFile == null ? null : psiFile.getViewProvider()) + "; psiFile.isPhysical(): " + (psiFile != null && psiFile.isPhysical()) ); @@ -137,6 +128,20 @@ public class CompositeElement extends TreeElement { clearRelativeOffsets(rawFirstChild()); } + private boolean isNonPhysicalOrInjected() { + FileElement fileElement = TreeUtil.getFileElement(this); + if (fileElement == null || fileElement instanceof DummyHolderElement) return true; + if (fileElement.getTreeParent() != null) return true; // dummy holder + PsiElement wrapper = this instanceof PsiElement ? (PsiElement)this : myWrapper; + if (wrapper == null) return true; + PsiFile psiFile = wrapper.getContainingFile(); + return + psiFile == null || + psiFile instanceof DummyHolder || + psiFile.getViewProvider() instanceof FreeThreadedFileViewProvider || + !psiFile.isPhysical(); + } + public void acceptTree(TreeElementVisitor visitor) { visitor.visitComposite(this); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SurroundWithTemplateHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SurroundWithTemplateHandler.java index 10cb3a9b858a..aecf682aa2fd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SurroundWithTemplateHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SurroundWithTemplateHandler.java @@ -24,6 +24,7 @@ import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.template.CustomLiveTemplate; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -122,16 +123,21 @@ public class SurroundWithTemplateHandler implements CodeInsightActionHandler { return list; } - public static PsiFile insertDummyIdentifier(Editor editor, PsiFile file) { + public static PsiFile insertDummyIdentifier(final Editor editor, PsiFile file) { file = (PsiFile)file.copy(); final Document document = file.getViewProvider().getDocument(); assert document != null; - int offset = editor.getCaretModel().getOffset(); - if (editor.getSelectionModel().hasSelection()) { - offset = editor.getSelectionModel().getSelectionStart(); - document.deleteString(offset, editor.getSelectionModel().getSelectionEnd()); - } - document.insertString(offset, CompletionUtil.DUMMY_IDENTIFIER_TRIMMED); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + int offset = editor.getCaretModel().getOffset(); + if (editor.getSelectionModel().hasSelection()) { + offset = editor.getSelectionModel().getSelectionStart(); + document.deleteString(offset, editor.getSelectionModel().getSelectionEnd()); + } + document.insertString(offset, CompletionUtil.DUMMY_IDENTIFIER_TRIMMED); + } + }); + PsiDocumentManager.getInstance(file.getProject()).commitDocument(document); return file; }