From 55621b7aad1bbd3f9767661e947012dfffe9ebc6 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 20 May 2021 13:10:36 +0200 Subject: [PATCH] FIR IDE: do not complete callables for classifier without companion --- .../FirCallableCompletionContributor.kt | 18 ++++++++++-------- .../frontend/api/symbols/KtClassLikeSymbol.kt | 5 +++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirCallableCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirCallableCompletionContributor.kt index 38d4d95149e..c0a14212405 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirCallableCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirCallableCompletionContributor.kt @@ -14,9 +14,7 @@ import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.components.KtScopeContext import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.psi.KtExpression @@ -90,11 +88,15 @@ internal class FirCallableCompletionContributor( extensionChecker: ExtensionApplicabilityChecker, visibilityChecker: CompletionVisibilityChecker, ) { - val packageSymbol = explicitReceiver.reference()?.resolveToSymbol() as? KtPackageSymbol - if (packageSymbol == null) { - collectDotCompletionForCallableReceiver(implicitScopes, explicitReceiver, expectedType, extensionChecker, visibilityChecker) - } else { - collectDotCompletionForPackageReceiver(packageSymbol, expectedType, visibilityChecker) + val symbol = explicitReceiver.reference()?.resolveToSymbol() + when { + symbol is KtPackageSymbol -> collectDotCompletionForPackageReceiver(symbol, expectedType, visibilityChecker) + symbol is KtNamedClassOrObjectSymbol && !symbol.classKind.isObject && symbol.companionObject == null -> { + // symbol cannot be used as callable receiver + } + else -> { + collectDotCompletionForCallableReceiver(implicitScopes, explicitReceiver, expectedType, extensionChecker, visibilityChecker) + } } } diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt index 4e20f853213..47377d99982 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt @@ -84,3 +84,8 @@ abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(), enum class KtClassKind { CLASS, ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, OBJECT, COMPANION_OBJECT, INTERFACE, ANONYMOUS_OBJECT } + +val KtClassKind.isObject + get() = this == KtClassKind.OBJECT + || this == KtClassKind.COMPANION_OBJECT + || this == KtClassKind.ANONYMOUS_OBJECT \ No newline at end of file