diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt index cc111123454e..f3e254486ee2 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/AbstractKotlinUVariable.kt @@ -79,7 +79,9 @@ abstract class AbstractKotlinUVariable( is KtNamedDeclaration -> sourcePsi.nameIdentifier is KtTypeReference -> sourcePsi.typeElement?.let { // receiver param in extension function - (it as? KtUserType)?.referenceExpression?.getIdentifier() ?: it + // Unwrap the type if the receiver param is nullable + val typeElement = (it as? KtNullableType)?.innerType ?: it + (typeElement as? KtUserType)?.referenceExpression?.getIdentifier() ?: it } ?: sourcePsi is KtNameReferenceExpression -> sourcePsi.getReferencedNameElement() is KtBinaryExpression, is KtCallExpression -> null // e.g. `foo("Lorem ipsum") ?: foo("dolor sit amet")` 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 e20e214fcfd6..f7bb88a89f96 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 @@ -640,4 +640,30 @@ interface UastApiFixtureTestBase : UastPluginSelection { }) } + fun checkIdentifierOfNullableExtensionReceiver(myFixture: JavaCodeInsightTestFixture) { + myFixture.configureByText( + "main.kt", """ + enum class SortOrder { + ASCENDING, DESCENDING, UNSORTED + } + + fun Comparator?.withOrder(sortOrder: SortOrder): Comparator? = + this?.let { + when (sortOrder) { + SortOrder.ASCENDING -> it + SortOrder.DESCENDING -> it.reversed() + SortOrder.UNSORTED -> null + } + } + """.trimIndent() + ) + + val uFile = myFixture.file.toUElement()!! + val withOrder = uFile.findElementByTextFromPsi("withOrder", strict = false) + .orFail("can't convert extension function: withOrder") + val extensionReceiver = withOrder.uastParameters.first() + val identifier = extensionReceiver.uastAnchor as? UIdentifier + TestCase.assertNotNull(identifier) + } + } \ 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 c91c5d8b619f..ad81d2de4827 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 @@ -82,4 +82,8 @@ class FirUastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi doCheck("LambdaImplicitParameters", ::checkLambdaImplicitParameters) } + fun testIdentifierOfNullableExtensionReceiver() { + checkIdentifierOfNullableExtensionReceiver(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 f8c841ebf5ef..4c818aa43673 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 @@ -75,4 +75,8 @@ class FE1UastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi checkLambdaImplicitParameters(myFixture) } + fun testIdentifierOfNullableExtensionReceiver() { + checkIdentifierOfNullableExtensionReceiver(myFixture) + } + } \ No newline at end of file