New J2K: Add post processings for removing redundant qualifiers
This commit is contained in:
committed by
Ilya Kirillov
parent
d0ba5e7fdf
commit
70c700f07a
@@ -46,6 +46,8 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.I
|
||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isTrivialStatementBody
|
||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.ConvertDataClass
|
||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.ConvertGettersAndSetters
|
||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.resolve
|
||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.topLevelContainingClassOrObject
|
||||
import org.jetbrains.kotlin.idea.quickfix.*
|
||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||
import org.jetbrains.kotlin.idea.references.mainReference
|
||||
@@ -161,6 +163,9 @@ object NewJ2KPostProcessingRegistrarImpl : J2KPostProcessingRegistrar {
|
||||
override val writeActionNeeded: Boolean = true
|
||||
}),
|
||||
|
||||
SingleProcessing(RemoveRedundantTypeQualifierProcessing()),
|
||||
SingleProcessing(RemoveRedundantExpressionQualifierProcessing()),
|
||||
|
||||
registerDiagnosticBasedProcessing<KtBinaryExpressionWithTypeRHS>(Errors.USELESS_CAST) { element, _ ->
|
||||
val expression = RemoveUselessCastFix.invoke(element)
|
||||
|
||||
@@ -667,4 +672,48 @@ object NewJ2KPostProcessingRegistrarImpl : J2KPostProcessingRegistrar {
|
||||
}
|
||||
}
|
||||
|
||||
private class RemoveRedundantExpressionQualifierProcessing : J2kPostProcessing {
|
||||
private fun check(qualifiedExpression: KtQualifiedExpression): Boolean {
|
||||
val qualifier = (qualifiedExpression.receiverExpression as? KtNameReferenceExpression)
|
||||
?.referenceExpression()
|
||||
?.resolve() as? KtClassOrObject ?: return false
|
||||
val topLevelClass = qualifiedExpression.getStrictParentOfType<KtClassOrObject>() ?: return false
|
||||
return topLevelClass == qualifier
|
||||
}
|
||||
|
||||
override fun createAction(element: KtElement, diagnostics: Diagnostics): (() -> Unit)? {
|
||||
if (element !is KtQualifiedExpression) return null
|
||||
if (!check(element)) return null
|
||||
return {
|
||||
if (element.isValid() && check(element)) {
|
||||
element.replace(element.selectorExpression!!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val writeActionNeeded: Boolean = true
|
||||
}
|
||||
|
||||
private class RemoveRedundantTypeQualifierProcessing : J2kPostProcessing {
|
||||
private fun check(reference: KtUserType): Boolean {
|
||||
val qualifierClass = reference.qualifier
|
||||
?.referenceExpression
|
||||
?.resolve() as? KtClassOrObject ?: return false
|
||||
val topLevelClass = reference.topLevelContainingClassOrObject() ?: return false
|
||||
return topLevelClass.isAncestor(qualifierClass)
|
||||
}
|
||||
|
||||
override fun createAction(element: KtElement, diagnostics: Diagnostics): (() -> Unit)? {
|
||||
if (element !is KtUserType) return null
|
||||
if (!check(element)) return null
|
||||
return {
|
||||
if (element.isValid && check(element)) {
|
||||
element.deleteQualifier()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val writeActionNeeded: Boolean = true
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
|
||||
|
||||
fun KtExpression.asProperty(): KtProperty? =
|
||||
@@ -32,4 +34,14 @@ fun KtExpression.unpackedReferenceToProperty(): KtProperty? =
|
||||
|
||||
|
||||
fun KtDeclaration.type() =
|
||||
(resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType
|
||||
(resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType
|
||||
|
||||
fun KtElement.topLevelContainingClassOrObject(): KtClassOrObject? =
|
||||
generateSequence(getStrictParentOfType<KtClassOrObject>()) {
|
||||
it.getStrictParentOfType()
|
||||
}.lastOrNull()
|
||||
|
||||
fun KtReferenceExpression.resolve() =
|
||||
references
|
||||
.firstOrNull { it is KtSimpleNameReference }
|
||||
?.resolve()
|
||||
Reference in New Issue
Block a user