Reformat MovePropertyToConstructorIntention

This commit is contained in:
Toshiaki Kameyama
2018-04-17 06:41:39 +03:00
committed by Mikhail Glukhikh
parent 633679ac16
commit 012227dd73
@@ -43,10 +43,9 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class MovePropertyToConstructorIntention : class MovePropertyToConstructorIntention :
SelfTargetingIntention<KtProperty>(KtProperty::class.java, "Move to constructor"), SelfTargetingIntention<KtProperty>(KtProperty::class.java, "Move to constructor"),
LocalQuickFix { LocalQuickFix {
override fun applyFix(project: Project, descriptor: ProblemDescriptor) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val property = descriptor.psiElement as? KtProperty ?: return val property = descriptor.psiElement as? KtProperty ?: return
@@ -54,18 +53,18 @@ class MovePropertyToConstructorIntention :
} }
override fun isApplicableTo(element: KtProperty, caretOffset: Int): Boolean { override fun isApplicableTo(element: KtProperty, caretOffset: Int): Boolean {
fun KtProperty.isDeclaredInClass() : Boolean { fun KtProperty.isDeclaredInClass(): Boolean {
val parent = getStrictParentOfType<KtClassOrObject>() val parent = getStrictParentOfType<KtClassOrObject>()
return parent is KtClass && !parent.isInterface() return parent is KtClass && !parent.isInterface()
} }
return !element.isLocal return !element.isLocal
&& !element.hasDelegate() && !element.hasDelegate()
&& element.getter == null && element.getter == null
&& element.setter == null && element.setter == null
&& !element.hasModifier(LATEINIT_KEYWORD) && !element.hasModifier(LATEINIT_KEYWORD)
&& (element.isDeclaredInClass()) && (element.isDeclaredInClass())
&& (element.initializer?.isValidInConstructor() ?: true) && (element.initializer?.isValidInConstructor() ?: true)
} }
override fun applyTo(element: KtProperty, editor: Editor?) { override fun applyTo(element: KtProperty, editor: Editor?) {
@@ -79,15 +78,14 @@ class MovePropertyToConstructorIntention :
val propertyAnnotationsText = element.modifierList?.annotationEntries?.joinToString(separator = " ") { val propertyAnnotationsText = element.modifierList?.annotationEntries?.joinToString(separator = " ") {
if (it.isApplicableToConstructorParameter()) { if (it.isApplicableToConstructorParameter()) {
it.getTextWithUseSiteIfMissing("property") it.getTextWithUseSiteIfMissing("property")
} } else {
else {
it.text it.text
} }
} }
if (constructorParameter != null) { if (constructorParameter != null) {
val parameterAnnotationsText = val parameterAnnotationsText =
constructorParameter.modifierList?.annotationEntries?.joinToString(separator = " ") { it.text } constructorParameter.modifierList?.annotationEntries?.joinToString(separator = " ") { it.text }
val parameterText = buildString { val parameterText = buildString {
element.modifierList?.getModifiersText()?.let(this::append) element.modifierList?.getModifiersText()?.let(this::append)
@@ -103,10 +101,9 @@ class MovePropertyToConstructorIntention :
constructorParameter.replace(factory.createParameter(parameterText)).apply { constructorParameter.replace(factory.createParameter(parameterText)).apply {
commentSaver.restore(this) commentSaver.restore(this)
} }
} } else {
else { val typeText =
val typeText = element.typeReference?.text ?: element.typeReference?.text ?: (element.resolveToDescriptorIfAny() as? PropertyDescriptor)?.type?.render() ?: return
(element.resolveToDescriptorIfAny() as? PropertyDescriptor)?.type?.render() ?: return
val parameterText = buildString { val parameterText = buildString {
element.modifierList?.getModifiersText()?.let(this::append) element.modifierList?.getModifiersText()?.let(this::append)
propertyAnnotationsText?.takeIf(String::isNotBlank)?.let { appendWithSpaceBefore(it) } propertyAnnotationsText?.takeIf(String::isNotBlank)?.let { appendWithSpaceBefore(it) }
@@ -139,19 +136,19 @@ class MovePropertyToConstructorIntention :
} }
private fun KtAnnotationEntry.getTextWithUseSiteIfMissing(useSite: String) = private fun KtAnnotationEntry.getTextWithUseSiteIfMissing(useSite: String) =
if (useSiteTarget == null) if (useSiteTarget == null)
"@$useSite:${typeReference?.text.orEmpty()}${valueArgumentList?.text.orEmpty()}" "@$useSite:${typeReference?.text.orEmpty()}${valueArgumentList?.text.orEmpty()}"
else else
text text
private fun KotlinType.render() = IdeDescriptorRenderers.SOURCE_CODE.renderType(this) private fun KotlinType.render() = IdeDescriptorRenderers.SOURCE_CODE.renderType(this)
private fun KtModifierList.getModifiersText() = getModifiers().joinToString(separator = " ") { it.text } private fun KtModifierList.getModifiersText() = getModifiers().joinToString(separator = " ") { it.text }
private fun KtModifierList.getModifiers(): List<PsiElement> = private fun KtModifierList.getModifiers(): List<PsiElement> =
node.getChildren(null).filter { it.elementType is KtModifierKeywordToken }.map { it.psi } node.getChildren(null).filter { it.elementType is KtModifierKeywordToken }.map { it.psi }
private fun StringBuilder.appendWithSpaceBefore(str: String) = append(" " + str) private fun StringBuilder.appendWithSpaceBefore(str: String) = append(" $str")
private fun KtExpression.isValidInConstructor(): Boolean { private fun KtExpression.isValidInConstructor(): Boolean {
val containingClass = getStrictParentOfType<KtClass>() ?: return false val containingClass = getStrictParentOfType<KtClass>() ?: return false