diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index 9eccc6b1706..b7a7fb0a717 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -32,7 +32,16 @@ import org.jetbrains.jet.plugin.completion.smart.SmartCompletion import org.jetbrains.jet.plugin.references.JetSimpleNameReference import org.jetbrains.jet.plugin.project.ResolveSessionForBodies -abstract class CompletionSessionBase(public val parameters: CompletionParameters, +class CompletionSessionConfiguration( + val completeNonImportedDeclarations: Boolean, + val completeNonAccessibleDeclarations: Boolean) + +fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration( + completeNonImportedDeclarations = parameters.getInvocationCount() >= 2, + completeNonAccessibleDeclarations = parameters.getInvocationCount() >= 2) + +abstract class CompletionSessionBase(protected val configuration: CompletionSessionConfiguration, + protected val parameters: CompletionParameters, resultSet: CompletionResultSet, protected val jetReference: JetSimpleNameReference) { @@ -50,8 +59,7 @@ abstract class CompletionSessionBase(public val parameters: CompletionParameters protected val prefixMatcher: PrefixMatcher = this.resultSet.getPrefixMatcher() protected fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean { - // Show everything if user insist on showing completion list - if (parameters.getInvocationCount() >= 2) return true + if (configuration.completeNonAccessibleDeclarations) return true if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) { return Visibilities.isVisible(descriptor as DeclarationDescriptorWithVisibility, inDescriptor) @@ -61,8 +69,12 @@ abstract class CompletionSessionBase(public val parameters: CompletionParameters } } -class BasicCompletionSession(parameters: CompletionParameters, resultSet: CompletionResultSet, jetReference: JetSimpleNameReference) -: CompletionSessionBase(parameters, resultSet, jetReference) { +class BasicCompletionSession(configuration: CompletionSessionConfiguration, + parameters: CompletionParameters, + resultSet: CompletionResultSet, + jetReference: JetSimpleNameReference) +: CompletionSessionBase(configuration, parameters, resultSet, jetReference) { + private val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession, { isVisibleDescriptor(it) }) public fun complete(): Boolean { @@ -79,7 +91,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple if (isOnlyKeywordCompletion(position)) return if (shouldRunOnlyTypeCompletion()) { - if (parameters.getInvocationCount() >= 2) { + if (configuration.completeNonImportedDeclarations) { TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) } else { @@ -96,7 +108,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple // Try to avoid computing not-imported descriptors for empty prefix if (prefix.isEmpty()) { - if (parameters.getInvocationCount() < 2) return + if (!configuration.completeNonImportedDeclarations) return if (PsiTreeUtil.getParentOfType(jetReference.expression, javaClass()) == null) return } @@ -176,7 +188,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple } private fun shouldRunTopLevelCompletion(): Boolean { - if (parameters.getInvocationCount() < 2) { + if (!configuration.completeNonImportedDeclarations) { return false } @@ -189,7 +201,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple } private fun shouldRunExtensionsCompletion(): Boolean { - return parameters.getInvocationCount() > 1 || prefixMatcher.getPrefix().length >= 3 + return configuration.completeNonImportedDeclarations || prefixMatcher.getPrefix().length >= 3 } private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) { @@ -198,8 +210,8 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple } } -class SmartCompletionSession(parameters: CompletionParameters, resultSet: CompletionResultSet, jetReference: JetSimpleNameReference) -: CompletionSessionBase(parameters, resultSet, jetReference) { +class SmartCompletionSession(configuration: CompletionSessionConfiguration, parameters: CompletionParameters, resultSet: CompletionResultSet, jetReference: JetSimpleNameReference) +: CompletionSessionBase(configuration, parameters, resultSet, jetReference) { public fun complete() { val descriptors = TipsManager.getReferenceVariants(jetReference.expression, bindingContext) val completion = SmartCompletion(jetReference.expression, resolveSession, { isVisibleDescriptor(it) }, parameters.getOriginalFile() as JetFile) diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt index 17ef8f6f0b4..97ee933b3c3 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt @@ -112,7 +112,7 @@ public class JetCompletionContributor : CompletionContributor() { return } - if (EXTENSION_RECEIVER_TYPE_ACTIVATION_PATTERN.accepts(position) && parameters.getInvocationCount() == 0) { + if (EXTENSION_RECEIVER_TYPE_ACTIVATION_PATTERN.accepts(position) && parameters.getInvocationCount() == 0) { // no auto-popup on typing after "val", "var" and "fun" result.stopHere() return } @@ -127,15 +127,17 @@ public class JetCompletionContributor : CompletionContributor() { try { result.restartCompletionWhenNothingMatches() + val configuration = CompletionSessionConfiguration(parameters) if (parameters.getCompletionType() == CompletionType.BASIC) { - val somethingAdded = BasicCompletionSession(parameters, result, jetReference).complete() + val somethingAdded = BasicCompletionSession(configuration, parameters, result, jetReference).complete() if (!somethingAdded && parameters.getInvocationCount() < 2) { // Rerun completion if nothing was found - BasicCompletionSession(parameters.withInvocationCount(2), result, jetReference).complete() + val newConfiguration = CompletionSessionConfiguration(completeNonImportedDeclarations = true, completeNonAccessibleDeclarations = parameters.getInvocationCount() > 0) + BasicCompletionSession(newConfiguration, parameters, result, jetReference).complete() } } else { - SmartCompletionSession(parameters, result, jetReference).complete() + SmartCompletionSession(configuration, parameters, result, jetReference).complete() } } catch (e: ProcessCanceledException) { diff --git a/idea/testData/completion/basic/common/NoSecondPressCompletionInAutoPopup.kt b/idea/testData/completion/basic/common/NoSecondPressCompletionInAutoPopup.kt new file mode 100644 index 00000000000..b4befb699a9 --- /dev/null +++ b/idea/testData/completion/basic/common/NoSecondPressCompletionInAutoPopup.kt @@ -0,0 +1,10 @@ +object O { + private val zzzz = 0 +} + +fun foo() { + O.z +} + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index 943674c9daa..2fd75d39146 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -369,6 +369,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest("idea/testData/completion/basic/common/NoObjectInTypePosition.kt"); } + @TestMetadata("NoSecondPressCompletionInAutoPopup.kt") + public void testNoSecondPressCompletionInAutoPopup() throws Exception { + doTest("idea/testData/completion/basic/common/NoSecondPressCompletionInAutoPopup.kt"); + } + @TestMetadata("NoTopLevelCompletionInQualifiedUserTypes.kt") public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception { doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 6dcfabce3da..983dc78688a 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -16,17 +16,14 @@ package org.jetbrains.jet.completion; -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; - -import java.io.File; -import java.util.regex.Pattern; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.jetbrains.jet.completion.AbstractJvmBasicCompletionTest; +import java.io.File; +import java.util.regex.Pattern; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @@ -369,6 +366,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest("idea/testData/completion/basic/common/NoObjectInTypePosition.kt"); } + @TestMetadata("NoSecondPressCompletionInAutoPopup.kt") + public void testNoSecondPressCompletionInAutoPopup() throws Exception { + doTest("idea/testData/completion/basic/common/NoSecondPressCompletionInAutoPopup.kt"); + } + @TestMetadata("NoTopLevelCompletionInQualifiedUserTypes.kt") public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception { doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt");