From 730683738bda7ee25137bda18de8099eef9ffeb8 Mon Sep 17 00:00:00 2001 From: Andrew Kozlov Date: Fri, 6 Sep 2024 15:16:15 +0200 Subject: [PATCH] [kotlin] KTIJ-26398 KaErrorType receiver types should be filtered out GitOrigin-RevId: e548395b28005724d9897373689ff7033a7dbf1a --- .../FirCallableCompletionContributor.kt | 13 ++++++------- .../impl/k2/contributors/helpers/utils.kt | 2 ++ .../testData/basic/stdlibWithCommon/ErrorType.kt | 11 +++++++++++ .../FirWithMppStdlibCompletionTestGenerated.java | 5 +++++ 4 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 plugins/kotlin/completion/testData/basic/stdlibWithCommon/ErrorType.kt diff --git a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/FirCallableCompletionContributor.kt b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/FirCallableCompletionContributor.kt index daf292bb3e21..29d191d11d1e 100644 --- a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/FirCallableCompletionContributor.kt +++ b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/FirCallableCompletionContributor.kt @@ -188,9 +188,6 @@ internal open class FirCallableCompletionContributor( scopeContext: KaScopeContext, extensionChecker: KaCompletionExtensionCandidateChecker?, ): Sequence = sequence { - val implicitReceivers = scopeContext.implicitReceivers - val implicitReceiversTypes = implicitReceivers.map { it.type } - val availableLocalAndMemberNonExtensions = collectLocalAndMemberNonExtensionsFromScopeContext( parameters = parameters, positionContext = positionContext, @@ -270,7 +267,7 @@ internal open class FirCallableCompletionContributor( collectExtensionsFromIndexAndResolveExtensionScope( positionContext = positionContext, - receiverTypes = implicitReceiversTypes, + receiverTypes = scopeContext.implicitReceivers.map { it.type }, extensionChecker = extensionChecker, ).forEach { applicableExtension -> val signature = applicableExtension.signature @@ -351,7 +348,7 @@ internal open class FirCallableCompletionContributor( explicitReceiver: KtExpression, extensionChecker: KaCompletionExtensionCandidateChecker?, ): Sequence = sequence { - val receiverType = explicitReceiver.expressionType.takeUnless { it is KaErrorType } ?: return@sequence + val receiverType = explicitReceiver.expressionType ?: return@sequence val callablesWithMetadata = collectDotCompletionForCallableReceiver( positionContext = positionContext, typesOfPossibleReceiver = listOf(receiverType), @@ -489,8 +486,10 @@ internal open class FirCallableCompletionContributor( extensionChecker: KaCompletionExtensionCandidateChecker?, explicitReceiverTypes: List? = null, ): Sequence> { - val receiverTypes = explicitReceiverTypes - ?: scopeContext.implicitReceivers.map { it.type } + val receiverTypes = (explicitReceiverTypes + ?: scopeContext.implicitReceivers.map { it.type }) + .filterNot { it is KaErrorType } + if (receiverTypes.isEmpty()) return emptySequence() return scopeContext.scopes.asSequence().flatMap { scopeWithKind -> val suitableExtensions = collectSuitableExtensions( diff --git a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/helpers/utils.kt b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/helpers/utils.kt index 03c52d3dc5af..25f23f7cf4e7 100644 --- a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/helpers/utils.kt +++ b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/contributors/helpers/utils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.components.KaScopeKinds import org.jetbrains.kotlin.analysis.api.scopes.KaScope import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.types.KaErrorType import org.jetbrains.kotlin.analysis.api.types.KaType import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.config.LanguageFeature @@ -142,6 +143,7 @@ internal fun collectNonExtensionsForType( indexInTower: Int? = null, symbolFilter: (KaCallableSymbol) -> Boolean = { true }, ): Sequence { + if (receiverType is KaErrorType) return emptySequence() val typeScope = receiverType.scope ?: return emptySequence() val languageVersionSettings = parameters.languageVersionSettings // todo is it possible to reuse WeighingContext? diff --git a/plugins/kotlin/completion/testData/basic/stdlibWithCommon/ErrorType.kt b/plugins/kotlin/completion/testData/basic/stdlibWithCommon/ErrorType.kt new file mode 100644 index 000000000000..f6097bdbbd14 --- /dev/null +++ b/plugins/kotlin/completion/testData/basic/stdlibWithCommon/ErrorType.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +fun T.foo() {} +fun Any.foo() {} + +fun Foo.test() { + fo +} + +// EXIST: for +// EXIST: floatArrayOf +// NOTHING_ELSE \ No newline at end of file diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/FirWithMppStdlibCompletionTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/FirWithMppStdlibCompletionTestGenerated.java index 72f3d17f7540..d79511eb2020 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/FirWithMppStdlibCompletionTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/FirWithMppStdlibCompletionTestGenerated.java @@ -30,6 +30,11 @@ public class FirWithMppStdlibCompletionTestGenerated extends AbstractFirWithMppS KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } + @TestMetadata("ErrorType.kt") + public void testErrorType() throws Exception { + runTest("../../completion/testData/basic/stdlibWithCommon/ErrorType.kt"); + } + @TestMetadata("extension.kt") public void testExtension() throws Exception { runTest("../../completion/testData/basic/stdlibWithCommon/extension.kt");