Do not shown inaccessible symbols on auto-popup
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user