Do not shown inaccessible symbols on auto-popup

This commit is contained in:
Valentin Kipyatkov
2014-07-30 22:19:37 +04:00
parent 9168f0a91a
commit b5058fa7fd
5 changed files with 51 additions and 20 deletions
@@ -32,7 +32,16 @@ import org.jetbrains.jet.plugin.completion.smart.SmartCompletion
import org.jetbrains.jet.plugin.references.JetSimpleNameReference import org.jetbrains.jet.plugin.references.JetSimpleNameReference
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies 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, resultSet: CompletionResultSet,
protected val jetReference: JetSimpleNameReference) { protected val jetReference: JetSimpleNameReference) {
@@ -50,8 +59,7 @@ abstract class CompletionSessionBase(public val parameters: CompletionParameters
protected val prefixMatcher: PrefixMatcher = this.resultSet.getPrefixMatcher() protected val prefixMatcher: PrefixMatcher = this.resultSet.getPrefixMatcher()
protected fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean { protected fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean {
// Show everything if user insist on showing completion list if (configuration.completeNonAccessibleDeclarations) return true
if (parameters.getInvocationCount() >= 2) return true
if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) { if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) {
return Visibilities.isVisible(descriptor as DeclarationDescriptorWithVisibility, inDescriptor) 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) class BasicCompletionSession(configuration: CompletionSessionConfiguration,
: CompletionSessionBase(parameters, resultSet, jetReference) { parameters: CompletionParameters,
resultSet: CompletionResultSet,
jetReference: JetSimpleNameReference)
: CompletionSessionBase(configuration, parameters, resultSet, jetReference) {
private val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession, { isVisibleDescriptor(it) }) private val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession, { isVisibleDescriptor(it) })
public fun complete(): Boolean { public fun complete(): Boolean {
@@ -79,7 +91,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple
if (isOnlyKeywordCompletion(position)) return if (isOnlyKeywordCompletion(position)) return
if (shouldRunOnlyTypeCompletion()) { if (shouldRunOnlyTypeCompletion()) {
if (parameters.getInvocationCount() >= 2) { if (configuration.completeNonImportedDeclarations) {
TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector)
} }
else { else {
@@ -96,7 +108,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple
// Try to avoid computing not-imported descriptors for empty prefix // Try to avoid computing not-imported descriptors for empty prefix
if (prefix.isEmpty()) { if (prefix.isEmpty()) {
if (parameters.getInvocationCount() < 2) return if (!configuration.completeNonImportedDeclarations) return
if (PsiTreeUtil.getParentOfType(jetReference.expression, javaClass<JetDotQualifiedExpression>()) == null) return if (PsiTreeUtil.getParentOfType(jetReference.expression, javaClass<JetDotQualifiedExpression>()) == null) return
} }
@@ -176,7 +188,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple
} }
private fun shouldRunTopLevelCompletion(): Boolean { private fun shouldRunTopLevelCompletion(): Boolean {
if (parameters.getInvocationCount() < 2) { if (!configuration.completeNonImportedDeclarations) {
return false return false
} }
@@ -189,7 +201,7 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple
} }
private fun shouldRunExtensionsCompletion(): Boolean { 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) { private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) {
@@ -198,8 +210,8 @@ class BasicCompletionSession(parameters: CompletionParameters, resultSet: Comple
} }
} }
class SmartCompletionSession(parameters: CompletionParameters, resultSet: CompletionResultSet, jetReference: JetSimpleNameReference) class SmartCompletionSession(configuration: CompletionSessionConfiguration, parameters: CompletionParameters, resultSet: CompletionResultSet, jetReference: JetSimpleNameReference)
: CompletionSessionBase(parameters, resultSet, jetReference) { : CompletionSessionBase(configuration, parameters, resultSet, jetReference) {
public fun complete() { public fun complete() {
val descriptors = TipsManager.getReferenceVariants(jetReference.expression, bindingContext) val descriptors = TipsManager.getReferenceVariants(jetReference.expression, bindingContext)
val completion = SmartCompletion(jetReference.expression, resolveSession, { isVisibleDescriptor(it) }, parameters.getOriginalFile() as JetFile) val completion = SmartCompletion(jetReference.expression, resolveSession, { isVisibleDescriptor(it) }, parameters.getOriginalFile() as JetFile)
@@ -112,7 +112,7 @@ public class JetCompletionContributor : CompletionContributor() {
return 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() result.stopHere()
return return
} }
@@ -127,15 +127,17 @@ public class JetCompletionContributor : CompletionContributor() {
try { try {
result.restartCompletionWhenNothingMatches() result.restartCompletionWhenNothingMatches()
val configuration = CompletionSessionConfiguration(parameters)
if (parameters.getCompletionType() == CompletionType.BASIC) { 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) { if (!somethingAdded && parameters.getInvocationCount() < 2) {
// Rerun completion if nothing was found // 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 { else {
SmartCompletionSession(parameters, result, jetReference).complete() SmartCompletionSession(configuration, parameters, result, jetReference).complete()
} }
} }
catch (e: ProcessCanceledException) { catch (e: ProcessCanceledException) {
@@ -0,0 +1,10 @@
object O {
private val zzzz = 0
}
fun foo() {
O.z<caret>
}
// INVOCATION_COUNT: 0
// NUMBER: 0
@@ -369,6 +369,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest("idea/testData/completion/basic/common/NoObjectInTypePosition.kt"); 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") @TestMetadata("NoTopLevelCompletionInQualifiedUserTypes.kt")
public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception { public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception {
doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt"); doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt");
@@ -16,17 +16,14 @@
package org.jetbrains.jet.completion; package org.jetbrains.jet.completion;
import junit.framework.Assert;
import junit.framework.Test; import junit.framework.Test;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata; 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 */ /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@@ -369,6 +366,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest("idea/testData/completion/basic/common/NoObjectInTypePosition.kt"); 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") @TestMetadata("NoTopLevelCompletionInQualifiedUserTypes.kt")
public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception { public void testNoTopLevelCompletionInQualifiedUserTypes() throws Exception {
doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt"); doTest("idea/testData/completion/basic/common/NoTopLevelCompletionInQualifiedUserTypes.kt");