diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/DefaultInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/DefaultInsertHandler.java index 26b9bedfb608..247d27cead43 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/DefaultInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/DefaultInsertHandler.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.AutoPopupController; import com.intellij.codeInsight.CharTailType; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.TailTypes; +import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.openapi.diagnostic.Logger; @@ -82,7 +83,7 @@ public class DefaultInsertHandler extends TemplateInsertHandler implements Clone private static void handleParentheses(final boolean hasParams, final boolean needParenth, TailType tailType, InsertionContext context, InsertHandlerState myState){ final Document document = context.getEditor().getDocument(); - boolean insertRightParenth = tailType != TailType.SMART_COMPLETION; + boolean insertRightParenth = context.getCompletionChar() != Lookup.COMPLETE_STATEMENT_SELECT_CHAR; if (needParenth){ if (context.getOffsetMap().getOffset(JavaCompletionUtil.LPAREN_OFFSET) >= 0 && context.getOffsetMap().getOffset(JavaCompletionUtil.ARG_LIST_END_OFFSET) >= 0){ 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 3e030b775348..681e9e700d03 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java @@ -49,7 +49,7 @@ public class SmartCompletionDecorator extends TailTypeDecorator { protected TailType computeTailType(InsertionContext context) { if (context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { - return TailType.SMART_COMPLETION; + return TailType.NONE; } if (LookupItem.getDefaultTailType(context.getCompletionChar()) != null) { diff --git a/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter.java b/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter.java new file mode 100644 index 000000000000..92d0eb2ccec8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter.java @@ -0,0 +1,6 @@ +public class Bar { + { + String nullity = ""; + if (this != nul) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter_after.java b/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter_after.java new file mode 100644 index 000000000000..701335cc073d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/KeywordSmartEnter_after.java @@ -0,0 +1,8 @@ +public class Bar { + { + String nullity = ""; + if (this != null) { + + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ConstructorArgsSmartEnter-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ConstructorArgsSmartEnter-out.java index 484b537fe6de..9d25f937591d 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/ConstructorArgsSmartEnter-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/ConstructorArgsSmartEnter-out.java @@ -5,7 +5,6 @@ public class MyJavaClass { { - List l = new ArrayList(239); - + List l = new ArrayList(239); } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SmartFinish-out.java b/java/java-tests/testData/codeInsight/completion/smartType/SmartFinish-out.java index 1583beea2183..e95297e009b7 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/SmartFinish-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/SmartFinish-out.java @@ -2,8 +2,7 @@ public class Foo { { Foo foo = null; - Foo bar = id(foo); - + Foo bar = id(foo); } Foo id(Foo foo) {return foo;} 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 022cadcac517..27b5ecd7591b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -7,6 +7,7 @@ import com.intellij.codeInsight.lookup.Lookup import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.codeInsight.lookup.LookupManager +import com.intellij.openapi.actionSystem.IdeActions import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.fileTypes.StdFileTypes import com.intellij.psi.CommonClassNames @@ -947,6 +948,12 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { checkResult() } + public void testKeywordSmartEnter() { + configure() + myFixture.performEditorAction(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_COMPLETE_STATEMENT) + checkResult() + } + public void testImportStringValue() throws Throwable { myFixture.addClass("package foo; public class StringValue {}") myFixture.addClass("package java.lang; class StringValue {}") diff --git a/platform/lang-api/src/com/intellij/codeInsight/TailType.java b/platform/lang-api/src/com/intellij/codeInsight/TailType.java index c85b62984723..6c47940dbacd 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/TailType.java +++ b/platform/lang-api/src/com/intellij/codeInsight/TailType.java @@ -16,22 +16,13 @@ package com.intellij.codeInsight; import com.intellij.codeInsight.completion.InsertionContext; -import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessor; -import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessors; -import com.intellij.lang.Language; import com.intellij.openapi.editor.CaretModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; -import com.intellij.psi.util.PsiUtilBase; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import java.util.List; - /** * @author peter */ @@ -160,28 +151,6 @@ public abstract class TailType { return new CharTailType(c); } - public static final TailType SMART_COMPLETION = new TailType() { - public int processTail(final Editor editor, int tailOffset) { - final Project project = editor.getProject(); - final Document doc = editor.getDocument(); - final Language language = PsiUtilBase.getLanguageInEditor(editor, project); - - final List processors = SmartEnterProcessors.INSTANCE.forKey(language); - if (processors.size() > 0) { - for (SmartEnterProcessor processor : processors) { - processor.process(project, editor, PsiDocumentManager.getInstance(project).getPsiFile(doc)); - } - } - - return tailOffset; - } - - @NonNls - public String toString() { - return "SMART_COMPLETION"; - } - }; - public boolean isApplicable(@NotNull final InsertionContext context) { return true; } 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 6fa5c8b23324..4ab7591f939f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -20,6 +20,8 @@ import com.intellij.codeInsight.CodeInsightActionHandler; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.editorActions.CompletionAutoPopupHandler; +import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessor; +import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessors; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.featureStatistics.FeatureUsageTracker; @@ -622,7 +624,8 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { assert context.getTailOffset() >= 0 : "stale tailOffset"; item.handleInsert(context); - PostprocessReformattingAspect.getInstance(indicator.getProject()).doPostponedFormatting(); + Project project = indicator.getProject(); + PostprocessReformattingAspect.getInstance(project).doPostponedFormatting(); if (context.shouldAddCompletionChar()) { int tailOffset = context.getTailOffset(); @@ -632,8 +635,18 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { } else { editor.getCaretModel().moveToOffset(tailOffset); } - DataContext dataContext = DataManager.getInstance().getDataContext(editor.getContentComponent()); - EditorActionManager.getInstance().getTypedAction().getHandler().execute(editor, completionChar, dataContext); + if (context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + final Language language = PsiUtilBase.getLanguageInEditor(editor, project); + final List processors = SmartEnterProcessors.INSTANCE.forKey(language); + if (processors.size() > 0) { + for (SmartEnterProcessor processor : processors) { + processor.process(project, editor, indicator.getParameters().getOriginalFile()); + } + } + } else { + DataContext dataContext = DataManager.getInstance().getDataContext(editor.getContentComponent()); + EditorActionManager.getInstance().getTypedAction().getHandler().execute(editor, completionChar, dataContext); + } } context.stopWatching(); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); @@ -736,7 +749,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { super(indicator.getOffsetMap(), completionChar, items.toArray(new LookupElement[items.size()]), indicator.getParameters().getOriginalFile(), editor, completionChar != Lookup.AUTO_INSERT_SELECT_CHAR && completionChar != Lookup.REPLACE_SELECT_CHAR && - completionChar != Lookup.NORMAL_SELECT_CHAR && completionChar != Lookup.COMPLETE_STATEMENT_SELECT_CHAR); + completionChar != Lookup.NORMAL_SELECT_CHAR); } @Override 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 d763a7c574c0..4d15a58b1740 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/TemplateInsertHandler.java @@ -40,8 +40,8 @@ public abstract class TemplateInsertHandler implements InsertHandler { protected static final Object EXPANDED_TEMPLATE_ATTR = Key.create("EXPANDED_TEMPLATE_ATTR"); public void handleInsert(final InsertionContext context, final LookupElement item) { - context.setAddCompletionChar(false); if (isTemplateToBeCompleted(item)) { + context.setAddCompletionChar(false); handleTemplate((LookupItem) item, context); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java index fd07750efbfb..b8ecf2bdc052 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java @@ -209,7 +209,6 @@ public class LookupItem extends MutableLookupElement implements Comparable case '=': return TailType.EQ; case ' ': return TailType.SPACE; case ':': return TailType.CASE_COLON; //? - case Lookup.COMPLETE_STATEMENT_SELECT_CHAR: return TailType.SMART_COMPLETION; } return null; } diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlTagInsertHandler.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlTagInsertHandler.java index 37a8cc5a83a0..e55101bd5509 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/XmlTagInsertHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/XmlTagInsertHandler.java @@ -76,7 +76,9 @@ public class XmlTagInsertHandler implements InsertHandler { if (tag == null) return; - context.setAddCompletionChar(false); + if (context.getCompletionChar() != Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + context.setAddCompletionChar(false); + } final XmlElementDescriptor descriptor = tag.getDescriptor();