FIR IDE: make FirKeywordCompletion to be a completion contributor
This commit is contained in:
committed by
TeamCityServer
parent
ca1fd185dc
commit
8cfa85df6b
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
import com.intellij.codeInsight.completion.CompletionParameters
|
|
||||||
import com.intellij.codeInsight.completion.CompletionResultSet
|
|
||||||
import com.intellij.codeInsight.completion.PrefixMatcher
|
|
||||||
import com.intellij.openapi.module.Module
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
|
||||||
import org.jetbrains.kotlin.psi.KtExpressionWithLabel
|
|
||||||
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
|
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
|
||||||
|
|
||||||
object FirKeywordCompletion {
|
|
||||||
private val keywordCompletion = KeywordCompletion(object : KeywordCompletion.LanguageVersionSettingProvider {
|
|
||||||
override fun getLanguageVersionSetting(element: PsiElement) = LanguageVersionSettingsImpl.DEFAULT // TODO
|
|
||||||
override fun getLanguageVersionSetting(module: Module) = LanguageVersionSettingsImpl.DEFAULT // TODO
|
|
||||||
})
|
|
||||||
|
|
||||||
fun completeKeywords(
|
|
||||||
result: CompletionResultSet,
|
|
||||||
parameters: CompletionParameters,
|
|
||||||
position: PsiElement,
|
|
||||||
prefixMatcher: PrefixMatcher,
|
|
||||||
project: Project,
|
|
||||||
isJvmModule: Boolean
|
|
||||||
) {
|
|
||||||
val reference = (position.parent as? KtSimpleNameExpression)?.mainReference
|
|
||||||
val expression = if (reference != null) { // logic is copy-n-pasted from CompletionSession.expression
|
|
||||||
if (reference.expression is KtLabelReferenceExpression) {
|
|
||||||
reference.expression.parent.parent as? KtExpressionWithLabel
|
|
||||||
} else {
|
|
||||||
reference.expression
|
|
||||||
}
|
|
||||||
} else null
|
|
||||||
keywordCompletion.complete(expression ?: position, prefixMatcher, isJvmModule) { lookupElement ->
|
|
||||||
val keyword = lookupElement.lookupString
|
|
||||||
val completionKeywordHandler = DefaultCompletionKeywordHandlers.defaultHandlers.getHandlerForKeyword(keyword)
|
|
||||||
val lookups = completionKeywordHandler
|
|
||||||
?.createLookups(parameters, expression, lookupElement, project)
|
|
||||||
?: listOf(lookupElement)
|
|
||||||
result.addAllElements(lookups)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+18
-19
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.idea.completion.context.FirNameReferencePositionCont
|
|||||||
import org.jetbrains.kotlin.idea.completion.context.FirPositionCompletionContextDetector
|
import org.jetbrains.kotlin.idea.completion.context.FirPositionCompletionContextDetector
|
||||||
import org.jetbrains.kotlin.idea.completion.context.FirUnknownPositionContext
|
import org.jetbrains.kotlin.idea.completion.context.FirUnknownPositionContext
|
||||||
import org.jetbrains.kotlin.idea.completion.contributors.FirCompletionContributorBase
|
import org.jetbrains.kotlin.idea.completion.contributors.FirCompletionContributorBase
|
||||||
|
import org.jetbrains.kotlin.idea.completion.contributors.FirKeywordCompletionContributor
|
||||||
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
|
||||||
@@ -53,25 +54,23 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
|
|||||||
recordOriginalFile(basicContext)
|
recordOriginalFile(basicContext)
|
||||||
val positionContext = FirPositionCompletionContextDetector.detect(basicContext)
|
val positionContext = FirPositionCompletionContextDetector.detect(basicContext)
|
||||||
|
|
||||||
FirKeywordCompletion.completeKeywords(
|
val keywordContributor = FirKeywordCompletionContributor(basicContext)
|
||||||
result,
|
|
||||||
parameters,
|
|
||||||
parameters.position,
|
|
||||||
resultSet.prefixMatcher,
|
|
||||||
basicContext.project,
|
|
||||||
isJvmModule = basicContext.targetPlatform.isJvm()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
if (positionContext is FirUnknownPositionContext) {
|
||||||
FirPositionCompletionContextDetector.analyseInContext(basicContext, positionContext) {
|
// TODO unify when LL API will be able to handle more context for completion
|
||||||
when (positionContext) {
|
keywordContributor.completeKeywordsWithoutAnalysisSessionContext(positionContext.position, expression = null)
|
||||||
is FirNameReferencePositionContext -> with(
|
} else {
|
||||||
KotlinWithNameReferenceCompletionProvider(basicContext, indexHelper)
|
FirPositionCompletionContextDetector.analyseInContext(basicContext, positionContext) {
|
||||||
) {
|
with(keywordContributor) { completeKeywords(positionContext) }
|
||||||
addCompletions(positionContext)
|
when (positionContext) {
|
||||||
}
|
is FirNameReferencePositionContext -> with(
|
||||||
is FirUnknownPositionContext -> {
|
KotlinWithNameReferenceCompletionProvider(basicContext, indexHelper)
|
||||||
// TODO
|
) {
|
||||||
|
addCompletions(positionContext)
|
||||||
|
}
|
||||||
|
is FirUnknownPositionContext -> {
|
||||||
|
// TODO remove when hack when LL API will be able to handle more context for completion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,7 +137,7 @@ internal fun interface CompletionVisibilityChecker {
|
|||||||
private class KotlinWithNameReferenceCompletionProvider(
|
private class KotlinWithNameReferenceCompletionProvider(
|
||||||
basicContext: FirBasicCompletionContext,
|
basicContext: FirBasicCompletionContext,
|
||||||
private val indexHelper: IndexHelper
|
private val indexHelper: IndexHelper
|
||||||
): FirCompletionContributorBase(basicContext) {
|
) : FirCompletionContributorBase(basicContext) {
|
||||||
private val lookupElementFactory = KotlinFirLookupElementFactory()
|
private val lookupElementFactory = KotlinFirLookupElementFactory()
|
||||||
private val typeNamesProvider = TypeNamesProvider(indexHelper)
|
private val typeNamesProvider = TypeNamesProvider(indexHelper)
|
||||||
|
|
||||||
|
|||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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.contributors
|
||||||
|
|
||||||
|
import com.intellij.openapi.module.Module
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
|
import org.jetbrains.kotlin.idea.completion.DefaultCompletionKeywordHandlers
|
||||||
|
import org.jetbrains.kotlin.idea.completion.KeywordCompletion
|
||||||
|
import org.jetbrains.kotlin.idea.completion.context.FirBasicCompletionContext
|
||||||
|
import org.jetbrains.kotlin.idea.completion.context.FirNameReferencePositionContext
|
||||||
|
import org.jetbrains.kotlin.idea.completion.context.FirPositionCompletionContext
|
||||||
|
import org.jetbrains.kotlin.idea.completion.context.FirUnknownPositionContext
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||||
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtExpressionWithLabel
|
||||||
|
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
|
||||||
|
|
||||||
|
internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionContext) : FirCompletionContributorBase(basicContext) {
|
||||||
|
private val keywordCompletion = KeywordCompletion(object : KeywordCompletion.LanguageVersionSettingProvider {
|
||||||
|
override fun getLanguageVersionSetting(element: PsiElement) = LanguageVersionSettingsImpl.DEFAULT // TODO
|
||||||
|
override fun getLanguageVersionSetting(module: Module) = LanguageVersionSettingsImpl.DEFAULT // TODO
|
||||||
|
})
|
||||||
|
|
||||||
|
fun KtAnalysisSession.completeKeywords(
|
||||||
|
positionContext: FirPositionCompletionContext
|
||||||
|
) {
|
||||||
|
val expression = when (positionContext) {
|
||||||
|
is FirNameReferencePositionContext -> {
|
||||||
|
val reference = positionContext.reference
|
||||||
|
when (reference.expression) {
|
||||||
|
is KtLabelReferenceExpression -> reference.expression.parent.parent as? KtExpressionWithLabel
|
||||||
|
else -> reference.expression
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is FirUnknownPositionContext -> null
|
||||||
|
}
|
||||||
|
completeKeywordsWithoutAnalysisSessionContext(expression ?: positionContext.position, expression)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun completeKeywordsWithoutAnalysisSessionContext(position: PsiElement, expression: KtExpression?) {
|
||||||
|
keywordCompletion.complete(position, prefixMatcher, targetPlatform.isJvm()) { lookupElement ->
|
||||||
|
val keyword = lookupElement.lookupString
|
||||||
|
val completionKeywordHandler = DefaultCompletionKeywordHandlers.defaultHandlers.getHandlerForKeyword(keyword)
|
||||||
|
val lookups = completionKeywordHandler
|
||||||
|
?.createLookups(parameters, expression, lookupElement, project)
|
||||||
|
?: listOf(lookupElement)
|
||||||
|
result.addAllElements(lookups)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user