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.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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user