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 {
|
fun foo(): Boolean {
|
||||||
ret<caret>
|
ret<caret>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_COMPARISON
|
||||||
fun foo(): String? {
|
fun foo(): String? {
|
||||||
ret<caret>
|
ret<caret>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_COMPARISON
|
||||||
fun foo(): Boolean? {
|
fun foo(): Boolean? {
|
||||||
ret<caret>
|
ret<caret>
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-11
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
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)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
override fun KtAnalysisSession.createLookups(
|
override fun KtAnalysisSession.createLookups(
|
||||||
parameters: CompletionParameters,
|
parameters: CompletionParameters,
|
||||||
@@ -61,31 +61,35 @@ internal object ReturnKeywordHandler: CompletionKeywordHandler<KtAnalysisSession
|
|||||||
val isUnit = returnType.isUnit
|
val isUnit = returnType.isUnit
|
||||||
result.add(createKeywordElementWithSpace("return", tail = label?.labelNameToTail().orEmpty(), addSpaceAfter = !isUnit))
|
result.add(createKeywordElementWithSpace("return", tail = label?.labelNameToTail().orEmpty(), addSpaceAfter = !isUnit))
|
||||||
getExpressionsToReturnByType(returnType).mapTo(result) { returnTarget ->
|
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)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
private fun KtAnalysisSession.getExpressionsToReturnByType(returnType: KtType): List<String> = buildList {
|
private fun KtAnalysisSession.getExpressionsToReturnByType(returnType: KtType): List<ExpressionTarget> = buildList {
|
||||||
if (returnType.canBeNull) {
|
if (returnType.canBeNull) {
|
||||||
add("null")
|
add(ExpressionTarget("null", addToLookupElementTail = false))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun emptyListShouldBeSuggested(): Boolean =
|
fun emptyListShouldBeSuggested(): Boolean =
|
||||||
returnType.isClassTypeWithClassId(StandardClassIds.Collection)
|
returnType.isClassTypeWithClassId(StandardClassIds.Collection)
|
||||||
|| returnType.isClassTypeWithClassId(StandardClassIds.List)
|
|| returnType.isClassTypeWithClassId(StandardClassIds.List)
|
||||||
|| returnType.isClassTypeWithClassId(StandardClassIds.Iterable)
|
|| returnType.isClassTypeWithClassId(StandardClassIds.Iterable)
|
||||||
|
|
||||||
when {
|
when {
|
||||||
returnType.isClassTypeWithClassId(StandardClassIds.Boolean) -> {
|
returnType.isClassTypeWithClassId(StandardClassIds.Boolean) -> {
|
||||||
add("true")
|
add(ExpressionTarget("true", addToLookupElementTail = false))
|
||||||
add("false")
|
add(ExpressionTarget("false", addToLookupElementTail = false))
|
||||||
}
|
}
|
||||||
emptyListShouldBeSuggested() -> {
|
emptyListShouldBeSuggested() -> {
|
||||||
add("emptyList()")
|
add(ExpressionTarget("emptyList()", addToLookupElementTail = true))
|
||||||
}
|
}
|
||||||
returnType.isClassTypeWithClassId(StandardClassIds.Set) -> {
|
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
|
val callee = call?.calleeExpression as? KtReferenceExpression ?: return false
|
||||||
return (callee.mainReference.resolveToSymbol() as? KtFunctionSymbol)?.isInline == true
|
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