[kotlin] k2: introduce KotlinSimpleNameReferencePositionContext

KTIJ-27228

GitOrigin-RevId: 33eeffe6d9239e759b4368173a61c87a1fabfeb6
This commit is contained in:
aleksandrina-streltsova
2023-08-31 17:25:17 +03:00
committed by intellij-monorepo-bot
parent 7f730f5884
commit addcd994a4
4 changed files with 32 additions and 23 deletions

View File

@@ -10,9 +10,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.idea.base.utils.fqname.isJavaClassNotToBeUsedInKotlin
import org.jetbrains.kotlin.idea.completion.context.FirBasicCompletionContext
import org.jetbrains.kotlin.idea.util.positionContext.KDocNameReferencePositionContext
import org.jetbrains.kotlin.idea.util.positionContext.KotlinNameReferencePositionContext
import org.jetbrains.kotlin.idea.util.positionContext.KotlinRawPositionContext
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.idea.util.positionContext.KotlinSimpleNameReferencePositionContext
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue
internal fun interface CompletionVisibilityChecker {
@@ -51,7 +50,7 @@ internal fun interface CompletionVisibilityChecker {
return isVisible(
symbol,
basicContext.originalKtFile.getFileSymbol(),
(positionContext as? KotlinNameReferencePositionContext)?.explicitReceiver as? KtExpression,
(positionContext as? KotlinSimpleNameReferencePositionContext)?.explicitReceiver,
positionContext.position
)
}

View File

@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.completion.lookups.factories.FunctionInsertionH
import org.jetbrains.kotlin.idea.completion.weighers.WeighingContext
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.positionContext.KotlinNameReferencePositionContext
import org.jetbrains.kotlin.idea.util.positionContext.KotlinSimpleNameReferencePositionContext
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.*
@@ -122,10 +123,7 @@ internal open class FirCallableCompletionContributor(
val visibilityChecker = CompletionVisibilityChecker.create(basicContext, positionContext)
val scopesContext = originalKtFile.getScopeContextForPosition(nameExpression)
val expression = nameExpression
val receiver = explicitReceiver
val extensionChecker = if (expression is KtSimpleNameExpression && receiver is KtExpression?) {
val extensionChecker = if (positionContext is KotlinSimpleNameReferencePositionContext) {
object : ExtensionApplicabilityChecker {
/**
* Cached applicability results for callable extension symbols.
@@ -142,11 +140,13 @@ internal open class FirCallableCompletionContributor(
private val cache: MutableMap<KtCallableSymbol, KtExtensionApplicabilityResult> = mutableMapOf()
context(KtAnalysisSession)
override fun checkApplicability(symbol: KtCallableSymbol): KtExtensionApplicabilityResult =
cache.getOrPut(symbol) { symbol.checkExtensionIsSuitable(originalKtFile, expression, receiver) }
override fun checkApplicability(symbol: KtCallableSymbol): KtExtensionApplicabilityResult = cache.getOrPut(symbol) {
symbol.checkExtensionIsSuitable(originalKtFile, positionContext.nameExpression, positionContext.explicitReceiver)
}
}
} else null
val receiver = explicitReceiver
val weighingContextWithoutExpectedType = weighingContext.withoutExpectedType()
val callablesWithMetadata: Sequence<CallableWithMetadataForCompletion> = when {

View File

@@ -8,7 +8,6 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.base.projectStructure.languageVersionSettings
import org.jetbrains.kotlin.idea.completion.FirCompletionSessionParameters
import org.jetbrains.kotlin.util.match
import org.jetbrains.kotlin.idea.completion.KeywordCompletion
import org.jetbrains.kotlin.idea.completion.context.*
import org.jetbrains.kotlin.idea.completion.contributors.keywords.OverrideKeywordHandler
@@ -22,7 +21,6 @@ import org.jetbrains.kotlin.idea.completion.keywords.DefaultCompletionKeywordHan
import org.jetbrains.kotlin.idea.completion.keywords.createLookups
import org.jetbrains.kotlin.idea.completion.weighers.Weighers
import org.jetbrains.kotlin.idea.completion.weighers.WeighingContext
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
import org.jetbrains.kotlin.idea.util.positionContext.*
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.platform.jvm.isJvm
@@ -31,6 +29,7 @@ import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtExpressionWithLabel
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.util.match
internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionContext, priority: Int) :
FirCompletionContributorBase<KotlinRawPositionContext>(basicContext, priority) {
@@ -48,7 +47,7 @@ internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionC
sessionParameters: FirCompletionSessionParameters,
) {
val expression = when (positionContext) {
is KotlinNameReferencePositionContext -> (positionContext.reference as? KtSimpleNameReference)?.expression?.let {
is KotlinSimpleNameReferencePositionContext -> positionContext.reference.expression.let {
it.parentsWithSelf.match(KtLabelReferenceExpression::class, KtContainerNode::class, last = KtExpressionWithLabel::class)
?: it
}
@@ -58,6 +57,7 @@ internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionC
is KotlinValueParameterPositionContext,
is KotlinMemberDeclarationExpectedPositionContext,
is KDocNameReferencePositionContext,
is KotlinUnknownPositionContext -> null
}
completeWithResolve(expression ?: positionContext.position, expression, weighingContext)

View File

@@ -58,19 +58,25 @@ sealed class KotlinNameReferencePositionContext : KotlinRawPositionContext() {
abstract val explicitReceiver: KtElement?
}
sealed class KotlinSimpleNameReferencePositionContext : KotlinNameReferencePositionContext() {
abstract override val reference: KtSimpleNameReference
abstract override val nameExpression: KtSimpleNameExpression
abstract override val explicitReceiver: KtExpression?
}
class KotlinImportDirectivePositionContext(
override val position: PsiElement,
override val reference: KtSimpleNameReference,
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinPackageDirectivePositionContext(
override val position: PsiElement,
override val reference: KtSimpleNameReference,
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinTypeNameReferencePositionContext(
@@ -79,7 +85,7 @@ class KotlinTypeNameReferencePositionContext(
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
val typeReference: KtTypeReference?,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinAnnotationTypeNameReferencePositionContext(
override val position: PsiElement,
@@ -87,7 +93,7 @@ class KotlinAnnotationTypeNameReferencePositionContext(
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
val annotationEntry: KtAnnotationEntry,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
/**
* Example
@@ -105,7 +111,7 @@ class KotlinSuperTypeCallNameReferencePositionContext(
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
val superExpression: KtSuperExpression,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
/**
* Example
@@ -123,21 +129,21 @@ class KotlinSuperReceiverNameReferencePositionContext(
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?,
val superExpression: KtSuperExpression,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinExpressionNameReferencePositionContext(
override val position: PsiElement,
override val reference: KtSimpleNameReference,
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinInfixCallPositionContext(
override val position: PsiElement,
override val reference: KtSimpleNameReference,
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinWithSubjectEntryPositionContext(
@@ -147,14 +153,14 @@ class KotlinWithSubjectEntryPositionContext(
override val explicitReceiver: KtExpression?,
val subjectExpression: KtExpression,
val whenCondition: KtWhenCondition,
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
class KotlinCallableReferencePositionContext(
override val position: PsiElement,
override val reference: KtSimpleNameReference,
override val nameExpression: KtSimpleNameExpression,
override val explicitReceiver: KtExpression?
) : KotlinNameReferencePositionContext()
) : KotlinSimpleNameReferencePositionContext()
/**
* Position in class body, on which member declaration or class initializer is expected
@@ -175,7 +181,11 @@ class KotlinMemberDeclarationExpectedPositionContext(
val classBody: KtClassBody
) : KotlinRawPositionContext()
sealed class KDocNameReferencePositionContext : KotlinNameReferencePositionContext()
sealed class KDocNameReferencePositionContext : KotlinNameReferencePositionContext() {
abstract override val reference: KDocReference
abstract override val nameExpression: KDocName
abstract override val explicitReceiver: KDocName?
}
class KDocParameterNamePositionContext(
override val position: PsiElement,