diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index 632e3616da5..bdaa26c942a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -312,8 +312,8 @@ internal fun resolveToPsiMethod( is KtFunction -> if (source.isLocal) getContainingLightClass(source)?.let { UastFakeLightMethod(source, it) } - else - LightClassUtil.getLightClassMethod(source) + else // UltraLightMembersCreator.createMethods() returns nothing for JVM-invisible methods, so fake it if we get null here + LightClassUtil.getLightClassMethod(source) ?: getContainingLightClass(source)?.let { UastFakeLightMethod(source, it) } is PsiMethod -> source null -> resolveDeserialized(context, descriptor) as? PsiMethod else -> null diff --git a/plugins/uast-kotlin/testData/ReifiedResolve.kt b/plugins/uast-kotlin/testData/ReifiedResolve.kt new file mode 100644 index 00000000000..651d78826e0 --- /dev/null +++ b/plugins/uast-kotlin/testData/ReifiedResolve.kt @@ -0,0 +1,17 @@ +inline fun foo(init: T.() -> Unit = {}): T { + TODO("message") +} + +inline fun bar(init: T.() -> Unit = {}): T { + TODO("message") +} + +fun resolve() { + foo() + val x: String = foo() + + bar() + val y: String = bar() + + val z = listOf("foo").filterIsInstance() +} diff --git a/plugins/uast-kotlin/testData/ReifiedResolve.resolved.txt b/plugins/uast-kotlin/testData/ReifiedResolve.resolved.txt new file mode 100644 index 00000000000..8fdca272777 --- /dev/null +++ b/plugins/uast-kotlin/testData/ReifiedResolve.resolved.txt @@ -0,0 +1,22 @@ +UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = Any) -> PsiClass:Object: Object +UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> Light PSI class: T: T +UTypeReferenceExpression (name = void) -> USimpleNameReferenceExpression (identifier = Unit) -> PsiClass:Void: Void +UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> Light PSI class: T: T + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:TODO) -> USimpleNameReferenceExpression (identifier = TODO) -> PsiMethod:TODO: TODO +UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = Any) -> PsiClass:Object: Object +UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> Light PSI class: T: T +UTypeReferenceExpression (name = void) -> USimpleNameReferenceExpression (identifier = Unit) -> PsiClass:Void: Void +UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> Light PSI class: T: T + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:TODO) -> USimpleNameReferenceExpression (identifier = TODO) -> PsiMethod:TODO: TODO + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to LightMethodBuilder:foo) -> USimpleNameReferenceExpression (identifier = foo) -> LightMethodBuilder:foo: foo + UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String + UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to LightMethodBuilder:foo) -> USimpleNameReferenceExpression (identifier = foo) -> LightMethodBuilder:foo: foo + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to KtUltraLightMethodForSourceDeclaration:bar) -> USimpleNameReferenceExpression (identifier = bar) -> KtUltraLightMethodForSourceDeclaration:bar: bar + UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String + UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to KtUltraLightMethodForSourceDeclaration:bar) -> USimpleNameReferenceExpression (identifier = bar) -> KtUltraLightMethodForSourceDeclaration:bar: bar + ULocalVariable (name = z) -> UQualifiedReferenceExpression -> null: null + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to null) -> USimpleNameReferenceExpression (identifier = filterIsInstance) -> null: null + UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String diff --git a/plugins/uast-kotlin/tests/KotlinUastResolveEverythingTest.kt b/plugins/uast-kotlin/tests/KotlinUastResolveEverythingTest.kt index 7346c1f11c7..ddfaa28ae28 100644 --- a/plugins/uast-kotlin/tests/KotlinUastResolveEverythingTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastResolveEverythingTest.kt @@ -30,6 +30,9 @@ class KotlinUastResolveEverythingTest : AbstractKotlinResolveEverythingTest() { @Test fun testImports() = doTest("Imports") + @Test + fun testReifiedResolve() = doTest("ReifiedResolve") + @Test fun testResolve() = doTest("Resolve")