Fixed extension properties not completed after "get"

This commit is contained in:
Valentin Kipyatkov
2016-05-14 01:22:41 +03:00
parent 88bf7f883e
commit 2ec81f44bf
5 changed files with 36 additions and 21 deletions
@@ -118,17 +118,16 @@ abstract class CompletionSession(
protected val prefixMatcher = CamelHumpMatcher(prefix)
protected val descriptorNameFilter: (Name) -> Boolean = run {
val nameFilter = prefixMatcher.asNameFilter()
private val descriptorStringNameFilter: (String) -> Boolean = run {
val nameFilter = prefixMatcher.asStringNameFilter()
val getOrSetPrefix = listOf("get", "set", "ge", "se", "g", "s").firstOrNull { prefix.startsWith(it) }
if (getOrSetPrefix != null)
nameFilter or prefixMatcher.cloneWithPrefix(prefix.removePrefix(getOrSetPrefix).decapitalizeSmart()).asNameFilter()
prefixMatcher.cloneWithPrefix(prefix.removePrefix(getOrSetPrefix).decapitalizeSmart()).asStringNameFilter() or nameFilter
else
nameFilter
}
private infix fun ((Name) -> Boolean).or(otherFilter: (Name) -> Boolean): (Name) -> Boolean
= { this(it) || otherFilter(it) }
protected val descriptorNameFilter: (Name) -> Boolean = descriptorStringNameFilter.toNameFilter()
protected val isVisibleFilter: (DeclarationDescriptor) -> Boolean = { isVisibleDescriptor(it, completeNonAccessible = configuration.completeNonAccessibleDeclarations) }
protected val isVisibleFilterCheckAlways: (DeclarationDescriptor) -> Boolean = { isVisibleDescriptor(it, completeNonAccessible = false) }
@@ -318,12 +317,11 @@ abstract class CompletionSession(
var notImportedExtensions: Collection<CallableDescriptor> = emptyList()
if (callTypeAndReceiver.shouldCompleteCallableExtensions()) {
val nameFilter: (String) -> Boolean = { prefixMatcher.prefixMatches(it) }
val indicesHelper = indicesHelper(true)
val extensions = if (runtimeReceiver != null)
indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, listOf(runtimeReceiver.type), nameFilter)
indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, listOf(runtimeReceiver.type), descriptorStringNameFilter)
else
indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, expression!!, bindingContext, nameFilter)
indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, expression!!, bindingContext, descriptorStringNameFilter)
val pair = extensions.partition { isImportableDescriptorImported(it) }
variants += pair.first
@@ -118,21 +118,19 @@ fun rethrowWithCancelIndicator(exception: ProcessCanceledException): ProcessCanc
return exception
}
fun PrefixMatcher.asNameFilter() = { name: Name ->
if (name.isSpecial) {
false
}
else {
val identifier = name.identifier
if (prefix.startsWith("$")) { // we need properties from scope for backing field completion
prefixMatches("$" + identifier)
}
else {
prefixMatches(identifier)
}
}
fun PrefixMatcher.asNameFilter(): (Name) -> Boolean {
return { name -> !name.isSpecial && prefixMatches(name.identifier) }
}
fun PrefixMatcher.asStringNameFilter() = { name: String -> prefixMatches(name) }
fun ((String) -> Boolean).toNameFilter(): (Name) -> Boolean {
return { name -> !name.isSpecial && this(name.identifier) }
}
infix fun <T> ((T) -> Boolean).or(otherFilter: (T) -> Boolean): (T) -> Boolean
= { this(it) || otherFilter(it) }
fun LookupElementPresentation.prependTailText(text: String, grayed: Boolean) {
val tails = tailFragments
clearTail()
@@ -0,0 +1,4 @@
package dependency
val String.notImportedExtension: Int
get() = 0
@@ -0,0 +1,9 @@
val String.thisFileExtension: Int
get() = 0
fun f() {
"".get<caret>
}
// EXIST: thisFileExtension
// EXIST: notImportedExtension
@@ -119,6 +119,12 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ
doTest(fileName);
}
@TestMetadata("ExtensionsAndGetPrefix")
public void testExtensionsAndGetPrefix() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ExtensionsAndGetPrefix/");
doTest(fileName);
}
@TestMetadata("ExtensionsForSmartCast")
public void testExtensionsForSmartCast() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ExtensionsForSmartCast/");