diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt index cb28106575e..bc785681379 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt @@ -67,35 +67,6 @@ private object KotlinFirCompletionProvider : CompletionProvider this - elementType == KtTokens.EQ && parent is KtNamedFunction -> this - else -> null - } - } - - val originalPosition = parameters.originalPosition - if (originalPosition is PsiWhiteSpace) { - originalPosition.prevSibling?.getPositionForExpressionFunctionBody()?.let { - /* We are in expression function body - * fun x() = - */ - return it - } - } - if (originalPosition != null) return originalPosition - if (parameters.offset == originalFile.textLength) { - /* - * We are in the end of the file possibly in function with expression body - * fun x() = - */ - originalFile.findElementAt(parameters.offset - 1)?.getPositionForExpressionFunctionBody()?.let { return it } - } - error("Can not find original position") - } - @OptIn(InvalidWayOfUsingAnalysisSession::class) fun addCompletions(parameters: CompletionParameters, result: CompletionResultSet) { val originalFile = parameters.originalFile as? KtFile ?: return @@ -105,10 +76,8 @@ private object KotlinAvailableScopesCompletionProvider { val possibleReceiver = nameExpression.getQualifiedExpressionForSelector()?.receiverExpression - val originalPosition = getOriginalPosition(parameters, originalFile) - with(getAnalysisSessionFor(originalFile).createContextDependentCopy()) { - val (implicitScopes, implicitReceivers) = originalFile.getScopeContextForPosition(originalPosition, nameExpression) + val (implicitScopes, implicitReceivers) = originalFile.getScopeContextForPosition(nameExpression) val typeOfPossibleReceiver = possibleReceiver?.getKtType() val possibleReceiverScope = typeOfPossibleReceiver?.getTypeScope() diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt index 1256bf41d3c..ed66efd4eca 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt @@ -69,8 +69,8 @@ abstract class KtAnalysisSession(override val token: ValidityToken) : ValidityTo fun KtType.getTypeScope(): KtScope? = scopeProvider.getTypeScope(this) - fun KtFile.getScopeContextForPosition(originalPosition: PsiElement, positionInFakeFile: KtElement): KtScopeContext = - scopeProvider.getScopeContextForPosition(this, originalPosition, positionInFakeFile) + fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext = + scopeProvider.getScopeContextForPosition(this, positionInFakeFile) fun KtDeclaration.getSymbol(): KtSymbol = symbolProvider.getSymbol(this) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt index 28a7e29db6b..683d78149a2 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt @@ -23,7 +23,6 @@ abstract class KtScopeProvider : KtAnalysisSessionComponent() { abstract fun getScopeContextForPosition( originalFile: KtFile, - originalPosition: PsiElement, positionInFakeFile: KtElement ): KtScopeContext } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index 348753b783e..c324baa49e8 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -39,8 +39,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymb import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.* -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.types.KtType @@ -111,14 +109,13 @@ internal class KtFirScopeProvider( override fun getScopeContextForPosition( originalFile: KtFile, - originalPosition: PsiElement, positionInFakeFile: KtElement ): KtScopeContext = withValidityAssertion { val originalFirFile = originalFile.getOrBuildFirOfType(firResolveState) val fakeEnclosingFunction = positionInFakeFile.getNonStrictParentOfType() ?: error("Cannot find enclosing function for ${positionInFakeFile.getElementTextInContext()}") - val originalEnclosingFunction = originalPosition.getNonStrictParentOfType() - ?: error("Cannot find original enclosing function for $originalPosition") + val originalEnclosingFunction = originalFile.findFunctionDeclarationAt(fakeEnclosingFunction.textOffset) + ?: error("Cannot find original function matching to ${fakeEnclosingFunction.getElementTextInContext()} in $originalFile") val completionContext = LowLevelFirApiFacade.buildCompletionContextForFunction( originalFirFile, @@ -146,6 +143,11 @@ internal class KtFirScopeProvider( KtScopeContext(getCompositeScope(allKtScopes), implicitReceiversTypes) } + private fun KtFile.findFunctionDeclarationAt(offset: Int): KtNamedFunction? = + findElementAt(offset) + ?.getNonStrictParentOfType() + ?.takeIf { it.textOffset == offset } + private fun convertToKtScope(firScope: FirScope): KtScope { firScopeStorage.register(firScope) return when (firScope) {