Add ability to override EnumEntries class search logic from IDE side

See KTIJ-24676
This commit is contained in:
Roman Efremov
2023-03-07 13:42:05 +01:00
committed by Space Team
parent 6471624d0c
commit 60787e9fe4
2 changed files with 36 additions and 3 deletions
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.impl.*;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.name.NameUtils;
import org.jetbrains.kotlin.name.StandardClassIds;
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextClassReceiver;
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextReceiver;
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver;
@@ -175,8 +174,9 @@ public class DescriptorFactory {
@Nullable
public static PropertyDescriptor createEnumEntriesProperty(@NotNull ClassDescriptor enumClass) {
ClassDescriptor enumEntriesClass = FindClassInModuleKt.findClassAcrossModuleDependencies(getContainingModule(enumClass),
StandardClassIds.INSTANCE.getEnumEntries());
ModuleDescriptor module = getContainingModule(enumClass);
StdlibClassFinder stdlibClassFinder = StdlibClassFinderKt.getStdlibClassFinder(module);
ClassDescriptor enumEntriesClass = stdlibClassFinder.findEnumEntriesClass(module);
if (enumEntriesClass == null) {
return null;
}
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleCapability
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.name.StandardClassIds
interface StdlibClassFinder {
fun findEnumEntriesClass(moduleDescriptor: ModuleDescriptor): ClassDescriptor?
}
/**
* Default implementation which works for CLI, because all dependencies are added to one module,
* so we can always find `EnumEntries` there.
* But this doesn't work for IDE for modules without stdlib in dependencies (e.g. JDK or Kotlin module with `-no-stdlib` specified).
*/
private object CliStdlibClassFinderImpl : StdlibClassFinder {
override fun findEnumEntriesClass(moduleDescriptor: ModuleDescriptor): ClassDescriptor? {
return moduleDescriptor.findClassAcrossModuleDependencies(StandardClassIds.EnumEntries)
}
}
val STDLIB_CLASS_FINDER_CAPABILITY = ModuleCapability<StdlibClassFinder>("StdlibClassFinder")
internal fun ModuleDescriptor.getStdlibClassFinder(): StdlibClassFinder {
return getCapability(STDLIB_CLASS_FINDER_CAPABILITY) ?: CliStdlibClassFinderImpl
}