Allow generate toString(), equals(), and hashCode() to include non-default accessors
^KT-15262 Fixed
This commit is contained in:
committed by
Vladimir Dolzhenko
parent
3bf18343f5
commit
af6e744b65
@@ -25,7 +25,9 @@ import com.intellij.openapi.ui.VerticalFlowLayout
|
|||||||
import com.intellij.refactoring.classMembers.AbstractMemberInfoModel
|
import com.intellij.refactoring.classMembers.AbstractMemberInfoModel
|
||||||
import com.intellij.ui.NonFocusableCheckBox
|
import com.intellij.ui.NonFocusableCheckBox
|
||||||
import com.intellij.util.containers.HashMap
|
import com.intellij.util.containers.HashMap
|
||||||
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.core.isInheritable
|
import org.jetbrains.kotlin.idea.core.isInheritable
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberSelectionPanel
|
import org.jetbrains.kotlin.idea.refactoring.memberInfo.KotlinMemberSelectionPanel
|
||||||
@@ -73,7 +75,12 @@ class KotlinGenerateEqualsWizard(
|
|||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createMemberInfo(it: KtNamedDeclaration) = KotlinMemberInfo(it).apply { isChecked = true }
|
private fun createMemberInfo(it: KtNamedDeclaration): KotlinMemberInfo {
|
||||||
|
return KotlinMemberInfo(it).apply {
|
||||||
|
val descriptor = it.unsafeResolveToDescriptor()
|
||||||
|
isChecked = (descriptor as? PropertyDescriptor)?.getter?.isDefault ?: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun getPsiClass() = klass
|
override fun getPsiClass() = klass
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.intellij.util.IncorrectOperationException
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
|
||||||
@@ -168,11 +169,12 @@ class KotlinGenerateToStringAction : KotlinGenerateMemberActionBase<KotlinGenera
|
|||||||
val superToString = classDescriptor.getSuperClassOrAny().findDeclaredToString(true)!!
|
val superToString = classDescriptor.getSuperClassOrAny().findDeclaredToString(true)!!
|
||||||
|
|
||||||
val memberChooserObjects = properties.map { DescriptorMemberChooserObject(it, it.unsafeResolveToDescriptor()) }.toTypedArray()
|
val memberChooserObjects = properties.map { DescriptorMemberChooserObject(it, it.unsafeResolveToDescriptor()) }.toTypedArray()
|
||||||
|
val selectedElements = memberChooserObjects.filter { (it.descriptor as? PropertyDescriptor)?.getter?.isDefault ?: true }.toTypedArray()
|
||||||
val headerPanel = ToStringMemberChooserHeaderPanel(!superToString.builtIns.isMemberOfAny(superToString))
|
val headerPanel = ToStringMemberChooserHeaderPanel(!superToString.builtIns.isMemberOfAny(superToString))
|
||||||
val chooser = MemberChooser<DescriptorMemberChooserObject>(memberChooserObjects, true, true, project, false, headerPanel).apply {
|
val chooser = MemberChooser<DescriptorMemberChooserObject>(memberChooserObjects, true, true, project, false, headerPanel).apply {
|
||||||
title = KotlinBundle.message("action.generate.tostring.name")
|
title = KotlinBundle.message("action.generate.tostring.name")
|
||||||
setCopyJavadocVisible(false)
|
setCopyJavadocVisible(false)
|
||||||
selectElements(memberChooserObjects)
|
selectElements(selectedElements)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!klass.hasExpectModifier()) {
|
if (!klass.hasExpectModifier()) {
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ fun getPropertiesToUseInGeneratedMember(classOrObject: KtClassOrObject): List<Kt
|
|||||||
classOrObject.declarations.asSequence().filterIsInstance<KtProperty>().filterTo(this) {
|
classOrObject.declarations.asSequence().filterIsInstance<KtProperty>().filterTo(this) {
|
||||||
val descriptor = it.unsafeResolveToDescriptor()
|
val descriptor = it.unsafeResolveToDescriptor()
|
||||||
when (descriptor) {
|
when (descriptor) {
|
||||||
is ValueParameterDescriptor -> true
|
is ValueParameterDescriptor, is PropertyDescriptor -> true
|
||||||
is PropertyDescriptor -> descriptor.getter?.isDefault ?: true
|
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,5 +4,8 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
<caret>
|
<caret>
|
||||||
}
|
}
|
||||||
+8
@@ -4,6 +4,10 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
|
|
||||||
<caret>override fun equals(other: Any?): Boolean {
|
<caret>override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (javaClass != other?.javaClass) return false
|
if (javaClass != other?.javaClass) return false
|
||||||
@@ -12,6 +16,8 @@ class Test {
|
|||||||
|
|
||||||
if (serial != other.serial) return false
|
if (serial != other.serial) return false
|
||||||
if (name != other.name) return false
|
if (name != other.name) return false
|
||||||
|
if (age != other.age) return false
|
||||||
|
if (color != other.color) return false
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -19,6 +25,8 @@ class Test {
|
|||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
var result = serial.hashCode()
|
var result = serial.hashCode()
|
||||||
result = 31 * result + name.hashCode()
|
result = 31 * result + name.hashCode()
|
||||||
|
result = 31 * result + age
|
||||||
|
result = 31 * result + color.hashCode()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-1
@@ -8,11 +8,19 @@ class Test {
|
|||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (javaClass != other?.javaClass) return false
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as Test
|
||||||
|
|
||||||
|
if (serial != other.serial) return false
|
||||||
|
if (name != other.name) return false
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
return javaClass.hashCode()
|
var result = serial.hashCode()
|
||||||
|
result = 31 * result + name.hashCode()
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+3
@@ -5,5 +5,8 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
<caret>
|
<caret>
|
||||||
}
|
}
|
||||||
+7
-1
@@ -5,10 +5,16 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
|
|
||||||
<caret>override fun toString(): String {
|
<caret>override fun toString(): String {
|
||||||
return "Test(" +
|
return "Test(" +
|
||||||
"serial='$serial', " +
|
"serial='$serial', " +
|
||||||
"name='$name'" +
|
"name='$name', " +
|
||||||
|
"age=$age, " +
|
||||||
|
"color='$color'" +
|
||||||
")"
|
")"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,5 +4,8 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
<caret>
|
<caret>
|
||||||
}
|
}
|
||||||
+5
-1
@@ -4,8 +4,12 @@ class Test {
|
|||||||
field = value.toUpperCase()
|
field = value.toUpperCase()
|
||||||
}
|
}
|
||||||
var name: String = ""
|
var name: String = ""
|
||||||
|
val age by lazy { 15 + 10 }
|
||||||
|
val color: String
|
||||||
|
get() = "Purple"
|
||||||
|
|
||||||
<caret>override fun toString(): String {
|
<caret>override fun toString(): String {
|
||||||
return "Test(serial='$serial', name='$name')"
|
return "Test(serial='$serial', name='$name', age=$age, color='$color')"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Vendored
+1
-1
@@ -6,7 +6,7 @@ class Test {
|
|||||||
get
|
get
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "Test()"
|
return "Test(serial='$serial', name='$name')"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user