FIR IDE: add return target to tail in keyword completion
The same do FE10 completion and we need it to have consistent tests
This commit is contained in:
committed by
TeamCityServer
parent
f8fc43f1e9
commit
47a596c214
@@ -1,3 +1,4 @@
|
||||
// FIR_COMPARISON
|
||||
fun foo(): Boolean {
|
||||
ret<caret>
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_COMPARISON
|
||||
fun foo(): String? {
|
||||
ret<caret>
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_COMPARISON
|
||||
fun foo(): Boolean? {
|
||||
ret<caret>
|
||||
}
|
||||
|
||||
+24
-11
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
|
||||
internal object ReturnKeywordHandler: CompletionKeywordHandler<KtAnalysisSession>(KtTokens.RETURN_KEYWORD) {
|
||||
internal object ReturnKeywordHandler : CompletionKeywordHandler<KtAnalysisSession>(KtTokens.RETURN_KEYWORD) {
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
override fun KtAnalysisSession.createLookups(
|
||||
parameters: CompletionParameters,
|
||||
@@ -61,31 +61,35 @@ internal object ReturnKeywordHandler: CompletionKeywordHandler<KtAnalysisSession
|
||||
val isUnit = returnType.isUnit
|
||||
result.add(createKeywordElementWithSpace("return", tail = label?.labelNameToTail().orEmpty(), addSpaceAfter = !isUnit))
|
||||
getExpressionsToReturnByType(returnType).mapTo(result) { returnTarget ->
|
||||
createKeywordElement("return", tail = "${label.labelNameToTail()} $returnTarget")
|
||||
if (label != null || returnTarget.addToLookupElementTail) {
|
||||
createKeywordElement("return", tail = "${label.labelNameToTail()} ${returnTarget.expressionText}")
|
||||
} else {
|
||||
createKeywordElement("return ${returnTarget.expressionText}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private fun KtAnalysisSession.getExpressionsToReturnByType(returnType: KtType): List<String> = buildList {
|
||||
private fun KtAnalysisSession.getExpressionsToReturnByType(returnType: KtType): List<ExpressionTarget> = buildList {
|
||||
if (returnType.canBeNull) {
|
||||
add("null")
|
||||
add(ExpressionTarget("null", addToLookupElementTail = false))
|
||||
}
|
||||
|
||||
fun emptyListShouldBeSuggested(): Boolean =
|
||||
returnType.isClassTypeWithClassId(StandardClassIds.Collection)
|
||||
|| returnType.isClassTypeWithClassId(StandardClassIds.List)
|
||||
|| returnType.isClassTypeWithClassId(StandardClassIds.Iterable)
|
||||
|| returnType.isClassTypeWithClassId(StandardClassIds.List)
|
||||
|| returnType.isClassTypeWithClassId(StandardClassIds.Iterable)
|
||||
|
||||
when {
|
||||
returnType.isClassTypeWithClassId(StandardClassIds.Boolean) -> {
|
||||
add("true")
|
||||
add("false")
|
||||
add(ExpressionTarget("true", addToLookupElementTail = false))
|
||||
add(ExpressionTarget("false", addToLookupElementTail = false))
|
||||
}
|
||||
emptyListShouldBeSuggested() -> {
|
||||
add("emptyList()")
|
||||
add(ExpressionTarget("emptyList()", addToLookupElementTail = true))
|
||||
}
|
||||
returnType.isClassTypeWithClassId(StandardClassIds.Set) -> {
|
||||
add("emptySet()")
|
||||
add(ExpressionTarget("emptySet()", addToLookupElementTail = true))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,4 +98,13 @@ internal object ReturnKeywordHandler: CompletionKeywordHandler<KtAnalysisSession
|
||||
val callee = call?.calleeExpression as? KtReferenceExpression ?: return false
|
||||
return (callee.mainReference.resolveToSymbol() as? KtFunctionSymbol)?.isInline == true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private data class ExpressionTarget(
|
||||
val expressionText: String,
|
||||
/**
|
||||
* FE10 completion sometimes add return target to LookupElement tails and sometimes not,
|
||||
* To ensure consistency (at least for tests) we need to do it to
|
||||
*/
|
||||
val addToLookupElementTail: Boolean
|
||||
)
|
||||
Reference in New Issue
Block a user