From 6eb6d169999ed3ddffb37fa6edb3bdf946de08ea Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 19 Jan 2018 23:34:54 +0100 Subject: [PATCH] avoid additional commit during completion if it wasn't invoked inside injection (IDEA-CR-28641) --- .../completion/CodeCompletionHandlerBase.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index cd63cf1e2494..c58da25e296d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -572,12 +572,12 @@ public class CodeCompletionHandlerBase { if (editor.getCaretModel().supportsMultipleCarets()) { Ref lastContext = Ref.create(); Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(editor); + boolean wasInjected = hostEditor != editor; OffsetsInFile topLevelOffsets = indicator.getHostOffsets(); hostEditor.getCaretModel().runForEachCaret(new CaretAction() { @Override public void perform(Caret caret) { - PsiDocumentManager.getInstance(indicator.getProject()).commitDocument(hostEditor.getDocument()); - OffsetsInFile targetOffsets = topLevelOffsets.toInjectedIfAny(caret.getOffset()); + OffsetsInFile targetOffsets = findInjectedOffsetsIfAny(caret); PsiFile targetFile = targetOffsets.getFile(); Editor targetEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(hostEditor, targetFile); int targetCaretOffset = targetEditor.getCaretModel().getOffset(); @@ -591,6 +591,13 @@ public class CodeCompletionHandlerBase { targetOffsets.getOffsets()); lastContext.set(currentContext); } + + private OffsetsInFile findInjectedOffsetsIfAny(Caret caret) { + if (!wasInjected) return topLevelOffsets; + + PsiDocumentManager.getInstance(indicator.getProject()).commitDocument(hostEditor.getDocument()); + return topLevelOffsets.toInjectedIfAny(caret.getOffset()); + } }); context = lastContext.get(); } else {