From 24b5e9a888c163a9e5dc1af22d42882c7771d466 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 8 Mar 2011 16:48:23 +0100 Subject: [PATCH] by default execute typed handler when finishing completion by a character --- .../completion/JavaAwareCompletionData.java | 4 +++- .../completion/JavaClassNameInsertHandler.java | 4 ---- .../completion/JavaCompletionUtil.java | 9 +++++---- .../completion/JavaMethodCallElement.java | 1 + .../completion/SmartCompletionDecorator.java | 11 +++++++---- .../normal/SpaceAfterLookupString_after.java | 2 +- .../codeInsight/completion/InsertionContext.java | 5 +++-- .../completion/CodeCompletionHandlerBase.java | 15 +++++++++------ .../codeInsight/completion/CompletionUtil.java | 3 ++- .../completion/TemplateInsertHandler.java | 2 +- .../codeInsight/lookup/impl/TypedHandler.java | 1 + .../codeInsight/template/impl/TemplateState.java | 2 +- 12 files changed, 34 insertions(+), 25 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaAwareCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaAwareCompletionData.java index ae8c9070c875..4fa3bb4f4eb8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaAwareCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaAwareCompletionData.java @@ -87,13 +87,15 @@ public class JavaAwareCompletionData extends CompletionData{ ret.setInsertHandler(new InsertHandler() { @Override public void handleInsert(InsertionContext context, LookupElement item) { + if (context.shouldAddCompletionChar()) { + return; + } TailType type = analyzeItem(item.getObject(), context.getFile().findElementAt(context.getStartOffset())); if (type == TailType.NONE) { type = tailType; } //new DefaultInsertHandler().handleInsert(context, item); if (type != TailType.NONE) { - context.setAddCompletionChar(false); type.processTail(context.getEditor(), context.getTailOffset()); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index c42019456461..4c7c656b3b08 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -44,10 +44,6 @@ class JavaClassNameInsertHandler implements InsertHandler implements Type final PsiType type = method.getReturnType(); if (context.getCompletionChar() == '!' && type != null && PsiType.BOOLEAN.isAssignableFrom(type)) { + context.setAddCompletionChar(false); context.commitDocument(); final int offset = context.getOffset(refStart); final PsiMethodCallExpression methodCall = PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiMethodCallExpression.class, false); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java index ef32d2520c77..9bd06caa047a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.TailType; +import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.codeInsight.lookup.TailTypeDecorator; @@ -52,10 +53,12 @@ public class SmartCompletionDecorator extends TailTypeDecorator { } protected TailType computeTailType(InsertionContext context) { - final TailType defType = LookupItem.getDefaultTailType(context.getCompletionChar()); - if (defType != null) { - context.setAddCompletionChar(false); - return defType; + if (context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + return TailType.SMART_COMPLETION; + } + + if (LookupItem.getDefaultTailType(context.getCompletionChar()) != null) { + return null; } LookupElement delegate = getDelegate(); diff --git a/java/java-tests/testData/codeInsight/completion/normal/SpaceAfterLookupString_after.java b/java/java-tests/testData/codeInsight/completion/normal/SpaceAfterLookupString_after.java index 61c3e21af605..13d4c7a2afe0 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/SpaceAfterLookupString_after.java +++ b/java/java-tests/testData/codeInsight/completion/normal/SpaceAfterLookupString_after.java @@ -3,7 +3,7 @@ class Foo { { String abc; String abcdef; - abc d + abc d } } \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/InsertionContext.java b/platform/lang-api/src/com/intellij/codeInsight/completion/InsertionContext.java index d5c1627795b2..1a793de71178 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/InsertionContext.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/InsertionContext.java @@ -36,17 +36,18 @@ public class InsertionContext { private final PsiFile myFile; private final Editor myEditor; private Runnable myLaterRunnable; - private boolean myAddCompletionChar = true; + private boolean myAddCompletionChar; public InsertionContext(final OffsetMap offsetMap, final char completionChar, final LookupElement[] elements, @NotNull final PsiFile file, - @NotNull final Editor editor) { + @NotNull final Editor editor, final boolean addCompletionChar) { myOffsetMap = offsetMap; myCompletionChar = completionChar; myElements = elements; myFile = file; myEditor = editor; setTailOffset(editor.getCaretModel().getOffset()); + myAddCompletionChar = addCompletionChar; } public void setTailOffset(final int offset) { 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 4a55ff85d4be..5e2ea8902ae3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -18,12 +18,12 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.CodeInsightActionHandler; import com.intellij.codeInsight.CodeInsightSettings; -import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.editorActions.CompletionAutoPopupHandler; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.featureStatistics.FeatureUsageTracker; +import com.intellij.ide.DataManager; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.Language; import com.intellij.lang.injection.InjectedLanguageManager; @@ -37,6 +37,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; @@ -545,7 +546,9 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { final Editor editor = indicator.getEditor(); final PsiFile file = indicator.getParameters().getOriginalFile(); - final InsertionContext context = new InsertionContext(indicator.getOffsetMap(), completionChar, items.toArray(new LookupElement[items.size()]), file, editor); + final InsertionContext context = new InsertionContext(indicator.getOffsetMap(), completionChar, items.toArray(new LookupElement[items.size()]), file, editor, + completionChar != Lookup.AUTO_INSERT_SELECT_CHAR && completionChar != Lookup.REPLACE_SELECT_CHAR && + completionChar != Lookup.NORMAL_SELECT_CHAR && completionChar != Lookup.COMPLETE_STATEMENT_SELECT_CHAR); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final int idEndOffset = indicator.getIdentifierEndOffset(); @@ -563,10 +566,10 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { final int tailOffset = context.getTailOffset(); if (tailOffset >= 0) { - if (context.shouldAddCompletionChar() && - completionChar != Lookup.AUTO_INSERT_SELECT_CHAR && completionChar != Lookup.REPLACE_SELECT_CHAR && - completionChar != Lookup.NORMAL_SELECT_CHAR && completionChar != Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { - TailType.insertChar(editor, tailOffset, completionChar); + if (context.shouldAddCompletionChar()) { + editor.getCaretModel().moveToOffset(tailOffset); + EditorActionManager.getInstance().getTypedAction().getHandler().execute(editor, completionChar, DataManager.getInstance() + .getDataContext(editor.getContentComponent())); } } else { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java index bf8f691202e8..967be3f5a7a2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java @@ -175,7 +175,8 @@ public class CompletionUtil { private static InsertionContext newContext(InsertionContext oldContext, LookupElement forElement) { final Editor editor = oldContext.getEditor(); - return new InsertionContext(new OffsetMap(editor.getDocument()), Lookup.AUTO_INSERT_SELECT_CHAR, new LookupElement[]{forElement}, oldContext.getFile(), editor); + return new InsertionContext(new OffsetMap(editor.getDocument()), Lookup.AUTO_INSERT_SELECT_CHAR, new LookupElement[]{forElement}, oldContext.getFile(), editor, + oldContext.shouldAddCompletionChar()); } public static InsertionContext newContext(InsertionContext oldContext, LookupElement forElement, int startOffset, int tailOffset) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java index 977adac61580..d763a7c574c0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java @@ -85,7 +85,7 @@ public abstract class TemplateInsertHandler implements InsertHandler { final PsiFile psiFile = context.getFile(); InsertionContext newContext = - new InsertionContext(offsetMap, context.getCompletionChar(), LookupElement.EMPTY_ARRAY, psiFile, editor); + new InsertionContext(offsetMap, context.getCompletionChar(), LookupElement.EMPTY_ARRAY, psiFile, editor, context.shouldAddCompletionChar()); populateInsertMap(psiFile, offsetMap); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java index 4dcab26920a2..370c39f68bc3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java @@ -82,6 +82,7 @@ public class TypedHandler implements TypedActionHandler { if (result == CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP && lookup.isFocused()) { LookupElement item = lookup.getCurrentItem(); if (item != null){ + inside = false; FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_FINISH_BY_DOT_ETC); lookup.finishLookup(charTyped); return; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 7457d7e91936..7916e843bebd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -520,7 +520,7 @@ public class TemplateState implements Disposable { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); final OffsetMap offsetMap = new OffsetMap(myDocument); - final InsertionContext context = new InsertionContext(offsetMap, (char)0, elements, psiFile, myEditor); + final InsertionContext context = new InsertionContext(offsetMap, (char)0, elements, psiFile, myEditor, false); context.setTailOffset(myEditor.getCaretModel().getOffset()); offsetMap.addOffset(CompletionInitializationContext.START_OFFSET, context.getTailOffset() - item.getLookupString().length()); offsetMap.addOffset(CompletionInitializationContext.SELECTION_END_OFFSET, context.getTailOffset());