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.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
|
||||
}
|
||||
Reference in New Issue
Block a user