@@ -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
+ ?.findSingleEnclosedDescriptor(
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
+ ?.findSingleEnclosedDescriptor(
332
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
333
+ psi = 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
+ ?.findSingleEnclosedDescriptor(
341
+ kindFilter = DescriptorKindFilter .VARIABLES ,
342
+ psi = 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
+ )?.findSingleEnclosedDescriptor(
446
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
447
+ psi = owner
448
+ ) as FunctionDescriptor
428
449
} as DeclarationDescriptor
429
450
return getKSTypeCached(
430
451
LazyJavaTypeParameterDescriptor (
@@ -697,3 +718,38 @@ private fun Name.getNonSpecialIdentifier() :String {
697
718
asString().substring(1 )
698
719
}
699
720
}
721
+
722
+ private inline fun MemberScope.findSingleEnclosedDescriptor (
723
+ kindFilter : DescriptorKindFilter ,
724
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
725
+ ) : DeclarationDescriptor ? {
726
+ return getContributedDescriptors(
727
+ kindFilter = kindFilter
728
+ ).singleOrNull(filter)
729
+ }
730
+
731
+ private inline fun ClassDescriptor.findSingleEnclosedDescriptor (
732
+ kindFilter : DescriptorKindFilter ,
733
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
734
+ ) : DeclarationDescriptor ? {
735
+ return this .unsubstitutedMemberScope.findSingleEnclosedDescriptor(
736
+ kindFilter = kindFilter,
737
+ filter = filter
738
+ ) ? : this .staticScope.findSingleEnclosedDescriptor(
739
+ kindFilter = kindFilter,
740
+ filter = filter
741
+ )
742
+ }
743
+
744
+ private fun ClassDescriptor.findSingleEnclosedDescriptor (
745
+ kindFilter : DescriptorKindFilter ,
746
+ psi : PsiElement
747
+ ): DeclarationDescriptor ? {
748
+ return this .unsubstitutedMemberScope.findSingleEnclosedDescriptor(
749
+ kindFilter = kindFilter,
750
+ filter = { it.findPsi() == psi }
751
+ ) ? : this .staticScope.findSingleEnclosedDescriptor(
752
+ kindFilter = kindFilter,
753
+ filter = { it.findPsi() == psi }
754
+ )
755
+ }
0 commit comments