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.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