Import quick fix: suggest for operator extension function called from name reference

#KT-28049 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-09-17 06:30:26 +09:00
committed by Dmitry Gridin
parent 998adfb098
commit 79199260b9
3 changed files with 55 additions and 4 deletions
@@ -50,12 +50,10 @@ import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper
import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.intentions.getCallableDescriptor
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
import org.jetbrains.kotlin.idea.util.ReceiverType
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.idea.util.receiverTypesWithIndex
import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -261,6 +259,12 @@ internal abstract class OrdinaryImportFixBase<T : KtExpression>(expression: T, f
indicesHelper.getTopLevelCallablesByName(name).filterTo(result, filterByCallType)
}
if (callTypeAndReceiver.callType == CallType.OPERATOR) {
val type = expression.getCallableDescriptor()?.returnType
if (type != null) {
result.addAll(indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, listOf(type), { it == name }))
}
}
}
result.addAll(indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, expression, bindingContext) { it == name })
@@ -0,0 +1,42 @@
// FILE: first.before.kt
// "Import" "true"
// ERROR: Expression 'a' of type 'A' cannot be invoked as a function. The function 'invoke()' is not found
package b
import a.A
fun main() {
val a = A()
<caret>a()
}
//-----------------------
// FILE: second.kt
// "Import" "true"
// ERROR: Expression 'a' of type 'A' cannot be invoked as a function. The function 'invoke()' is not found
package a
class A
operator fun A.invoke() = 42
//-----------------------
// FILE: first.after.kt
// "Import" "true"
// ERROR: Expression 'a' of type 'A' cannot be invoked as a function. The function 'invoke()' is not found
package b
import a.A
import a.invoke
fun main() {
val a = A()
<caret>a()
}
//-----------------------
@@ -763,6 +763,11 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
runTest("idea/testData/quickfix/autoImports/invokeExtension.test");
}
@TestMetadata("invokeExtension2.test")
public void testInvokeExtension2() throws Exception {
runTest("idea/testData/quickfix/autoImports/invokeExtension2.test");
}
@TestMetadata("invokeExtensionNoOperator.test")
public void testInvokeExtensionNoOperator() throws Exception {
runTest("idea/testData/quickfix/autoImports/invokeExtensionNoOperator.test");