Extract getText/getFamilyName from ChangeCallableReturnTypeFix to use in FIR IDE

This commit is contained in:
Ilya Kirillov
2021-02-01 23:21:08 +01:00
parent 79baffb69d
commit 0551834164
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.idea.project.builtIns import org.jetbrains.kotlin.idea.project.builtIns
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -71,19 +72,10 @@ abstract class ChangeCallableReturnTypeFix(
open fun functionPresentation(): String? { open fun functionPresentation(): String? {
val element = element!! val element = element!!
val name = element.name if (element.name == null) return null
if (name != null) { val container = element.unsafeResolveToDescriptor().containingDeclaration as? ClassDescriptor
val container = element.unsafeResolveToDescriptor().containingDeclaration as? ClassDescriptor val containerName = container?.name?.takeUnless { it.isSpecial }
val containerName = container?.name?.takeUnless { it.isSpecial }?.asString() return StringPresentation.functionOrConstructorParameterPresentation(element, containerName)
val fullName = if (containerName != null) "'$containerName.$name'" else "'$name'"
if (element is KtParameter) {
return KotlinBundle.message("fix.change.return.type.presentation.property", fullName)
} else {
return KotlinBundle.message("fix.change.return.type.presentation.function", fullName)
}
} else {
return null
}
} }
class OnType(element: KtFunction, type: KotlinType) : ChangeCallableReturnTypeFix(element, type), HighPriorityAction { class OnType(element: KtFunction, type: KotlinType) : ChangeCallableReturnTypeFix(element, type), HighPriorityAction {
@@ -112,7 +104,7 @@ abstract class ChangeCallableReturnTypeFix(
class ForOverridden(element: KtFunction, type: KotlinType) : ChangeCallableReturnTypeFix(element, type) { class ForOverridden(element: KtFunction, type: KotlinType) : ChangeCallableReturnTypeFix(element, type) {
override fun functionPresentation(): String? { override fun functionPresentation(): String? {
val presentation = super.functionPresentation() ?: return null val presentation = super.functionPresentation() ?: return null
return KotlinBundle.message("fix.change.return.type.presentation.base", presentation) return StringPresentation.baseFunctionOrConstructorParameterPresentation(presentation)
} }
} }
@@ -123,32 +115,10 @@ abstract class ChangeCallableReturnTypeFix(
return changeFunctionLiteralReturnTypeFix.text return changeFunctionLiteralReturnTypeFix.text
} }
val functionPresentation = functionPresentation() return StringPresentation.getTextForQuickFix(element, functionPresentation(), isUnitType, typePresentation)
if (isUnitType && element is KtFunction && element.hasBlockBody()) {
return if (functionPresentation == null)
KotlinBundle.message("fix.change.return.type.remove.explicit.return.type")
else
KotlinBundle.message("fix.change.return.type.remove.explicit.return.type.of", functionPresentation)
}
return when (element) {
is KtFunction -> {
if (functionPresentation != null)
KotlinBundle.message("fix.change.return.type.return.type.text.of", functionPresentation, typePresentation)
else
KotlinBundle.message("fix.change.return.type.return.type.text", typePresentation)
}
else -> {
if (functionPresentation != null)
KotlinBundle.message("fix.change.return.type.type.text.of", functionPresentation, typePresentation)
else
KotlinBundle.message("fix.change.return.type.type.text", typePresentation)
}
}
} }
override fun getFamilyName() = KotlinBundle.message("fix.change.return.type.family") override fun getFamilyName(): String = StringPresentation.familyName()
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean { override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return !typeContainsError && return !typeContainsError &&
@@ -264,4 +234,59 @@ abstract class ChangeCallableReturnTypeFix(
return multiDeclaration.entries[componentIndex - 1] return multiDeclaration.entries[componentIndex - 1]
} }
} }
object StringPresentation {
fun familyName(): String = KotlinBundle.message("fix.change.return.type.family")
fun functionOrConstructorParameterPresentation(element: KtCallableDeclaration, containerName: Name?): String? {
val name = element.name
return if (name != null) {
val fullName = if (containerName != null) "'${containerName.asString()}.$name'" else "'$name'"
when (element) {
is KtParameter -> KotlinBundle.message("fix.change.return.type.presentation.property", fullName)
is KtProperty -> KotlinBundle.message("fix.change.return.type.presentation.property", fullName)
else -> KotlinBundle.message("fix.change.return.type.presentation.function", fullName)
}
} else null
}
fun baseFunctionOrConstructorParameterPresentation(presentation: String): String =
KotlinBundle.message("fix.change.return.type.presentation.base", presentation)
fun baseFunctionOrConstructorParameterPresentation(element: KtCallableDeclaration, containerName: Name?): String? {
val presentation = functionOrConstructorParameterPresentation(element, containerName) ?: return null
return baseFunctionOrConstructorParameterPresentation(presentation)
}
fun getTextForQuickFix(
element: KtCallableDeclaration,
presentation: String?,
isUnitType: Boolean,
typePresentation: String
): String {
if (isUnitType && element is KtFunction && element.hasBlockBody()) {
return if (presentation == null)
KotlinBundle.message("fix.change.return.type.remove.explicit.return.type")
else
KotlinBundle.message("fix.change.return.type.remove.explicit.return.type.of", presentation)
}
return when (element) {
is KtFunction -> {
if (presentation != null)
KotlinBundle.message("fix.change.return.type.return.type.text.of", presentation, typePresentation)
else
KotlinBundle.message("fix.change.return.type.return.type.text", typePresentation)
}
else -> {
if (presentation != null)
KotlinBundle.message("fix.change.return.type.type.text.of", presentation, typePresentation)
else
KotlinBundle.message("fix.change.return.type.type.text", typePresentation)
}
}
}
}
} }