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 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
}