FIR IDE: do not complete callables for classifier without companion

This commit is contained in:
Ilya Kirillov
2021-05-20 13:10:36 +02:00
committed by TeamCityServer
parent 365bc5712b
commit 55621b7aad
2 changed files with 15 additions and 8 deletions
@@ -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.components.KtScopeContext
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope 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.scopes.KtScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.*
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.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
@@ -90,11 +88,15 @@ internal class FirCallableCompletionContributor(
extensionChecker: ExtensionApplicabilityChecker, extensionChecker: ExtensionApplicabilityChecker,
visibilityChecker: CompletionVisibilityChecker, visibilityChecker: CompletionVisibilityChecker,
) { ) {
val packageSymbol = explicitReceiver.reference()?.resolveToSymbol() as? KtPackageSymbol val symbol = explicitReceiver.reference()?.resolveToSymbol()
if (packageSymbol == null) { when {
collectDotCompletionForCallableReceiver(implicitScopes, explicitReceiver, expectedType, extensionChecker, visibilityChecker) symbol is KtPackageSymbol -> collectDotCompletionForPackageReceiver(symbol, expectedType, visibilityChecker)
} else { symbol is KtNamedClassOrObjectSymbol && !symbol.classKind.isObject && symbol.companionObject == null -> {
collectDotCompletionForPackageReceiver(packageSymbol, expectedType, visibilityChecker) // symbol cannot be used as callable receiver
}
else -> {
collectDotCompletionForCallableReceiver(implicitScopes, explicitReceiver, expectedType, extensionChecker, visibilityChecker)
}
} }
} }
@@ -84,3 +84,8 @@ abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(),
enum class KtClassKind { enum class KtClassKind {
CLASS, ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, OBJECT, COMPANION_OBJECT, INTERFACE, ANONYMOUS_OBJECT 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