[kotlin] replace context receivers with context parameters for completion subsystem

KT-78093

GitOrigin-RevId: 2a691e4f53b70cf7eb1c03779f9a0e369ad99380
This commit is contained in:
Anna Kozlova
2025-08-29 17:31:17 +00:00
committed by intellij-monorepo-bot
parent 4bf74e2414
commit 091db089ea
84 changed files with 523 additions and 367 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ create_kotlinc_options(
"org.jetbrains.kotlin.analysis.api.permissions.KaAllowProhibitedAnalyzeFromWriteAction",
"org.jetbrains.kotlin.analysis.api.KaIdeApi",
],
x_context_receivers = True
x_context_parameters = True
)
jvm_library(
@@ -4,7 +4,7 @@
<facet type="kotlin-language" name="Kotlin">
<configuration version="5" platform="JVM 17" allPlatforms="JVM [17]" useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-Xjvm-default=all -Xopt-in=com.intellij.openapi.util.IntellijInternalApi -Xcontext-receivers -opt-in=org.jetbrains.kotlin.analysis.api.permissions.KaAllowProhibitedAnalyzeFromWriteAction -opt-in=org.jetbrains.kotlin.analysis.api.KaIdeApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
<option name="additionalArguments" value="-Xjvm-default=all -Xopt-in=com.intellij.openapi.util.IntellijInternalApi -Xcontext-parameters -opt-in=org.jetbrains.kotlin.analysis.api.permissions.KaAllowProhibitedAnalyzeFromWriteAction -opt-in=org.jetbrains.kotlin.analysis.api.KaIdeApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
</compilerSettings>
<compilerArguments>
<stringArguments>
@@ -9,7 +9,7 @@ create_kotlinc_options(
"org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction",
"org.jetbrains.kotlin.idea.base.util.K1ModeProjectStructureApi",
],
x_context_receivers = True
x_context_parameters = True
)
jvm_library(
@@ -4,7 +4,7 @@
<facet type="kotlin-language" name="Kotlin">
<configuration version="5" platform="JVM 17" allPlatforms="JVM [17]" useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-Xjvm-default=all -opt-in=com.intellij.openapi.util.IntellijInternalApi -opt-in=org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction -Xcontext-receivers -opt-in=org.jetbrains.kotlin.idea.base.util.K1ModeProjectStructureApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
<option name="additionalArguments" value="-Xjvm-default=all -opt-in=com.intellij.openapi.util.IntellijInternalApi -opt-in=org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction -Xcontext-parameters -opt-in=org.jetbrains.kotlin.idea.base.util.K1ModeProjectStructureApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
</compilerSettings>
<compilerArguments>
<stringArguments>
@@ -10,7 +10,7 @@ create_kotlinc_options(
"org.jetbrains.kotlin.analysis.api.KaIdeApi",
"org.jetbrains.kotlin.analysis.api.KaContextParameterApi",
],
x_context_receivers = True
x_context_parameters = True
)
jvm_resources(
@@ -4,7 +4,7 @@
<facet type="kotlin-language" name="Kotlin">
<configuration version="5" platform="JVM 17" allPlatforms="JVM [17]" useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-Xjvm-default=all -Xopt-in=com.intellij.openapi.util.IntellijInternalApi -Xcontext-receivers -opt-in=org.jetbrains.kotlin.analysis.api.permissions.KaAllowProhibitedAnalyzeFromWriteAction -opt-in=org.jetbrains.kotlin.analysis.api.KaIdeApi -opt-in=org.jetbrains.kotlin.analysis.api.KaContextParameterApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
<option name="additionalArguments" value="-Xjvm-default=all -Xopt-in=com.intellij.openapi.util.IntellijInternalApi -Xcontext-parameters -opt-in=org.jetbrains.kotlin.analysis.api.permissions.KaAllowProhibitedAnalyzeFromWriteAction -opt-in=org.jetbrains.kotlin.analysis.api.KaIdeApi -opt-in=org.jetbrains.kotlin.analysis.api.KaContextParameterApi -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
</compilerSettings>
<compilerArguments>
<stringArguments>
@@ -9,6 +9,8 @@ import com.intellij.psi.PsiErrorElement
import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.components.resolveToCall
import org.jetbrains.kotlin.analysis.api.components.resolveToCallCandidates
import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic
import org.jetbrains.kotlin.analysis.api.resolution.KaApplicableCallCandidateInfo
import org.jetbrains.kotlin.analysis.api.resolution.KaFunctionCall
@@ -170,7 +172,7 @@ internal object Completions {
sink.addedElementCount > 0
}
context(KaSession)
context(_: KaSession)
private fun completeSequentially(
positionContext: KotlinRawPositionContext,
sink: LookupElementSink,
@@ -428,7 +430,7 @@ internal fun KotlinUnknownPositionContext.isAfterRangeToken(): Boolean {
* @return `true` if the context is after a double dot (`..`) not associated with a `rangeTo` operation,
* otherwise `false`.
*/
context(KaSession)
context(_: KaSession)
internal fun KotlinRawPositionContext.isAfterRangeOperator(): Boolean {
if (this !is KotlinExpressionNameReferencePositionContext) return false
val binaryExpression = nameExpression.parent as? KtBinaryExpression
@@ -446,7 +448,7 @@ internal fun KotlinRawPositionContext.isAfterRangeOperator(): Boolean {
}
}
context(KaSession)
context(_: KaSession)
internal fun KotlinRawPositionContext.allowsOnlyNamedArguments(): Boolean {
if (this !is KotlinExpressionNameReferencePositionContext) return false
if (explicitReceiver != null) return false
@@ -4,6 +4,8 @@ package org.jetbrains.kotlin.idea.completion.impl.k2
import com.intellij.openapi.project.Project
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.containingSymbol
import org.jetbrains.kotlin.analysis.api.components.fakeOverrideOriginal
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.idea.base.analysis.api.utils.getDefaultImports
import org.jetbrains.kotlin.idea.base.util.isImported
@@ -25,7 +27,7 @@ class ImportStrategyDetector(originalKtFile: KtFile, project: Project) {
}
context(KaSession)
context(_: KaSession)
fun detectImportStrategyForCallableSymbol(symbol: KaCallableSymbol, isFunctionalVariableCall: Boolean = false): ImportStrategy {
val hasStablePath = when ((symbol.fakeOverrideOriginal.containingSymbol as? KaClassSymbol)?.classKind) {
KaClassKind.ENUM_CLASS,
@@ -45,7 +47,7 @@ class ImportStrategyDetector(originalKtFile: KtFile, project: Project) {
}
}
context (KaSession)
context (_: KaSession)
fun detectImportStrategyForClassifierSymbol(symbol: KaClassifierSymbol): ImportStrategy {
if (symbol !is KaClassLikeSymbol) return ImportStrategy.DoNothing
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.components.KaCompletionExtensionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.expectedType
import org.jetbrains.kotlin.analysis.api.impl.base.components.KaBaseIllegalPsiException
import org.jetbrains.kotlin.idea.base.analysis.api.utils.KtSymbolFromIndexProvider
import org.jetbrains.kotlin.idea.completion.KotlinFirCompletionParameters
@@ -143,7 +144,7 @@ internal interface K2CompletionRunner {
}
}
context(KaSession)
context(_: KaSession)
private fun createWeighingContext(
positionContext: KotlinRawPositionContext,
parameters: KotlinFirCompletionParameters
@@ -174,7 +175,7 @@ private fun createWeighingContext(
}
}
context(KaSession)
context(_: KaSession)
private fun createExtensionChecker(
positionContext: KotlinRawPositionContext,
originalFile: KtFile,
@@ -273,12 +274,12 @@ private class SharedPriorityQueue<P : Any, C : Comparable<C>>(
fun createLocalInstance(): LocalInstance = LocalInstance()
}
context(KaSession)
context(session: KaSession)
private fun <P : KotlinRawPositionContext> K2CompletionSection<P>.executeIfAllowed(context: K2CompletionSectionContext<P>) {
with(contributor) {
if (!this@KaSession.shouldExecute(context)) return
if (!session.shouldExecute(context)) return
}
runnable(this@KaSession, context)
runnable(session, context)
}
/**
@@ -5,9 +5,12 @@ package org.jetbrains.kotlin.idea.completion.checkers
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaUseSiteVisibilityChecker
import org.jetbrains.kotlin.analysis.api.components.createUseSiteVisibilityChecker
import org.jetbrains.kotlin.analysis.api.components.deprecationStatus
import org.jetbrains.kotlin.analysis.api.permissions.forbidAnalysis
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.idea.base.projectStructure.getKaModule
import org.jetbrains.kotlin.idea.base.util.isJavaClassNotToBeUsedInKotlin
import org.jetbrains.kotlin.idea.completion.KotlinFirCompletionParameters
@@ -68,7 +71,7 @@ internal class CompletionVisibilityChecker(
declarationModule in useSiteModule.directFriendDependencies
}
context(KaSession)
context(_: KaSession)
fun isVisible(
symbol: KaDeclarationSymbol,
positionContext: KotlinRawPositionContext,
@@ -92,7 +95,7 @@ internal class CompletionVisibilityChecker(
return getCachedVisibilityChecker(positionContext).isVisible(symbol)
}
context(KaSession)
context(_: KaSession)
private fun getCachedVisibilityChecker(positionContext: KotlinRawPositionContext): KaUseSiteVisibilityChecker {
return visibilityCheckerPerPositionContextCache.getOrPut(positionContext) {
createUseSiteVisibilityChecker(
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
import org.jetbrains.kotlin.analysis.api.components.KaCompletionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaCompletionExtensionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaExtensionApplicabilityResult
import org.jetbrains.kotlin.analysis.api.components.createExtensionCandidateChecker
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
import org.jetbrains.kotlin.psi.KtExpression
@@ -41,7 +42,7 @@ internal class KtCompletionExtensionCandidateChecker private constructor(
companion object {
context(KaCompletionCandidateChecker)
context(_: KaCompletionCandidateChecker)
fun create(
originalFile: KtFile,
nameExpression: KtSimpleNameExpression,
@@ -62,7 +62,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
priority = K2ContributorSectionPriority.HEURISTIC,
) {
context(KaSession)
context(_: KaSession)
protected open fun getImportStrategy(
context: K2CompletionSectionContext<P>,
signature: KaCallableSignature<*>,
@@ -80,13 +80,13 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
else -> CallableInsertionStrategy.AsIdentifier
}
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
protected open fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = CallableInsertionStrategy.AsCall
context(KaSession)
context(_: KaSession)
private fun getOptions(
context: K2CompletionSectionContext<P>,
signature: KaCallableSignature<*>,
@@ -96,7 +96,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
getInsertionStrategy(signature)
)
context(KaSession)
context(_: KaSession)
protected open fun filter(symbol: KaCallableSymbol): Boolean = !symbol.isIgnoredExpectDeclaration()
// todo replace with a sealed hierarchy; too many arguments
@@ -131,7 +131,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
private fun K2CompletionSectionContext<P>.isWithTrailingLambda(): Boolean =
positionContext is KotlinExpressionNameReferencePositionContext
context(KaSession)
context(_: KaSession)
private fun Sequence<CallableWithMetadataForCompletion>.createFilteredLookupElements(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter
@@ -165,7 +165,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
fun completeFromLocalScope(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -181,7 +181,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun createAndFilterMetadataForMemberCallables(
context: K2CompletionSectionContext<P>,
@@ -197,7 +197,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
)
}
context(KaSession)
context(_: KaSession)
private fun completeWithoutReceiverFromIndex(
context: K2CompletionSectionContext<P>
): Sequence<CallableWithMetadataForCompletion> = sequence {
@@ -230,7 +230,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
yieldAll(extensionDescriptors)
}
context(KaSession)
context(_: KaSession)
fun completeFromIndex(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -247,7 +247,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
protected open fun collectDotCompletionFromLocalScope(
context: K2CompletionSectionContext<P>,
scopeContext: KaScopeContext,
@@ -281,7 +281,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
protected open fun collectDotCompletionFromIndex(
context: K2CompletionSectionContext<P>,
explicitReceiver: KtElement,
@@ -313,7 +313,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
private val KaNamedClassSymbol.canBeUsedAsReceiver: Boolean
get() = classKind.isObject || companionObject != null
context(KaSession)
context(_: KaSession)
private fun collectDotCompletionForPackageReceiver(
context: K2CompletionSectionContext<P>,
packageSymbol: KaPackageSymbol,
@@ -334,7 +334,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
protected fun collectDotCompletionForCallableReceiver(
context: K2CompletionSectionContext<P>,
@@ -374,7 +374,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
})
}
context(KaSession)
context(_: KaSession)
protected fun collectDotCompletionForCallableReceiver(
context: K2CompletionSectionContext<P>,
typesOfPossibleReceiver: List<KaType>,
@@ -406,7 +406,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
yieldAll(extensionNonMembers)
}
context(KaSession)
context(_: KaSession)
protected fun collectDotCompletionForCallableReceiverFromIndex(
context: K2CompletionSectionContext<P>,
typesOfPossibleReceiver: List<KaType>,
@@ -417,7 +417,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
).filter { filter(it.signature.symbol) }.asSequence()
}
context(KaSession)
context(_: KaSession)
protected fun collectDotCompletionFromStaticScope(
context: K2CompletionSectionContext<P>,
symbol: KaNamedClassSymbol,
@@ -446,7 +446,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun collectExtensionsFromIndexAndResolveExtensionScope(
context: K2CompletionSectionContext<P>,
receiverTypes: List<KaType>,
@@ -472,7 +472,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun collectSuitableExtensions(
context: K2CompletionSectionContext<P>,
scopeContext: KaScopeContext,
@@ -504,7 +504,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun collectSuitableExtensions(
context: K2CompletionSectionContext<P>,
scope: KaScope,
@@ -515,7 +515,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.filter { filter(it) }
.mapNotNull { callable -> checkApplicabilityAndSubstitute(context, callable) }
context(KaSession)
context(_: KaSession)
protected fun createApplicableExtension(
signature: KaCallableSignature<*>,
importingStrategy: ImportStrategy,
@@ -529,7 +529,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
* If [candidate] is applicable returns substituted signature and insertion options, otherwise, null.
* When the extensionChecker from the [context] is null, no check is carried and applicability result is null.
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
protected open fun checkApplicabilityAndSubstitute(
context: K2CompletionSectionContext<P>,
@@ -571,7 +571,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
*
* @see NotPropertiesService
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun KaCallableSignature<*>.getJavaGetterSignatureIfNotProperty(): KaCallableSignature<*>? {
if (this !is KaVariableSignature<*>) return null
@@ -587,7 +587,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
* Note, that [isImportDefinitelyNotRequired] should be set to true only if the callable is available without import, and it doesn't
* require import or fully-qualified name to be resolved unambiguously.
*/
context(KaSession)
context(_: KaSession)
protected fun KaCallableSignature<*>.createCallableWithMetadata(
context: K2CompletionSectionContext<P>,
scopeKind: KaScopeKind,
@@ -652,7 +652,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun shadowIfNecessary(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter
@@ -675,7 +675,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun Sequence<CallableWithMetadataForCompletion>.filterIfInsideAnnotationEntryArgument(
position: PsiElement,
expectedType: KaType?,
@@ -702,15 +702,15 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}
}
context(KaSession)
context(_: KaSession)
private fun KaJavaFieldSymbol.hasPrimitiveOrStringReturnType(): Boolean =
(psi as? PsiField)?.type is PsiPrimitiveType || returnType.isStringType
context(KaSession)
context(_: KaSession)
private fun KaCallableSymbol.hasConstEvaluationAnnotation(): Boolean =
annotations.any { it.classId == StandardClassIds.Annotations.IntrinsicConstEvaluation }
context(KaSession)
context(_: KaSession)
protected fun KaNamedClassSymbol.staticScope(withCompanionScope: Boolean = true): KaScope = buildList {
if (withCompanionScope) {
addIfNotNull(companionObject?.memberScope)
@@ -719,7 +719,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
}.asCompositeScope()
context(KaSession)
context(_: KaSession)
fun completeEnumEntriesFromPsi(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -750,7 +750,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
fun completeLocalVariables(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -772,7 +772,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
fun completeLocalExtensions(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -805,7 +805,7 @@ internal abstract class K2AbstractCallableCompletionContributor<P : KotlinNameRe
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
fun completeEnumEntriesFromIndex(
context: K2CompletionSectionContext<P>,
shadowedCallablesFilter: ShadowedCallablesFilter,
@@ -903,7 +903,7 @@ internal class K2CallableCompletionContributor : K2AbstractCallableCompletionCon
return !context.positionContext.isAfterRangeOperator() && !context.positionContext.allowsOnlyNamedArguments()
}
context(KaSession)
context(_: KaSession)
override fun createChainedLookupElements(
context: K2CompletionSectionContext<KotlinExpressionNameReferencePositionContext>,
receiverExpression: KtDotQualifiedExpression,
@@ -935,7 +935,7 @@ internal class K2CallableReferenceCompletionContributor : K2AbstractCallableComp
) {
override fun K2CompletionSectionContext<KotlinCallableReferencePositionContext>.getGroupPriority(): Int = 1
context(KaSession)
context(_: KaSession)
override fun getImportStrategy(
context: K2CompletionSectionContext<KotlinCallableReferencePositionContext>,
signature: KaCallableSignature<*>,
@@ -949,13 +949,13 @@ internal class K2CallableReferenceCompletionContributor : K2AbstractCallableComp
override fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy =
CallableInsertionStrategy.AsIdentifier
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = null
context(KaSession)
context(_: KaSession)
override fun filter(symbol: KaCallableSymbol): Boolean = when {
// References to elements which are members and extensions at the same time are not allowed
symbol.isExtension && symbol.location == KaSymbolLocation.CLASS -> false
@@ -970,7 +970,7 @@ internal class K2CallableReferenceCompletionContributor : K2AbstractCallableComp
}
context(KaSession)
context(_: KaSession)
override fun collectDotCompletionFromLocalScope(
context: K2CompletionSectionContext<KotlinCallableReferencePositionContext>,
scopeContext: KaScopeContext,
@@ -1010,13 +1010,13 @@ internal class K2InfixCallableCompletionContributor : K2AbstractCallableCompleti
override fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy =
CallableInsertionStrategy.InfixCallableInsertionStrategy
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = null
context(KaSession)
context(_: KaSession)
override fun filter(symbol: KaCallableSymbol): Boolean =
symbol is KaNamedFunctionSymbol
&& symbol.isInfix
@@ -1033,13 +1033,13 @@ internal class K2KDocCallableCompletionContributor : K2AbstractCallableCompletio
/**
* Is not used directly, @see [checkApplicabilityAndSubstitute].
*/
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy = throw RuntimeException("Should not be used directly")
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun checkApplicabilityAndSubstitute(
context: K2CompletionSectionContext<KDocLinkNamePositionContext>,
@@ -1051,14 +1051,14 @@ internal class K2KDocCallableCompletionContributor : K2AbstractCallableCompletio
}
// No dot completion from index necessary for KDocs
context(KaSession)
context(_: KaSession)
override fun collectDotCompletionFromIndex(
context: K2CompletionSectionContext<KDocLinkNamePositionContext>,
explicitReceiver: KtElement,
showReceiver: Boolean
): Sequence<CallableWithMetadataForCompletion> = emptySequence()
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun collectDotCompletionFromLocalScope(
context: K2CompletionSectionContext<KDocLinkNamePositionContext>,
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.idea.util.positionContext.KotlinExpressionNameRefere
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
internal interface K2ChainCompletionContributor {
context(KaSession)
context(_: KaSession)
fun createChainedLookupElements(
context: K2CompletionSectionContext<KotlinExpressionNameReferencePositionContext>,
receiverExpression: KtDotQualifiedExpression,
@@ -14,6 +14,12 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.components.KaScopeWithKind
import org.jetbrains.kotlin.analysis.api.components.ShortenCommand
import org.jetbrains.kotlin.analysis.api.components.containingSymbol
import org.jetbrains.kotlin.analysis.api.components.defaultType
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.components.memberScope
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbols
import org.jetbrains.kotlin.analysis.api.components.staticDeclaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.analysis.api.types.KaType
@@ -43,7 +49,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
KotlinNameReferencePositionContext::class
), K2ChainCompletionContributor {
context(KaSession)
context(_: KaSession)
private fun filterClassifiers(
context: K2CompletionSectionContext<KotlinNameReferencePositionContext>,
classifierSymbol: KaClassifierSymbol
@@ -68,7 +74,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
}
}
context(KaSession)
context(_: KaSession)
private fun getImportingStrategy(
context: K2CompletionContext<KotlinNameReferencePositionContext>,
importStrategyDetector: ImportStrategyDetector,
@@ -107,7 +113,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
return !context.positionContext.isAfterRangeOperator() && !context.positionContext.allowsOnlyNamedArguments()
}
context(KaSession)
context(_: KaSession)
private fun KaScopeWithKind.completeClassifiers(
context: K2CompletionSectionContext<KotlinNameReferencePositionContext>,
visibilityChecker: CompletionVisibilityChecker,
@@ -116,7 +122,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
.filter { filterClassifiers(context, it) }
.filter { visibilityChecker.isVisible(it, context.positionContext) }
context(KaSession)
context(_: KaSession)
private fun completeWithoutReceiverFromScopes(
sectionContext: K2CompletionSectionContext<KotlinNameReferencePositionContext>
) {
@@ -174,7 +180,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
scopeClassifiers.forEach { sectionContext.addElement(it) }
}
context(KaSession)
context(_: KaSession)
private fun completeWithoutReceiverFromIndex(
sectionContext: K2CompletionSectionContext<KotlinNameReferencePositionContext>
) {
@@ -213,7 +219,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
indexClassifiers.forEach { sectionContext.addElement(it) }
}
context(KaSession)
context(_: KaSession)
private fun completeWithReceiver(
explicitReceiver: KtElement,
sectionContext: K2CompletionSectionContext<KotlinNameReferencePositionContext>
@@ -241,7 +247,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
}
}
context(KaSession)
context(_: KaSession)
override fun createChainedLookupElements(
context: K2CompletionSectionContext<KotlinExpressionNameReferencePositionContext>,
receiverExpression: KtDotQualifiedExpression,
@@ -266,7 +272,7 @@ internal open class K2ClassifierCompletionContributor : K2CompletionContributor<
}.map { it.withPresentableText(selectorExpression.text + "." + it.lookupString) }
}
context(KaSession)
context(_: KaSession)
private fun createClassifierLookupElement(
classifierSymbol: KaClassifierSymbol,
positionContext: KotlinNameReferencePositionContext,
@@ -5,6 +5,10 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.openapi.progress.ProgressManager
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.collectImplicitReceiverTypes
import org.jetbrains.kotlin.analysis.api.components.dispatchReceiverType
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.idea.completion.ItemPriority
@@ -43,7 +47,7 @@ internal class K2DeclarationFromUnresolvedNameContributor : K2SimpleCompletionCo
}
}
context(KaSession)
context(_: KaSession)
private fun processReference(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
referenceScope: KtElement,
@@ -68,7 +72,7 @@ internal class K2DeclarationFromUnresolvedNameContributor : K2SimpleCompletionCo
}
}
context(KaSession)
context(_: KaSession)
private fun shouldOfferCompletion(unresolvedRef: KtNameReferenceExpression, currentDeclaration: KtNamedDeclaration): Boolean {
val refExprParent = unresolvedRef.parent
val receiver = if (refExprParent is KtCallExpression) {
@@ -116,7 +120,7 @@ internal class K2DeclarationFromUnresolvedNameContributor : K2SimpleCompletionCo
return qualifiedExpression.receiverExpression
}
context(KaSession)
context(_: KaSession)
private fun getReceiverType(symbol: KaCallableSymbol): KaType? {
return symbol.receiverType ?: (symbol as? KaCallableSymbol)?.dispatchReceiverType
}
@@ -4,6 +4,8 @@ package org.jetbrains.kotlin.idea.completion.impl.k2.contributors
import com.intellij.codeInsight.lookup.LookupElement
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.components.declaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.KaDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
@@ -44,7 +46,7 @@ internal class K2KDocParameterNameContributor : K2SimpleCompletionContributor<KD
.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
context: K2CompletionSectionContext<KDocNameReferencePositionContext>,
declarationSymbol: KaDeclarationSymbol,
@@ -70,7 +72,7 @@ internal class K2KDocParameterNameContributor : K2SimpleCompletionContributor<KD
else -> emptySequence()
}
context(KaSession)
context(_: KaSession)
private fun getParametersForKDoc(
ownerDeclarationSymbol: KaDeclarationSymbol
): Sequence<KaDeclarationSymbol> = sequence {
@@ -99,7 +99,7 @@ internal class K2NamedArgumentCompletionContributor : K2SimpleCompletionContribu
val indexedTypes: List<IndexedValue<KaType>>
)
context(KaSession)
context(_: KaSession)
private fun collectNamedArgumentInfos(
callElement: KtCallElement,
argumentsBeforeCurrent: List<KtValueArgument>,
@@ -117,7 +117,7 @@ internal class K2NamedArgumentCompletionContributor : K2SimpleCompletionContribu
}
}
context(KaSession)
context(_: KaSession)
private fun collectNotUsedIndexedParameterCandidates(
callElement: KtCallElement,
candidate: KaFunctionCall<*>,
@@ -5,6 +5,7 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.psi.util.parentsOfType
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.allOverriddenSymbols
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -12,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolModality
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.analysis.api.types.KaIntersectionType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.analysis.api.types.KaUsualClassType
@@ -82,7 +84,7 @@ internal class K2SuperMemberCompletionContributor : K2SimpleCompletionContributo
).forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
private fun getSymbolsAndNamesNeedDisambiguation(
context: K2CompletionSectionContext<KotlinSuperReceiverNameReferencePositionContext>,
superTypes: List<KaType>,
@@ -118,7 +120,7 @@ internal class K2SuperMemberCompletionContributor : K2SimpleCompletionContributo
return Pair(allSymbols, nameNeedDisambiguation)
}
context(KaSession)
context(_: KaSession)
private fun getNonExtensionsMemberSymbols(
context: K2CompletionSectionContext<KotlinSuperReceiverNameReferencePositionContext>,
receiverType: KaType,
@@ -135,7 +137,7 @@ internal class K2SuperMemberCompletionContributor : K2SimpleCompletionContributo
)
}
context(KaSession)
context(_: KaSession)
private fun collectCallToSuperMember(
context: K2CompletionSectionContext<KotlinSuperReceiverNameReferencePositionContext>,
callableInfo: CallableInfo,
@@ -161,13 +163,13 @@ internal class K2SuperMemberCompletionContributor : K2SimpleCompletionContributo
)
}
context(KaSession)
context(_: KaSession)
private fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy = when (signature) {
is KaFunctionSignature<*> -> CallableInsertionStrategy.AsCall
else -> CallableInsertionStrategy.AsIdentifier
}
context(KaSession)
context(_: KaSession)
private fun collectDelegateCallToSuperMember(
context: K2CompletionSectionContext<KotlinSuperReceiverNameReferencePositionContext>,
superReceiver: KtSuperExpression,
@@ -245,7 +247,7 @@ internal class K2SuperMemberCompletionContributor : K2SimpleCompletionContributo
}
}
context(KaSession)
context(_: KaSession)
private fun wrapWithDisambiguationIfNeeded(
insertionStrategy: CallableInsertionStrategy,
superType: KaType,
@@ -17,6 +17,15 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaCompletionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaCompletionExtensionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaExtensionApplicabilityResult
import org.jetbrains.kotlin.analysis.api.components.canBeAnalysed
import org.jetbrains.kotlin.analysis.api.components.createSubstitutor
import org.jetbrains.kotlin.analysis.api.components.expandedSymbol
import org.jetbrains.kotlin.analysis.api.components.isSubClassOf
import org.jetbrains.kotlin.analysis.api.components.lowerBoundIfFlexible
import org.jetbrains.kotlin.analysis.api.components.memberScope
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.components.resolveToCallCandidates
import org.jetbrains.kotlin.analysis.api.components.substitute
import org.jetbrains.kotlin.analysis.api.impl.base.components.KaBaseIllegalPsiException
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.types.KaTypeRenderer
@@ -26,6 +35,7 @@ import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolVisibility
import org.jetbrains.kotlin.analysis.api.symbols.findClass
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.builtins.StandardNames
@@ -111,7 +121,7 @@ internal sealed class K2TrailingFunctionParameterNameCompletionContributorBase<P
}
}
context(KaSession)
context(_: KaSession)
protected fun complete(
position: KtElement,
context: K2CompletionSectionContext<P>,
@@ -149,7 +159,7 @@ internal sealed class K2TrailingFunctionParameterNameCompletionContributorBase<P
}.forEach { context.addElement(it) }
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
context: K2CompletionSectionContext<*>,
trailingFunctionDescriptor: TrailingFunctionDescriptor,
@@ -178,7 +188,7 @@ internal sealed class K2TrailingFunctionParameterNameCompletionContributorBase<P
}
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
context: K2CompletionSectionContext<*>,
trailingFunctionDescriptor: TrailingFunctionDescriptor,
@@ -282,7 +292,7 @@ internal sealed class K2TrailingFunctionParameterNameCompletionContributorBase<P
object FqNameListSerializer : KSerializer<List<FqName>> by ListSerializer(KotlinFqNameSerializer)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun KaNamedClassSymbol.getSignatures(
context: K2CompletionSectionContext<*>,
@@ -315,7 +325,7 @@ internal sealed class K2TrailingFunctionParameterNameCompletionContributorBase<P
else emptyList()
}
context(KaSession)
context(_: KaSession)
private fun KaNamedClassSymbol.getComponents(
context: K2CompletionSectionContext<*>,
receiverTypes: List<KaClassType>,
@@ -397,7 +407,7 @@ data class ChainedInsertHandler(
}
}
context(KaSession)
context(_: KaSession)
private fun createCompoundLookupElement(
suggestedNames: Collection<Pair<KaType, String>>,
isDestructuring: Boolean = false,
@@ -436,7 +446,7 @@ internal data class CompoundInsertionHandler(
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private val KaType.text: String
get() = render(
@@ -444,7 +454,7 @@ private val KaType.text: String
position = Variance.INVARIANT,
)
context(KaCompletionCandidateChecker)
context(_: KaCompletionCandidateChecker)
private fun createExtensionCandidateChecker(
bodyExpression: KtBlockExpression,
): KtCompletionExtensionCandidateChecker? {
@@ -10,6 +10,8 @@ import com.intellij.psi.codeStyle.NameUtil
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeContext
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.compositeScope
import org.jetbrains.kotlin.analysis.api.components.returnType
import org.jetbrains.kotlin.analysis.api.scopes.KaScope
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
@@ -82,7 +84,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
}
}
context(KaSession)
context(_: KaSession)
private fun completeFromParametersInFile(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
variableOrParameter: KtCallableDeclaration,
@@ -141,7 +143,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
}
}
context(KaSession)
context(_: KaSession)
private fun completeClassesFromScopeContext(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
variableOrParameter: KtCallableDeclaration,
@@ -169,7 +171,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
}
}
context(KaSession)
context(_: KaSession)
private fun completeClassesFromIndices(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
variableOrParameter: KtCallableDeclaration,
@@ -196,7 +198,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
}
}
context(KaSession)
context(_: KaSession)
private fun addSuggestions(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
variableOrParameter: KtCallableDeclaration,
@@ -297,7 +299,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
}
}
context(KaSession)
context(_: KaSession)
private fun getAvailableTypeParameters(scopes: KaScope): Sequence<KaTypeParameterSymbol> =
scopes.classifiers.filterIsInstance<KaTypeParameterSymbol>()
@@ -305,7 +307,7 @@ internal class K2VariableOrParameterNameWithTypeCompletionContributor : K2Simple
return (typeReference.parent as? KtCallableDeclaration)?.takeIf { it.receiverTypeReference == typeReference }
}
context(KaSession)
context(_: KaSession)
private fun typeIsVisible(
context: K2CompletionSectionContext<KotlinRawPositionContext>,
type: KaType,
@@ -15,6 +15,11 @@ import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.isNullable
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbol
import org.jetbrains.kotlin.analysis.api.components.scopeContext
import org.jetbrains.kotlin.analysis.api.components.sealedClassInheritors
import org.jetbrains.kotlin.analysis.api.components.staticDeclaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.analysis.api.types.KaClassType
@@ -124,13 +129,13 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
}
}
context(KaSession)
context(_: KaSession)
private fun getClassSymbol(subjectType: KaType): KaNamedClassSymbol? {
val classType = subjectType as? KaClassType
return classType?.symbol as? KaNamedClassSymbol
}
context(KaSession)
context(_: KaSession)
private fun createNullBranchLookupElement(
context: WeighingContext,
type: KaType?,
@@ -141,7 +146,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
.applyWeighs(context)
}
context(KaSession)
context(_: KaSession)
private fun completeAllTypes(
context: K2CompletionSectionContext<KotlinWithSubjectEntryPositionContext>,
whenCondition: KtWhenCondition,
@@ -194,7 +199,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
}
}
context(KaSession)
context(_: KaSession)
private fun isPrefixNeeded(context: K2CompletionSectionContext<*>, symbol: KaNamedSymbol): Boolean {
return when (symbol) {
is KaAnonymousObjectSymbol -> return false
@@ -208,7 +213,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
}
}
context(KaSession)
context(_: KaSession)
private fun completeSubClassesOfSealedClass(
context: K2CompletionSectionContext<KotlinWithSubjectEntryPositionContext>,
classSymbol: KaNamedClassSymbol,
@@ -246,7 +251,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
}
}
context(KaSession)
context(_: KaSession)
private fun getHandledClassIds(conditions: List<KtWhenCondition>): Set<ClassId> =
conditions.mapNotNullTo(hashSetOf()) { condition ->
val reference = when (condition) {
@@ -258,7 +263,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
resolvesTo?.classId
}
context(KaSession)
context(_: KaSession)
private fun getAllSealedInheritors(classSymbol: KaNamedClassSymbol): Collection<KaNamedClassSymbol> {
fun getAllSealedInheritorsTo(
@@ -277,7 +282,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
.apply { getAllSealedInheritorsTo(classSymbol, this) }
}
context(KaSession)
context(_: KaSession)
private fun createElseBranchLookupElement(
context: WeighingContext,
whenCondition: KtWhenCondition,
@@ -293,7 +298,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
}
context(KaSession)
context(_: KaSession)
private fun completeEnumEntries(
context: K2CompletionSectionContext<KotlinWithSubjectEntryPositionContext>,
classSymbol: KaNamedClassSymbol,
@@ -327,7 +332,7 @@ internal class K2WhenWithSubjectConditionContributor : K2SimpleCompletionContrib
return entry.conditions.size == 1
}
context(KaSession)
context(_: KaSession)
private fun createLookupElement(
context: K2CompletionSectionContext<*>,
lookupString: String,
@@ -33,7 +33,7 @@ internal class FirActualDeclarationContributor(
priority: Int,
) : FirCompletionContributorBase<KotlinRawPositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinRawPositionContext,
weighingContext: WeighingContext,
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature
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.analysis.api.types.KaTypeNullability
import org.jetbrains.kotlin.analysis.api.types.symbol
import org.jetbrains.kotlin.idea.base.analysis.api.utils.*
import org.jetbrains.kotlin.idea.base.psi.isInsideAnnotationEntryArgumentList
@@ -64,7 +63,7 @@ internal open class FirCallableCompletionContributor(
) : FirCompletionContributorBase<KotlinNameReferencePositionContext>(sink, priority),
ChainCompletionContributor {
context(KaSession)
context(_: KaSession)
protected open fun getImportStrategy(signature: KaCallableSignature<*>, isImportDefinitelyNotRequired: Boolean): ImportStrategy =
if (isImportDefinitelyNotRequired) {
ImportStrategy.DoNothing
@@ -78,13 +77,13 @@ internal open class FirCallableCompletionContributor(
else -> CallableInsertionStrategy.AsIdentifier
}
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
protected open fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = CallableInsertionStrategy.AsCall
context(KaSession)
context(_: KaSession)
private fun getOptions(
signature: KaCallableSignature<*>,
isImportDefinitelyNotRequired: Boolean = false
@@ -93,7 +92,7 @@ internal open class FirCallableCompletionContributor(
getInsertionStrategy(signature)
)
context(KaSession)
context(_: KaSession)
protected open fun filter(symbol: KaCallableSymbol): Boolean = !symbol.isIgnoredExpectDeclaration()
// todo replace with a sealed hierarchy; too many arguments
@@ -125,7 +124,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -179,13 +178,13 @@ internal open class FirCallableCompletionContributor(
}.forEach(sink::addElement)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun completeExpectedEnumEntries(
expectedType: KaType?,
): Sequence<KaCallableSymbol> {
val expectedEnumType = expectedType?.takeUnless { it is KaErrorType }
?.withNullability(KaTypeNullability.NON_NULLABLE)
?.withNullability(false)
?.takeIf { it.isEnum() }
val enumClass = expectedEnumType?.symbol?.psi
@@ -202,7 +201,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun createAndFilterMetadataForMemberCallables(
callables: Sequence<KaCallableSymbol>,
@@ -218,7 +217,7 @@ internal open class FirCallableCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun completeWithoutReceiver(
positionContext: KotlinNameReferencePositionContext,
@@ -289,7 +288,7 @@ internal open class FirCallableCompletionContributor(
val invocationCount = parameters.invocationCount
val expectedType = expectedType?.takeUnless { it is KaErrorType }
?.withNullability(KaTypeNullability.NON_NULLABLE)
?.withNullability(false)
?.takeIf { it.isEnum() }
yieldAll(sequence {
@@ -298,7 +297,7 @@ internal open class FirCallableCompletionContributor(
else if (expectedType != null) { enumEntry ->
visibilityChecker.canBeVisible(enumEntry)
&& enumEntry.returnType
.withNullability(KaTypeNullability.NON_NULLABLE)
.withNullability(false)
.semanticallyEquals(expectedType)
}
else return@sequence
@@ -323,7 +322,7 @@ internal open class FirCallableCompletionContributor(
.filter { enumEntrySymbol ->
expectedType == null
|| enumEntrySymbol.returnType
.withNullability(KaTypeNullability.NON_NULLABLE)
.withNullability(false)
.semanticallyEquals(expectedType)
}
yieldAll(enumConstants)
@@ -357,7 +356,7 @@ internal open class FirCallableCompletionContributor(
yieldAll(extensionDescriptors)
}
context(KaSession)
context(_: KaSession)
override fun createChainedLookupElements(
positionContext: KotlinNameReferencePositionContext,
receiverExpression: KtDotQualifiedExpression,
@@ -385,7 +384,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
protected open fun collectDotCompletion(
positionContext: KotlinNameReferencePositionContext,
scopeContext: KaScopeContext,
@@ -428,7 +427,7 @@ internal open class FirCallableCompletionContributor(
private val KaNamedClassSymbol.canBeUsedAsReceiver: Boolean
get() = classKind.isObject || companionObject != null
context(KaSession)
context(_: KaSession)
private fun collectDotCompletionForPackageReceiver(
positionContext: KotlinNameReferencePositionContext,
packageSymbol: KaPackageSymbol,
@@ -449,7 +448,7 @@ internal open class FirCallableCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
protected fun collectDotCompletionForCallableReceiver(
positionContext: KotlinNameReferencePositionContext,
@@ -489,7 +488,7 @@ internal open class FirCallableCompletionContributor(
yieldAll(callablesWithMetadataFromUnstableSmartCast)
}
context(KaSession)
context(_: KaSession)
protected fun collectDotCompletionForCallableReceiver(
positionContext: KotlinNameReferencePositionContext,
typesOfPossibleReceiver: List<KaType>,
@@ -529,7 +528,7 @@ internal open class FirCallableCompletionContributor(
yieldAll(extensionDescriptors)
}
context(KaSession)
context(_: KaSession)
protected fun collectDotCompletionFromStaticScope(
positionContext: KotlinNameReferencePositionContext,
symbol: KaNamedClassSymbol,
@@ -558,7 +557,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun collectExtensionsFromIndexAndResolveExtensionScope(
positionContext: KotlinNameReferencePositionContext,
receiverTypes: List<KaType>,
@@ -585,7 +584,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun collectSuitableExtensions(
positionContext: KotlinNameReferencePositionContext,
scopeContext: KaScopeContext,
@@ -619,7 +618,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun collectSuitableExtensions(
positionContext: KotlinNameReferencePositionContext,
scope: KaScope,
@@ -631,7 +630,7 @@ internal open class FirCallableCompletionContributor(
.filter { filter(it) }
.mapNotNull { callable -> checkApplicabilityAndSubstitute(callable, hasSuitableExtensionReceiver) }
context(KaSession)
context(_: KaSession)
protected fun createApplicableExtension(
signature: KaCallableSignature<*>,
importingStrategy: ImportStrategy = importStrategyDetector.detectImportStrategyForCallableSymbol(symbol = signature.symbol),
@@ -645,7 +644,7 @@ internal open class FirCallableCompletionContributor(
* If [candidate] is applicable returns substituted signature and insertion options, otherwise, null.
* When [extensionChecker] is null, no check is carried and applicability result is null.
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
protected open fun checkApplicabilityAndSubstitute(
candidate: KaCallableSymbol,
@@ -682,7 +681,7 @@ internal open class FirCallableCompletionContributor(
*
* @see NotPropertiesService
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun KaCallableSignature<*>.getJavaGetterSignatureIfNotProperty(): KaCallableSignature<*>? {
if (this !is KaVariableSignature<*>) return null
@@ -698,7 +697,7 @@ internal open class FirCallableCompletionContributor(
* Note, that [isImportDefinitelyNotRequired] should be set to true only if the callable is available without import, and it doesn't
* require import or fully-qualified name to be resolved unambiguously.
*/
context(KaSession)
context(_: KaSession)
protected fun KaCallableSignature<*>.createCallableWithMetadata(
scopeKind: KaScopeKind,
isImportDefinitelyNotRequired: Boolean = false,
@@ -762,7 +761,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun shadowIfNecessary(
expectedType: KaType?,
) = object : Function1<CallableWithMetadataForCompletion, CallableWithMetadataForCompletion?> {
@@ -786,7 +785,7 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun Sequence<CallableWithMetadataForCompletion>.filterIfInsideAnnotationEntryArgument(
position: PsiElement,
expectedType: KaType?,
@@ -813,15 +812,15 @@ internal open class FirCallableCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun KaJavaFieldSymbol.hasPrimitiveOrStringReturnType(): Boolean =
(psi as? PsiField)?.type is PsiPrimitiveType || returnType.isStringType
context(KaSession)
context(_: KaSession)
private fun KaCallableSymbol.hasConstEvaluationAnnotation(): Boolean =
annotations.any { it.classId == StandardClassIds.Annotations.IntrinsicConstEvaluation }
context(KaSession)
context(_: KaSession)
protected fun KaNamedClassSymbol.staticScope(withCompanionScope: Boolean = true): KaScope = buildList {
if (withCompanionScope) {
addIfNotNull(companionObject?.memberScope)
@@ -835,7 +834,7 @@ internal class FirCallableReferenceCompletionContributor(
priority: Int,
) : FirCallableCompletionContributor(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun getImportStrategy(signature: KaCallableSignature<*>, isImportDefinitelyNotRequired: Boolean): ImportStrategy {
if (isImportDefinitelyNotRequired) return ImportStrategy.DoNothing
@@ -845,13 +844,13 @@ internal class FirCallableReferenceCompletionContributor(
override fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy =
CallableInsertionStrategy.AsIdentifier
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = null
context(KaSession)
context(_: KaSession)
override fun filter(symbol: KaCallableSymbol): Boolean = when {
// References to elements which are members and extensions at the same time are not allowed
symbol.isExtension && symbol.location == KaSymbolLocation.CLASS -> false
@@ -866,7 +865,7 @@ internal class FirCallableReferenceCompletionContributor(
}
context(KaSession)
context(_: KaSession)
override fun collectDotCompletion(
positionContext: KotlinNameReferencePositionContext,
scopeContext: KaScopeContext,
@@ -910,13 +909,13 @@ internal class FirInfixCallableCompletionContributor(
override fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy =
CallableInsertionStrategy.InfixCallableInsertionStrategy
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy? = null
context(KaSession)
context(_: KaSession)
override fun filter(symbol: KaCallableSymbol): Boolean =
symbol is KaNamedFunctionSymbol
&& symbol.isInfix
@@ -934,20 +933,20 @@ internal class FirKDocCallableCompletionContributor(
/**
* Is not used directly, @see [checkApplicabilityAndSubstitute].
*/
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
override fun getInsertionStrategyForFunctionalVariables(
applicabilityResult: KaExtensionApplicabilityResult.ApplicableAsFunctionalVariableCall,
): CallableInsertionStrategy = throw RuntimeException("Should not be used directly")
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun checkApplicabilityAndSubstitute(
candidate: KaCallableSymbol,
extensionChecker: KaCompletionExtensionCandidateChecker?,
): ApplicableExtension = createApplicableExtension(signature = candidate.asSignature())
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun collectDotCompletion(
positionContext: KotlinNameReferencePositionContext,
@@ -14,7 +14,7 @@ internal class FirClassReferenceCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinCallableReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinCallableReferencePositionContext,
weighingContext: WeighingContext,
@@ -14,6 +14,12 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.components.KaScopeWithKind
import org.jetbrains.kotlin.analysis.api.components.ShortenCommand
import org.jetbrains.kotlin.analysis.api.components.containingSymbol
import org.jetbrains.kotlin.analysis.api.components.defaultType
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.components.memberScope
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbols
import org.jetbrains.kotlin.analysis.api.components.staticDeclaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.analysis.api.types.KaType
@@ -47,14 +53,14 @@ internal open class FirClassifierCompletionContributor(
) : FirCompletionContributorBase<KotlinNameReferencePositionContext>(sink, priority),
ChainCompletionContributor {
context(KaSession)
context(_: KaSession)
protected open fun filterClassifiers(classifierSymbol: KaClassifierSymbol): Boolean = true
context(KaSession)
context(_: KaSession)
protected open fun getImportingStrategy(classifierSymbol: KaClassifierSymbol): ImportStrategy =
importStrategyDetector.detectImportStrategyForClassifierSymbol(classifierSymbol)
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -88,7 +94,7 @@ internal open class FirClassifierCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun KaScopeWithKind.completeClassifiers(
positionContext: KotlinNameReferencePositionContext,
): Sequence<KaClassifierSymbol> = scope
@@ -96,7 +102,7 @@ internal open class FirClassifierCompletionContributor(
.filter { filterClassifiers(it) }
.filter { visibilityChecker.isVisible(it, positionContext) }
context(KaSession)
context(_: KaSession)
private fun completeWithoutReceiver(
weighingContext: WeighingContext,
positionContext: KotlinNameReferencePositionContext,
@@ -170,7 +176,7 @@ internal open class FirClassifierCompletionContributor(
indexClassifiers
}
context(KaSession)
context(_: KaSession)
override fun createChainedLookupElements(
positionContext: KotlinNameReferencePositionContext,
receiverExpression: KtDotQualifiedExpression,
@@ -196,7 +202,7 @@ internal open class FirClassifierCompletionContributor(
}
context(KaSession)
context(_: KaSession)
private fun createClassifierLookupElement(
classifierSymbol: KaClassifierSymbol,
positionContext: KotlinRawPositionContext,
@@ -245,7 +251,7 @@ internal class FirAnnotationCompletionContributor(
priority: Int = 0,
) : FirClassifierCompletionContributor(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun filterClassifiers(classifierSymbol: KaClassifierSymbol): Boolean = when (classifierSymbol) {
is KaAnonymousObjectSymbol -> false
is KaTypeParameterSymbol -> false
@@ -270,7 +276,7 @@ internal class FirClassifierReferenceCompletionContributor(
priority: Int
) : FirClassifierCompletionContributor(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun getImportingStrategy(classifierSymbol: KaClassifierSymbol): ImportStrategy = when (classifierSymbol) {
is KaTypeParameterSymbol -> ImportStrategy.DoNothing
is KaClassLikeSymbol -> {
@@ -7,7 +7,7 @@ import org.jetbrains.kotlin.idea.util.positionContext.KotlinRawPositionContext
internal interface FirCompletionContributor<C : KotlinRawPositionContext> {
context(KaSession)
context(_: KaSession)
fun complete(
positionContext: C,
weighingContext: WeighingContext,
@@ -13,6 +13,7 @@ import kotlinx.serialization.Serializable
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.containingDeclaration
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaConstructorSymbol
@@ -99,7 +100,7 @@ internal abstract class FirCompletionContributorBase<C : KotlinRawPositionContex
}
}
context(KaSession)
context(_: KaSession)
protected fun createOperatorLookupElement(
context: WeighingContext,
signature: KaFunctionSignature<*>,
@@ -121,7 +122,7 @@ internal abstract class FirCompletionContributorBase<C : KotlinRawPositionContex
)
}
context(KaSession)
context(_: KaSession)
protected fun createCallableLookupElements(
context: WeighingContext,
signature: KaCallableSignature<*>,
@@ -253,7 +254,7 @@ internal abstract class FirCompletionContributorBase<C : KotlinRawPositionContex
@ApiStatus.Experimental // todo reconsider
internal interface ChainCompletionContributor : FirCompletionContributor<KotlinNameReferencePositionContext> {
context(KaSession)
context(_: KaSession)
fun createChainedLookupElements(
positionContext: KotlinNameReferencePositionContext,
receiverExpression: KtDotQualifiedExpression,
@@ -36,7 +36,7 @@ internal class FirDeclarationFromOverridableMembersContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinRawPositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinRawPositionContext,
weighingContext: WeighingContext,
@@ -5,6 +5,10 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.openapi.progress.ProgressManager
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.collectImplicitReceiverTypes
import org.jetbrains.kotlin.analysis.api.components.dispatchReceiverType
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.idea.completion.ItemPriority
@@ -33,7 +37,7 @@ internal class FirDeclarationFromUnresolvedNameContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinRawPositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinRawPositionContext,
weighingContext: WeighingContext,
@@ -49,7 +53,7 @@ internal class FirDeclarationFromUnresolvedNameContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun processReference(
referenceScope: KtElement,
currentDeclarationInFakeFile: KtNamedDeclaration,
@@ -73,7 +77,7 @@ internal class FirDeclarationFromUnresolvedNameContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun shouldOfferCompletion(unresolvedRef: KtNameReferenceExpression, currentDeclaration: KtNamedDeclaration): Boolean {
val refExprParent = unresolvedRef.parent
val receiver = if (refExprParent is KtCallExpression) {
@@ -118,7 +122,7 @@ internal class FirDeclarationFromUnresolvedNameContributor(
return qualifiedExpression.receiverExpression
}
context(KaSession)
context(_: KaSession)
private fun getReceiverType(symbol: KaCallableSymbol): KaType? {
return symbol.receiverType ?: (symbol as? KaCallableSymbol)?.dispatchReceiverType
}
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.idea.completion.impl.k2.contributors.fir
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.idea.completion.contributors.helpers.KtSymbolWithOrigin
import org.jetbrains.kotlin.idea.completion.contributors.helpers.resolveReceiverToSymbols
import org.jetbrains.kotlin.idea.completion.contributors.helpers.staticScope
@@ -21,7 +22,7 @@ internal class FirImportDirectivePackageMembersCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinImportDirectivePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun complete(
positionContext: KotlinImportDirectivePositionContext,
@@ -4,6 +4,8 @@ package org.jetbrains.kotlin.idea.completion.impl.k2.contributors.fir
import com.intellij.codeInsight.lookup.LookupElement
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.components.declaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.idea.completion.contributors.helpers.KtOutsideTowerScopeKinds
@@ -23,7 +25,7 @@ internal open class FirKDocParameterNameContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KDocNameReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KDocNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -41,7 +43,7 @@ internal open class FirKDocParameterNameContributor(
.forEach(sink::addElement)
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
declarationSymbol: KaDeclarationSymbol,
weighingContext: WeighingContext,
@@ -65,7 +67,7 @@ internal open class FirKDocParameterNameContributor(
else -> emptySequence()
}
context(KaSession)
context(_: KaSession)
private fun getParametersForKDoc(
ownerDeclarationSymbol: KaDeclarationSymbol
): Sequence<KaDeclarationSymbol> = sequence {
@@ -46,7 +46,7 @@ internal class FirKeywordCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinRawPositionContext,
weighingContext: WeighingContext,
@@ -33,7 +33,7 @@ internal class FirNamedArgumentCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinExpressionNameReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinExpressionNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -100,7 +100,7 @@ internal class FirNamedArgumentCompletionContributor(
val indexedTypes: List<IndexedValue<KaType>>
)
context(KaSession)
context(_: KaSession)
private fun collectNamedArgumentInfos(
callElement: KtCallElement,
argumentsBeforeCurrent: List<KtValueArgument>,
@@ -118,7 +118,7 @@ internal class FirNamedArgumentCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun collectNotUsedIndexedParameterCandidates(
callElement: KtCallElement,
candidate: KaFunctionCall<*>,
@@ -14,7 +14,7 @@ internal class FirOperatorNameCompletionContributor(
sink: LookupElementSink,
priority: Int = 0,
) : FirCompletionContributorBase<KotlinTypeNameReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinTypeNameReferencePositionContext,
weighingContext: WeighingContext
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.idea.completion.impl.k2.contributors.fir
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.packageScope
import org.jetbrains.kotlin.analysis.api.symbols.KaPackageSymbol
import org.jetbrains.kotlin.base.analysis.isExcludedFromAutoImport
import org.jetbrains.kotlin.idea.completion.contributors.helpers.KtOutsideTowerScopeKinds
@@ -20,7 +21,7 @@ internal class FirPackageCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinRawPositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
override fun complete(
positionContext: KotlinRawPositionContext,
@@ -16,7 +16,7 @@ internal class FirSameAsFileClassifierNameCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinClassifierNamePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinClassifierNamePositionContext,
weighingContext: WeighingContext,
@@ -16,7 +16,7 @@ internal class FirSuperEntryContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinSuperTypeCallNameReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinSuperTypeCallNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -5,6 +5,8 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.psi.util.parentsOfType
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.allOverriddenSymbols
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -12,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolModality
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.analysis.api.types.KaIntersectionType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.analysis.api.types.KaUsualClassType
@@ -55,7 +58,7 @@ internal class FirSuperMemberCompletionContributor(
get() = withValidityAssertion { _signature }
}
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinSuperReceiverNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -86,7 +89,7 @@ internal class FirSuperMemberCompletionContributor(
).forEach(sink::addElement)
}
context(KaSession)
context(_: KaSession)
private fun getSymbolsAndNamesNeedDisambiguation(
positionContext: KotlinNameReferencePositionContext,
superTypes: List<KaType>,
@@ -122,7 +125,7 @@ internal class FirSuperMemberCompletionContributor(
return Pair(allSymbols, nameNeedDisambiguation)
}
context(KaSession)
context(_: KaSession)
private fun getNonExtensionsMemberSymbols(
positionContext: KotlinNameReferencePositionContext,
receiverType: KaType,
@@ -139,7 +142,7 @@ internal class FirSuperMemberCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
private fun collectCallToSuperMember(
callableInfo: CallableInfo,
context: WeighingContext,
@@ -163,13 +166,13 @@ internal class FirSuperMemberCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
private fun getInsertionStrategy(signature: KaCallableSignature<*>): CallableInsertionStrategy = when (signature) {
is KaFunctionSignature<*> -> CallableInsertionStrategy.AsCall
else -> CallableInsertionStrategy.AsIdentifier
}
context(KaSession)
context(_: KaSession)
private fun collectDelegateCallToSuperMember(
context: WeighingContext,
superReceiver: KtSuperExpression,
@@ -246,7 +249,7 @@ internal class FirSuperMemberCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun wrapWithDisambiguationIfNeeded(
insertionStrategy: CallableInsertionStrategy,
superType: KaType,
@@ -11,6 +11,15 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaCompletionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaCompletionExtensionCandidateChecker
import org.jetbrains.kotlin.analysis.api.components.KaExtensionApplicabilityResult
import org.jetbrains.kotlin.analysis.api.components.canBeAnalysed
import org.jetbrains.kotlin.analysis.api.components.createSubstitutor
import org.jetbrains.kotlin.analysis.api.components.expandedSymbol
import org.jetbrains.kotlin.analysis.api.components.isSubClassOf
import org.jetbrains.kotlin.analysis.api.components.lowerBoundIfFlexible
import org.jetbrains.kotlin.analysis.api.components.memberScope
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.components.resolveToCallCandidates
import org.jetbrains.kotlin.analysis.api.components.substitute
import org.jetbrains.kotlin.analysis.api.impl.base.components.KaBaseIllegalPsiException
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.types.KaTypeRenderer
@@ -20,6 +29,7 @@ import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolVisibility
import org.jetbrains.kotlin.analysis.api.symbols.findClass
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.builtins.StandardNames
@@ -54,7 +64,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
priority: Int = 0,
) : FirTrailingFunctionParameterNameCompletionContributorBase<KotlinExpressionNameReferencePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinExpressionNameReferencePositionContext,
weighingContext: WeighingContext,
@@ -80,7 +90,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
priority: Int = 0,
) : FirTrailingFunctionParameterNameCompletionContributorBase<KotlinSimpleParameterPositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinSimpleParameterPositionContext,
weighingContext: WeighingContext,
@@ -104,7 +114,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
}
}
context(KaSession)
context(_: KaSession)
protected fun complete(
position: KtElement,
existingParameterNames: Set<String>,
@@ -142,7 +152,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
}.forEach(sink::addElement)
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
trailingFunctionDescriptor: TrailingFunctionDescriptor,
candidateChecker: KaCompletionExtensionCandidateChecker,
@@ -169,7 +179,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
}
}
context(KaSession)
context(_: KaSession)
private fun createLookupElements(
trailingFunctionDescriptor: TrailingFunctionDescriptor,
candidateChecker: KaCompletionExtensionCandidateChecker,
@@ -251,7 +261,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun KaNamedClassSymbol.getSignatures(
candidateChecker: KaCompletionExtensionCandidateChecker,
@@ -283,7 +293,7 @@ internal sealed class FirTrailingFunctionParameterNameCompletionContributorBase<
else emptyList()
}
context(KaSession)
context(_: KaSession)
private fun KaNamedClassSymbol.getComponents(
receiverTypes: List<KaClassType>,
): Collection<KaNamedFunctionSymbol> {
@@ -329,7 +339,7 @@ private val NoAnnotationsTypeRenderer: KaTypeRenderer = KaTypeRendererForSource.
}
}
context(KaSession)
context(_: KaSession)
private fun createCompoundLookupElement(
suggestedNames: Collection<Pair<KaType, String>>,
isDestructuring: Boolean = false,
@@ -357,7 +367,7 @@ private fun createCompoundLookupElement(
.withTailTextInsertHandler()
.withChainedInsertHandler(CompoundInsertionHandler(presentableText))
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private val KaType.text: String
get() = render(
@@ -365,7 +375,7 @@ private val KaType.text: String
position = Variance.INVARIANT,
)
context(KaCompletionCandidateChecker)
context(_: KaCompletionCandidateChecker)
private fun createExtensionCandidateChecker(
bodyExpression: KtBlockExpression,
): KtCompletionExtensionCandidateChecker? {
@@ -4,6 +4,7 @@ package org.jetbrains.kotlin.idea.completion.impl.k2.contributors.fir
import com.intellij.codeInsight.lookup.LookupElementBuilder
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.analysis.api.symbols.typeParameters
import org.jetbrains.kotlin.idea.base.codeInsight.KotlinIconProvider.getIconFor
import org.jetbrains.kotlin.idea.completion.impl.k2.LookupElementSink
@@ -18,7 +19,7 @@ internal class FirTypeParameterConstraintNameInWhereClauseCompletionContributor(
priority: Int = 0,
) : FirCompletionContributorBase<KotlinTypeConstraintNameInWhereClausePositionContext>(sink, priority) {
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinTypeConstraintNameInWhereClausePositionContext,
weighingContext: WeighingContext,
@@ -10,6 +10,9 @@ import com.intellij.psi.codeStyle.NameUtil
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeContext
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.compositeScope
import org.jetbrains.kotlin.analysis.api.components.returnType
import org.jetbrains.kotlin.analysis.api.components.scopeContext
import org.jetbrains.kotlin.analysis.api.scopes.KaScope
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
@@ -42,7 +45,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
private val nameFiltersWithUserPrefixes: List<Pair<NameFilter, String>> = getNameFiltersWithUserPrefixes()
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinRawPositionContext,
weighingContext: WeighingContext,
@@ -81,7 +84,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
)
}
context(KaSession)
context(_: KaSession)
private fun completeFromParametersInFile(
positionContext: KotlinRawPositionContext,
variableOrParameter: KtCallableDeclaration,
@@ -138,7 +141,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun completeClassesFromScopeContext(
positionContext: KotlinRawPositionContext,
variableOrParameter: KtCallableDeclaration,
@@ -165,7 +168,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun completeClassesFromIndices(
positionContext: KotlinRawPositionContext,
variableOrParameter: KtCallableDeclaration,
@@ -191,7 +194,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun addSuggestions(
variableOrParameter: KtCallableDeclaration,
symbol: KaClassifierSymbol,
@@ -291,7 +294,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun getAvailableTypeParameters(scopes: KaScope): Sequence<KaTypeParameterSymbol> =
scopes.classifiers.filterIsInstance<KaTypeParameterSymbol>()
@@ -299,7 +302,7 @@ internal class FirVariableOrParameterNameWithTypeCompletionContributor(
return (typeReference.parent as? KtCallableDeclaration)?.takeIf { it.receiverTypeReference == typeReference }
}
context(KaSession)
context(_: KaSession)
private fun typeIsVisible(
positionContext: KotlinRawPositionContext,
type: KaType,
@@ -10,6 +10,12 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.components.isNullable
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbol
import org.jetbrains.kotlin.analysis.api.components.scopeContext
import org.jetbrains.kotlin.analysis.api.components.sealedClassInheritors
import org.jetbrains.kotlin.analysis.api.components.staticDeclaredMemberScope
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.analysis.api.types.KaClassType
@@ -51,7 +57,7 @@ internal class FirWhenWithSubjectConditionContributor(
super.prefixMatcher
.applyIf(onTypingIsKeyword) { cloneWithPrefix("") }
context(KaSession)
context(_: KaSession)
override fun complete(
positionContext: KotlinWithSubjectEntryPositionContext,
weighingContext: WeighingContext,
@@ -98,13 +104,13 @@ internal class FirWhenWithSubjectConditionContributor(
?.let(sink::addElement)
}
context(KaSession)
context(_: KaSession)
private fun getClassSymbol(subjectType: KaType): KaNamedClassSymbol? {
val classType = subjectType as? KaClassType
return classType?.symbol as? KaNamedClassSymbol
}
context(KaSession)
context(_: KaSession)
private fun createNullBranchLookupElement(
context: WeighingContext,
type: KaType?,
@@ -115,7 +121,7 @@ internal class FirWhenWithSubjectConditionContributor(
.applyWeighs(context)
}
context(KaSession)
context(_: KaSession)
private fun completeAllTypes(
positionContext: KotlinWithSubjectEntryPositionContext,
context: WeighingContext,
@@ -162,7 +168,7 @@ internal class FirWhenWithSubjectConditionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun isPrefixNeeded(symbol: KaNamedSymbol): Boolean {
return when (symbol) {
is KaAnonymousObjectSymbol -> return false
@@ -176,7 +182,7 @@ internal class FirWhenWithSubjectConditionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun completeSubClassesOfSealedClass(
positionContext: KotlinWithSubjectEntryPositionContext,
context: WeighingContext,
@@ -215,7 +221,7 @@ internal class FirWhenWithSubjectConditionContributor(
}
}
context(KaSession)
context(_: KaSession)
private fun getHandledClassIds(conditions: List<KtWhenCondition>): Set<ClassId> =
conditions.mapNotNullTo(hashSetOf()) { condition ->
val reference = when (condition) {
@@ -227,7 +233,7 @@ internal class FirWhenWithSubjectConditionContributor(
resolvesTo?.classId
}
context(KaSession)
context(_: KaSession)
private fun getAllSealedInheritors(classSymbol: KaNamedClassSymbol): Collection<KaNamedClassSymbol> {
fun getAllSealedInheritorsTo(
@@ -246,7 +252,7 @@ internal class FirWhenWithSubjectConditionContributor(
.apply { getAllSealedInheritorsTo(classSymbol, this) }
}
context(KaSession)
context(_: KaSession)
private fun createElseBranchLookupElement(
context: WeighingContext,
whenCondition: KtWhenCondition,
@@ -262,7 +268,7 @@ internal class FirWhenWithSubjectConditionContributor(
}
context(KaSession)
context(_: KaSession)
private fun completeEnumEntries(
positionContext: KotlinWithSubjectEntryPositionContext,
context: WeighingContext,
@@ -297,7 +303,7 @@ internal class FirWhenWithSubjectConditionContributor(
return entry.conditions.size == 1
}
context(KaSession)
context(_: KaSession)
private fun createLookupElement(
context: WeighingContext,
lookupString: String,
@@ -8,6 +8,21 @@ import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaImplicitReceiver
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.allOverriddenSymbols
import org.jetbrains.kotlin.analysis.api.components.approximateToSuperPublicDenotableOrSelf
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.components.containingDeclaration
import org.jetbrains.kotlin.analysis.api.components.containingSymbol
import org.jetbrains.kotlin.analysis.api.components.defaultType
import org.jetbrains.kotlin.analysis.api.components.directlyOverriddenSymbols
import org.jetbrains.kotlin.analysis.api.components.expandedSymbol
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.components.fakeOverrideOriginal
import org.jetbrains.kotlin.analysis.api.components.isMarkedNullable
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.components.isUnitType
import org.jetbrains.kotlin.analysis.api.components.semanticallyEquals
import org.jetbrains.kotlin.analysis.api.components.withNullability
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.*
@@ -76,7 +91,7 @@ internal object CallableMetadataProvider {
else -> this
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun getCallableMetadata(
signature: KaCallableSignature<*>,
@@ -109,7 +124,7 @@ internal object CallableMetadataProvider {
}
}
context(KaSession)
context(_: KaSession)
private fun nonExtensionWeight(
signature: KaCallableSignature<*>,
flattenedActualReceiverTypes: List<List<KaType>>,
@@ -140,7 +155,7 @@ internal object CallableMetadataProvider {
.applyIf(hasOverriddenSymbols) { CallableMetadata(kind.correspondingBaseForThisOrSelf, scopeIndex) }
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun extensionWeight(
signature: KaCallableSignature<*>,
@@ -165,7 +180,7 @@ internal object CallableMetadataProvider {
)
}
context(KaSession)
context(_: KaSession)
private fun getExpectedNonExtensionReceiver(symbol: KaCallableSymbol): KaClassSymbol? {
val containingClass = symbol.fakeOverrideOriginal.containingSymbol as? KaClassSymbol
return if (symbol is KaConstructorSymbol && (containingClass as? KaNamedClassSymbol)?.isInner == true) {
@@ -175,7 +190,7 @@ internal object CallableMetadataProvider {
}
}
context(KaSession)
context(_: KaSession)
private fun receiverTypes(
receiver: KtElement,
): List<KaType>? {
@@ -201,7 +216,7 @@ internal object CallableMetadataProvider {
}
// todo refactor; move to an appropriate place
context(KaSession)
context(_: KaSession)
fun calculateActualReceiverTypes(
explicitReceiver: KtElement?,
implicitReceivers: () -> List<KaImplicitReceiver>,
@@ -218,13 +233,13 @@ internal object CallableMetadataProvider {
private inline val KaClassLikeSymbol.companionObject: KaNamedClassSymbol?
get() = (this as? KaNamedClassSymbol)?.companionObject
context(KaSession)
context(_: KaSession)
private fun KaType.flatten(): List<KaType> = when (this) {
is KaIntersectionType -> conjuncts.flatMap { it.flatten() }
else -> listOf(this)
}
context(KaSession)
context(_: KaSession)
private fun KtExpression.getTypeWithCorrectedNullability(
referenceClass: KaSymbol? = null,
): KaType? {
@@ -237,11 +252,11 @@ internal object CallableMetadataProvider {
}
return expressionType?.applyIf(parent is KtSafeQualifiedExpression) {
withNullability(KaTypeNullability.NON_NULLABLE)
withNullability(false)
}
}
context(KaSession)
context(_: KaSession)
private val KaCallableSymbol.isOverride: Boolean
get() = when (this) {
is KaNamedFunctionSymbol -> isOverride
@@ -256,16 +271,16 @@ internal object CallableMetadataProvider {
* val l = String::length
* ```
*/
context(KaSession)
context(_: KaSession)
private fun isInCallableReferenceExpression(explicitReceiver: KtElement): Boolean =
explicitReceiver.getParentOfType<KtCallableReferenceExpression>(strict = true)
?.lhs == explicitReceiver
context(KaSession)
context(_: KaSession)
private fun KaType.replaceTypeArgumentsWithStarProjections(): KaType? =
expandedSymbol?.let { buildClassTypeWithStarProjections(it) }?.withNullability(nullability)
expandedSymbol?.let { buildClassTypeWithStarProjections(it) }?.withNullability(isMarkedNullable)
context(KaSession)
context(_: KaSession)
private fun callableWeightByReceiver(
symbol: KaCallableSymbol,
actualReceiverTypes: List<List<KaType>>,
@@ -303,7 +318,7 @@ internal object CallableMetadataProvider {
return CallableMetadata(bestMatchWeightKind, bestMatchIndex)
}
context(KaSession)
context(_: KaSession)
private fun callableWeightKindByReceiverType(
symbol: KaCallableSymbol,
actualReceiverType: KaType,
@@ -323,7 +338,7 @@ internal object CallableMetadataProvider {
else -> null
}
context(KaSession)
context(_: KaSession)
private fun isExtensionCallOnTypeParameterReceiver(symbol: KaCallableSymbol): Boolean {
val originalSymbol = symbol.fakeOverrideOriginal
val receiverParameterType = originalSymbol.receiverType as? KaTypeParameterType ?: return false
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.psi.KtEnumEntry
internal object FirClassifierProvider {
context(KaSession)
context(_: KaSession)
fun KaScopeWithKind.getAvailableClassifiers(
positionContext: KotlinRawPositionContext,
scopeNameFilter: (Name) -> Boolean,
@@ -29,7 +29,7 @@ internal object FirClassifierProvider {
.filter { visibilityChecker.isVisible(it, positionContext) }
.map { KtSymbolWithOrigin(it, kind) }
context(KaSession)
context(_: KaSession)
fun getAvailableClassifiersFromIndex(
positionContext: KotlinRawPositionContext,
parameters: KotlinFirCompletionParameters,
@@ -44,7 +44,7 @@ internal object FirClassifierProvider {
}
}
context(KaSession)
context(_: KaSession)
private fun completeKotlinClasses(
symbolProvider: KtSymbolFromIndexProvider,
scopeNameFilter: (Name) -> Boolean,
@@ -58,7 +58,7 @@ private fun completeKotlinClasses(
}
)
context(KaSession)
context(_: KaSession)
private fun completeJavaClasses(
parameters: KotlinFirCompletionParameters,
symbolProvider: KtSymbolFromIndexProvider,
@@ -11,6 +11,7 @@ import com.intellij.psi.util.nextLeafs
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
import org.jetbrains.kotlin.analysis.api.symbols.classSymbol
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.idea.completion.api.serialization.SerializableInsertHandler
import org.jetbrains.kotlin.idea.completion.lookups.factories.insertAndShortenReferencesInStringUsingTemporarySuffix
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
internal object FirSuperEntriesProvider {
context(KaSession)
context(_: KaSession)
fun getSuperClassesAvailableForSuperCall(context: PsiElement): List<KaNamedClassSymbol> {
val containingClass = context.getStrictParentOfType<KtClassOrObject>() ?: return emptyList()
val containingClassSymbol = containingClass.classSymbol ?: return emptyList()
@@ -5,6 +5,8 @@ import com.intellij.openapi.util.Ref
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.KaTypeRelationChecker
import org.jetbrains.kotlin.analysis.api.components.allSupertypes
import org.jetbrains.kotlin.analysis.api.components.expandedSymbol
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature
@@ -41,7 +43,7 @@ internal class ShadowedCallablesFilter {
* invoked. For example, `kotlin.text.String()` is not shortened by reference shortener, because shortened version `String()`
* is resolved to `kotlin.String()`. That's why we can't rely on reference shortener and need to use [ImportStrategy.DoNothing].
*/
context(KaSession)
context(_: KaSession)
fun excludeFromCompletion(
callableSignature: KaCallableSignature<*>,
options: CallableInsertionOptions,
@@ -89,7 +91,7 @@ internal class ShadowedCallablesFilter {
return FilterResult(excludeFromCompletion)
}
context(KaSession)
context(_: KaSession)
private fun processSignatureConsideringOptions(
fullSimplifiedSignature: SimplifiedSignature,
simplifiedSignature: SimplifiedSignature,
@@ -149,7 +151,7 @@ internal class ShadowedCallablesFilter {
*
* Also, extensions are sorted by their kind: a function variable can be shadowed by an extension function.
*/
context(KaSession)
context(_: KaSession)
fun sortExtensions(
extensions: Collection<ApplicableExtension>,
receiversFromContext: List<KaType>
@@ -196,7 +198,7 @@ internal class ShadowedCallablesFilter {
private data class NameForLocal(val name: Name) : ReceiverId()
companion object {
context(KaSession)
context(_: KaSession)
fun create(type: KaType): ReceiverId? {
val expandedClassSymbol = type.expandedSymbol ?: return null
val name = expandedClassSymbol.name ?: return null
@@ -230,7 +232,7 @@ private sealed class SimplifiedSignature {
companion object {
context(KaSymbolProvider)
context(_: KaSymbolProvider)
fun KaCallableSymbol.getContainerFqName(): FqName? {
val callableId = callableId ?: return null
return when (location) {
@@ -256,7 +258,7 @@ private data class VariableLikeSimplifiedSignature(
companion object {
context(KaSymbolProvider)
context(_: KaSymbolProvider)
fun create(
signature: KaVariableSignature<*>,
) = VariableLikeSimplifiedSignature(
@@ -277,7 +279,7 @@ private class FunctionLikeSimplifiedSignature(
companion object {
context(KaSession)
context(session: KaSession)
fun create(
signature: KaVariableSignature<*>,
) = FunctionLikeSimplifiedSignature(
@@ -290,10 +292,10 @@ private class FunctionLikeSimplifiedSignature(
functionalType.parameterTypes
},
varargValueParameterIndices = emptyList(),
typeRelationChecker = this@KaSession,
typeRelationChecker = session,
)
context(KaSession)
context(session: KaSession)
fun create(
signature: KaFunctionSignature<*>,
requiresTypeArguments: (KaFunctionSymbol) -> Boolean,
@@ -311,7 +313,7 @@ private class FunctionLikeSimplifiedSignature(
valueParameters.map { it.returnType }
},
varargValueParameterIndices = valueParameters.mapIndexedNotNull { index, parameter -> index.takeIf { parameter.symbol.isVararg } },
typeRelationChecker = this@KaSession,
typeRelationChecker = session,
)
}
}
@@ -5,6 +5,9 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.KaScopeWithKind
import org.jetbrains.kotlin.analysis.api.components.KaScopeWithKindImpl
import org.jetbrains.kotlin.analysis.api.components.memberScope
import org.jetbrains.kotlin.analysis.api.components.packageScope
import org.jetbrains.kotlin.analysis.api.components.staticMemberScope
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -18,7 +21,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KaDeclarationContainerS
* Note that if the symbol is [org.jetbrains.kotlin.analysis.api.symbols.KaTypeAliasSymbol], `null` is returned.
* See KT-34281 for more details.
*/
context(KaSession)
context(_: KaSession)
internal val KaSymbol.staticScope: KaScopeWithKind?
get() = when (this) {
is KaDeclarationContainerSymbol -> KaScopeWithKindImpl(
@@ -8,6 +8,13 @@ import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeContext
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.KaScopeKinds
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.components.containingDeclaration
import org.jetbrains.kotlin.analysis.api.components.declaredMemberScope
import org.jetbrains.kotlin.analysis.api.components.isUnitType
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbols
import org.jetbrains.kotlin.analysis.api.components.scope
import org.jetbrains.kotlin.analysis.api.components.syntheticJavaPropertiesScope
import org.jetbrains.kotlin.analysis.api.scopes.KaScope
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.symbols.*
@@ -40,14 +47,14 @@ object KtOutsideTowerScopeKinds {
val StaticMemberScope: KaScopeKinds.StaticMemberScope = KaScopeKinds.StaticMemberScope(INDEX_IN_TOWER)
}
context(KaSession)
context(_: KaSession)
internal fun KotlinRawPositionContext.resolveReceiverToSymbols(): Sequence<KaSymbol> =
when (this) {
is KotlinNameReferencePositionContext -> resolveReceiverToSymbols()
else -> sequenceOf(rootPackageSymbol)
}
context(KaSession)
context(_: KaSession)
internal fun KotlinNameReferencePositionContext.resolveReceiverToSymbols(): Sequence<KaSymbol> =
when (val explicitReceiver = explicitReceiver) {
null -> sequenceOf(rootPackageSymbol)
@@ -64,7 +71,7 @@ internal fun createStarTypeArgumentsList(typeArgumentsCount: Int): String =
""
}
context(KaSession)
context(_: KaSession)
internal fun collectLocalAndMemberNonExtensionsFromScopeContext(
parameters: KotlinFirCompletionParameters,
positionContext: KotlinNameReferencePositionContext,
@@ -111,7 +118,7 @@ internal fun collectLocalAndMemberNonExtensionsFromScopeContext(
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
internal fun collectNonExtensionsForType(
parameters: KotlinFirCompletionParameters,
@@ -151,7 +158,7 @@ internal fun collectNonExtensionsForType(
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun Sequence<KaCallableSignature<*>>.filterOutJavaGettersAndSetters(
positionContext: KotlinNameReferencePositionContext,
@@ -179,7 +186,7 @@ private fun Sequence<KaCallableSignature<*>>.filterOutJavaGettersAndSetters(
* Returns non-extensions from [KtScope]. Resulting callables do not include synthetic Java properties and constructors of inner classes.
* To get them use [collectNonExtensionsForType].
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
internal fun collectNonExtensionsFromScope(
parameters: KotlinFirCompletionParameters,
@@ -195,7 +202,7 @@ internal fun collectNonExtensionsFromScope(
filterNot { isEnumEntriesProperty(it.symbol) }
}
context(KaSession)
context(_: KaSession)
private fun Sequence<KaCallableSignature<*>>.filterNonExtensions(
positionContext: KotlinNameReferencePositionContext,
visibilityChecker: CompletionVisibilityChecker,
@@ -218,7 +225,7 @@ private fun ((Name) -> Boolean).getAndSetAware(): (Name) -> Boolean = { property
).any(this)
}
context(KaSession)
context(_: KaSession)
private fun isEnumEntriesProperty(symbol: KaCallableSymbol): Boolean {
return symbol is KaPropertySymbol &&
symbol.isStatic &&
@@ -237,7 +244,7 @@ private fun LanguageVersionSettings.excludeSyntheticJavaProperties(
/**
* Checks if the scope contains an alias for the [symbol] and returns the name of the alias.
*/
context(KaSession)
context(_: KaSession)
internal fun KtFile.getAliasNameIfExists(symbol: KaSymbol): Name? {
val fqName = symbol.getFqNameIfPackageOrNonLocal() ?: return null
// TODO: It's possible to optimize this by using a map for the aliases if it turns out to be a bottleneck.
@@ -11,6 +11,7 @@ import com.intellij.ui.RowIcon
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinProjectStructureProvider
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KaDeclarationRendererForSource
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KaSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.idea.KotlinIconProvider
import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferencesInRange
import org.jetbrains.kotlin.idea.base.util.module
@@ -46,7 +48,7 @@ internal class ActualKeywordHandler(
private val declaration: KtNamedDeclaration? = null,
) : CompletionKeywordHandler<KaSession>(KtTokens.ACTUAL_KEYWORD) {
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -60,7 +62,7 @@ internal class ActualKeywordHandler(
lookup
}
context(KaSession)
context(_: KaSession)
fun createActualLookups(
parameters: KotlinFirCompletionParameters,
project: Project
@@ -102,7 +104,7 @@ internal class ActualKeywordHandler(
return actualsForExpected.isEmpty()
}
context(KaSession)
context(_: KaSession)
private fun createLookupElement(
project: Project,
file: KtFile,
@@ -134,7 +136,7 @@ internal class ActualKeywordHandler(
)
}
context(KaSession)
context(_: KaSession)
private fun KaDeclarationSymbol.textPresentation(): String {
val symbol = this
return buildString {
@@ -148,7 +150,7 @@ internal class ActualKeywordHandler(
}
}
context(KaSession)
context(_: KaSession)
private fun KaDeclarationSymbol.iconPresentation(): RowIcon {
val symbol = this
val baseIcon = KotlinIconProvider.getBaseIcon(symbol)
@@ -12,6 +12,9 @@ import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.base.KaContextReceiversOwner
import org.jetbrains.kotlin.analysis.api.components.containingSymbol
import org.jetbrains.kotlin.analysis.api.components.fakeOverrideOriginal
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KaContextReceiversRenderer
import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers.KaContextReceiverListRenderer
@@ -42,7 +45,7 @@ internal class OverrideKeywordHandler(
private val importStrategyDetector: ImportStrategyDetector,
) : CompletionKeywordHandler<KaSession>(KtTokens.OVERRIDE_KEYWORD) {
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -59,7 +62,7 @@ internal class OverrideKeywordHandler(
) + lookup
}
context(KaSession)
context(session: KaSession)
fun createOverrideMemberLookups(
parameters: KotlinFirCompletionParameters,
declaration: KtCallableDeclaration?,
@@ -74,7 +77,9 @@ internal class OverrideKeywordHandler(
for (member in members) {
val symbolPointer = member.memberInfo.symbolPointer
val memberSymbol = symbolPointer.restoreSymbol()
val memberSymbol = with(session) {
symbolPointer.restoreSymbol()
}
requireNotNull(memberSymbol) { "${symbolPointer::class} can't be restored" }
if (declaration != null && !canCompleteDeclarationWithMember(declaration, memberSymbol)) continue
@@ -97,7 +102,7 @@ internal class OverrideKeywordHandler(
} else allMembers.toList()
}
context(KaSession)
context(_: KaSession)
private fun canCompleteDeclarationWithMember(
declaration: KtCallableDeclaration,
symbolToOverride: KaCallableSymbol
@@ -115,7 +120,7 @@ internal class OverrideKeywordHandler(
else -> false
}
context(KaSession)
context(session: KaSession)
@OptIn(KaExperimentalApi::class)
private fun createLookupElementToGenerateSingleOverrideMember(
member: KtClassMember,
@@ -125,7 +130,7 @@ internal class OverrideKeywordHandler(
project: Project,
): OverridesCompletionLookupElementDecorator {
val symbolPointer = member.memberInfo.symbolPointer
val memberSymbol = symbolPointer.restoreSymbol()
val memberSymbol = with(session) { symbolPointer.restoreSymbol() }
requireNotNull(memberSymbol) { "${symbolPointer::class} can't be restored" }
check(memberSymbol is KaNamedSymbol)
@@ -7,6 +7,10 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.isClassType
import org.jetbrains.kotlin.analysis.api.components.isNullable
import org.jetbrains.kotlin.analysis.api.components.isUnitType
import org.jetbrains.kotlin.analysis.api.components.returnType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.idea.completion.createKeywordElement
import org.jetbrains.kotlin.idea.completion.createKeywordElementWithSpace
@@ -29,7 +33,7 @@ import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
* Implementation in K1: [org.jetbrains.kotlin.idea.completion.returnExpressionItems]
*/
internal object ReturnKeywordHandler : CompletionKeywordHandler<KaSession>(KtTokens.RETURN_KEYWORD) {
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -67,7 +71,7 @@ internal object ReturnKeywordHandler : CompletionKeywordHandler<KaSession>(KtTok
return result
}
context(KaSession)
context(_: KaSession)
private fun addAllReturnVariants(
result: MutableList<LookupElement>,
returnType: KaType,
@@ -89,7 +93,7 @@ internal object ReturnKeywordHandler : CompletionKeywordHandler<KaSession>(KtTok
}
}
context(KaSession)
context(_: KaSession)
private fun getExpressionsToReturnByType(returnType: KaType): List<ExpressionTarget> = buildList {
if (returnType.isNullable) {
add(ExpressionTarget("null", addToLookupElementTail = false))
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtExpression
internal object SuperKeywordHandler : CompletionKeywordHandler<KaSession>(KtTokens.SUPER_KEYWORD) {
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaImplicitReceiver
import org.jetbrains.kotlin.analysis.api.components.scopeContext
import org.jetbrains.kotlin.analysis.api.symbols.KaAnonymousFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaClassKind
import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
@@ -31,7 +32,7 @@ internal class ThisKeywordHandler(
private val prefixMatcher: PrefixMatcher,
) : CompletionKeywordHandler<KaSession>(KtTokens.THIS_KEYWORD) {
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -65,7 +66,7 @@ internal class ThisKeywordHandler(
return result
}
context(KaSession)
context(_: KaSession)
private fun canReferenceSymbolByThis(parameters: CompletionParameters, symbol: KaSymbol): Boolean {
if (symbol !is KaClassSymbol) return true
if (symbol.classKind != KaClassKind.COMPANION_OBJECT) return true
@@ -73,14 +74,14 @@ internal class ThisKeywordHandler(
return parameters.offset in companionPsi.textRange
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun createThisLookupElement(receiver: KaImplicitReceiver, labelName: Name?): LookupElement {
return createKeywordElement(KtTokens.THIS_KEYWORD.value, labelName.labelNameToTail(), lookupObject = KeywordLookupObject())
.withTypeText(receiver.type.renderVerbose())
}
context(KaSession)
context(_: KaSession)
private fun getThisLabelBySymbol(symbol: KaSymbol): Name? = when {
symbol is KaNamedSymbol && !symbol.name.isSpecial -> symbol.name
symbol is KaAnonymousFunctionSymbol -> {
@@ -8,6 +8,7 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaScopeKind
import org.jetbrains.kotlin.analysis.api.components.containingDeclaration
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaConstructorSymbol
@@ -35,7 +36,7 @@ import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.util.OperatorNameConventions
context(KaSession)
context(_: KaSession)
internal fun createCallableLookupElements(
context: WeighingContext,
parameters: KotlinFirCompletionParameters,
@@ -119,7 +120,7 @@ private fun LookupElementBuilder.applyKindToPresentation(): LookupElementBuilder
else -> this
}
context(KaSession)
context(_: KaSession)
internal fun createOperatorLookupElement(
context: WeighingContext,
signature: KaFunctionSignature<*>,
@@ -11,11 +11,13 @@ import com.intellij.codeInsight.template.TextResult
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.types.KaTypeRenderer
import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource
import org.jetbrains.kotlin.analysis.api.types.KaFunctionType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.analysis.api.useSiteModule
import org.jetbrains.kotlin.idea.base.codeInsight.KotlinNameSuggester
import org.jetbrains.kotlin.idea.completion.api.serialization.SerializableInsertHandler
import org.jetbrains.kotlin.name.Name
@@ -82,7 +84,7 @@ internal class TrailingLambdaInsertionHandler private constructor(
* Returns the [TrailingLambdaInsertionHandler] if the project supports using templates, null otherwise.
*/
@OptIn(KaExperimentalApi::class)
context(KaSession)
context(_: KaSession)
fun create(functionType: KaFunctionType): TrailingLambdaInsertionHandler? {
if (TemplateManager.getInstance(useSiteModule.project) == null) return null
val parameterNames = functionType.parameters.map { it.name }
@@ -99,7 +101,7 @@ private data class TrailingLambdaParameterData(
val typeText: String,
)
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun buildTrailingLambdaParameterData(
trailingFunctionType: KaFunctionType,
@@ -16,7 +16,7 @@ data class CallableInsertionOptions(
val insertionStrategy: CallableInsertionStrategy,
)
context(KaSession)
context(_: KaSession)
internal fun detectCallableOptions(symbol: KaCallableSymbol, importStrategyDetector: ImportStrategyDetector): CallableInsertionOptions {
return CallableInsertionOptions(
importingStrategy = importStrategyDetector.detectImportStrategyForCallableSymbol(symbol),
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.completion.lookups
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.renderer.types.KaExpandedTypeRenderingMode
import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource
import org.jetbrains.kotlin.analysis.api.renderer.types.renderers.KaFunctionalTypeRenderer
@@ -19,26 +20,26 @@ import org.jetbrains.kotlin.types.Variance
internal object CompletionShortNamesRenderer {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun renderFunctionalTypeParameters(functionalType: KaFunctionType): String = functionalType.parameterTypes.joinToString(
prefix = "(",
postfix = ")",
) { it.renderVerbose() }
context(KaSession)
context(_: KaSession)
fun renderVariable(variable: KaVariableSignature<*>): String {
return renderReceiver(variable)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun renderReceiver(variable: KaVariableSignature<*>): String {
val receiverType = variable.receiverType ?: return ""
return receiverType.renderVerbose() + "."
}
context(KaSession)
context(_: KaSession)
fun renderFunctionParameters(
parameters: List<KaVariableSignature<KaValueParameterSymbol>>,
): @NonNls String = parameters.joinToString(
@@ -46,7 +47,7 @@ internal object CompletionShortNamesRenderer {
postfix = ")",
) { renderFunctionParameter(it) }
context(KaSession)
context(_: KaSession)
fun renderTrailingFunction(
trailingFunctionSignature: KaVariableSignature<KaValueParameterSymbol>,
trailingFunctionType: KaFunctionType,
@@ -59,7 +60,7 @@ internal object CompletionShortNamesRenderer {
append(" }")
}
context(KaSession)
context(_: KaSession)
private fun renderFunctionParameter(
parameter: KaVariableSignature<KaValueParameterSymbol>,
): @NonNls String = buildString {
@@ -78,7 +79,7 @@ internal object CompletionShortNamesRenderer {
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun <A : Appendable> A.appendParameter(
parameterName: Name,
@@ -98,7 +99,7 @@ internal object CompletionShortNamesRenderer {
}
}
context(KaSession)
context(_: KaSession)
@KaExperimentalApi
internal fun KaType.renderVerbose(): @NonNls String = render(
renderer = CompletionShortNamesRenderer.rendererVerbose,
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.renderer.render
@ApiStatus.Internal
object TailTextProvider {
context(KaSession)
context(_: KaSession)
fun getTailText(
signature: KaCallableSignature<*>,
useFqName: Boolean = false,
@@ -32,7 +32,7 @@ object TailTextProvider {
return getTailText(symbol, useFqName = useFqName)
}
context(KaSession)
context(_: KaSession)
fun getTailText(
symbol: KaCallableSymbol,
useFqName: Boolean = false,
@@ -42,7 +42,7 @@ object TailTextProvider {
symbol.getContainerOrAliasPresentation(useFqName = useFqName)?.let { append(it) }
}
context(KaSession)
context(_: KaSession)
private fun KaCallableSymbol.getContainerOrAliasPresentation(isFunctionalVariableCall: Boolean = false, useFqName: Boolean = false): String? {
return if (useFqName) {
val callableId = callableId ?: return null
@@ -53,7 +53,7 @@ object TailTextProvider {
}
}
context(KaSession)
context(_: KaSession)
fun getTailTextForVariableCall(
functionalType: KaFunctionType,
signature: KaVariableSignature<*>,
@@ -70,7 +70,7 @@ object TailTextProvider {
signature.symbol.getContainerOrAliasPresentation(useFqName = useFqName, isFunctionalVariableCall = true)?.let { append(it) }
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun getTailText(
symbol: KaClassLikeSymbol,
@@ -98,14 +98,14 @@ object TailTextProvider {
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun StringBuilder.renderReceiverType(receiverType: KaType) {
val renderedType = receiverType.renderVerbose()
append(KotlinCompletionImplK2Bundle.message("presentation.tail.for.0", renderedType))
}
context(KaSession)
context(_: KaSession)
private fun KaCallableSymbol.getContainerPresentation(isFunctionalVariableCall: Boolean): String? {
val callableId = callableId ?: return null
val className = callableId.className
@@ -126,7 +126,7 @@ object TailTextProvider {
private fun FqName.asStringForTailText(): String =
if (isRoot) "<root>" else render()
context(KaSession)
context(_: KaSession)
fun insertLambdaBraces(symbol: KaFunctionType): Boolean {
val singleParam = symbol.parameterTypes.singleOrNull()
return singleParam != null && singleParam is KaFunctionType
@@ -16,7 +16,7 @@ internal object TypeTextProvider {
/**
* Creates lookup element's type text, based on provided classifier symbol.
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun getTypeTextForClassifier(symbol: KaClassifierSymbol): String? = when (symbol) {
is KaTypeAliasSymbol -> symbol.expandedType.renderVerbose()
@@ -34,7 +34,7 @@ internal object TypeTextProvider {
* ```
* a lookup element `foo()` is suggested and its type text should be `Unit`.
*/
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun getTypeTextForCallable(
signature: KaCallableSignature<*>,
@@ -7,6 +7,7 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature
@@ -27,7 +28,7 @@ import org.jetbrains.kotlin.name.Name
@ApiStatus.Internal
object KotlinFirLookupElementFactory {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createConstructorCallLookupElement(
containingSymbol: KaNamedClassSymbol,
@@ -39,7 +40,7 @@ object KotlinFirLookupElementFactory {
return ClassLookupElementFactory.createConstructorLookup(containingSymbol, visibleConstructorSymbols, importingStrategy, aliasName)
}
context(KaSession)
context(_: KaSession)
fun createClassifierLookupElement(
symbol: KaClassifierSymbol,
importingStrategy: ImportStrategy = ImportStrategy.DoNothing,
@@ -52,7 +53,7 @@ object KotlinFirLookupElementFactory {
is KaTypeParameterSymbol -> TypeParameterLookupElementFactory.createLookup(symbol)
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createLookupElement(
symbol: KaNamedSymbol,
@@ -71,7 +72,7 @@ object KotlinFirLookupElementFactory {
else -> throw IllegalArgumentException("Cannot create a lookup element for $symbol")
}
context(KaSession)
context(_: KaSession)
fun createCallableLookupElement(
name: Name,
signature: KaCallableSignature<*>,
@@ -83,7 +84,7 @@ object KotlinFirLookupElementFactory {
is KaVariableSignature<*> -> VariableLookupElementFactory.createLookup(signature, options, aliasName)
}
context(KaSession)
context(_: KaSession)
fun createBracketOperatorLookupElement(
operatorName: Name,
signature: KaCallableSignature<*>,
@@ -100,18 +101,18 @@ object KotlinFirLookupElementFactory {
fun createPackagePartLookupElement(packagePartFqName: FqName): LookupElement =
PackagePartLookupElementFactory.createLookup(packagePartFqName)
context(KaSession)
context(_: KaSession)
fun createNamedArgumentLookupElement(name: Name, types: List<KaType>): LookupElement =
NamedArgumentLookupElementFactory.createLookup(name, types)
fun createNamedArgumentWithValueLookupElement(name: Name, value: String): LookupElement =
NamedArgumentLookupElementFactory.createLookup(name, value)
context(KaSession)
context(_: KaSession)
fun createTypeLookupElement(type: KaType): LookupElement? =
TypeLookupElementFactory.createLookup(type)
context(KaSession)
context(_: KaSession)
fun createTypeLookupElement(classSymbol: KaClassifierSymbol): LookupElement? =
TypeLookupElementFactory.createLookup(classSymbol)
}
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.renderer.render
internal object NamedArgumentLookupElementFactory {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createLookup(name: Name, types: List<KaType>): LookupElement {
val typeText = types.singleOrNull()?.renderVerbose() ?: "..."
@@ -10,6 +10,7 @@ import kotlinx.serialization.Serializable
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.render
import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KaRendererAnnotationsFilter
import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
@@ -30,7 +31,7 @@ import org.jetbrains.kotlin.types.Variance
internal object TypeLookupElementFactory {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createLookup(type: KaType): LookupElement? {
val renderedType = type.render(TYPE_RENDERING_OPTIONS_SHORT_NAMES, position = Variance.INVARIANT)
@@ -56,7 +57,7 @@ internal object TypeLookupElementFactory {
}
}
context(KaSession)
context(_: KaSession)
fun createLookup(symbol: KaClassifierSymbol): LookupElement? {
val relativeName = symbol.name
?: return null
@@ -11,6 +11,9 @@ import com.intellij.psi.util.*
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.deprecationStatus
import org.jetbrains.kotlin.analysis.api.components.getterDeprecationStatus
import org.jetbrains.kotlin.analysis.api.components.setterDeprecationStatus
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisFromWriteAction
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisOnEdt
import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisFromWriteAction
@@ -37,7 +40,7 @@ import org.jetbrains.kotlin.psi.KtSuperExpression
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
context(KaSession)
context(_: KaSession)
internal fun withClassifierSymbolInfo(
symbol: KaClassifierSymbol,
elementBuilder: LookupElementBuilder
@@ -47,7 +50,7 @@ internal fun withClassifierSymbolInfo(
.withTypeText(getTypeTextForClassifier(symbol))
.withStrikeoutness(symbol.requireStrikeoutness())
context(KaSession)
context(_: KaSession)
internal fun withCallableSignatureInfo(
signature: KaCallableSignature<*>,
elementBuilder: LookupElementBuilder
@@ -57,7 +60,7 @@ internal fun withCallableSignatureInfo(
.withTypeText(getTypeTextForCallable(signature, treatAsFunctionCall = elementBuilder.`object` is FunctionCallLookupObject))
.withStrikeoutness(signature.symbol.requireStrikeoutness())
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun KaDeclarationSymbol.requireStrikeoutness(): Boolean = when {
deprecationStatus != null -> true
@@ -134,6 +137,6 @@ private fun getSuperTypeQualifierRange(typeReference: KtTypeReference): TextRang
(typeReference.nextLeaf { it.elementType == KtTokens.GT } ?: typeReference).endOffset
)
context(KaSession)
context(_: KaSession)
internal fun KaCallableSymbol.isExtensionCall(isFunctionalVariableCall: Boolean): Boolean =
isExtension || isFunctionalVariableCall && (returnType as? KaFunctionType)?.hasReceiver == true
@@ -21,7 +21,7 @@ internal object ClassifierWeigher {
NON_LOCAL
}
context(KaSession)
context(_: KaSession)
fun addWeight(
lookupElement: LookupElement,
symbol: KaSymbol,
@@ -6,6 +6,7 @@ import com.intellij.codeInsight.lookup.LookupElementWeigher
import com.intellij.openapi.util.Key
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.deprecationStatus
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
@@ -13,7 +14,7 @@ internal object DeprecatedWeigher {
const val WEIGHER_ID = "kotlin.deprecated"
private var LookupElement.isDeprecated: Boolean by NotNullableUserDataProperty(Key("KOTLIN_DEPRECATED"), false)
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun addWeight(lookupElement: LookupElement, symbol: KaSymbol) {
lookupElement.isDeprecated = symbol.deprecationStatus != null
@@ -8,12 +8,19 @@ import com.intellij.openapi.util.Key
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds
import org.jetbrains.kotlin.analysis.api.components.buildClassType
import org.jetbrains.kotlin.analysis.api.components.expandedSymbol
import org.jetbrains.kotlin.analysis.api.components.isMarkedNullable
import org.jetbrains.kotlin.analysis.api.components.isNothingType
import org.jetbrains.kotlin.analysis.api.components.isSubClassOf
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.components.isUnitType
import org.jetbrains.kotlin.analysis.api.components.withNullability
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.analysis.api.types.KaTypeNullability
import org.jetbrains.kotlin.idea.codeinsight.utils.isEnum
import org.jetbrains.kotlin.idea.completion.KeywordLookupObject
import org.jetbrains.kotlin.idea.completion.impl.k2.lookups.factories.NamedArgumentLookupObject
@@ -27,7 +34,7 @@ internal object ExpectedTypeWeigher {
element.matchesExpectedType ?: MatchesExpectedType.NON_TYPABLE
}
context(KaSession)
context(_: KaSession)
fun addWeight(context: WeighingContext, lookupElement: LookupElement, symbol: KaSymbol?) {
val expectedType = context.expectedType
@@ -36,7 +43,7 @@ internal object ExpectedTypeWeigher {
lookupElement.`object` is NamedArgumentLookupObject -> MatchesExpectedType.MATCHES
lookupElement.`object` is KeywordLookupObject && expectedType != null -> {
val actualType = when (lookupElement.lookupString) {
KtTokens.NULL_KEYWORD.value -> buildClassType(DefaultTypeClassIds.NOTHING).withNullability(KaTypeNullability.NULLABLE)
KtTokens.NULL_KEYWORD.value -> buildClassType(DefaultTypeClassIds.NOTHING).withNullability(true)
KtTokens.TRUE_KEYWORD.value,
KtTokens.FALSE_KEYWORD.value -> buildClassType(DefaultTypeClassIds.BOOLEAN)
@@ -51,7 +58,7 @@ internal object ExpectedTypeWeigher {
}
}
context(KaSession)
context(_: KaSession)
private fun matchesExpectedType(
symbol: KaSymbol,
expectedType: KaType,
@@ -84,13 +91,13 @@ internal object ExpectedTypeWeigher {
;
companion object {
context(KaSession)
context(_: KaSession)
fun matches(actualType: KaType, expectedType: KaType): MatchesExpectedType = when {
// We exclude the Nothing type because it would match everything, but we should not give it priority.
// The only exception where we should prefer is for the `null` constant, which will be of type `Nothing?`
actualType.isNothingType && !actualType.isMarkedNullable -> NOT_MATCHES
actualType.isSubtypeOf(expectedType) -> MATCHES
actualType.withNullability(KaTypeNullability.NON_NULLABLE).isSubtypeOf(expectedType) -> MATCHES_WITHOUT_NULLABILITY
actualType.withNullability(false).isSubtypeOf(expectedType) -> MATCHES_WITHOUT_NULLABILITY
else -> NOT_MATCHES
}
}
@@ -18,7 +18,7 @@ internal object K2SoftDeprecationWeigher {
private var LookupElement.isSoftDeprecated: Boolean
by NotNullableUserDataProperty(Key("KOTLIN_SOFT_DEPRECATED"), false)
context(KaSession)
context(_: KaSession)
fun addWeight(
lookupElement: LookupElement,
symbol: KaCallableSymbol,
@@ -40,7 +40,7 @@ internal object K2SoftDeprecationWeigher {
* Lower soft-deprecated `Enum.values()` method in completion.
* See [KT-22298](https://youtrack.jetbrains.com/issue/KTIJ-22298/Soft-deprecate-Enumvalues-for-Kotlin-callers).
*/
context(KaSession)
context(_: KaSession)
private fun isEnumValuesSoftDeprecatedMethod(
symbol: KaCallableSymbol,
languageVersionSettings: LanguageVersionSettings,
@@ -45,7 +45,7 @@ internal object KindWeigher {
private var LookupElement.isSymbolToSkip: Boolean by NotNullableUserDataProperty(Key("KOTLIN_KIND_WEIGHER_IS_SYMBOL_TO_SKIP"), false)
context(KaSession)
context(_: KaSession)
fun addWeight(lookupElement: LookupElement, symbol: KaSymbol?, context: WeighingContext) {
lookupElement.isSymbolToSkip = symbol in context.symbolsToSkip
lookupElement.isEnumEntry = symbol is KaEnumEntrySymbol
@@ -25,7 +25,7 @@ internal object NotImportedWeigher {
NOT_TO_BE_USED_IN_KOTLIN
}
context(KaSession)
context(_: KaSession)
fun addWeight(context: WeighingContext, element: LookupElement, symbol: KaSymbol, availableWithoutImport: Boolean) {
if (availableWithoutImport) return
val fqName = when (symbol) {
@@ -16,7 +16,7 @@ internal object PreferAbstractForOverrideWeigher {
IMPLEMENTED,
}
context(KaSession)
context(_: KaSession)
fun addWeight(element: OverridesCompletionLookupElementDecorator) {
element.overrideType = if (element.isImplement) Weight.NOT_IMPLEMENTED else Weight.IMPLEMENTED
}
@@ -36,7 +36,7 @@ internal object PreferContextualCallablesWeigher {
* Marks [symbol] as contextual if [symbol] or one of its overridden symbols is equal to or overridden by
* one of the callables containing current position.
*/
context(KaSession)
context(_: KaSession)
fun addWeight(lookupElement: LookupElement, symbol: KaCallableSymbol, contextualSymbolsCache: WeighingContext.ContextualSymbolsCache) {
if (symbol !is KaNamedSymbol || symbol.name !in contextualSymbolsCache) return
@@ -15,7 +15,7 @@ internal object PreferFewerParametersWeigher {
private var LookupElement.parametersCount: Int
by NotNullableUserDataProperty(Key("KOTLIN_PREFER_FEWER_PARAMETERS_WEIGHER"), 0)
context(KaSession)
context(_: KaSession)
fun addWeight(lookupElement: LookupElement, symbol: KaCallableSymbol) {
lookupElement.parametersCount = (symbol as? KaFunctionSymbol)?.valueParameters?.size ?: 0
}
@@ -15,7 +15,7 @@ internal object PreferGetSetMethodsToPropertyWeigher {
const val WEIGHER_ID = "kotlin.preferGetSetMethodsToProperty"
private var LookupElement.propertyName by UserDataProperty(Key<Name>("KOTLIN_PROPERTY_NAME"))
context(KaSession)
context(_: KaSession)
fun addWeight(lookupElement: LookupElement, symbol: KaSymbol) {
lookupElement.propertyName = (symbol as? KaPropertySymbol)?.name
}
@@ -5,6 +5,10 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupElementWeigher
import com.intellij.openapi.util.Key
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.defaultType
import org.jetbrains.kotlin.analysis.api.components.isNothingType
import org.jetbrains.kotlin.analysis.api.components.isSubtypeOf
import org.jetbrains.kotlin.analysis.api.components.semanticallyEquals
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
import org.jetbrains.kotlin.idea.completion.weighers.WeighingContext
@@ -19,7 +23,7 @@ internal object PreferredSubtypeWeigher {
UNRELATED
}
context(KaSession)
context(_: KaSession)
fun addWeight(context: WeighingContext, lookupElement: LookupElement, symbol: KaSymbol) {
val preferredSubtype = context.preferredSubtype ?: return
val actualClassType = (symbol as? KaClassLikeSymbol)?.defaultType ?: return
@@ -22,7 +22,7 @@ object VariableOrFunctionWeigher {
const val WEIGHER_ID = "kotlin.variableOrFunction"
private var LookupElement.variableOrFunction by UserDataProperty(Key<Weight>("KOTLIN_VARIABLE_OR_FUNCTION_WEIGHT"))
context(KaSession)
context(_: KaSession)
fun addWeight(lookupElement: LookupElement, symbol: KaSymbol) {
when (symbol) {
is KaVariableSymbol -> {
@@ -9,6 +9,14 @@ import com.intellij.psi.util.parentsOfType
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.KaImplicitReceiver
import org.jetbrains.kotlin.analysis.api.components.KaScopeContext
import org.jetbrains.kotlin.analysis.api.components.allOverriddenSymbols
import org.jetbrains.kotlin.analysis.api.components.expressionType
import org.jetbrains.kotlin.analysis.api.components.fakeOverrideOriginal
import org.jetbrains.kotlin.analysis.api.components.importingScopeContext
import org.jetbrains.kotlin.analysis.api.components.resolveToCall
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbol
import org.jetbrains.kotlin.analysis.api.components.scopeContext
import org.jetbrains.kotlin.analysis.api.components.withNullability
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeOwner
import org.jetbrains.kotlin.analysis.api.lifetime.KaLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
@@ -18,10 +26,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolModality
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.symbol
import org.jetbrains.kotlin.analysis.api.types.KaClassType
import org.jetbrains.kotlin.analysis.api.types.KaErrorType
import org.jetbrains.kotlin.analysis.api.types.KaType
import org.jetbrains.kotlin.analysis.api.types.KaTypeNullability
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.idea.base.analysis.api.utils.getDefaultImportPaths
@@ -63,8 +71,8 @@ internal class WeighingContext private constructor(
class ContextualSymbolsCache(private val symbolsContainingPosition: Map<Name, List<KaCallableSymbol>>) {
private val contextualOverriddenSymbols: MutableMap<Name, Set<KaCallableSymbol>> = mutableMapOf()
context(KaSession)
fun symbolIsPresentInContext(symbol: KaCallableSymbol): Boolean = withValidityAssertion {
context(session: KaSession)
fun symbolIsPresentInContext(symbol: KaCallableSymbol): Boolean = session.withValidityAssertion {
if (symbol !is KaNamedSymbol) return false
val symbols = symbolsContainingPosition[symbol.name].orEmpty()
@@ -77,8 +85,8 @@ internal class WeighingContext private constructor(
return symbol.fakeOverrideOriginal in overriddenSymbols
}
context(KaSession)
operator fun contains(name: Name): Boolean = withValidityAssertion { name in symbolsContainingPosition }
context(session: KaSession)
operator fun contains(name: Name): Boolean = session.withValidityAssertion { name in symbolsContainingPosition }
}
val scopeContext: KaScopeContext
@@ -111,7 +119,7 @@ internal class WeighingContext private constructor(
companion object {
context(KaSession)
context(session: KaSession)
fun create(
parameters: KotlinFirCompletionParameters,
elementInCompletionFile: PsiElement,
@@ -124,7 +132,7 @@ internal class WeighingContext private constructor(
val completionFile = parameters.completionFile
val defaultImportPaths = completionFile.getDefaultImportPaths(useSiteModule = parameters.useSiteModule).toSet()
return WeighingContext(
token = token,
token = session.token,
languageVersionSettings = parameters.languageVersionSettings,
positionInFakeCompletionFile = elementInCompletionFile,
myScopeContext = scopeContext ?: completionFile.importingScopeContext,
@@ -143,14 +151,14 @@ internal class WeighingContext private constructor(
}
// For `is` and `as` operations we want to prefer sealed inheritors
context(KaSession)
context(_: KaSession)
fun KtExpression.getPreferredSealedType(): KaClassType? {
val comparisonType = expressionType as? KaClassType ?: return null
if (comparisonType.symbol.modality != KaSymbolModality.SEALED) return null
return comparisonType
}
context(KaSession)
context(_: KaSession)
fun create(
parameters: KotlinFirCompletionParameters,
positionContext: KotlinNameReferencePositionContext,
@@ -212,7 +220,7 @@ internal class WeighingContext private constructor(
*
* TODO: It seems like a bug in the analysis API that this is required: KT-76480
*/
context(KaSession)
context(_: KaSession)
internal fun getAnnotationLiteralExpectedType(
nameExpression: KtElement,
): KaType? {
@@ -224,7 +232,7 @@ internal class WeighingContext private constructor(
return callArgument.symbol.returnType
}
context(KaSession)
context(_: KaSession)
internal fun getEqualityExpectedType(
nameExpression: KtElement,
): KaType? {
@@ -252,14 +260,14 @@ internal class WeighingContext private constructor(
return expression?.expressionType
?.takeUnless { it is KaErrorType }
?.withNullability(newNullability = KaTypeNullability.NULLABLE)
?.withNullability(true)
}
private fun Set<ImportPath>.hasImport(name: FqName): Boolean {
return ImportPath(name, false) in this || ImportPath(name.parent(), true) in this
}
context(KaSession)
context(_: KaSession)
private fun getContextualSymbolsCache(
elementInCompletionFile: PsiElement,
originalFile: KtFile,
@@ -281,7 +289,7 @@ internal class WeighingContext private constructor(
internal object Weighers {
context(KaSession)
context(_: KaSession)
fun <E : LookupElement> E.applyWeighs(
context: WeighingContext,
symbolWithOrigin: KtSymbolWithOrigin<*>? = null,
@@ -8,6 +8,7 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.asSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaConstructorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.renderer.render
internal object ClassLookupElementFactory {
context(KaSession)
context(_: KaSession)
fun createLookup(
symbol: KaClassLikeSymbol,
importingStrategy: ImportStrategy,
@@ -34,7 +35,7 @@ internal object ClassLookupElementFactory {
.let { withClassifierSymbolInfo(symbol, it) }
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createConstructorLookup(
containingSymbol: KaNamedClassSymbol,
@@ -18,6 +18,10 @@ import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.annotations.KaAnnotationValue
import org.jetbrains.kotlin.analysis.api.base.KaConstantValue
import org.jetbrains.kotlin.analysis.api.components.createSubstitutor
import org.jetbrains.kotlin.analysis.api.components.lowerBoundIfFlexible
import org.jetbrains.kotlin.analysis.api.components.samConstructor
import org.jetbrains.kotlin.analysis.api.components.upperBoundIfFlexible
import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaFunctionSignature
import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature
@@ -45,7 +49,7 @@ import org.jetbrains.kotlin.renderer.render
internal object FunctionLookupElementFactory {
context(KaSession)
context(_: KaSession)
fun createLookup(
shortName: Name,
signature: KaFunctionSignature<*>,
@@ -68,7 +72,7 @@ internal object FunctionLookupElementFactory {
return createLookupElement(signature, lookupObject, useFqNameInTailText = aliasName != null)
}
context(KaSession)
context(_: KaSession)
internal fun getTrailingFunctionSignature(
signature: KaFunctionSignature<*>,
checkDefaultValues: Boolean = true,
@@ -82,7 +86,7 @@ internal object FunctionLookupElementFactory {
?.takeUnless { it.symbol.isVararg }
}
context(KaSession)
context(_: KaSession)
internal fun createTrailingFunctionDescriptor(
trailingFunctionSignature: KaVariableSignature<KaValueParameterSymbol>,
): TrailingFunctionDescriptor? {
@@ -120,7 +124,7 @@ internal object FunctionLookupElementFactory {
}
@OptIn(KaExperimentalApi::class)
context(KaSession)
context(_: KaSession)
@ApiStatus.Experimental
fun createLookupWithTrailingLambda(
shortName: Name,
@@ -153,7 +157,7 @@ internal object FunctionLookupElementFactory {
}
}
context(KaSession)
context(_: KaSession)
private fun createLookupElement(
signature: KaFunctionSignature<*>,
lookupObject: FunctionCallLookupObject,
@@ -218,7 +222,7 @@ internal data class WithCallArgsInsertionHandler(
}
object FunctionInsertionHelper {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun functionCanBeCalledWithoutExplicitTypeArguments(
symbol: KaFunctionSymbol,
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.idea.completion.lookups.withClassifierSymbolInfo
internal object TypeParameterLookupElementFactory {
context(KaSession)
context(_: KaSession)
fun createLookup(symbol: KaTypeParameterSymbol): LookupElementBuilder {
return LookupElementBuilder.create(UniqueLookupObject(), symbol.name.asString())
.let { withClassifierSymbolInfo(symbol, it) }
@@ -10,6 +10,8 @@ import kotlinx.serialization.Polymorphic
import kotlinx.serialization.Serializable
import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.javaGetterName
import org.jetbrains.kotlin.analysis.api.components.javaSetterName
import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature
import org.jetbrains.kotlin.analysis.api.symbols.KaPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaSyntheticJavaPropertySymbol
@@ -28,7 +30,7 @@ import org.jetbrains.kotlin.renderer.render
internal object VariableLookupElementFactory {
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
fun createLookup(
signature: KaVariableSignature<*>,
@@ -47,7 +49,7 @@ internal object VariableLookupElementFactory {
return withCallableSignatureInfo(signature, builder)
}
context(KaSession)
context(_: KaSession)
private fun createLookupElementBuilder(
options: CallableInsertionOptions,
signature: KaVariableSignature<*>,
@@ -92,7 +94,7 @@ internal object VariableLookupElementFactory {
}
}
context(KaSession)
context(_: KaSession)
@OptIn(KaExperimentalApi::class)
private fun markIfSyntheticJavaProperty(
lookupElementBuilder: LookupElementBuilder,
@@ -8,7 +8,7 @@ create_kotlinc_options(
"com.intellij.openapi.util.IntellijInternalApi",
"org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction",
],
x_context_receivers = True
x_context_parameters = True
)
jvm_library(
@@ -4,7 +4,7 @@
<facet type="kotlin-language" name="Kotlin">
<configuration version="5" platform="JVM 17" allPlatforms="JVM [17]" useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-Xjvm-default=all -opt-in=com.intellij.openapi.util.IntellijInternalApi -opt-in=org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction -Xcontext-receivers -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
<option name="additionalArguments" value="-Xjvm-default=all -opt-in=com.intellij.openapi.util.IntellijInternalApi -opt-in=org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction -Xcontext-parameters -XXLanguage:+AllowEagerSupertypeAccessibilityChecks" />
</compilerSettings>
<compilerArguments>
<stringArguments>
@@ -4,7 +4,9 @@ package org.jetbrains.kotlin.idea.completion.implCommon.keywords
import com.intellij.codeInsight.completion.CompletionParameters
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.KaContextParameterApi
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.components.resolveToSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KaNamedFunctionSymbol
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings
@@ -37,7 +39,7 @@ class BreakContinueKeywordHandler(keyword: KtKeywordToken) : CompletionKeywordHa
}
}
context(KaSession)
context(_: KaSession)
fun createLookups(expression: KtExpression?): Collection<LookupElement> {
if (expression == null) return emptyList()
val supportsNonLocalBreakContinue =
@@ -55,7 +57,7 @@ class BreakContinueKeywordHandler(keyword: KtKeywordToken) : CompletionKeywordHa
}
.toList()
}
context(KaSession)
context(_: KaSession)
private fun canDoNonLocalJump(
body: KtDeclarationWithBody,
supportsNonLocalBreakContinue: Boolean,
@@ -63,7 +65,7 @@ class BreakContinueKeywordHandler(keyword: KtKeywordToken) : CompletionKeywordHa
body is KtFunctionLiteral &&
isInlineFunctionCall(body.findLabelAndCall().second)
context(KaSession)
context(_: KaSession)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
@@ -72,7 +74,8 @@ class BreakContinueKeywordHandler(keyword: KtKeywordToken) : CompletionKeywordHa
): Collection<LookupElement> = createLookups(expression)
}
context(KaSession)
@OptIn(KaContextParameterApi::class)
context(_: KaSession)
fun isInlineFunctionCall(call: KtCallExpression?): Boolean =
(call?.calleeExpression as? KtReferenceExpression)?.mainReference
?.resolveToSymbol()
@@ -13,7 +13,7 @@ abstract class CompletionKeywordHandler<CONTEXT>(
) {
object NO_CONTEXT
context(CONTEXT)
context(_: CONTEXT)
abstract fun createLookups(
parameters: CompletionParameters, // todo replace with KotlinFirCompletionParameters eventually
expression: KtExpression?,
@@ -31,13 +31,13 @@ inline fun <CONTEXT> completionKeywordHandler(
project: Project
) -> Collection<LookupElement>
) = object : CompletionKeywordHandler<CONTEXT>(keyword) {
context(CONTEXT)
context(_: CONTEXT)
override fun createLookups(
parameters: CompletionParameters,
expression: KtExpression?,
lookup: LookupElement,
project: Project
): Collection<LookupElement> = create(this@CONTEXT, parameters, expression, lookup, project)
): Collection<LookupElement> = create(contextOf<CONTEXT>(), parameters, expression, lookup, project)
}
/**