a fix for completion from non-primary caret (IDEA-123396)

This commit is contained in:
Dmitry Batrak
2014-10-07 17:45:41 +04:00
parent 353e027b65
commit 444dce0373
6 changed files with 35 additions and 4 deletions
@@ -0,0 +1,4 @@
class Foo {{
<caret>blah
// <caret>blah
}}
@@ -0,0 +1,4 @@
class Foo {{
return<caret>
// return<caret>
}}
@@ -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", """
@@ -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;
@@ -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<CompletionContributor> 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);
@@ -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;