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 47cf86819c0f..7310227a80f0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -53,6 +53,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Consumer; +import com.intellij.util.ObjectUtils; import com.intellij.util.PairConsumer; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; @@ -340,6 +341,7 @@ public class JavaCompletionContributor extends CompletionContributor { } final Object[] variants = reference.getVariants(); + //noinspection ConstantConditions if (variants == null) { LOG.error("Reference=" + reference); } @@ -365,6 +367,7 @@ public class JavaCompletionContributor extends CompletionContributor { } else { + //noinspection deprecation LookupElement element = LookupItemUtil.objectToLookupItem(completion); usedWords.add(element.getLookupString()); result.addElement(element); @@ -434,7 +437,7 @@ public class JavaCompletionContributor extends CompletionContributor { private static void completeAnnotationAttributeName(CompletionResultSet result, PsiElement insertedElement, CompletionParameters parameters) { PsiNameValuePair pair = PsiTreeUtil.getParentOfType(insertedElement, PsiNameValuePair.class); - PsiAnnotationParameterList parameterList = (PsiAnnotationParameterList)pair.getParent(); + PsiAnnotationParameterList parameterList = (PsiAnnotationParameterList)ObjectUtils.assertNotNull(pair).getParent(); PsiAnnotation anno = (PsiAnnotation)parameterList.getParent(); boolean showClasses = psiElement().afterLeaf("(").accepts(insertedElement); PsiClass annoClass = null; @@ -507,7 +510,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (psiElement().withParent(psiReferenceExpression().withFirstChild(psiReferenceExpression().referencing(psiClass()))).accepts(position)) { if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.GLOBAL_MEMBER_NAME)) { final String shortcut = getActionShortcut(IdeActions.ACTION_CODE_COMPLETION); - if (shortcut != null) { + if (StringUtil.isNotEmpty(shortcut)) { return "Pressing " + shortcut + " twice without a class qualifier would show all accessible static methods"; } } @@ -517,7 +520,7 @@ public class JavaCompletionContributor extends CompletionContributor { 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); - if (shortcut != null) { + if (StringUtil.isNotEmpty(shortcut)) { return CompletionBundle.message("completion.smart.hint", shortcut); } } @@ -528,7 +531,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (psiTypes.length > 0) { if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_TOAR)) { final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION); - if (shortcut != null) { + if (StringUtil.isNotEmpty(shortcut)) { for (final PsiType psiType : psiTypes) { final PsiType type = PsiUtil.extractIterableTypeParameter(psiType, false); if (type != null) { @@ -539,7 +542,7 @@ public class JavaCompletionContributor extends CompletionContributor { } if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_ASLIST)) { final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION); - if (shortcut != null) { + if (StringUtil.isNotEmpty(shortcut)) { for (final PsiType psiType : psiTypes) { if (psiType instanceof PsiArrayType) { final PsiType componentType = ((PsiArrayType)psiType).getComponentType(); @@ -553,7 +556,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_CHAIN)) { final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION); - if (shortcut != null) { + if (StringUtil.isNotEmpty(shortcut)) { return CompletionBundle.message("completion.smart.chain.hint", shortcut); } } @@ -639,9 +642,12 @@ public class JavaCompletionContributor extends CompletionContributor { final PsiFile file = context.getFile(); if (file instanceof PsiJavaFile) { - JavaCompletionUtil.initOffsets(file, context.getOffsetMap()); + if (context.getInvocationCount() > 0) { + autoImport(file, context.getStartOffset() - 1, context.getEditor()); + PsiDocumentManager.getInstance(context.getProject()).commitDocument(context.getEditor().getDocument()); + } - autoImport(file, context.getStartOffset() - 1, context.getEditor()); + JavaCompletionUtil.initOffsets(file, context.getOffsetMap()); if (context.getCompletionType() == CompletionType.BASIC) { if (semicolonNeeded(context.getEditor(), file, context.getStartOffset())) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java index 7cf2c7d7db11..624d60fd8688 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionInitializationContext.java @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiUtilBase; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -40,13 +41,15 @@ public class CompletionInitializationContext { private final Editor myEditor; private final PsiFile myFile; private final CompletionType myCompletionType; + private final int myInvocationCount; private final OffsetMap myOffsetMap; private String myDummyIdentifier = DUMMY_IDENTIFIER; - public CompletionInitializationContext(final Editor editor, final PsiFile file, final CompletionType completionType) { + public CompletionInitializationContext(final Editor editor, final PsiFile file, final CompletionType completionType, int invocationCount) { myEditor = editor; myFile = file; myCompletionType = completionType; + myInvocationCount = invocationCount; myOffsetMap = new OffsetMap(editor.getDocument()); myOffsetMap.addOffset(START_OFFSET, calcStartOffset(editor)); @@ -79,7 +82,7 @@ public class CompletionInitializationContext { @NotNull public Language getPositionLanguage() { - return PsiUtilBase.getLanguageInEditor(getEditor(), getProject()); + return ObjectUtils.assertNotNull(PsiUtilBase.getLanguageInEditor(getEditor(), getProject())); } public String getDummyIdentifier() { @@ -127,9 +130,12 @@ public class CompletionInitializationContext { return getIdentifierEndOffset(); } + public int getInvocationCount() { + return myInvocationCount; + } + /** * Mark the offset up to which the text will be deleted if a completion variant is selected using Replace character (Tab) - * @param idEnd */ public void setReplacementOffset(int idEnd) { myOffsetMap.addOffset(IDENTIFIER_END_OFFSET, idEnd); 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 0685c53c2ad7..31a79bab98bb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -135,19 +135,18 @@ public class CodeCompletionHandlerBase { } */ - int newTime = phase.newCompletionStarted(time, repeated); + final int newTime = phase.newCompletionStarted(time, repeated); if (invokedExplicitly) { time = newTime; } + final int invocationCount = time; if (CompletionServiceImpl.isPhase(CompletionPhase.InsertedSingleItem.class)) { CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); } CompletionServiceImpl.assertPhase(CompletionPhase.NoCompletion.getClass(), CompletionPhase.CommittingDocuments.class); - if (time > 1) { - if (myCompletionType == CompletionType.BASIC) { - FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.SECOND_BASIC_COMPLETION); - } + if (invocationCount > 1 && myCompletionType == CompletionType.BASIC) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.SECOND_BASIC_COMPLETION); } final CompletionInitializationContext[] initializationContext = {null}; @@ -168,7 +167,7 @@ public class CodeCompletionHandlerBase { psiFile.putUserData(PsiFileEx.BATCH_REFERENCE_PROCESSING, Boolean.TRUE); CompletionAssertions.assertCommitSuccessful(editor, psiFile); - initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile); + initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile, invocationCount); } }; ApplicationManager.getApplication().runWriteAction(runnable); @@ -184,12 +183,12 @@ public class CodeCompletionHandlerBase { CommandProcessor.getInstance().executeCommand(project, initCmd, null, null); } - insertDummyIdentifier(initializationContext[0], hasModifiers, time); + insertDummyIdentifier(initializationContext[0], hasModifiers, invocationCount); } - private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile) { + private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile, int invocationCount) { final Ref current = Ref.create(null); - CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType) { + CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType, invocationCount) { CompletionContributor dummyIdentifierChanger; @Override @@ -759,10 +758,12 @@ public class CodeCompletionHandlerBase { } 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()); + if (language != null) { + final List processors = SmartEnterProcessors.INSTANCE.forKey(language); + if (processors.size() > 0) { + for (SmartEnterProcessor processor : processors) { + processor.process(project, editor, indicator.getParameters().getOriginalFile()); + } } } }