Add capabilities to moduleDescriptor as a way to put user data into module
Add OriginCapability to ide modules
This commit is contained in:
@@ -116,6 +116,8 @@ public interface ModuleInfo {
|
||||
public fun dependencies(): List<ModuleInfo>
|
||||
public fun friends(): Collection<ModuleInfo> = listOf()
|
||||
public fun dependencyOnBuiltins(): DependencyOnBuiltins = DependenciesOnBuiltins.LAST
|
||||
val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
|
||||
get() = emptyMap()
|
||||
|
||||
//TODO: (module refactoring) provide dependency on builtins after runtime in IDEA
|
||||
public interface DependencyOnBuiltins {
|
||||
@@ -158,7 +160,7 @@ public abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
|
||||
val descriptorByModule = HashMap<M, ModuleDescriptorImpl>()
|
||||
modules.forEach {
|
||||
module ->
|
||||
descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager)
|
||||
descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager, module.capabilities)
|
||||
}
|
||||
return ResolverForProjectImpl(debugName, descriptorByModule, delegateResolver)
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||
import org.jetbrains.kotlin.container.useInstance
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleParameters
|
||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -88,8 +89,10 @@ open class PlatformConfigurator(
|
||||
}
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun TargetPlatform.createModule(
|
||||
name: Name,
|
||||
storageManager: StorageManager
|
||||
) = ModuleDescriptorImpl(name, storageManager, defaultModuleParameters, builtIns)
|
||||
storageManager: StorageManager,
|
||||
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap()
|
||||
) = ModuleDescriptorImpl(name, storageManager, defaultModuleParameters, builtIns, capabilities)
|
||||
|
||||
|
||||
@@ -41,6 +41,10 @@ public interface ModuleDescriptor : DeclarationDescriptor, ModuleParameters {
|
||||
public fun getPackage(fqName: FqName): PackageViewDescriptor
|
||||
|
||||
public fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
|
||||
|
||||
fun <T> getCapability(capability: Capability<T>): T?
|
||||
|
||||
class Capability<T>(val name: String)
|
||||
}
|
||||
|
||||
interface ModuleParameters {
|
||||
|
||||
@@ -26,13 +26,14 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.utils.sure
|
||||
import java.util.LinkedHashSet
|
||||
import java.util.*
|
||||
|
||||
public class ModuleDescriptorImpl(
|
||||
public class ModuleDescriptorImpl @JvmOverloads constructor(
|
||||
moduleName: Name,
|
||||
private val storageManager: StorageManager,
|
||||
private val moduleParameters: ModuleParameters,
|
||||
override val builtIns: KotlinBuiltIns
|
||||
override val builtIns: KotlinBuiltIns,
|
||||
private val capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap()
|
||||
) : DeclarationDescriptorImpl(Annotations.EMPTY, moduleName), ModuleDescriptor, ModuleParameters by moduleParameters {
|
||||
init {
|
||||
if (!moduleName.isSpecial()) {
|
||||
@@ -102,6 +103,9 @@ public class ModuleDescriptorImpl(
|
||||
assert(friend != this) { "Attempt to make module $id a friend to itself" }
|
||||
friendModules.add(friend)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T> getCapability(capability: ModuleDescriptor.Capability<T>) = capabilities[capability] as? T
|
||||
}
|
||||
|
||||
public interface ModuleDependencies {
|
||||
|
||||
@@ -51,6 +51,12 @@ public class ErrorUtils {
|
||||
private static final ModuleDescriptor ERROR_MODULE;
|
||||
static {
|
||||
ERROR_MODULE = new ModuleDescriptor() {
|
||||
@Nullable
|
||||
@Override
|
||||
public <T> T getCapability(@NotNull Capability<T> capability) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.intellij.psi.search.GlobalSearchScope
|
||||
import com.intellij.psi.util.CachedValueProvider
|
||||
import com.intellij.psi.util.CachedValuesManager
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.emptyOrSingletonList
|
||||
import java.util.*
|
||||
@@ -35,6 +36,11 @@ public val LIBRARY_NAME_PREFIX: String = "library "
|
||||
|
||||
public interface IdeaModuleInfo : ModuleInfo {
|
||||
fun contentScope(): GlobalSearchScope
|
||||
|
||||
val moduleOrigin: ModuleOrigin
|
||||
|
||||
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
|
||||
get() = mapOf(OriginCapability to moduleOrigin)
|
||||
}
|
||||
|
||||
private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, productionOnly: Boolean): List<IdeaModuleInfo> {
|
||||
@@ -82,6 +88,8 @@ fun ideaModelDependencies(module: Module, productionOnly: Boolean): List<IdeaMod
|
||||
|
||||
public interface ModuleSourceInfo : IdeaModuleInfo {
|
||||
val module: Module
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
get() = ModuleOrigin.MODULE
|
||||
}
|
||||
|
||||
public data class ModuleProductionSourceInfo(override val module: Module) : ModuleSourceInfo {
|
||||
@@ -149,6 +157,9 @@ private class ModuleTestSourceScope(module: Module) : ModuleSourceScope(module)
|
||||
}
|
||||
|
||||
public data class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo {
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
get() = ModuleOrigin.LIBRARY
|
||||
|
||||
override val name: Name = Name.special("<$LIBRARY_NAME_PREFIX${library.getName()}>")
|
||||
|
||||
override fun contentScope(): GlobalSearchScope = LibraryWithoutSourceScope(project, library)
|
||||
@@ -172,6 +183,9 @@ public data class LibraryInfo(val project: Project, val library: Library) : Idea
|
||||
}
|
||||
|
||||
internal data class LibrarySourceInfo(val project: Project, val library: Library) : IdeaModuleInfo {
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
get() = ModuleOrigin.OTHER
|
||||
|
||||
override val name: Name = Name.special("<sources for library ${library.getName()}>")
|
||||
|
||||
override fun contentScope() = GlobalSearchScope.EMPTY_SCOPE
|
||||
@@ -188,6 +202,9 @@ internal data class LibrarySourceInfo(val project: Project, val library: Library
|
||||
|
||||
//TODO: (module refactoring) there should be separate SdkSourceInfo but there are no kotlin source in existing sdks for now :)
|
||||
public data class SdkInfo(val project: Project, val sdk: Sdk) : IdeaModuleInfo {
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
get() = ModuleOrigin.LIBRARY
|
||||
|
||||
override val name: Name = Name.special("<$LIBRARY_NAME_PREFIX${sdk.getName()}>")
|
||||
|
||||
override fun contentScope(): GlobalSearchScope = SdkScope(project, sdk)
|
||||
@@ -196,6 +213,9 @@ public data class SdkInfo(val project: Project, val sdk: Sdk) : IdeaModuleInfo {
|
||||
}
|
||||
|
||||
internal object NotUnderContentRootModuleInfo : IdeaModuleInfo {
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
get() = ModuleOrigin.OTHER
|
||||
|
||||
override val name: Name = Name.special("<special module for files not under source root>")
|
||||
|
||||
override fun contentScope() = GlobalSearchScope.EMPTY_SCOPE
|
||||
@@ -222,3 +242,11 @@ private class SdkScope(project: Project, private val sdk: Sdk) :
|
||||
}
|
||||
|
||||
internal fun IdeaModuleInfo.isLibraryClasses() = this is SdkInfo || this is LibraryInfo
|
||||
|
||||
val OriginCapability = ModuleDescriptor.Capability<ModuleOrigin>("MODULE_ORIGIN")
|
||||
|
||||
enum class ModuleOrigin {
|
||||
MODULE,
|
||||
LIBRARY,
|
||||
OTHER
|
||||
}
|
||||
Reference in New Issue
Block a user