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.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)
}
}
}
@@ -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