From 444dce0373904fd14a6765c19ee651a33318bebe Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 7 Oct 2014 17:41:39 +0400 Subject: [PATCH] a fix for completion from non-primary caret (IDEA-123396) --- ...MulticaretCompletionFromNonPrimaryCaretWithTab.java | 4 ++++ ...aretCompletionFromNonPrimaryCaretWithTab_after.java | 4 ++++ .../codeInsight/completion/NormalCompletionTest.groovy | 4 ++++ .../completion/CompletionInitializationContext.java | 10 +++++++++- .../completion/CodeCompletionHandlerBase.java | 7 ++++--- .../completion/CompletionProgressIndicator.java | 10 ++++++++++ 6 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab_after.java diff --git a/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab.java b/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab.java new file mode 100644 index 000000000000..6b63d4ade364 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab.java @@ -0,0 +1,4 @@ +class Foo {{ + blah + // blah +}} diff --git a/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab_after.java b/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab_after.java new file mode 100644 index 000000000000..74b8e61afb4d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/MulticaretCompletionFromNonPrimaryCaretWithTab_after.java @@ -0,0 +1,4 @@ +class Foo {{ + return + // return +}} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index f5fc39041106..3391bb407e43 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1428,6 +1428,10 @@ class XInternalError {} myFixture.assertPreferredCompletionItems(0, "arraycopy") } + public void testMulticaretCompletionFromNonPrimaryCaretWithTab() { + doTest '\t' + } + public void "test complete lowercase class name"() { myFixture.addClass("package foo; public class myClass {}") myFixture.configureByText "a.java", """ diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java index 2c152b595421..a932262a5c7e 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java @@ -39,14 +39,17 @@ public class CompletionInitializationContext { public static @NonNls final String DUMMY_IDENTIFIER = CompletionUtilCore.DUMMY_IDENTIFIER; public static @NonNls final String DUMMY_IDENTIFIER_TRIMMED = CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED; private final Editor myEditor; + @NotNull + private final Caret myCaret; private final PsiFile myFile; private final CompletionType myCompletionType; private final int myInvocationCount; private final OffsetMap myOffsetMap; private String myDummyIdentifier = DUMMY_IDENTIFIER; - public CompletionInitializationContext(final Editor editor, final Caret caret, final PsiFile file, final CompletionType completionType, int invocationCount) { + public CompletionInitializationContext(final Editor editor, final @NotNull Caret caret, final PsiFile file, final CompletionType completionType, int invocationCount) { myEditor = editor; + myCaret = caret; myFile = file; myCompletionType = completionType; myInvocationCount = invocationCount; @@ -92,6 +95,11 @@ public class CompletionInitializationContext { return myEditor; } + @NotNull + public Caret getCaret() { + return myCaret; + } + @NotNull public CompletionType getCompletionType() { return myCompletionType; 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 507578a566f2..397d30993ac9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -193,7 +193,7 @@ public class CodeCompletionHandlerBase { insertDummyIdentifier(initializationContext[0], hasModifiers, invocationCount); } - private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile, int invocationCount, Caret caret) { + private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile, int invocationCount, @NotNull Caret caret) { final Ref current = Ref.create(null); CompletionInitializationContext context = new CompletionInitializationContext(editor, caret, psiFile, myCompletionType, invocationCount) { CompletionContributor dummyIdentifierChanger; @@ -296,7 +296,8 @@ public class CodeCompletionHandlerBase { final Semaphore freezeSemaphore = new Semaphore(); freezeSemaphore.down(); - final CompletionProgressIndicator indicator = new CompletionProgressIndicator(editor, parameters, this, freezeSemaphore, + final CompletionProgressIndicator indicator = new CompletionProgressIndicator(editor, initContext.getCaret(), + parameters, this, freezeSemaphore, initContext.getOffsetMap(), hasModifiers, lookup); Disposer.register(indicator, hostMap); Disposer.register(indicator, context.getOffsetMap()); @@ -602,7 +603,7 @@ public class CodeCompletionHandlerBase { final CompletionLookupArranger.StatisticsUpdate update) { final Editor editor = indicator.getEditor(); - final int caretOffset = editor.getCaretModel().getOffset(); + final int caretOffset = indicator.getCaret().getOffset(); int idEndOffset = indicator.getIdentifierEndOffset(); if (idEndOffset < 0) { idEndOffset = CompletionInitializationContext.calcDefaultIdentifierEnd(editor, caretOffset); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index 68da01327408..4b5b7b5c90e9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -39,6 +39,7 @@ import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressManager; @@ -88,6 +89,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class CompletionProgressIndicator extends ProgressIndicatorBase implements CompletionProcess, Disposable { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.CompletionProgressIndicator"); private final Editor myEditor; + @NotNull + private final Caret myCaret; private final CompletionParameters myParameters; private final CodeCompletionHandlerBase myHandler; private final LookupImpl myLookup; @@ -132,6 +135,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement private final int myStartCaret; public CompletionProgressIndicator(final Editor editor, + @NotNull Caret caret, CompletionParameters parameters, CodeCompletionHandlerBase handler, Semaphore freezeSemaphore, @@ -139,6 +143,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement boolean hasModifiers, LookupImpl lookup) { myEditor = editor; + myCaret = caret; myParameters = parameters; myHandler = handler; myFreezeSemaphore = freezeSemaphore; @@ -575,6 +580,11 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement return myEditor; } + @NotNull + public Caret getCaret() { + return myCaret; + } + public boolean isRepeatedInvocation(CompletionType completionType, Editor editor) { if (completionType != myParameters.getCompletionType() || editor != myEditor) { return false;