diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ImportStaticLookupActionProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/ImportStaticLookupActionProvider.java index 4c8e8b878b4a..10441159129a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ImportStaticLookupActionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ImportStaticLookupActionProvider.java @@ -28,8 +28,6 @@ public class ImportStaticLookupActionProvider implements LookupActionProvider { consumer.consume(new LookupElementAction(icon, "Import statically") { @Override public Result performLookupAction() { - FeatureUsageTracker.getInstance().triggerFeatureUsed(JavaCompletionFeatures.IMPORT_STATIC); - item.setShouldBeImported(!item.willBeImported()); return Result.REFRESH_ITEM; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index d02355bb6fcb..845a3f79b159 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -361,6 +361,18 @@ public class JavaCompletionContributor extends CompletionContributor { public String advertise(@NotNull final CompletionParameters parameters) { if (!(parameters.getOriginalFile() instanceof PsiJavaFile)) return null; + if (parameters.getCompletionType() == CompletionType.BASIC && parameters.getInvocationCount() > 0) { + PsiElement position = parameters.getPosition(); + if (psiElement().withParent(psiReferenceExpression().withFirstChild(psiReferenceExpression().referencing(psiClass()))).accepts(position)) { + if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.GLOBAL_MEMBER_NAME)) { + final String shortcut = getActionShortcut(IdeActions.ACTION_CLASS_NAME_COMPLETION); + if (shortcut != null) { + return "Pressing " + shortcut + " without a class qualifier would show all accessible static methods"; + } + } + } + } + if (parameters.getCompletionType() != CompletionType.SMART && shouldSuggestSmartCompletion(parameters.getPosition())) { if (CompletionUtil.shouldShowFeature(parameters, CodeCompletionFeatures.EDITING_COMPLETION_SMARTTYPE_GENERAL)) { final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionFeatures.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionFeatures.java index 144bc8ca81a0..c775281e16ed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionFeatures.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionFeatures.java @@ -25,7 +25,7 @@ public interface JavaCompletionFeatures { @NonNls String SECOND_SMART_COMPLETION_TOAR = "editing.completion.second.smarttype.toar"; @NonNls String SECOND_SMART_COMPLETION_ASLIST = "editing.completion.second.smarttype.aslist"; @NonNls String SECOND_SMART_COMPLETION_ARRAY_MEMBER = "editing.completion.second.smarttype.array.member"; - @NonNls String IMPORT_STATIC = "editing.completion.import.static"; + @NonNls String GLOBAL_MEMBER_NAME = "editing.completion.global.member.name"; @NonNls String AFTER_NEW = "editing.completion.smarttype.afternew"; @NonNls String AFTER_NEW_ANONYMOUS = "editing.completion.smarttype.afternew"; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java index d0045ccf6fb1..74c6384d32d0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java @@ -44,6 +44,8 @@ public abstract class StaticMemberProcessor { } public void processStaticMethodsGlobally(final CompletionResultSet resultSet) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(JavaCompletionFeatures.GLOBAL_MEMBER_NAME); + final Consumer consumer = new Consumer() { @Override public void consume(LookupElement element) { @@ -64,10 +66,7 @@ public abstract class StaticMemberProcessor { if (classes.add(containingClass)) { final boolean shouldImport = myStaticImportedClasses.contains(containingClass); - if (!myHintShown && - !shouldImport && - FeatureUsageTracker.getInstance().isToBeShown(JavaCompletionFeatures.IMPORT_STATIC, myProject) && - CompletionService.getCompletionService().getAdvertisementText() == null) { + if (!myHintShown && !shouldImport && CompletionService.getCompletionService().getAdvertisementText() == null) { final String shortcut = CompletionContributor.getActionShortcut("EditorRight"); if (shortcut != null) { CompletionService.getCompletionService().setAdvertisementText("To import a method statically, press " + shortcut); diff --git a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties index 72bb568e217b..c1d1bd08a8e6 100644 --- a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties +++ b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties @@ -49,7 +49,7 @@ editing.completion.second.smarttype.chain=Second smart type completion: chained editing.completion.second.smarttype.toar=Second smart type completion: toArray() conversion editing.completion.second.smarttype.aslist=Second smart type completion: asList() conversion editing.completion.second.smarttype.array.member=Second smart type completion: array member access -editing.completion.import.static=Static import via code completion +editing.completion.global.member.name=Global method name code completion editing.completion.variable.name=Variable name completion editing.completion.replace=Replace By when using lookup editing.completion.finishByDotEtc=Finish lookup by special characters diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 85c7259d098c..54c5e2a04d92 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.TailTypes; import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.util.Iconable; @@ -272,23 +273,6 @@ public class GroovyCompletionContributor extends CompletionContributor { } public GroovyCompletionContributor() { - extend(CompletionType.BASIC, psiElement(PsiElement.class), new CompletionProvider() { - @Override - protected void addCompletions(@NotNull CompletionParameters parameters, - ProcessingContext context, - @NotNull final CompletionResultSet result) { - final PsiElement reference = parameters.getPosition().getParent(); - if (reference instanceof GrReferenceElement) { - if (reference.getParent() instanceof GrImportStatement && ((GrReferenceElement)reference).getQualifier() != null) { - result.addElement(LookupElementBuilder.create("*")); - } - - completeReference(parameters, result, (GrReferenceElement)reference); - } - } - }); - - //provide 'this' and 'super' completions in ClassName. extend(CompletionType.BASIC, AFTER_DOT, new CompletionProvider() { @Override @@ -305,6 +289,15 @@ public class GroovyCompletionContributor extends CompletionContributor { GrReferenceExpression referenceExpression = (GrReferenceExpression)qualifier; final PsiElement resolved = referenceExpression.resolve(); if (!(resolved instanceof PsiClass)) return; + + if (CompletionService.getCompletionService().getAdvertisementText() == null && parameters.getInvocationCount() > 0 && + CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.GLOBAL_MEMBER_NAME)) { + final String shortcut = getActionShortcut(IdeActions.ACTION_CLASS_NAME_COMPLETION); + if (shortcut != null) { + CompletionService.getCompletionService().setAdvertisementText("Pressing " + shortcut + " without a class qualifier would show all accessible static methods"); + } + } + if (!PsiUtil.hasEnclosingInstanceInScope((PsiClass)resolved, position, false)) return; for (String keyword : THIS_SUPER) { @@ -313,6 +306,23 @@ public class GroovyCompletionContributor extends CompletionContributor { } }); + extend(CompletionType.BASIC, psiElement(PsiElement.class), new CompletionProvider() { + @Override + protected void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull final CompletionResultSet result) { + final PsiElement reference = parameters.getPosition().getParent(); + if (reference instanceof GrReferenceElement) { + if (reference.getParent() instanceof GrImportStatement && ((GrReferenceElement)reference).getQualifier() != null) { + result.addElement(LookupElementBuilder.create("*")); + } + + completeReference(parameters, result, (GrReferenceElement)reference); + } + } + }); + + extend(CompletionType.BASIC, TYPE_IN_VARIABLE_DECLARATION_AFTER_MODIFIER, new CompletionProvider() { @Override protected void addCompletions(@NotNull CompletionParameters parameters, @@ -525,8 +535,10 @@ public class GroovyCompletionContributor extends CompletionContributor { } private static void showInfo() { - CompletionService.getCompletionService() - .setAdvertisementText(GroovyBundle.message("invoke.completion.second.time.to.show.skipped.methods")); + if (StringUtil.isEmpty(CompletionService.getCompletionService().getAdvertisementText())) { + CompletionService.getCompletionService() + .setAdvertisementText(GroovyBundle.message("invoke.completion.second.time.to.show.skipped.methods")); + } } private static StaticMemberProcessor completeStaticMembers(PsiElement position) { diff --git a/resources/src/ProductivityFeaturesRegistry.xml b/resources/src/ProductivityFeaturesRegistry.xml index cacef83771c2..aee5801c3a1c 100644 --- a/resources/src/ProductivityFeaturesRegistry.xml +++ b/resources/src/ProductivityFeaturesRegistry.xml @@ -176,7 +176,7 @@