FIR IDE: encapsulate basic completion parameters into class

This commit is contained in:
Ilya Kirillov
2021-05-06 15:07:25 +02:00
committed by TeamCityServer
parent a08c267c37
commit 8eff865277
2 changed files with 52 additions and 16 deletions
@@ -11,6 +11,7 @@ import com.intellij.patterns.PlatformPatterns
import com.intellij.patterns.PsiJavaPatterns
import com.intellij.util.ProcessingContext
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.completion.context.FirBasicCompletionContext
import org.jetbrains.kotlin.idea.completion.weighers.Weighers
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
import org.jetbrains.kotlin.idea.fir.low.level.api.util.originalKtFile
@@ -26,7 +27,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.platform.jvm.isJvm
@@ -82,11 +82,11 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
}
}
private fun interface ExtensionApplicabilityChecker {
internal fun interface ExtensionApplicabilityChecker {
fun isApplicable(symbol: KtCallableSymbol): Boolean
}
private fun interface CompletionVisibilityChecker {
internal fun interface CompletionVisibilityChecker {
fun isVisible(symbol: KtSymbolWithVisibility): Boolean
fun isVisible(symbol: KtCallableSymbol): Boolean {
@@ -133,35 +133,39 @@ private class KotlinCommonCompletionProvider(
with(Weighers) { applyWeighsToLookupElement(lookupElement, symbol, expectedType) }
}
private fun recordOriginalFile(completionParameters: CompletionParameters) {
val originalFile = completionParameters.originalFile as? KtFile ?: return
val fakeFile = completionParameters.position.containingFile as? KtFile ?: return
private fun recordOriginalFile(basicCompletionContext: FirBasicCompletionContext) {
val originalFile = basicCompletionContext.originalKtFile
val fakeFile = basicCompletionContext.fakeKtFile
fakeFile.originalKtFile = originalFile
}
@OptIn(InvalidWayOfUsingAnalysisSession::class)
fun addCompletions(parameters: CompletionParameters, result: CompletionResultSet) {
val originalFile = parameters.originalFile as? KtFile ?: return
val isJvmModule = TargetPlatformDetector.getPlatform(originalFile).isJvm()
val project = originalFile.project
val basicContext = FirBasicCompletionContext.createFromParameters(parameters, result) ?: return
recordOriginalFile(basicContext)
recordOriginalFile(parameters)
FirKeywordCompletion.completeKeywords(result, parameters, parameters.position, prefixMatcher, project, isJvmModule = isJvmModule)
FirKeywordCompletion.completeKeywords(
result,
parameters,
parameters.position,
prefixMatcher,
basicContext.project,
isJvmModule = basicContext.targetPlatform.isJvm()
)
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
val nameExpression = reference.expression.takeIf { it !is KtLabelReferenceExpression } ?: return
val explicitReceiver = nameExpression.getReceiverExpression()
analyseInFakeAnalysisSession(originalFile, nameExpression) {
val fileSymbol = originalFile.getFileSymbol()
analyseInFakeAnalysisSession(basicContext.originalKtFile, nameExpression) {
val fileSymbol = basicContext.originalKtFile.getFileSymbol()
val expectedType = nameExpression.getExpectedType()
val scopesContext = originalFile.getScopeContextForPosition(nameExpression)
val scopesContext = basicContext.originalKtFile.getScopeContextForPosition(nameExpression)
val extensionChecker = ExtensionApplicabilityChecker {
it.checkExtensionIsSuitable(originalFile, nameExpression, explicitReceiver)
it.checkExtensionIsSuitable(basicContext.originalKtFile, nameExpression, explicitReceiver)
}
val visibilityChecker = CompletionVisibilityChecker {
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.completion.context
import com.intellij.codeInsight.completion.CompletionParameters
import com.intellij.codeInsight.completion.CompletionResultSet
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.KtFile
internal class FirBasicCompletionContext(
val parameters: CompletionParameters,
val result: CompletionResultSet,
val originalKtFile: KtFile,
val fakeKtFile: KtFile,
val project: Project,
val targetPlatform: TargetPlatform,
) {
companion object {
fun createFromParameters(parameters: CompletionParameters, result: CompletionResultSet): FirBasicCompletionContext? {
val originalKtFile = parameters.originalFile as? KtFile ?: return null
val fakeKtFile = parameters.position.containingFile as? KtFile ?: return null
val targetPlatform = TargetPlatformDetector.getPlatform(originalKtFile)
val project = originalKtFile.project
return FirBasicCompletionContext(parameters, result, originalKtFile, fakeKtFile, project, targetPlatform)
}
}
}