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.patterns.PsiJavaPatterns
|
||||||
import com.intellij.util.ProcessingContext
|
import com.intellij.util.ProcessingContext
|
||||||
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
|
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.completion.weighers.Weighers
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
|
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.originalKtFile
|
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.symbols.markers.KtSymbolWithVisibility
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
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.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
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
|
fun isApplicable(symbol: KtCallableSymbol): Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun interface CompletionVisibilityChecker {
|
internal fun interface CompletionVisibilityChecker {
|
||||||
fun isVisible(symbol: KtSymbolWithVisibility): Boolean
|
fun isVisible(symbol: KtSymbolWithVisibility): Boolean
|
||||||
|
|
||||||
fun isVisible(symbol: KtCallableSymbol): Boolean {
|
fun isVisible(symbol: KtCallableSymbol): Boolean {
|
||||||
@@ -133,35 +133,39 @@ private class KotlinCommonCompletionProvider(
|
|||||||
with(Weighers) { applyWeighsToLookupElement(lookupElement, symbol, expectedType) }
|
with(Weighers) { applyWeighsToLookupElement(lookupElement, symbol, expectedType) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recordOriginalFile(completionParameters: CompletionParameters) {
|
private fun recordOriginalFile(basicCompletionContext: FirBasicCompletionContext) {
|
||||||
val originalFile = completionParameters.originalFile as? KtFile ?: return
|
val originalFile = basicCompletionContext.originalKtFile
|
||||||
val fakeFile = completionParameters.position.containingFile as? KtFile ?: return
|
val fakeFile = basicCompletionContext.fakeKtFile
|
||||||
fakeFile.originalKtFile = originalFile
|
fakeFile.originalKtFile = originalFile
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(InvalidWayOfUsingAnalysisSession::class)
|
@OptIn(InvalidWayOfUsingAnalysisSession::class)
|
||||||
fun addCompletions(parameters: CompletionParameters, result: CompletionResultSet) {
|
fun addCompletions(parameters: CompletionParameters, result: CompletionResultSet) {
|
||||||
val originalFile = parameters.originalFile as? KtFile ?: return
|
val basicContext = FirBasicCompletionContext.createFromParameters(parameters, result) ?: return
|
||||||
val isJvmModule = TargetPlatformDetector.getPlatform(originalFile).isJvm()
|
recordOriginalFile(basicContext)
|
||||||
val project = originalFile.project
|
|
||||||
|
|
||||||
recordOriginalFile(parameters)
|
FirKeywordCompletion.completeKeywords(
|
||||||
|
result,
|
||||||
FirKeywordCompletion.completeKeywords(result, parameters, parameters.position, prefixMatcher, project, isJvmModule = isJvmModule)
|
parameters,
|
||||||
|
parameters.position,
|
||||||
|
prefixMatcher,
|
||||||
|
basicContext.project,
|
||||||
|
isJvmModule = basicContext.targetPlatform.isJvm()
|
||||||
|
)
|
||||||
|
|
||||||
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
|
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
|
||||||
val nameExpression = reference.expression.takeIf { it !is KtLabelReferenceExpression } ?: return
|
val nameExpression = reference.expression.takeIf { it !is KtLabelReferenceExpression } ?: return
|
||||||
|
|
||||||
val explicitReceiver = nameExpression.getReceiverExpression()
|
val explicitReceiver = nameExpression.getReceiverExpression()
|
||||||
|
|
||||||
analyseInFakeAnalysisSession(originalFile, nameExpression) {
|
analyseInFakeAnalysisSession(basicContext.originalKtFile, nameExpression) {
|
||||||
val fileSymbol = originalFile.getFileSymbol()
|
val fileSymbol = basicContext.originalKtFile.getFileSymbol()
|
||||||
val expectedType = nameExpression.getExpectedType()
|
val expectedType = nameExpression.getExpectedType()
|
||||||
|
|
||||||
val scopesContext = originalFile.getScopeContextForPosition(nameExpression)
|
val scopesContext = basicContext.originalKtFile.getScopeContextForPosition(nameExpression)
|
||||||
|
|
||||||
val extensionChecker = ExtensionApplicabilityChecker {
|
val extensionChecker = ExtensionApplicabilityChecker {
|
||||||
it.checkExtensionIsSuitable(originalFile, nameExpression, explicitReceiver)
|
it.checkExtensionIsSuitable(basicContext.originalKtFile, nameExpression, explicitReceiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
val visibilityChecker = CompletionVisibilityChecker {
|
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