New J2K: Implement removing of explicit types in post-processing

This commit is contained in:
Simon Ogorodnik
2018-08-22 22:02:40 +03:00
committed by Ilya Kirillov
parent 1c1804f22d
commit dbf4ba536f
@@ -24,10 +24,13 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.diagnostics.Errors 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.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.core.setVisibility import org.jetbrains.kotlin.idea.core.setVisibility
import org.jetbrains.kotlin.idea.inspections.* 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.RemoveModifierFix
import org.jetbrains.kotlin.idea.quickfix.RemoveUselessCastFix import org.jetbrains.kotlin.idea.quickfix.RemoveUselessCastFix
import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.* 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.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics 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.typeUtil.makeNotNullable
import org.jetbrains.kotlin.utils.mapToIndex import org.jetbrains.kotlin.utils.mapToIndex
import java.util.* import java.util.*
@@ -86,6 +91,7 @@ object J2KPostProcessingRegistrar {
registerGeneralInspectionBasedProcessing(RedundantVisibilityModifierInspection()) registerGeneralInspectionBasedProcessing(RedundantVisibilityModifierInspection())
registerGeneralInspectionBasedProcessing(RedundantExplicitTypeInspection()) registerGeneralInspectionBasedProcessing(RedundantExplicitTypeInspection())
registerGeneralInspectionBasedProcessing(RedundantUnitReturnTypeInspection()) registerGeneralInspectionBasedProcessing(RedundantUnitReturnTypeInspection())
_processings.add(RemoveExplicitPropertyType())
registerGeneralInspectionBasedProcessing(CanBeValInspection()) registerGeneralInspectionBasedProcessing(CanBeValInspection())
registerIntentionBasedProcessing(FoldInitializerAndIfToElvisIntention()) 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 { private class RemoveExplicitTypeArgumentsProcessing : J2kPostProcessing {
override val writeActionNeeded = true override val writeActionNeeded = true