diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt index ec214e98fee..faaeae6bc42 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt @@ -24,10 +24,13 @@ import com.intellij.psi.PsiElement import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.setVisibility import org.jetbrains.kotlin.idea.inspections.* @@ -42,6 +45,7 @@ import org.jetbrains.kotlin.idea.quickfix.QuickFixActionBase import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix import org.jetbrains.kotlin.idea.quickfix.RemoveUselessCastFix import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* @@ -49,6 +53,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.utils.mapToIndex import java.util.* @@ -86,6 +91,7 @@ object J2KPostProcessingRegistrar { registerGeneralInspectionBasedProcessing(RedundantVisibilityModifierInspection()) registerGeneralInspectionBasedProcessing(RedundantExplicitTypeInspection()) registerGeneralInspectionBasedProcessing(RedundantUnitReturnTypeInspection()) + _processings.add(RemoveExplicitPropertyType()) registerGeneralInspectionBasedProcessing(CanBeValInspection()) registerIntentionBasedProcessing(FoldInitializerAndIfToElvisIntention()) @@ -312,6 +318,35 @@ object J2KPostProcessingRegistrar { }) } + private class RemoveExplicitPropertyType : J2kPostProcessing { + override val writeActionNeeded = true + + override fun createAction(element: KtElement, diagnostics: Diagnostics): (() -> Unit)? { + if (element !is KtProperty) return null + + fun check(element: KtProperty): Boolean { + val initializer = element.initializer ?: return false + val withoutExpectedType = initializer.analyzeInContext(initializer.getResolutionScope()) + val descriptor = element.resolveToDescriptorIfAny() as? PropertyDescriptor ?: return false + return when (withoutExpectedType.getType(initializer)) { + descriptor.returnType, + descriptor.returnType?.makeNotNullable() -> true + else -> false + } + } + + if (!check(element)) { + return null + } else { + return { + if (element.isValid && check(element)) { + element.typeReference = null + } + } + } + } + } + private class RemoveExplicitTypeArgumentsProcessing : J2kPostProcessing { override val writeActionNeeded = true