diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CastExpressionFixFactories.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CastExpressionFixFactories.kt index df6443645f6e..87029c276c8e 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CastExpressionFixFactories.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/CastExpressionFixFactories.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KaExperimentalApi import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource +import org.jetbrains.kotlin.analysis.api.types.KaDefinitelyNotNullType import org.jetbrains.kotlin.analysis.api.types.KaErrorType import org.jetbrains.kotlin.analysis.api.types.KaType import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferences @@ -30,6 +31,7 @@ object CastExpressionFixFactories { private data class ElementContext( val typePresentation: String, val typeSourceCode: String, + val isDefinitelyNotNull: Boolean, ) private class CastExpressionModCommandAction( @@ -59,9 +61,10 @@ object CastExpressionFixFactories { elementContext: ElementContext, updater: ModPsiUpdater, ) { + val pattern = if (elementContext.isDefinitelyNotNull) "$0 as ($1)" else "$0 as $1" val expressionToInsert = KtPsiFactory(actionContext.project) .createExpressionByPattern( - "$0 as $1", + pattern, element, elementContext.typeSourceCode, ) @@ -135,6 +138,7 @@ object CastExpressionFixFactories { val elementContext = ElementContext( expectedType.render(KaTypeRendererForSource.WITH_SHORT_NAMES, position = Variance.OUT_VARIANCE), expectedType.render(KaTypeRendererForSource.WITH_QUALIFIED_NAMES, position = Variance.OUT_VARIANCE), + expectedType is KaDefinitelyNotNullType, ) return listOf( diff --git a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java index cc74479897f2..186e6af33ea3 100644 --- a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java @@ -4108,6 +4108,11 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } + @TestMetadata("castFunctionParameter.kt") + public void testCastFunctionParameter() throws Exception { + runTest("../../../idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt"); + } + @TestMetadata("castQualifiedArgument.kt") public void testCastQualifiedArgument() throws Exception { runTest("../../../idea/tests/testData/quickfix/typeMismatch/casts/castQualifiedArgument.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java index faa3a8da8b66..c7b0376a2b31 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java @@ -17733,6 +17733,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } + @TestMetadata("castFunctionParameter.kt") + public void testCastFunctionParameter() throws Exception { + runTest("testData/quickfix/typeMismatch/casts/castFunctionParameter.kt"); + } + @TestMetadata("castQualifiedArgument.kt") public void testCastQualifiedArgument() throws Exception { runTest("testData/quickfix/typeMismatch/casts/castQualifiedArgument.kt"); diff --git a/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt b/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt new file mode 100644 index 000000000000..e4c136d9580c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt @@ -0,0 +1,11 @@ +// "Cast expression 'z' to 'T & Any'" "true" + +fun foo(x: T & Any) {} + +fun bar(x: T & Any) { + val z: T = x + foo(z) +} + +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.CastExpressionFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.CastExpressionFixFactories$CastExpressionModCommandAction \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt.after new file mode 100644 index 000000000000..199b89dd8831 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/typeMismatch/casts/castFunctionParameter.kt.after @@ -0,0 +1,11 @@ +// "Cast expression 'z' to 'T & Any'" "true" + +fun foo(x: T & Any) {} + +fun bar(x: T & Any) { + val z: T = x + foo(z as (T & Any)) +} + +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.CastExpressionFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.k2.codeinsight.fixes.CastExpressionFixFactories$CastExpressionModCommandAction \ No newline at end of file