From fff404780c3c74c2c7d7d227a5d6c9f8a8d51402 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 29 Oct 2015 16:44:13 +0300 Subject: [PATCH] Add capabilities to moduleDescriptor as a way to put user data into module Add OriginCapability to ide modules --- .../kotlin/analyzer/AnalyzerFacade.kt | 4 ++- .../kotlin/resolve/TargetPlatform.kt | 7 +++-- .../kotlin/descriptors/ModuleDescriptor.kt | 4 +++ .../descriptors/impl/ModuleDescriptorImpl.kt | 10 +++++-- .../jetbrains/kotlin/types/ErrorUtils.java | 6 ++++ .../idea/caches/resolve/IdeaModuleInfos.kt | 28 +++++++++++++++++++ 6 files changed, 53 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 21bae63d18a..42aea7e6c6a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -116,6 +116,8 @@ public interface ModuleInfo { public fun dependencies(): List public fun friends(): Collection = listOf() public fun dependencyOnBuiltins(): DependencyOnBuiltins = DependenciesOnBuiltins.LAST + val capabilities: Map, 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 { val descriptorByModule = HashMap() modules.forEach { module -> - descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager) + descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager, module.capabilities) } return ResolverForProjectImpl(debugName, descriptorByModule, delegateResolver) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt index 35998441536..44cbdfd771e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt @@ -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, Any?> = emptyMap() +) = ModuleDescriptorImpl(name, storageManager, defaultModuleParameters, builtIns, capabilities) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt index df76d040f9a..1baff1a9c03 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt @@ -41,6 +41,10 @@ public interface ModuleDescriptor : DeclarationDescriptor, ModuleParameters { public fun getPackage(fqName: FqName): PackageViewDescriptor public fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection + + fun getCapability(capability: Capability): T? + + class Capability(val name: String) } interface ModuleParameters { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index 844fbdff265..5d2d6fce05a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -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, 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 getCapability(capability: ModuleDescriptor.Capability) = capabilities[capability] as? T } public interface ModuleDependencies { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index eb90c8956d2..1dd9c55152c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -51,6 +51,12 @@ public class ErrorUtils { private static final ModuleDescriptor ERROR_MODULE; static { ERROR_MODULE = new ModuleDescriptor() { + @Nullable + @Override + public T getCapability(@NotNull Capability capability) { + return null; + } + @NotNull @Override public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt index a5145317b10..3b4ac6aeaf0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt @@ -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, Any?> + get() = mapOf(OriginCapability to moduleOrigin) } private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, productionOnly: Boolean): List { @@ -82,6 +88,8 @@ fun ideaModelDependencies(module: Module, productionOnly: Boolean): List") 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("") 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("") 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("MODULE_ORIGIN") + +enum class ModuleOrigin { + MODULE, + LIBRARY, + OTHER +} \ No newline at end of file