No KotlinType reference in CastExpressionFix
This commit is contained in:
@@ -33,20 +33,22 @@ import org.jetbrains.kotlin.types.KotlinType
|
|||||||
import org.jetbrains.kotlin.types.flexibility
|
import org.jetbrains.kotlin.types.flexibility
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
|
|
||||||
class CastExpressionFix(element: KtExpression, private val type: KotlinType) : KotlinQuickFixAction<KtExpression>(element) {
|
class CastExpressionFix(element: KtExpression, type: KotlinType) : KotlinQuickFixAction<KtExpression>(element) {
|
||||||
override fun getFamilyName() = "Cast expression"
|
private val typeSourceCode = IdeDescriptorRenderers.SOURCE_CODE.renderType(type)
|
||||||
override fun getText() = "Cast expression '${element.text}' to '${IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type)}'"
|
private val typePresentation = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type)
|
||||||
|
private val upOrDownCast: Boolean = run {
|
||||||
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
|
val expressionType = element.analyze(BodyResolveMode.PARTIAL).getType(element)
|
||||||
if (!super.isAvailable(project, editor, file)) return false
|
expressionType != null && (type.isSubtypeOf(expressionType) || expressionType.isSubtypeOf(type))
|
||||||
|
|
||||||
val expressionType = element.analyze(BodyResolveMode.PARTIAL).getType(element) ?: return false
|
|
||||||
return type.isSubtypeOf(expressionType) || expressionType.isSubtypeOf(type) // donwcast/upcast
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getFamilyName() = "Cast expression"
|
||||||
|
override fun getText() = "Cast expression '${element.text}' to '$typePresentation'"
|
||||||
|
|
||||||
|
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
|
||||||
|
= upOrDownCast && super.isAvailable(project, editor, file)
|
||||||
|
|
||||||
public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||||
val renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(type)
|
val expressionToInsert = KtPsiFactory(file).createExpressionByPattern("$0 as $1", element, typeSourceCode)
|
||||||
val expressionToInsert = KtPsiFactory(file).createExpressionByPattern("$0 as $1", element, renderedType)
|
|
||||||
val newExpression = element.replaced(expressionToInsert)
|
val newExpression = element.replaced(expressionToInsert)
|
||||||
ShortenReferences.DEFAULT.process((KtPsiUtil.safeDeparenthesize(newExpression) as KtBinaryExpressionWithTypeRHS).right!!)
|
ShortenReferences.DEFAULT.process((KtPsiUtil.safeDeparenthesize(newExpression) as KtBinaryExpressionWithTypeRHS).right!!)
|
||||||
editor?.caretModel?.moveToOffset(newExpression.endOffset)
|
editor?.caretModel?.moveToOffset(newExpression.endOffset)
|
||||||
|
|||||||
Reference in New Issue
Block a user