Skip to content

Commit 91fdc0e

Browse files
committed
Move: Drop ${...} around shortened qualified expression
#KT-22692 Fixed
1 parent e63e489 commit 91fdc0e

File tree

12 files changed

+52
-31
lines changed

12 files changed

+52
-31
lines changed

idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter
2222
import org.jetbrains.kotlin.idea.util.getResolutionScope
2323
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
2424
import org.jetbrains.kotlin.psi.*
25-
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
26-
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
27-
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver
28-
import org.jetbrains.kotlin.psi.psiUtil.parents
25+
import org.jetbrains.kotlin.psi.psiUtil.*
2926
import org.jetbrains.kotlin.renderer.DescriptorRenderer
3027
import org.jetbrains.kotlin.resolve.BindingContext
3128
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
@@ -578,7 +575,11 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
578575
val parens = element.parent as? KtParenthesizedExpression
579576
val requiredParens = parens != null && !KtPsiUtil.areParenthesesUseless(parens)
580577
val shortenedElement = element.replace(element.selectorExpression!!) as KtElement
581-
if (requiredParens) return shortenedElement.parent.replaced(shortenedElement)
578+
val newParent = shortenedElement.parent
579+
if (requiredParens) return newParent.replaced(shortenedElement)
580+
if (newParent is KtBlockStringTemplateEntry && newParent.canDropBraces()) {
581+
newParent.dropBraces()
582+
}
582583
return shortenedElement
583584
}
584585
}

idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,4 +462,13 @@ fun KtModifierList.normalize(): KtModifierList {
462462
modifiers.sortBy { MODIFIERS_ORDER.indexOf(it.node.elementType) }
463463
modifiers.forEach { newList.add(it) }
464464
}
465+
}
466+
467+
fun KtBlockStringTemplateEntry.canDropBraces() =
468+
expression is KtNameReferenceExpression && canPlaceAfterSimpleNameEntry(nextSibling)
469+
470+
fun KtBlockStringTemplateEntry.dropBraces(): KtSimpleNameStringTemplateEntry {
471+
val name = (expression as KtNameReferenceExpression).getReferencedName()
472+
val newEntry = KtPsiFactory(this).createSimpleNameStringTemplateEntry(name)
473+
return replaced(newEntry)
465474
}

idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.Key
2020
import com.intellij.psi.PsiTreeChangeAdapter
2121
import com.intellij.psi.PsiTreeChangeEvent
2222
import org.jetbrains.kotlin.idea.caches.resolve.analyze
23+
import org.jetbrains.kotlin.idea.core.dropBraces
2324
import org.jetbrains.kotlin.idea.core.replaced
2425
import org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyIntention
2526
import org.jetbrains.kotlin.idea.intentions.RemoveCurlyBracesFromTemplateIntention
@@ -171,7 +172,7 @@ internal class ExpressionReplacementPerformer(
171172
if (templateEntry != null) {
172173
val intention = RemoveCurlyBracesFromTemplateIntention()
173174
if (intention.isApplicableTo(templateEntry)) {
174-
val newEntry = intention.applyTo(templateEntry)
175+
val newEntry = templateEntry.dropBraces()
175176
return newEntry.expression
176177
}
177178
}

idea/src/org/jetbrains/kotlin/idea/intentions/RemoveCurlyBracesFromTemplateIntention.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,17 @@
1717
package org.jetbrains.kotlin.idea.intentions
1818

1919
import com.intellij.openapi.editor.Editor
20-
import org.jetbrains.kotlin.idea.core.replaced
20+
import org.jetbrains.kotlin.idea.core.canDropBraces
21+
import org.jetbrains.kotlin.idea.core.dropBraces
2122
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
2223
import org.jetbrains.kotlin.psi.KtBlockStringTemplateEntry
23-
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
24-
import org.jetbrains.kotlin.psi.KtPsiFactory
25-
import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry
26-
import org.jetbrains.kotlin.psi.psiUtil.canPlaceAfterSimpleNameEntry
2724

2825
class RemoveCurlyBracesFromTemplateInspection : IntentionBasedInspection<KtBlockStringTemplateEntry>(RemoveCurlyBracesFromTemplateIntention::class)
2926

3027
class RemoveCurlyBracesFromTemplateIntention : SelfTargetingOffsetIndependentIntention<KtBlockStringTemplateEntry>(KtBlockStringTemplateEntry::class.java, "Remove curly braces") {
31-
override fun isApplicableTo(element: KtBlockStringTemplateEntry): Boolean {
32-
if (element.expression !is KtNameReferenceExpression) return false
33-
return canPlaceAfterSimpleNameEntry(element.nextSibling)
34-
}
28+
override fun isApplicableTo(element: KtBlockStringTemplateEntry) = element.canDropBraces()
3529

3630
override fun applyTo(element: KtBlockStringTemplateEntry, editor: Editor?) {
37-
applyTo(element)
38-
}
39-
40-
fun applyTo(element: KtBlockStringTemplateEntry): KtSimpleNameStringTemplateEntry {
41-
val name = (element.expression as KtNameReferenceExpression).getReferencedName()
42-
val newEntry = KtPsiFactory(element).createSimpleNameStringTemplateEntry(name)
43-
return element.replaced(newEntry)
31+
element.dropBraces()
4432
}
4533
}

idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,10 @@ import org.jetbrains.kotlin.idea.KotlinFileType
6161
import org.jetbrains.kotlin.idea.KotlinLanguage
6262
import org.jetbrains.kotlin.idea.caches.resolve.*
6363
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
64-
import org.jetbrains.kotlin.idea.core.ShortenReferences
65-
import org.jetbrains.kotlin.idea.core.getPackage
66-
import org.jetbrains.kotlin.idea.core.quoteSegmentsIfNeeded
64+
import org.jetbrains.kotlin.idea.core.*
6765
import org.jetbrains.kotlin.idea.core.util.showYesNoCancelDialog
6866
import org.jetbrains.kotlin.idea.highlighter.markers.actualsForExpected
6967
import org.jetbrains.kotlin.idea.highlighter.markers.liftToExpected
70-
import org.jetbrains.kotlin.idea.intentions.RemoveCurlyBracesFromTemplateIntention
7168
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
7269
import org.jetbrains.kotlin.idea.project.languageVersionSettings
7370
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
@@ -779,11 +776,8 @@ fun <T> Pass(body: (T) -> Unit) = object : Pass<T>() {
779776
}
780777

781778
fun KtExpression.removeTemplateEntryBracesIfPossible(): KtExpression {
782-
val parent = parent
783-
if (parent !is KtBlockStringTemplateEntry) return this
784-
785-
val intention = RemoveCurlyBracesFromTemplateIntention()
786-
val newEntry = if (intention.isApplicableTo(parent)) intention.applyTo(parent) else parent
779+
val parent = parent as? KtBlockStringTemplateEntry ?: return this
780+
val newEntry = if (parent.canDropBraces()) parent.dropBraces() else parent
787781
return newEntry.expression!!
788782
}
789783

idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/shortenStringTemplateEntry/after/bar/dummy.txt

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package bar
2+
3+
val someVal = ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package foo
2+
3+
import bar.someVal
4+
5+
fun usage() {
6+
println("Usage: $someVal")
7+
}

idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/shortenStringTemplateEntry/before/bar/dummy.txt

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package foo
2+
3+
val <caret>someVal = ""
4+
5+
fun usage() {
6+
println("Usage: $someVal")
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"mainFile": "foo/test.kt",
3+
"type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS",
4+
"targetPackage": "bar"
5+
}

idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)