diff --git a/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_after.java b/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_after.java new file mode 100644 index 000000000000..08b2afd09cb9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_after.java @@ -0,0 +1,7 @@ +class Foo { + public static void main(String[] args) { + String s = ""; + s.replaceAll("\\"); + System.out.println(); + } +} diff --git a/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_before.java b/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_before.java new file mode 100644 index 000000000000..bee6f10053c2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/invalidInitialSyntax_before.java @@ -0,0 +1,7 @@ +class Foo { + public static void main(String[] args) { + String s = ""; + s.replaceAll(""); + System.out.println(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java index f59162a6d5b2..9ca3b6084a43 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight; import com.intellij.openapi.editor.ex.EditorEx; +import com.intellij.psi.PsiDocumentManager; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; @@ -65,6 +66,14 @@ public class JavaTypingTest extends LightPlatformCodeInsightFixtureTestCase { myFixture.checkResultByFile(getTestName(true) + "_after.java"); } + public void testInvalidInitialSyntax() { + myFixture.configureByFile(getTestName(true) + "_before.java"); + myFixture.type('\\'); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); // emulates background commit after typing first character + myFixture.type('\\'); + myFixture.checkResultByFile(getTestName(true) + "_after.java"); + } + private void doTest(char c) { myFixture.configureByFile(getTestName(true) + "_before.java"); myFixture.type(c); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java index bb21eac69ecd..ba4768f73099 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java @@ -148,14 +148,17 @@ public class TypedHandler extends TypedActionHandlerBase { return; } + final PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); + final Document originalDocument = originalEditor.getDocument(); originalEditor.getCaretModel().runForEachCaret(new CaretAction() { @Override public void perform(Caret caret) { - PsiDocumentManager.getInstance(project) - .doPostponedOperationsAndUnblockDocument(originalEditor.getDocument()); // to clean up after previous caret processing + if (psiDocumentManager.isDocumentBlockedByPsi(originalDocument)) { + psiDocumentManager.doPostponedOperationsAndUnblockDocument(originalDocument); // to clean up after previous caret processing + } Editor editor = injectedEditorIfCharTypedIsSignificant(charTyped, originalEditor, originalFile); - PsiFile file = editor == originalEditor ? originalFile : PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + PsiFile file = editor == originalEditor ? originalFile : psiDocumentManager.getPsiFile(editor.getDocument()); final TypedHandlerDelegate[] delegates = Extensions.getExtensions(TypedHandlerDelegate.EP_NAME);