From a4e3e7abcc3c3bf9b5b2bd3b0f93c7d676c288c8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 12 Mar 2019 14:28:16 +0300 Subject: [PATCH] New J2K: Add !! when nullability mismatch on post processing --- .../jetbrains/kotlin/nj2k/J2kPostProcessor.kt | 5 +-- .../kotlin/nj2k/NewJ2kPostProcessings.kt | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/J2kPostProcessor.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/J2kPostProcessor.kt index 2cc50fb5430..0b5d0ce920b 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/J2kPostProcessor.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/J2kPostProcessor.kt @@ -36,14 +36,11 @@ import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.PostProcessor import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.AnalysisContext -import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.NullabilityAnalysisFacade -import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.nullabilityByUndefinedNullabilityComment -import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.AnalysisScope import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.NullabilityAnalysisFacade import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.nullabilityByUndefinedNullabilityComment import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.prepareTypeElementByMakingAllTypesNullableConsideringNullabilityComment +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.elementsInRange import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kPostProcessings.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kPostProcessings.kt index 923956846e0..bbff9014e66 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kPostProcessings.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/NewJ2kPostProcessings.kt @@ -49,6 +49,7 @@ import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isNullable +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.mapToIndex @@ -190,6 +191,38 @@ object NewJ2KPostProcessingRegistrar { parent.delete() }, + registerDiagnosticBasedProcessing( + Errors.UNSAFE_CALL, + Errors.UNSAFE_INFIX_CALL, + Errors.UNSAFE_OPERATOR_CALL + ) { element: PsiElement, diagnostic -> + val action = + AddExclExclCallFix.createActions(diagnostic).singleOrNull() + ?: return@registerDiagnosticBasedProcessing + action.invoke(element.project, null, element.containingFile) + }, + + registerDiagnosticBasedProcessing(Errors.SMARTCAST_IMPOSSIBLE) { element: PsiElement, diagnostic -> + val action = + SmartCastImpossibleExclExclFixFactory.createActions(diagnostic).singleOrNull() + ?: return@registerDiagnosticBasedProcessing + action.invoke(element.project, null, element.containingFile) + }, + + registerDiagnosticBasedProcessing(Errors.TYPE_MISMATCH) { element: PsiElement, diagnostic -> + val diagnosticWithParameters = diagnostic as? DiagnosticWithParameters2 + ?: return@registerDiagnosticBasedProcessing + val expectedType = diagnosticWithParameters.a + val realType = diagnosticWithParameters.b + if (realType.makeNotNullable().isSubtypeOf(expectedType.makeNotNullable()) + && realType.isNullable() + && !expectedType.isNullable() + ) { + val factory = KtPsiFactory(element) + element.replace(factory.createExpressionByPattern("($0)!!", element.text)) + } + }, + registerDiagnosticBasedProcessing(Errors.CAST_NEVER_SUCCEEDS) { element: KtSimpleNameExpression, diagnostic -> val action = ReplacePrimitiveCastWithNumberConversionFix.createActionsForAllProblems(listOf(diagnostic)).singleOrNull()