@@ -72,8 +72,9 @@ import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
72
72
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
73
73
import org.jetbrains.kotlin.resolve.multiplatform.findActuals
74
74
import org.jetbrains.kotlin.resolve.multiplatform.findExpects
75
+ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
75
76
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
76
- import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
77
+ import org.jetbrains.kotlin.resolve.scopes.MemberScope
77
78
import org.jetbrains.kotlin.types.*
78
79
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
79
80
import org.jetbrains.kotlin.types.typeUtil.substitute
@@ -317,17 +318,30 @@ class ResolverImpl(
317
318
is PsiMethod -> {
318
319
// TODO: get rid of hardcoded check if possible.
319
320
if (psi.name.startsWith(" set" ) || psi.name.startsWith(" get" )) {
320
- moduleClassResolver.resolveClass(JavaMethodImpl (psi).containingClass)
321
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().singleOrNull{
322
- (it as ? PropertyDescriptor )?.getter?.findPsi() == psi || (it as ? PropertyDescriptor )?.setter?.findPsi() == psi
323
- }
321
+ moduleClassResolver
322
+ .resolveClass(JavaMethodImpl (psi).containingClass)
323
+ ?.findEnclosedDescriptor(
324
+ kindFilter = DescriptorKindFilter .CALLABLES
325
+ ) {
326
+ (it as ? PropertyDescriptor )?.getter?.findPsi() == psi || (it as ? PropertyDescriptor )?.setter?.findPsi() == psi
327
+ }
324
328
} else {
325
- moduleClassResolver.resolveClass(JavaMethodImpl (psi).containingClass)
326
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().singleOrNull { it.findPsi() == psi }
329
+ moduleClassResolver
330
+ .resolveClass(JavaMethodImpl (psi).containingClass)
331
+ ?.findEnclosedDescriptor(
332
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
333
+ filter = { it.findPsi() == psi }
334
+ )
327
335
}
328
336
}
329
- is PsiField -> moduleClassResolver.resolveClass(JavaFieldImpl (psi).containingClass)
330
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().single { it.findPsi() == psi } as CallableMemberDescriptor
337
+ is PsiField -> {
338
+ moduleClassResolver
339
+ .resolveClass(JavaFieldImpl (psi).containingClass)
340
+ ?.findEnclosedDescriptor(
341
+ kindFilter = DescriptorKindFilter .VARIABLES ,
342
+ filter = { it.findPsi() == psi }
343
+ )
344
+ }
331
345
else -> throw IllegalStateException (" unhandled psi element kind: ${psi.javaClass} " )
332
346
}
333
347
}
@@ -422,9 +436,16 @@ class ResolverImpl(
422
436
val containingDeclaration = if (psi.owner is PsiClass ) {
423
437
moduleClassResolver.resolveClass(JavaClassImpl (psi.owner as PsiClass ))
424
438
} else {
439
+ val owner = psi.owner
440
+ check(owner is PsiMethod ) {
441
+ " unexpected owner type: $owner / ${owner?.javaClass} "
442
+ }
425
443
moduleClassResolver.resolveClass(
426
- JavaMethodImpl (psi.owner as PsiMethod ).containingClass
427
- )?.unsubstitutedMemberScope!! .getDescriptorsFiltered().single { it.findPsi() == psi.owner } as FunctionDescriptor
444
+ JavaMethodImpl (owner).containingClass
445
+ )?.findEnclosedDescriptor(
446
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
447
+ filter = { it.findPsi() == owner }
448
+ ) as FunctionDescriptor
428
449
} as DeclarationDescriptor
429
450
return getKSTypeCached(
430
451
LazyJavaTypeParameterDescriptor (
@@ -697,3 +718,25 @@ private fun Name.getNonSpecialIdentifier() :String {
697
718
asString().substring(1 )
698
719
}
699
720
}
721
+
722
+ private inline fun MemberScope.findEnclosedDescriptor (
723
+ kindFilter : DescriptorKindFilter ,
724
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
725
+ ) : DeclarationDescriptor ? {
726
+ return getContributedDescriptors(
727
+ kindFilter = kindFilter
728
+ ).firstOrNull(filter)
729
+ }
730
+
731
+ private inline fun ClassDescriptor.findEnclosedDescriptor (
732
+ kindFilter : DescriptorKindFilter ,
733
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
734
+ ) : DeclarationDescriptor ? {
735
+ return this .unsubstitutedMemberScope.findEnclosedDescriptor(
736
+ kindFilter = kindFilter,
737
+ filter = filter
738
+ ) ? : this .staticScope.findEnclosedDescriptor(
739
+ kindFilter = kindFilter,
740
+ filter = filter
741
+ )
742
+ }
0 commit comments