New J2K: Add !! when nullability mismatch on post processing

This commit is contained in:
Ilya Kirillov
2019-03-12 14:28:16 +03:00
committed by Ilya Kirillov
parent deb4129a16
commit a4e3e7abcc
2 changed files with 34 additions and 4 deletions
@@ -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
@@ -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<KtExpression, KotlinType, KotlinType>
?: 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()