Uast: partial fix for reified functions resolve (#3923, KT-41279)

doesn't take into account compiled reified functions from jars
This commit is contained in:
Kevin Bierhoff
2020-11-25 07:21:14 -08:00
committed by GitHub
parent 7cc6204d6b
commit c90546104e
4 changed files with 44 additions and 2 deletions
@@ -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
+17
View File
@@ -0,0 +1,17 @@
inline fun <reified T : Any> foo(init: T.() -> Unit = {}): T {
TODO("message")
}
inline fun <T : Any> bar(init: T.() -> Unit = {}): T {
TODO("message")
}
fun resolve() {
foo<String>()
val x: String = foo()
bar<String>()
val y: String = bar()
val z = listOf("foo").filterIsInstance<String>()
}
@@ -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
@@ -30,6 +30,9 @@ class KotlinUastResolveEverythingTest : AbstractKotlinResolveEverythingTest() {
@Test
fun testImports() = doTest("Imports")
@Test
fun testReifiedResolve() = doTest("ReifiedResolve")
@Test
fun testResolve() = doTest("Resolve")