@@ -73,8 +73,9 @@ import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
73
73
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
74
74
import org.jetbrains.kotlin.resolve.multiplatform.findActuals
75
75
import org.jetbrains.kotlin.resolve.multiplatform.findExpects
76
+ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
76
77
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
77
- import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
78
+ import org.jetbrains.kotlin.resolve.scopes.MemberScope
78
79
import org.jetbrains.kotlin.types.*
79
80
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
80
81
import org.jetbrains.kotlin.types.typeUtil.substitute
@@ -332,17 +333,30 @@ class ResolverImpl(
332
333
is PsiMethod -> {
333
334
// TODO: get rid of hardcoded check if possible.
334
335
if (psi.name.startsWith(" set" ) || psi.name.startsWith(" get" )) {
335
- moduleClassResolver.resolveClass(JavaMethodImpl (psi).containingClass)
336
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().singleOrNull{
337
- (it as ? PropertyDescriptor )?.getter?.findPsi() == psi || (it as ? PropertyDescriptor )?.setter?.findPsi() == psi
338
- }
336
+ moduleClassResolver
337
+ .resolveClass(JavaMethodImpl (psi).containingClass)
338
+ ?.findEnclosedDescriptor(
339
+ kindFilter = DescriptorKindFilter .CALLABLES
340
+ ) {
341
+ (it as ? PropertyDescriptor )?.getter?.findPsi() == psi || (it as ? PropertyDescriptor )?.setter?.findPsi() == psi
342
+ }
339
343
} else {
340
- moduleClassResolver.resolveClass(JavaMethodImpl (psi).containingClass)
341
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().singleOrNull { it.findPsi() == psi }
344
+ moduleClassResolver
345
+ .resolveClass(JavaMethodImpl (psi).containingClass)
346
+ ?.findEnclosedDescriptor(
347
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
348
+ filter = { it.findPsi() == psi }
349
+ )
342
350
}
343
351
}
344
- is PsiField -> moduleClassResolver.resolveClass(JavaFieldImpl (psi).containingClass)
345
- ?.unsubstitutedMemberScope!! .getDescriptorsFiltered().single { it.findPsi() == psi } as CallableMemberDescriptor
352
+ is PsiField -> {
353
+ moduleClassResolver
354
+ .resolveClass(JavaFieldImpl (psi).containingClass)
355
+ ?.findEnclosedDescriptor(
356
+ kindFilter = DescriptorKindFilter .VARIABLES ,
357
+ filter = { it.findPsi() == psi }
358
+ )
359
+ }
346
360
else -> throw IllegalStateException (" unhandled psi element kind: ${psi.javaClass} " )
347
361
}
348
362
}
@@ -437,9 +451,16 @@ class ResolverImpl(
437
451
val containingDeclaration = if (psi.owner is PsiClass ) {
438
452
moduleClassResolver.resolveClass(JavaClassImpl (psi.owner as PsiClass ))
439
453
} else {
454
+ val owner = psi.owner
455
+ check(owner is PsiMethod ) {
456
+ " unexpected owner type: $owner / ${owner?.javaClass} "
457
+ }
440
458
moduleClassResolver.resolveClass(
441
- JavaMethodImpl (psi.owner as PsiMethod ).containingClass
442
- )?.unsubstitutedMemberScope!! .getDescriptorsFiltered().single { it.findPsi() == psi.owner } as FunctionDescriptor
459
+ JavaMethodImpl (owner).containingClass
460
+ )?.findEnclosedDescriptor(
461
+ kindFilter = DescriptorKindFilter .FUNCTIONS ,
462
+ filter = { it.findPsi() == owner }
463
+ ) as FunctionDescriptor
443
464
} as DeclarationDescriptor
444
465
return getKSTypeCached(
445
466
LazyJavaTypeParameterDescriptor (
@@ -712,3 +733,25 @@ private fun Name.getNonSpecialIdentifier() :String {
712
733
asString().substring(1 )
713
734
}
714
735
}
736
+
737
+ private inline fun MemberScope.findEnclosedDescriptor (
738
+ kindFilter : DescriptorKindFilter ,
739
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
740
+ ) : DeclarationDescriptor ? {
741
+ return getContributedDescriptors(
742
+ kindFilter = kindFilter
743
+ ).firstOrNull(filter)
744
+ }
745
+
746
+ private inline fun ClassDescriptor.findEnclosedDescriptor (
747
+ kindFilter : DescriptorKindFilter ,
748
+ crossinline filter : (DeclarationDescriptor ) -> Boolean
749
+ ) : DeclarationDescriptor ? {
750
+ return this .unsubstitutedMemberScope.findEnclosedDescriptor(
751
+ kindFilter = kindFilter,
752
+ filter = filter
753
+ ) ? : this .staticScope.findEnclosedDescriptor(
754
+ kindFilter = kindFilter,
755
+ filter = filter
756
+ )
757
+ }
0 commit comments