Fixed smart completion of functions with "::"
#KT-6073 Fixed
This commit is contained in:
@@ -231,8 +231,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
|
|||||||
if (functionExpectedInfos.isEmpty()) return null
|
if (functionExpectedInfos.isEmpty()) return null
|
||||||
|
|
||||||
fun toLookupElement(descriptor: FunctionDescriptor): LookupElement? {
|
fun toLookupElement(descriptor: FunctionDescriptor): LookupElement? {
|
||||||
val functionType = functionType(descriptor)
|
val functionType = functionType(descriptor) ?: return null
|
||||||
if (functionType == null) return null
|
|
||||||
|
|
||||||
val matchedExpectedInfos = functionExpectedInfos.filter { functionType.isSubtypeOf(it.type) }
|
val matchedExpectedInfos = functionExpectedInfos.filter { functionType.isSubtypeOf(it.type) }
|
||||||
if (matchedExpectedInfos.isEmpty()) return null
|
if (matchedExpectedInfos.isEmpty()) return null
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ import org.jetbrains.jet.plugin.completion.*
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies
|
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies
|
||||||
import org.jetbrains.jet.plugin.completion.handlers.WithTailInsertHandler
|
import org.jetbrains.jet.plugin.completion.handlers.WithTailInsertHandler
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor
|
||||||
|
|
||||||
class ArtificialElementInsertHandler(
|
class ArtificialElementInsertHandler(
|
||||||
val textBeforeCaret: String, val textAfterCaret: String, val shortenRefs: Boolean) : InsertHandler<LookupElement>{
|
val textBeforeCaret: String, val textAfterCaret: String, val shortenRefs: Boolean) : InsertHandler<LookupElement>{
|
||||||
@@ -155,8 +157,26 @@ fun MutableCollection<LookupElement>.addLookupElementsForNullable(factory: () ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun functionType(function: FunctionDescriptor): JetType? {
|
fun functionType(function: FunctionDescriptor): JetType? {
|
||||||
|
val extensionReceiverType = function.getExtensionReceiverParameter()?.getType()
|
||||||
|
val memberReceiverType = if (function is ConstructorDescriptor) {
|
||||||
|
val classDescriptor = function.getContainingDeclaration()
|
||||||
|
if (classDescriptor.isInner()) {
|
||||||
|
(classDescriptor.getContainingDeclaration() as? ClassifierDescriptor)?.getDefaultType()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(function.getContainingDeclaration() as? ClassifierDescriptor)?.getDefaultType()
|
||||||
|
}
|
||||||
|
//TODO: this is to be changed when references to member extensions supported
|
||||||
|
val receiverType = if (extensionReceiverType != null && memberReceiverType != null)
|
||||||
|
null
|
||||||
|
else
|
||||||
|
extensionReceiverType ?: memberReceiverType
|
||||||
return KotlinBuiltIns.getInstance().getFunctionType(function.getAnnotations(),
|
return KotlinBuiltIns.getInstance().getFunctionType(function.getAnnotations(),
|
||||||
null,
|
receiverType,
|
||||||
function.getValueParameters().map { it.getType() },
|
function.getValueParameters().map { it.getType() },
|
||||||
function.getReturnType() ?: return null)
|
function.getReturnType() ?: return null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
class C {
|
||||||
|
fun foo(s: String): Boolean = true
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
listOf("a").filter(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
fun staticFoo(s: String): Boolean = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun C.extensionFoo(s: String): Boolean = true
|
||||||
|
fun globalFoo(s: String): Boolean = true
|
||||||
|
|
||||||
|
// ABSENT: ::foo
|
||||||
|
// ABSENT: ::staticFoo
|
||||||
|
// ABSENT: ::extensionFoo
|
||||||
|
// EXIST: ::globalFoo
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import kotlin.platform.platformName
|
||||||
|
|
||||||
|
class C(i: Int){
|
||||||
|
class Nested
|
||||||
|
inner class Inner
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
platformName("foo1")
|
||||||
|
fun foo(p: () -> C.Nested){}
|
||||||
|
|
||||||
|
platformName("foo2")
|
||||||
|
fun foo(p: () -> C.Inner){}
|
||||||
|
|
||||||
|
// EXIST: ::Nested
|
||||||
|
// ABSENT: ::Inner
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class C {
|
||||||
|
fun foo(p: C.() -> Unit){}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun f1(){}
|
||||||
|
fun C.f2(){}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: ::f1
|
||||||
|
// ABSENT: ::f2
|
||||||
@@ -7,5 +7,5 @@ fun bar() {
|
|||||||
fun String.f1(){}
|
fun String.f1(){}
|
||||||
fun f2(){}
|
fun f2(){}
|
||||||
|
|
||||||
// EXIST: ::f1
|
// EXIST: String::f1
|
||||||
// ABSENT: ::f2
|
// ABSENT: ::f2
|
||||||
|
|||||||
@@ -198,6 +198,24 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("FunctionReference10.kt")
|
||||||
|
public void testFunctionReference10() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference10.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("FunctionReference11.kt")
|
||||||
|
public void testFunctionReference11() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference11.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("FunctionReference12.kt")
|
||||||
|
public void testFunctionReference12() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference12.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("FunctionReference3.kt")
|
@TestMetadata("FunctionReference3.kt")
|
||||||
public void testFunctionReference3() throws Exception {
|
public void testFunctionReference3() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference3.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/FunctionReference3.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user