New J2K: Add post processings for removing redundant qualifiers

This commit is contained in:
Ilya Kirillov
2019-01-17 14:33:12 +03:00
committed by Ilya Kirillov
parent d0ba5e7fdf
commit 70c700f07a
2 changed files with 62 additions and 1 deletions
@@ -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()