diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt index 6dcfca23e959fc6c3068833031f5de379574ce45..5107f86b13c8eb5216c86c6f72e7a683dad27177 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/psi/UastKotlinPsiVariable.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.kotlin.psi import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.util.TextRange import com.intellij.psi.* import com.intellij.psi.impl.light.LightTypeElement import org.jetbrains.annotations.ApiStatus @@ -57,6 +58,8 @@ class UastKotlinPsiVariable private constructor( override fun getText(): String = ktElement.text + override fun getTextRange(): TextRange = ktElement.textRange + override fun getParent() = psiParent override fun hasInitializer() = ktInitializer != null diff --git a/plugins/kotlin/uast/uast-kotlin-base/tests/test/org/jetbrains/uast/test/common/kotlin/UastApiFixtureTestBase.kt b/plugins/kotlin/uast/uast-kotlin-base/tests/test/org/jetbrains/uast/test/common/kotlin/UastApiFixtureTestBase.kt index 17ce08a98904bdaf611878d55c38af7a0df176cb..2067484828dac66c29f33d168bb2e74925813bea 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/tests/test/org/jetbrains/uast/test/common/kotlin/UastApiFixtureTestBase.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/tests/test/org/jetbrains/uast/test/common/kotlin/UastApiFixtureTestBase.kt @@ -18,6 +18,7 @@ import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiParameter import com.intellij.psi.PsiTypes import org.jetbrains.kotlin.psi.KtDestructuringDeclaration +import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.uast.kotlin.BaseKotlinUastResolveProviderService import org.jetbrains.uast.util.isConstructorCall @@ -1080,4 +1081,37 @@ interface UastApiFixtureTestBase : UastPluginSelection { .orFail("cant convert to UCallExpression") TestCase.assertEquals("Foo", uCallExpression.receiverType?.canonicalText) } + + fun checkTextRangeOfLocalVariable(myFixture: JavaCodeInsightTestFixture) { + myFixture.configureByText( + "main.kt", """ + fun foo(p: Any) { + val bar = { arg -> + arg == p + } + boo(p = b<caret>ar) + } + + fun boo(p: (Any) -> Boolean): Boolean { + return p.invoke(42) + } + """.trimIndent() + ) + val nameReferenceExpression = myFixture.file.findElementAt(myFixture.caretOffset) + ?.getParentOfType<KtNameReferenceExpression>(strict = true) + .orFail("Cannot find KtNameReferenceExpression") + + val uNameReferenceExpression = nameReferenceExpression.toUElementOfType<USimpleNameReferenceExpression>() + .orFail("Cannot convert to KotlinUSimpleReferenceExpression") + + val localPsiVariable = uNameReferenceExpression.resolve() + .orFail("Cannot find the local variable") + + // val bar = ... + TestCase.assertNotNull(localPsiVariable.textRange) + // boo(p = bar) + TestCase.assertNotNull(uNameReferenceExpression.textRange) + + TestCase.assertNotSame(localPsiVariable.textRange, uNameReferenceExpression.textRange) + } } \ No newline at end of file diff --git a/plugins/kotlin/uast/uast-kotlin-fir/tests/test/org/jetbrains/fir/uast/test/FirUastApiFixtureTest.kt b/plugins/kotlin/uast/uast-kotlin-fir/tests/test/org/jetbrains/fir/uast/test/FirUastApiFixtureTest.kt index be10f03b02602789e2aa3fa0393c00e5c6aa97f6..e59fd3a5891e57dce82b4f789c1ddcc0e0422bf5 100644 --- a/plugins/kotlin/uast/uast-kotlin-fir/tests/test/org/jetbrains/fir/uast/test/FirUastApiFixtureTest.kt +++ b/plugins/kotlin/uast/uast-kotlin-fir/tests/test/org/jetbrains/fir/uast/test/FirUastApiFixtureTest.kt @@ -128,4 +128,8 @@ class FirUastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi fun testReceiverTypeOfExtensionFunction() { checkReceiverTypeOfExtensionFunction(myFixture) } + + fun testTextRangeOfLocalVariable() { + checkTextRangeOfLocalVariable(myFixture) + } } \ No newline at end of file diff --git a/plugins/kotlin/uast/uast-kotlin/tests/test/org/jetbrains/uast/test/kotlin/comparison/FE1UastApiFixtureTest.kt b/plugins/kotlin/uast/uast-kotlin/tests/test/org/jetbrains/uast/test/kotlin/comparison/FE1UastApiFixtureTest.kt index b8d33ebd5e22f2c2fa120b1376ff73ea1d659f37..45dd3010e64beef10b422a2fe8e724c4134cc0e8 100644 --- a/plugins/kotlin/uast/uast-kotlin/tests/test/org/jetbrains/uast/test/kotlin/comparison/FE1UastApiFixtureTest.kt +++ b/plugins/kotlin/uast/uast-kotlin/tests/test/org/jetbrains/uast/test/kotlin/comparison/FE1UastApiFixtureTest.kt @@ -126,4 +126,8 @@ class FE1UastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi fun testReceiverTypeOfExtensionFunction() { checkReceiverTypeOfExtensionFunction(myFixture) } + + fun testTextRangeOfLocalVariable() { + checkTextRangeOfLocalVariable(myFixture) + } } \ No newline at end of file