diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java index 46794da92edc..48d86aeba882 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java @@ -147,7 +147,7 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { } private static boolean hasStartMatches(Set set, PrefixMatcher matcher) { for (LookupElement lookupElement : set) { - if (hasStartMatches(matcher, lookupElement.getAllLookupStrings())) { + if (matcher.isStartMatch(lookupElement)) { return true; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java index 49ec906f9942..f14c3084a0d4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/NullSmartCompletionContributor.java @@ -21,9 +21,9 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiKeyword; import com.intellij.psi.PsiPrimitiveType; import com.intellij.psi.PsiType; -import org.jetbrains.annotations.NonNls; import java.util.Collection; +import java.util.LinkedHashSet; import static com.intellij.patterns.PsiJavaPatterns.psiElement; import static com.intellij.patterns.StandardPatterns.and; @@ -38,17 +38,23 @@ public class NullSmartCompletionContributor extends CompletionContributor{ not(psiElement().afterLeaf("."))), new ExpectedTypeBasedCompletionProvider() { protected void addCompletions(final CompletionParameters parameters, final CompletionResultSet result, final Collection infos) { - final boolean empty = result.runRemainingContributors(parameters, true).isEmpty(); + if (!StringUtil.startsWithChar(result.getPrefixMatcher().getPrefix(), 'n')) { + return; + } - @NonNls final String prefix = result.getPrefixMatcher().getPrefix(); - if (empty && StringUtil.startsWithChar(prefix, 'n')) { - for (final ExpectedTypeInfo info : infos) { - if (!(info.getType() instanceof PsiPrimitiveType)) { - final LookupItem item = (LookupItem)BasicExpressionCompletionContributor.createKeywordLookupItem(parameters.getPosition(), PsiKeyword.NULL); - item.setAttribute(LookupItem.TYPE, PsiType.NULL); - result.addElement(JavaSmartCompletionContributor.decorate(item, infos)); - return; - } + LinkedHashSet results = result.runRemainingContributors(parameters, true); + for (CompletionResult completionResult : results) { + if (completionResult.isStartMatch()) { + return; + } + } + + for (final ExpectedTypeInfo info : infos) { + if (!(info.getType() instanceof PsiPrimitiveType)) { + final LookupItem item = (LookupItem)BasicExpressionCompletionContributor.createKeywordLookupItem(parameters.getPosition(), PsiKeyword.NULL); + item.setAttribute(LookupItem.TYPE, PsiType.NULL); + result.addElement(JavaSmartCompletionContributor.decorate(item, infos)); + return; } } } diff --git a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1.java b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1.java index c4ef6c7c1fc8..b3e9890cb7bc 100644 --- a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1.java +++ b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1.java @@ -1,20 +1,5 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ public class A{ public void method(){ - boolean x = this i + boolean x = this ins } } diff --git a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1_after.java b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1_after.java index 344f74e8f6ed..b86936886d2b 100644 --- a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1_after.java +++ b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf1_after.java @@ -1,18 +1,3 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ public class A{ public void method(){ boolean x = this instanceof diff --git a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3.java b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3.java index fd6e661eb147..b0e93eecd245 100644 --- a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3.java +++ b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3.java @@ -1,21 +1,6 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ public class A{ public void method(){ String str = ""; - boolean x = str i + boolean x = str ins } } diff --git a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3_after.java b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3_after.java index a2bac477b6b5..9bc7e1cd03ba 100644 --- a/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3_after.java +++ b/java/java-tests/testData/codeInsight/completion/keywords/instanceOf3_after.java @@ -1,18 +1,3 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ public class A{ public void method(){ String str = ""; diff --git a/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java index 1080c468d330..e065346e9120 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java +++ b/java/java-tests/testData/codeInsight/completion/normal/PackageInMemberType.java @@ -1,3 +1,3 @@ class Foo { - java.l + java.la } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/PackageNamedVariableBeforeAssignment.java b/java/java-tests/testData/codeInsight/completion/normal/PackageNamedVariableBeforeAssignment.java index 51e6b886fa93..63455209ce15 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/PackageNamedVariableBeforeAssignment.java +++ b/java/java-tests/testData/codeInsight/completion/normal/PackageNamedVariableBeforeAssignment.java @@ -3,7 +3,7 @@ public class Bar { { int a = 1; Object java; - java.e + java.eq a = 2; } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/SuggestNull.java b/java/java-tests/testData/codeInsight/completion/smartType/SuggestNull.java index 05b6d47b92ef..c24a7e03a7d8 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/SuggestNull.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/SuggestNull.java @@ -1,6 +1,6 @@ public class Foo { { - String s = n + String s = nu } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/generics/before1.java b/java/java-tests/testData/codeInsight/completion/smartType/generics/before1.java index 7673bffd4667..cd42eefca8f8 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/generics/before1.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/generics/before1.java @@ -4,6 +4,6 @@ class A{ void put(String str); { - put(new A().g) + put(new A().ge) } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/generics/before2.java b/java/java-tests/testData/codeInsight/completion/smartType/generics/before2.java index 4a8c644df90b..7b1ec19ec8e2 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/generics/before2.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/generics/before2.java @@ -4,6 +4,6 @@ class A{ void put(T str); { - new A().put(new A().g) + new A().put(new A().ge) } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/generics/before5.java b/java/java-tests/testData/codeInsight/completion/smartType/generics/before5.java index 45444b96f395..fa8d78b4cb14 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/generics/before5.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/generics/before5.java @@ -4,6 +4,6 @@ class A{ } { - String str = new Map().g + String str = new Map().ge } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess-out.java b/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess-out.java index 6baaaef5a5d9..21610879eddd 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess-out.java @@ -1,6 +1,6 @@ class Goo { { - boolean[] ls; - boolean a = ls[]; + boolean[] los; + boolean a = los[]; } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess.java b/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess.java index 260590763d58..6b2f0d6180aa 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/ArrayMemberAccess.java @@ -1,6 +1,6 @@ class Goo { { - boolean[] ls; - boolean a = l + boolean[] los; + boolean a = los } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/QualifiedArrayMemberAccess.java b/java/java-tests/testData/codeInsight/completion/smartType/second/QualifiedArrayMemberAccess.java index fb5ae024f2db..a1400e161455 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/QualifiedArrayMemberAccess.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/QualifiedArrayMemberAccess.java @@ -3,6 +3,6 @@ class Goo { { - boolean a = this.a + boolean a = this.ar } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsList.java b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsList.java index 0074bf67976b..6e3a2eb8a1f4 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsList.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsList.java @@ -4,7 +4,7 @@ class Foo { { Foo[] foos; - Collection c = f + Collection c = foo } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsListWildcard.java b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsListWildcard.java index b0eea8ae1ed1..15b62288b829 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsListWildcard.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestArraysAsListWildcard.java @@ -6,7 +6,7 @@ class Foo implements Bar { { Foo[] foos; - Collection c = f + Collection c = foo } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess-out.java b/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess-out.java index 7d258b790f8e..d1c00ffdd996 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess-out.java @@ -1,5 +1,5 @@ class Goo { - void foo(boolean... ls) { - boolean a = ls[]; + void foo(boolean... los) { + boolean a = los[]; } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess.java b/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess.java index 658a87a8c198..0bc82bfcda83 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/VarargMemberAccess.java @@ -1,5 +1,5 @@ class Goo { - void foo(boolean... ls) { - boolean a = l + void foo(boolean... los) { + boolean a = los } } diff --git a/java/java-tests/testData/codeInsight/completion/style/before3.java b/java/java-tests/testData/codeInsight/completion/style/before3.java index ed3a30f9ee79..120395809e58 100644 --- a/java/java-tests/testData/codeInsight/completion/style/before3.java +++ b/java/java-tests/testData/codeInsight/completion/style/before3.java @@ -5,6 +5,6 @@ class A{ { int aaa = 0; - foo(a + foo(aa } } \ No newline at end of file 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 e4ea8beda5db..aca95baf7d1c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -589,7 +589,7 @@ public class ListUtils { public void testFillCommonPrefixOnSecondCompletion() throws Throwable { configureByFile(getTestName(false) + ".java"); - type('g'); + type('ge'); complete(); checkResult() assertStringItems("getBar", "getFoo", "getClass"); diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionResult.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionResult.java index 867dd01be918..340e8d905791 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionResult.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionResult.java @@ -61,4 +61,8 @@ public class CompletionResult { return new CompletionResult(element, myMatcher, mySorter); } + public boolean isStartMatch() { + return myMatcher.isStartMatch(myLookupElement); + } + } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java b/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java index a49b81c63b01..aabe532fd55b 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java @@ -23,6 +23,15 @@ public abstract class PrefixMatcher { return false; } + public boolean isStartMatch(LookupElement element) { + for (String s : element.getAllLookupStrings()) { + if (isStartMatch(s)) { + return true; + } + } + return false; + } + public boolean isStartMatch(String name) { return prefixMatches(name); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java index f35ba5c9cc1c..281987ec3c7c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java @@ -279,13 +279,7 @@ public class CompletionServiceImpl extends CompletionService{ } public static boolean isStartMatch(LookupElement element, Lookup lookup) { - PrefixMatcher itemMatcher = getItemMatcher(element, lookup); - for (String ls : element.getAllLookupStrings()) { - if (itemMatcher.isStartMatch(ls)) { - return true; - } - } - return false; + return getItemMatcher(element, lookup).isStartMatch(element); } private static PrefixMatcher getItemMatcher(LookupElement element, Lookup lookup) {