diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 396d9937dfe2..591729fb88cd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -72,7 +72,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { private static final ElementExtractorFilter THROWABLES_FILTER = new ElementExtractorFilter(new AssignableFromFilter(CommonClassNames.JAVA_LANG_THROWABLE)); @NonNls private static final String EXCEPTION_TAG = "exception"; - static final ElementPattern AFTER_NEW = + public static final ElementPattern AFTER_NEW = psiElement().afterLeaf( psiElement().withText(PsiKeyword.NEW).andNot( psiElement().afterLeaf( diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index 296b00a15e76..23e0190e4613 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -92,6 +92,7 @@ public class PsiTypeLookupItem extends LookupItem { PsiElement position = context.getFile().findElementAt(context.getStartOffset()); assert position != null; + boolean afterNew = JavaSmartCompletionContributor.AFTER_NEW.accepts(position); int genericsStart = context.getTailOffset(); context.getDocument().insertString(genericsStart, JavaCompletionUtil.escapeXmlIfNeeded(context, calcGenerics(position, context))); JavaCompletionUtil.shortenReference(context.getFile(), genericsStart - 1); @@ -100,10 +101,15 @@ public class PsiTypeLookupItem extends LookupItem { String braces = StringUtil.repeat("[]", getBracketsCount()); Editor editor = context.getEditor(); if (!braces.isEmpty()) { - context.getDocument().insertString(tail, braces); - editor.getCaretModel().moveToOffset(tail + 1); - if (context.getCompletionChar() == '[') { - context.setAddCompletionChar(false); + if (LookupEvent.isSpecialCompletionChar(context.getCompletionChar()) && afterNew) { + context.getDocument().insertString(tail, braces + "{}"); + editor.getCaretModel().moveToOffset(tail + braces.length() + 1); + } else { + context.getDocument().insertString(tail, braces); + editor.getCaretModel().moveToOffset(tail + 1); + if (context.getCompletionChar() == '[') { + context.setAddCompletionChar(false); + } } } else { diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ArrayInitializerBeforeVarargs-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ArrayInitializerBeforeVarargs-out.java index 49ce3eb54d4b..bec60ac2de6b 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/ArrayInitializerBeforeVarargs-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/ArrayInitializerBeforeVarargs-out.java @@ -1,5 +1,5 @@ class Super { void foo(String[] params, int... indices) { - foo(new String[], 0); + foo(new String[]{}, 0); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ThrowExceptionConstructor-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ThrowExceptionConstructor-out.java index d105afd9a5d7..7d740e51351c 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/ThrowExceptionConstructor-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/ThrowExceptionConstructor-out.java @@ -4,6 +4,6 @@ class MyException extends RuntimeException { class XXX { { - throw new MyException(new String[]); + throw new MyException(new String[]{}); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/generics/after8.java b/java/java-tests/testData/codeInsight/completion/smartType/generics/after8.java index a0db73a070a7..0a84ee9cc66b 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/generics/after8.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/generics/after8.java @@ -2,6 +2,6 @@ class List {} class C { void foo () { - List[] array = new List[]; + List[] array = new List[]{}; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/generics/after9.java b/java/java-tests/testData/codeInsight/completion/smartType/generics/after9.java index e7495d309f3a..b06059aa67d7 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/generics/after9.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/generics/after9.java @@ -2,6 +2,6 @@ class A { void foo(T[] ts) {} { - foo(new Object[]); + foo(new Object[]{}); } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/LightFixtureCompletionTestCase.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/LightFixtureCompletionTestCase.java index 2bcb2330efc9..17f0308d3119 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/LightFixtureCompletionTestCase.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/LightFixtureCompletionTestCase.java @@ -2,6 +2,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupEvent; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.openapi.command.WriteCommandAction; @@ -49,7 +50,7 @@ public abstract class LightFixtureCompletionTestCase extends LightCodeInsightFix protected void selectItem(LookupElement item, final char completionChar) { final LookupImpl lookup = getLookup(); lookup.setCurrentItem(item); - if (completionChar == 0 || completionChar == '\n' || completionChar == '\t' || completionChar == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + if (LookupEvent.isSpecialCompletionChar(completionChar)) { new WriteCommandAction.Simple(getProject()) { @Override protected void run() throws Throwable { diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupEvent.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupEvent.java index 6306421ebdc4..eee15faa7247 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupEvent.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupEvent.java @@ -59,4 +59,9 @@ public class LookupEvent extends EventObject { public boolean isCanceledExplicitly() { return myCanceledExplicitly; } + + public static boolean isSpecialCompletionChar(char c) { + return c == Lookup.AUTO_INSERT_SELECT_CHAR || c == Lookup.COMPLETE_STATEMENT_SELECT_CHAR || + c == Lookup.NORMAL_SELECT_CHAR || c == Lookup.REPLACE_SELECT_CHAR; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java index 44140daccd81..d93c17c9418d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java @@ -502,11 +502,7 @@ public class CompletionLookupArranger extends LookupArranger { } String withoutSpaces = StringUtil.replace(textInserted, new String[]{" ", "\t", "\n"}, new String[]{"", "", ""}); int spared = withoutSpaces.length() - indicator.getLookup().itemPattern(item).length(); - if (completionChar != Lookup.NORMAL_SELECT_CHAR && - completionChar != Lookup.REPLACE_SELECT_CHAR && - completionChar != Lookup.AUTO_INSERT_SELECT_CHAR && - completionChar != Lookup.COMPLETE_STATEMENT_SELECT_CHAR && - withoutSpaces.contains(String.valueOf(completionChar))) { + if (!LookupEvent.isSpecialCompletionChar(completionChar) && withoutSpaces.contains(String.valueOf(completionChar))) { spared--; } if (spared > 0) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/BaseCompleteMacro.java b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/BaseCompleteMacro.java index 8e51819e8f89..2fe96bca2a5a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/macro/BaseCompleteMacro.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/macro/BaseCompleteMacro.java @@ -126,7 +126,7 @@ public abstract class BaseCompleteMacro extends Macro { if (item == null) return; char c = event.getCompletionChar(); - if (c != Lookup.REPLACE_SELECT_CHAR && c != Lookup.NORMAL_SELECT_CHAR && c != Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + if (!LookupEvent.isSpecialCompletionChar(c)) { return; } diff --git a/xml/tests/src/com/intellij/codeInsight/completion/XmlSmartEnterTest.java b/xml/tests/src/com/intellij/codeInsight/completion/XmlSmartEnterTest.java index 8558295dc3cc..0ec36a34e2d4 100644 --- a/xml/tests/src/com/intellij/codeInsight/completion/XmlSmartEnterTest.java +++ b/xml/tests/src/com/intellij/codeInsight/completion/XmlSmartEnterTest.java @@ -3,6 +3,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupEvent; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.codeInsight.lookup.impl.LookupManagerImpl; @@ -115,7 +116,7 @@ public class XmlSmartEnterTest extends LightCodeInsightTestCase { } private void select(final char c) { - if (c != '\n' && c != '\t' && c != Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { + if (!LookupEvent.isSpecialCompletionChar(c)) { type(c); return; }