Skip to content

Commit e89e809

Browse files
committed
Rename: Respect naming conventions in automatic variable rename
#KT-7851 Fixed
1 parent 400d6b5 commit e89e809

File tree

8 files changed

+73
-10
lines changed

8 files changed

+73
-10
lines changed

ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@
171171

172172
#### Refactorings
173173

174+
###### New features
175+
- [`KT-7851`](https://youtrack.jetbrains.com/issue/KT-7851) Respect naming conventions in automatic variable rename
176+
174177
###### Issues fixed
175178
- [`KT-9156`](https://youtrack.jetbrains.com/issue/KT-9156) Quote non-identifier names in Kotlin references
176179
- [`KT-9157`](https://youtrack.jetbrains.com/issue/KT-9157) Fixed in-place rename of Kotlin expression referring Java declaration

idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ import com.intellij.openapi.util.text.StringUtil
2121
import com.intellij.psi.PsiClass
2222
import com.intellij.psi.PsiElement
2323
import com.intellij.psi.PsiNamedElement
24+
import com.intellij.psi.PsiVariable
25+
import com.intellij.psi.codeStyle.JavaCodeStyleManager
2426
import com.intellij.psi.util.PsiTreeUtil
2527
import com.intellij.refactoring.JavaRefactoringSettings
2628
import com.intellij.refactoring.RefactoringBundle
2729
import com.intellij.refactoring.rename.naming.AutomaticRenamer
2830
import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory
2931
import com.intellij.usageView.UsageInfo
3032
import org.jetbrains.kotlin.asJava.toLightClass
33+
import org.jetbrains.kotlin.asJava.toLightElements
3134
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
3235
import org.jetbrains.kotlin.descriptors.ClassDescriptor
3336
import org.jetbrains.kotlin.descriptors.VariableDescriptor
@@ -39,6 +42,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
3942
import org.jetbrains.kotlin.resolve.lazy.NoDescriptorForDeclarationException
4043
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
4144
import org.jetbrains.kotlin.types.KotlinType
45+
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
4246
import java.util.*
4347

4448
class AutomaticVariableRenamer(
@@ -85,19 +89,37 @@ class AutomaticVariableRenamer(
8589
override fun entityName() = RefactoringBundle.message("entity.name.variable")
8690

8791
override fun nameToCanonicalName(name: String, element: PsiNamedElement): String? {
92+
if (element !is KtNamedDeclaration) return name
93+
94+
val psiVariable = element.toLightElements().firstIsInstanceOrNull<PsiVariable>()
95+
val propertyName = if (psiVariable != null) {
96+
val codeStyleManager = JavaCodeStyleManager.getInstance(psiVariable.project)
97+
codeStyleManager.variableNameToPropertyName(name, codeStyleManager.getVariableKind(psiVariable))
98+
}
99+
else name
100+
88101
if (element in toUnpluralize) {
89-
val singular = StringUtil.unpluralize(name)
102+
val singular = StringUtil.unpluralize(propertyName)
90103
if (singular != null) return singular
91104
toUnpluralize.remove(element)
92105
}
93-
return name
106+
return propertyName
94107
}
95108

96109
override fun canonicalNameToName(canonicalName: String, element: PsiNamedElement): String? {
110+
if (element !is KtNamedDeclaration) return canonicalName
111+
112+
val psiVariable = element.toLightElements().firstIsInstanceOrNull<PsiVariable>()
113+
val varName = if (psiVariable != null) {
114+
val codeStyleManager = JavaCodeStyleManager.getInstance(psiVariable.project)
115+
codeStyleManager.propertyNameToVariableName(canonicalName, codeStyleManager.getVariableKind(psiVariable))
116+
}
117+
else canonicalName
118+
97119
return if (element in toUnpluralize)
98-
StringUtil.pluralize(canonicalName)
120+
StringUtil.pluralize(varName)
99121
else
100-
canonicalName
122+
varName
101123
}
102124

103125
companion object {

idea/testData/refactoring/rename/automaticRenamer/after/main.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
open class Bar : Throwable()
22

3-
val bar: Bar = Bar()
4-
val bar1: Bar = Bar()
3+
val BAR: Bar = Bar()
4+
val BAR_1: Bar = Bar()
55

6-
val bars: List<Bar> = listOf()
7-
val foos1: Array<Bar> = array()
6+
val BARs: List<Bar> = listOf()
7+
val FOOS_1: Array<Bar> = array()
88

99
fun main(args: Array<String>) {
1010
val bar: Bar = Bar()

idea/testData/refactoring/rename/automaticRenamerForJavaClass/after/usage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ class BarImpl : Bar()
22

33
object BarObj : Bar()
44

5-
val bar: Bar = Bar()
6-
val bars: Array<Bar> = throw Error()
5+
val BAR: Bar = Bar()
6+
val BARs: Array<Bar> = throw Error()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package test
2+
3+
class Bar {
4+
5+
}
6+
7+
val SOME_BAR: Bar = Bar()
8+
val BAR: Bar = Bar()
9+
10+
val SOME___BAR: Bar = Bar()
11+
val BAR: Bar = Bar()
12+
13+
val SOME_BAR: Bar = Bar()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package test
2+
3+
class Foo {
4+
5+
}
6+
7+
val SOME_FOO: Foo = Foo()
8+
val FOO: Foo = Foo()
9+
10+
val some_foo: Foo = Foo()
11+
val foo: Foo = Foo()
12+
13+
val SomeFoo: Foo = Foo()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "KOTLIN_CLASS",
3+
"mainFile": "test.kt",
4+
"classId": "test/Foo",
5+
"newName": "Bar"
6+
}

idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ public void testRenameBundleProperty_RenameBundleProperty() throws Exception {
125125
doTest(fileName);
126126
}
127127

128+
@TestMetadata("renameClassWithAutoVarConventions/renameClassWithAutoVarConventions.test")
129+
public void testRenameClassWithAutoVarConventions_RenameClassWithAutoVarConventions() throws Exception {
130+
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameClassWithAutoVarConventions/renameClassWithAutoVarConventions.test");
131+
doTest(fileName);
132+
}
133+
128134
@TestMetadata("renameCompareTo/compareTo.test")
129135
public void testRenameCompareTo_CompareTo() throws Exception {
130136
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameCompareTo/compareTo.test");

0 commit comments

Comments
 (0)