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 dependencies(): List<ModuleInfo>
|
||||||
public fun friends(): Collection<ModuleInfo> = listOf()
|
public fun friends(): Collection<ModuleInfo> = listOf()
|
||||||
public fun dependencyOnBuiltins(): DependencyOnBuiltins = DependenciesOnBuiltins.LAST
|
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
|
//TODO: (module refactoring) provide dependency on builtins after runtime in IDEA
|
||||||
public interface DependencyOnBuiltins {
|
public interface DependencyOnBuiltins {
|
||||||
@@ -158,7 +160,7 @@ public abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
|
|||||||
val descriptorByModule = HashMap<M, ModuleDescriptorImpl>()
|
val descriptorByModule = HashMap<M, ModuleDescriptorImpl>()
|
||||||
modules.forEach {
|
modules.forEach {
|
||||||
module ->
|
module ->
|
||||||
descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager)
|
descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager, module.capabilities)
|
||||||
}
|
}
|
||||||
return ResolverForProjectImpl(debugName, descriptorByModule, delegateResolver)
|
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.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||||
import org.jetbrains.kotlin.container.useInstance
|
import org.jetbrains.kotlin.container.useInstance
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleParameters
|
import org.jetbrains.kotlin.descriptors.ModuleParameters
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -88,8 +89,10 @@ open class PlatformConfigurator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmOverloads
|
||||||
fun TargetPlatform.createModule(
|
fun TargetPlatform.createModule(
|
||||||
name: Name,
|
name: Name,
|
||||||
storageManager: StorageManager
|
storageManager: StorageManager,
|
||||||
) = ModuleDescriptorImpl(name, storageManager, defaultModuleParameters, builtIns)
|
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 getPackage(fqName: FqName): PackageViewDescriptor
|
||||||
|
|
||||||
public fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
|
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 {
|
interface ModuleParameters {
|
||||||
|
|||||||
@@ -26,13 +26,14 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
import java.util.LinkedHashSet
|
import java.util.*
|
||||||
|
|
||||||
public class ModuleDescriptorImpl(
|
public class ModuleDescriptorImpl @JvmOverloads constructor(
|
||||||
moduleName: Name,
|
moduleName: Name,
|
||||||
private val storageManager: StorageManager,
|
private val storageManager: StorageManager,
|
||||||
private val moduleParameters: ModuleParameters,
|
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 {
|
) : DeclarationDescriptorImpl(Annotations.EMPTY, moduleName), ModuleDescriptor, ModuleParameters by moduleParameters {
|
||||||
init {
|
init {
|
||||||
if (!moduleName.isSpecial()) {
|
if (!moduleName.isSpecial()) {
|
||||||
@@ -102,6 +103,9 @@ public class ModuleDescriptorImpl(
|
|||||||
assert(friend != this) { "Attempt to make module $id a friend to itself" }
|
assert(friend != this) { "Attempt to make module $id a friend to itself" }
|
||||||
friendModules.add(friend)
|
friendModules.add(friend)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
override fun <T> getCapability(capability: ModuleDescriptor.Capability<T>) = capabilities[capability] as? T
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ModuleDependencies {
|
public interface ModuleDependencies {
|
||||||
|
|||||||
@@ -51,6 +51,12 @@ public class ErrorUtils {
|
|||||||
private static final ModuleDescriptor ERROR_MODULE;
|
private static final ModuleDescriptor ERROR_MODULE;
|
||||||
static {
|
static {
|
||||||
ERROR_MODULE = new ModuleDescriptor() {
|
ERROR_MODULE = new ModuleDescriptor() {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public <T> T getCapability(@NotNull Capability<T> capability) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
|
public PlatformToKotlinClassMap getPlatformToKotlinClassMap() {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.intellij.psi.search.GlobalSearchScope
|
|||||||
import com.intellij.psi.util.CachedValueProvider
|
import com.intellij.psi.util.CachedValueProvider
|
||||||
import com.intellij.psi.util.CachedValuesManager
|
import com.intellij.psi.util.CachedValuesManager
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.emptyOrSingletonList
|
import org.jetbrains.kotlin.utils.emptyOrSingletonList
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -35,6 +36,11 @@ public val LIBRARY_NAME_PREFIX: String = "library "
|
|||||||
|
|
||||||
public interface IdeaModuleInfo : ModuleInfo {
|
public interface IdeaModuleInfo : ModuleInfo {
|
||||||
fun contentScope(): GlobalSearchScope
|
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> {
|
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 {
|
public interface ModuleSourceInfo : IdeaModuleInfo {
|
||||||
val module: Module
|
val module: Module
|
||||||
|
override val moduleOrigin: ModuleOrigin
|
||||||
|
get() = ModuleOrigin.MODULE
|
||||||
}
|
}
|
||||||
|
|
||||||
public data class ModuleProductionSourceInfo(override val module: Module) : ModuleSourceInfo {
|
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 {
|
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 val name: Name = Name.special("<$LIBRARY_NAME_PREFIX${library.getName()}>")
|
||||||
|
|
||||||
override fun contentScope(): GlobalSearchScope = LibraryWithoutSourceScope(project, library)
|
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 {
|
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 val name: Name = Name.special("<sources for library ${library.getName()}>")
|
||||||
|
|
||||||
override fun contentScope() = GlobalSearchScope.EMPTY_SCOPE
|
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 :)
|
//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 {
|
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 val name: Name = Name.special("<$LIBRARY_NAME_PREFIX${sdk.getName()}>")
|
||||||
|
|
||||||
override fun contentScope(): GlobalSearchScope = SdkScope(project, sdk)
|
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 {
|
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 val name: Name = Name.special("<special module for files not under source root>")
|
||||||
|
|
||||||
override fun contentScope() = GlobalSearchScope.EMPTY_SCOPE
|
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
|
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