New J2K: Implement removing of explicit types in post-processing
This commit is contained in:
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user