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.intentions.branchedTransformations.isTrivialStatementBody
|
||||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.ConvertDataClass
|
import org.jetbrains.kotlin.idea.j2k.postProcessing.ConvertDataClass
|
||||||
import org.jetbrains.kotlin.idea.j2k.postProcessing.ConvertGettersAndSetters
|
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.quickfix.*
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
@@ -161,6 +163,9 @@ object NewJ2KPostProcessingRegistrarImpl : J2KPostProcessingRegistrar {
|
|||||||
override val writeActionNeeded: Boolean = true
|
override val writeActionNeeded: Boolean = true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
SingleProcessing(RemoveRedundantTypeQualifierProcessing()),
|
||||||
|
SingleProcessing(RemoveRedundantExpressionQualifierProcessing()),
|
||||||
|
|
||||||
registerDiagnosticBasedProcessing<KtBinaryExpressionWithTypeRHS>(Errors.USELESS_CAST) { element, _ ->
|
registerDiagnosticBasedProcessing<KtBinaryExpressionWithTypeRHS>(Errors.USELESS_CAST) { element, _ ->
|
||||||
val expression = RemoveUselessCastFix.invoke(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.caches.resolve.resolveToDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
|
|
||||||
|
|
||||||
fun KtExpression.asProperty(): KtProperty? =
|
fun KtExpression.asProperty(): KtProperty? =
|
||||||
@@ -33,3 +35,13 @@ fun KtExpression.unpackedReferenceToProperty(): KtProperty? =
|
|||||||
|
|
||||||
fun KtDeclaration.type() =
|
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