From cace6624e626a539fec61bd5da95455519a193d0 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Sat, 21 Oct 2017 03:38:24 +0300 Subject: [PATCH] EA-105522, KT-20256: Fix TextRange. "Invalid range specified" Check when caret inside template, and don't try to create invalid range then EA-105522 fixed #KT-20256 fixed --- .../confidence/EnableAutopopupInStringTemplate.kt | 5 +++++ .../confidence/AutoPopupInStringTemplateAfterDollar.kt | 7 +++++++ .../completion/test/confidence/KotlinConfidenceTest.java | 4 ++++ 3 files changed, 16 insertions(+) create mode 100644 idea/idea-completion/testData/confidence/AutoPopupInStringTemplateAfterDollar.kt diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/confidence/EnableAutopopupInStringTemplate.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/confidence/EnableAutopopupInStringTemplate.kt index e93eff2afdc..e1c114362b1 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/confidence/EnableAutopopupInStringTemplate.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/confidence/EnableAutopopupInStringTemplate.kt @@ -25,10 +25,15 @@ import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.prevLeaf +import org.jetbrains.kotlin.psi.psiUtil.startOffset class EnableAutopopupInStringTemplate : CompletionConfidence() { override fun shouldSkipAutopopup(contextElement: PsiElement, psiFile: PsiFile, offset: Int): ThreeState { val stringTemplate = contextElement.prevLeaf()?.getParentOfType(strict = false) ?: return ThreeState.UNSURE + + // "$nameRef" stringTemplate here is "$nameRef", so offset are inside template, we should show lookup + if (offset in stringTemplate.startOffset until stringTemplate.endOffset) return ThreeState.NO + val textRange = TextRange.create(stringTemplate.endOffset, offset) val containsWhitespaces = textRange.substring(psiFile.text).any { it.isWhitespace() } return if (containsWhitespaces) ThreeState.UNSURE else ThreeState.NO diff --git a/idea/idea-completion/testData/confidence/AutoPopupInStringTemplateAfterDollar.kt b/idea/idea-completion/testData/confidence/AutoPopupInStringTemplateAfterDollar.kt new file mode 100644 index 00000000000..d4d345c4c58 --- /dev/null +++ b/idea/idea-completion/testData/confidence/AutoPopupInStringTemplateAfterDollar.kt @@ -0,0 +1,7 @@ + +fun foo() { + val aaa = "" + val y = "$aaaa" +} + +// ELEMENT: aaa \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java index c2c5bb6e707..3a335995d44 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java @@ -68,6 +68,10 @@ public class KotlinConfidenceTest extends LightCompletionTestCase { doTest(); } + public void testAutoPopupInStringTemplateAfterDollar() { + doTest(); + } + public void testNoAutoPopupInStringTemplateAfterSpace() { doTest(); }