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 package org.jetbrains.kotlin.resolve.calls.tower
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.EffectSystem import org.jetbrains.kotlin.contracts.EffectSystem
@@ -466,7 +467,7 @@ class PSICallResolver(
dispatchReceiver: ReceiverValueWithSmartCastInfo?, dispatchReceiver: ReceiverValueWithSmartCastInfo?,
extensionReceiver: ReceiverValueWithSmartCastInfo? extensionReceiver: ReceiverValueWithSmartCastInfo?
): Collection<VariableDescriptor> { ): Collection<VariableDescriptor> {
return candidateInterceptor.interceptVariableCandidates( val result = candidateInterceptor.interceptVariableCandidates(
initialResults, initialResults,
this, this,
context, context,
@@ -477,6 +478,14 @@ class PSICallResolver(
dispatchReceiver, dispatchReceiver,
extensionReceiver 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.lazy.LazyJavaResolverContext
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValueOfMethod import org.jetbrains.kotlin.resolve.DescriptorFactory.*
import org.jetbrains.kotlin.resolve.DescriptorFactory.createEnumValuesMethod
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.utils.addIfNotNull
class LazyJavaStaticClassScope( class LazyJavaStaticClassScope(
c: LazyJavaResolverContext, c: LazyJavaResolverContext,
@@ -55,6 +55,9 @@ class LazyJavaStaticClassScope(
override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?) = override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?) =
declaredMemberIndex().getFieldNames().toMutableSet().apply { declaredMemberIndex().getFieldNames().toMutableSet().apply {
flatMapJavaStaticSupertypesScopes(ownerDescriptor, this) { it.getVariableNames() } flatMapJavaStaticSupertypesScopes(ownerDescriptor, this) { it.getVariableNames() }
if (jClass.isEnum) {
add(StandardNames.ENUM_ENTRIES)
}
} }
override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set<Name> = emptySet() 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) { override fun computeNonDeclaredFunctions(result: MutableCollection<SimpleFunctionDescriptor>, name: Name) {
val functionsFromSupertypes = getStaticFunctionsFromJavaSuperClasses(name, ownerDescriptor) val functionsFromSupertypes = getStaticFunctionsFromJavaSuperClasses(name, ownerDescriptor)
result.addAll(resolveOverridesForStaticMembers( result.addAll(
name, resolveOverridesForStaticMembers(
functionsFromSupertypes, name,
result, functionsFromSupertypes,
ownerDescriptor, result,
c.components.errorReporter, ownerDescriptor,
c.components.kotlinTypeChecker.overridingUtil c.components.errorReporter,
)) c.components.kotlinTypeChecker.overridingUtil
)
)
if (jClass.isEnum) { if (jClass.isEnum) {
when (name) { 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> { private fun getStaticFunctionsFromJavaSuperClasses(name: Name, descriptor: ClassDescriptor): Set<SimpleFunctionDescriptor> {