Add ability to override EnumEntries class search logic from IDE side
See KTIJ-24676
This commit is contained in:
committed by
Space Team
parent
6471624d0c
commit
60787e9fe4
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.*;
|
import org.jetbrains.kotlin.descriptors.impl.*;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.name.NameUtils;
|
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.ContextClassReceiver;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextReceiver;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextReceiver;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver;
|
||||||
@@ -175,8 +174,9 @@ public class DescriptorFactory {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static PropertyDescriptor createEnumEntriesProperty(@NotNull ClassDescriptor enumClass) {
|
public static PropertyDescriptor createEnumEntriesProperty(@NotNull ClassDescriptor enumClass) {
|
||||||
ClassDescriptor enumEntriesClass = FindClassInModuleKt.findClassAcrossModuleDependencies(getContainingModule(enumClass),
|
ModuleDescriptor module = getContainingModule(enumClass);
|
||||||
StandardClassIds.INSTANCE.getEnumEntries());
|
StdlibClassFinder stdlibClassFinder = StdlibClassFinderKt.getStdlibClassFinder(module);
|
||||||
|
ClassDescriptor enumEntriesClass = stdlibClassFinder.findEnumEntriesClass(module);
|
||||||
if (enumEntriesClass == null) {
|
if (enumEntriesClass == null) {
|
||||||
return 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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user