Skip to content

Commit 06eab3b

Browse files
yigitneetopia
authored andcommitted
Support finding descriptors for java statics (#171)
* Handle statics in resolveJavaDeclaration This PR fixes a bug where static java declarations were not being resolved properly because we would only look at the main scope of the class declaration but we also need to check the static scope.
1 parent 286b948 commit 06eab3b

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/ResolverImpl.kt

+54-11
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
7373
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
7474
import org.jetbrains.kotlin.resolve.multiplatform.findActuals
7575
import org.jetbrains.kotlin.resolve.multiplatform.findExpects
76+
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
7677
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
77-
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
78+
import org.jetbrains.kotlin.resolve.scopes.MemberScope
7879
import org.jetbrains.kotlin.types.*
7980
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
8081
import org.jetbrains.kotlin.types.typeUtil.substitute
@@ -332,17 +333,30 @@ class ResolverImpl(
332333
is PsiMethod -> {
333334
// TODO: get rid of hardcoded check if possible.
334335
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+
}
339343
} 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+
)
342350
}
343351
}
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+
}
346360
else -> throw IllegalStateException("unhandled psi element kind: ${psi.javaClass}")
347361
}
348362
}
@@ -437,9 +451,16 @@ class ResolverImpl(
437451
val containingDeclaration = if (psi.owner is PsiClass) {
438452
moduleClassResolver.resolveClass(JavaClassImpl(psi.owner as PsiClass))
439453
} else {
454+
val owner = psi.owner
455+
check(owner is PsiMethod) {
456+
"unexpected owner type: $owner / ${owner?.javaClass}"
457+
}
440458
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
443464
} as DeclarationDescriptor
444465
return getKSTypeCached(
445466
LazyJavaTypeParameterDescriptor(
@@ -712,3 +733,25 @@ private fun Name.getNonSpecialIdentifier() :String {
712733
asString().substring(1)
713734
}
714735
}
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+
}

compiler-plugin/testData/api/mangledNames.kt

+11
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
// fileLevelInlineReturningFun -> fileLevelInlineReturningFun
4141
// fileLevelInternalInlineReceivingFun -> fileLevelInternalInlineReceivingFun-E03SJzc
4242
// fileLevelInternalInlineReturningFun -> fileLevelInternalInlineReturningFun
43+
// JavaInput -> declarations
44+
// javaFunction -> javaFunction
45+
// staticJavaFunction -> staticJavaFunction
4346
// libPackage.Foo -> declarations
4447
// get-inlineProp -> getInlineProp-b_MPbnQ
4548
// set-inlineProp -> setInlineProp-mQ73O9w
@@ -108,3 +111,11 @@ fun fileLevelInlineReceivingFun(inline1: Inline1): Unit = TODO()
108111
fun fileLevelInlineReturningFun(): Inline1 = TODO()
109112
fun fileLevelInternalInlineReceivingFun(inline1: Inline1): Unit = TODO()
110113
fun fileLevelInternalInlineReturningFun(): Inline1 = TODO()
114+
115+
// FILE: JavaInput.java
116+
class JavaInput {
117+
String javaField;
118+
String javaFunction() {}
119+
static String staticJavaField;
120+
static void staticJavaFunction() {}
121+
}

0 commit comments

Comments
 (0)