1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-05-01 07:34:03 +02:00

fix: distanceTo to works with nested quotes and brackets

This commit is contained in:
Osvaldo Cordova Aburto 2025-01-28 19:54:33 -06:00 committed by Alex Pláte
parent ad49800b09
commit 01d776957a
2 changed files with 206 additions and 7 deletions
src/main/java/com/maddyhome/idea/vim/extension/miniai
tests/java-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/extension/miniai

View File

@ -220,11 +220,16 @@ private fun findClosestQuoteRange(
}
private fun TextRange.distanceTo(caretOffset: Int): Int {
return if (caretOffset < startOffset) {
startOffset - caretOffset
} else if (caretOffset > endOffset) {
caretOffset - endOffset
} else {
0 // Caret is inside the range
val rangeLength = endOffset - startOffset
// If caret is inside the range
if (caretOffset in startOffset..endOffset) {
// Return the length of the range - smaller ranges get priority
return rangeLength
}
}
// If caret is outside, make the distance much larger
val startDistance = kotlin.math.abs(caretOffset - startOffset)
val endDistance = kotlin.math.abs(caretOffset - endOffset)
return (startDistance + endDistance) * 1000 + rangeLength
}

View File

@ -23,6 +23,200 @@ class MiniAIExtensionTest : VimJavaTestCase() {
enableExtensions("mini-ai")
}
@Test
fun testChangeInsideNestedQuotes() {
doTest(
"ciq",
"this 'simple<caret> \"test\"'",
"this '<caret>'",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteInsideNestedQuotes() {
doTest(
"diq",
"this 'simple<caret> \"test\"'",
"this '<caret>'",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeInsideNestedQuotesDoubleInner() {
doTest(
"ciq",
"this \"simple<caret> 'test'\"",
"this \"<caret>\"",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteInsideNestedQuotesDoubleInner() {
doTest(
"diq",
"this \"simple<caret> 'test'\"",
"this \"<caret>\"",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeInsideNestedQuotesBackQuote() {
doTest(
"ciq",
"this `simple<caret> \"test\"`",
"this `<caret>`",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteInsideNestedQuotesBackQuote() {
doTest(
"diq",
"this `simple<caret> \"test\"`",
"this `<caret>`",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeAroundNestedSingleQuotes() {
doTest(
"caq",
"this 'simple<caret> \"test\"'",
"this <caret>",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteAroundNestedSingleQuotes() {
doTest(
"daq",
"this 'simple<caret> \"test\"' test",
"this <caret> test",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeAroundNestedDoubleQuotes() {
doTest(
"caq",
"this \"simple<caret> 'test'\"",
"this <caret>",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteAroundNestedDoubleQuotes() {
doTest(
"daq",
"this \"simple<caret> 'test'\" test",
"this <caret> test",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeAroundNestedBackQuotes() {
doTest(
"caq",
"this `simple<caret> \"test\"`",
"this <caret>",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteAroundNestedBackQuotes() {
doTest(
"daq",
"this `simple<caret> \"test\"` test",
"this <caret> test",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
// Additional edge cases with cursor on different positions
@Test
fun testChangeAroundNestedQuotesOnInnerQuote() {
doTest(
"caq",
"this 'simple \"<caret>test\"'",
"this 'simple <caret>'",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteAroundNestedQuotesOnInnerQuote() {
doTest(
"daq",
"this 'simple \"<caret>test\"'",
"this 'simple '",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
// Test with multiple levels of nesting
@Test
fun testChangeAroundTripleNestedQuotes() {
doTest(
"caq",
"this 'simple \"nested `<caret>test`\"'",
"this 'simple \"nested <caret>\"'",
Mode.INSERT,
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testDeleteAroundTripleNestedQuotes() {
doTest(
"daq",
"this 'simple \"nested `<caret>test`\"'",
"this 'simple \"nested <caret>\"'",
Mode.NORMAL(),
JavaFileType.INSTANCE,
)
assertSelection(null)
}
@Test
fun testChangeInsideSingleQuote() {
doTest(