New J2K: Add !! when nullability mismatch on post processing
This commit is contained in:
committed by
Ilya Kirillov
parent
deb4129a16
commit
a4e3e7abcc
@@ -36,14 +36,11 @@ import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
|||||||
import org.jetbrains.kotlin.j2k.ConverterSettings
|
import org.jetbrains.kotlin.j2k.ConverterSettings
|
||||||
import org.jetbrains.kotlin.j2k.PostProcessor
|
import org.jetbrains.kotlin.j2k.PostProcessor
|
||||||
import org.jetbrains.kotlin.name.FqName
|
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.AnalysisScope
|
||||||
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.NullabilityAnalysisFacade
|
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.NullabilityAnalysisFacade
|
||||||
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.nullabilityByUndefinedNullabilityComment
|
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.nullabilityByUndefinedNullabilityComment
|
||||||
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.prepareTypeElementByMakingAllTypesNullableConsideringNullabilityComment
|
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.prepareTypeElementByMakingAllTypesNullableConsideringNullabilityComment
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
|
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
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.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.isNullable
|
import org.jetbrains.kotlin.types.isNullable
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
import org.jetbrains.kotlin.utils.mapToIndex
|
import org.jetbrains.kotlin.utils.mapToIndex
|
||||||
@@ -190,6 +191,38 @@ object NewJ2KPostProcessingRegistrar {
|
|||||||
parent.delete()
|
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 ->
|
registerDiagnosticBasedProcessing(Errors.CAST_NEVER_SUCCEEDS) { element: KtSimpleNameExpression, diagnostic ->
|
||||||
val action =
|
val action =
|
||||||
ReplacePrimitiveCastWithNumberConversionFix.createActionsForAllProblems(listOf(diagnostic)).singleOrNull()
|
ReplacePrimitiveCastWithNumberConversionFix.createActionsForAllProblems(listOf(diagnostic)).singleOrNull()
|
||||||
|
|||||||
Reference in New Issue
Block a user