K1: add support for Enum.entries in Java scopes

This commit is contained in:
Mikhail Glukhikh
2022-07-25 14:48:56 +02:00
committed by Space
parent 12e8b1d844
commit 3a2d69225c
2 changed files with 31 additions and 11 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.resolve.calls.tower
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.EffectSystem
@@ -466,7 +467,7 @@ class PSICallResolver(
dispatchReceiver: ReceiverValueWithSmartCastInfo?,
extensionReceiver: ReceiverValueWithSmartCastInfo?
): Collection<VariableDescriptor> {
return candidateInterceptor.interceptVariableCandidates(
val result = candidateInterceptor.interceptVariableCandidates(
initialResults,
this,
context,
@@ -477,6 +478,14 @@ class PSICallResolver(
dispatchReceiver,
extensionReceiver
)
if (name != StandardNames.ENUM_ENTRIES || languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)) {
return result
}
return result.filter {
it !is PropertyDescriptor || !it.isSynthesized ||
it.dispatchReceiverParameter != null || it.extensionReceiverParameter != null ||
(it.containingDeclaration as? ClassDescriptor)?.kind != ClassKind.ENUM_CLASS
}
}
}
@@ -29,11 +29,11 @@ import org.jetbrains.kotlin.load.java.descriptors.getParentJavaStaticClassScope
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValueOfMethod
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValuesMethod
import org.jetbrains.kotlin.resolve.DescriptorFactory.*
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.utils.addIfNotNull
class LazyJavaStaticClassScope(
c: LazyJavaResolverContext,
@@ -55,6 +55,9 @@ class LazyJavaStaticClassScope(
override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?) =
declaredMemberIndex().getFieldNames().toMutableSet().apply {
flatMapJavaStaticSupertypesScopes(ownerDescriptor, this) { it.getVariableNames() }
if (jClass.isEnum) {
add(StandardNames.ENUM_ENTRIES)
}
}
override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set<Name> = emptySet()
@@ -66,14 +69,16 @@ class LazyJavaStaticClassScope(
override fun computeNonDeclaredFunctions(result: MutableCollection<SimpleFunctionDescriptor>, name: Name) {
val functionsFromSupertypes = getStaticFunctionsFromJavaSuperClasses(name, ownerDescriptor)
result.addAll(resolveOverridesForStaticMembers(
name,
functionsFromSupertypes,
result,
ownerDescriptor,
c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
))
result.addAll(
resolveOverridesForStaticMembers(
name,
functionsFromSupertypes,
result,
ownerDescriptor,
c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
)
)
if (jClass.isEnum) {
when (name) {
@@ -113,6 +118,12 @@ class LazyJavaStaticClassScope(
)
})
}
if (jClass.isEnum) {
when (name) {
StandardNames.ENUM_ENTRIES ->
result.addIfNotNull(createEnumEntriesProperty(ownerDescriptor))
}
}
}
private fun getStaticFunctionsFromJavaSuperClasses(name: Name, descriptor: ClassDescriptor): Set<SimpleFunctionDescriptor> {