Add capabilities to moduleDescriptor as a way to put user data into module

Add OriginCapability to ide modules
This commit is contained in:
Pavel V. Talanov
2015-10-29 16:44:13 +03:00
parent 736b496f6a
commit fff404780c
6 changed files with 53 additions and 6 deletions
@@ -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
}