From 60787e9fe4a278ace03bbe39014de6962d4318e6 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Tue, 7 Mar 2023 13:42:05 +0100 Subject: [PATCH] Add ability to override EnumEntries class search logic from IDE side See KTIJ-24676 --- .../kotlin/resolve/DescriptorFactory.java | 6 ++-- .../kotlin/resolve/StdlibClassFinder.kt | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 core/descriptors/src/org/jetbrains/kotlin/resolve/StdlibClassFinder.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java index 8dda387da33..3e1123929b8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java @@ -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; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/StdlibClassFinder.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/StdlibClassFinder.kt new file mode 100644 index 00000000000..bfffdd74d04 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/StdlibClassFinder.kt @@ -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") + +internal fun ModuleDescriptor.getStdlibClassFinder(): StdlibClassFinder { + return getCapability(STDLIB_CLASS_FINDER_CAPABILITY) ?: CliStdlibClassFinderImpl +} \ No newline at end of file