FIR IDE: encapsulate basic completion parameters into class
This commit is contained in:
committed by
TeamCityServer
parent
a08c267c37
commit
8eff865277
+20
-16
@@ -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 {
|
||||
|
||||
+32
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user