IDE facet refactoring, ModuleInfo.expectedBy introduced.
Part of facet classes was extracted to idea-analysis module Related to KT-21771
This commit is contained in:
+44
-14
@@ -5,6 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.caches.resolve
|
||||
|
||||
import com.intellij.facet.*
|
||||
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
|
||||
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.module.impl.scopes.LibraryScopeBase
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -27,6 +30,8 @@ import org.jetbrains.kotlin.caches.resolve.LibraryModuleInfo
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
|
||||
import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
|
||||
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
|
||||
import org.jetbrains.kotlin.idea.facet.KotlinFacetType.Companion.ID
|
||||
import org.jetbrains.kotlin.idea.framework.getLibraryPlatform
|
||||
import org.jetbrains.kotlin.idea.project.KotlinModuleModificationTracker
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
@@ -110,9 +115,25 @@ private fun ideaModelDependencies(module: Module, forProduction: Boolean): List<
|
||||
return result.toList()
|
||||
}
|
||||
|
||||
fun Module.findImplementedModuleName(modelsProvider: IdeModifiableModelsProvider): String? {
|
||||
val facetModel = modelsProvider.getModifiableFacetModel(this)
|
||||
val facet = facetModel.findFacet(
|
||||
KotlinFacetType.TYPE_ID,
|
||||
FacetTypeRegistry.getInstance().findFacetType(ID)!!.defaultFacetName
|
||||
)
|
||||
return facet?.configuration?.settings?.implementedModuleName
|
||||
}
|
||||
|
||||
fun Module.findImplementedModule(modelsProvider: IdeModifiableModelsProvider): Module? {
|
||||
val implementedModuleName = findImplementedModuleName(modelsProvider)
|
||||
return implementedModuleName?.let { modelsProvider.findIdeModule(it) }
|
||||
}
|
||||
|
||||
interface ModuleSourceInfo : IdeaModuleInfo, TrackableModuleInfo {
|
||||
val module: Module
|
||||
|
||||
override val expectedBy: ModuleSourceInfo?
|
||||
|
||||
override val displayedName get() = module.name
|
||||
|
||||
override val moduleOrigin: ModuleOrigin
|
||||
@@ -125,32 +146,41 @@ interface ModuleSourceInfo : IdeaModuleInfo, TrackableModuleInfo {
|
||||
KotlinModuleModificationTracker(module)
|
||||
}
|
||||
|
||||
data class ModuleProductionSourceInfo internal constructor(override val module: Module) : ModuleSourceInfo {
|
||||
override val name = Name.special("<production sources for module ${module.name}>")
|
||||
sealed class ModuleSourceInfoWithExpectedBy(private val forProduction: Boolean) : ModuleSourceInfo {
|
||||
override val expectedBy: ModuleSourceInfo?
|
||||
get() {
|
||||
val modelsProvider = IdeModifiableModelsProviderImpl(module.project)
|
||||
val expectedByModule = module.findImplementedModule(modelsProvider)
|
||||
return if (forProduction) expectedByModule?.productionSourceInfo() else expectedByModule?.testSourceInfo()
|
||||
}
|
||||
|
||||
override fun contentScope(): GlobalSearchScope = ModuleProductionSourceScope(module)
|
||||
|
||||
override fun dependencies() = module.cached(CachedValueProvider {
|
||||
override fun dependencies(): List<IdeaModuleInfo> = module.cached(CachedValueProvider {
|
||||
CachedValueProvider.Result(
|
||||
ideaModelDependencies(module, forProduction = true),
|
||||
ProjectRootModificationTracker.getInstance(module.project))
|
||||
ideaModelDependencies(module, forProduction),
|
||||
ProjectRootModificationTracker.getInstance(module.project))
|
||||
})
|
||||
}
|
||||
|
||||
data class ModuleProductionSourceInfo internal constructor(
|
||||
override val module: Module
|
||||
) : ModuleSourceInfoWithExpectedBy(forProduction = true) {
|
||||
|
||||
override val name = Name.special("<production sources for module ${module.name}>")
|
||||
|
||||
override fun contentScope(): GlobalSearchScope = ModuleProductionSourceScope(module)
|
||||
}
|
||||
|
||||
//TODO: (module refactoring) do not create ModuleTestSourceInfo when there are no test roots for module
|
||||
data class ModuleTestSourceInfo internal constructor(override val module: Module) : ModuleSourceInfo {
|
||||
data class ModuleTestSourceInfo internal constructor(
|
||||
override val module: Module
|
||||
) : ModuleSourceInfoWithExpectedBy(forProduction = false) {
|
||||
|
||||
override val name = Name.special("<test sources for module ${module.name}>")
|
||||
|
||||
override val displayedName get() = module.name + " (test)"
|
||||
|
||||
override fun contentScope(): GlobalSearchScope = ModuleTestSourceScope(module)
|
||||
|
||||
override fun dependencies() = module.cached(CachedValueProvider {
|
||||
CachedValueProvider.Result(
|
||||
ideaModelDependencies(module, forProduction = false),
|
||||
ProjectRootModificationTracker.getInstance(module.project))
|
||||
})
|
||||
|
||||
override fun modulesWhoseInternalsAreVisible() = module.cached(CachedValueProvider {
|
||||
val list = SmartList<ModuleInfo>()
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.facet
|
||||
|
||||
import com.intellij.facet.Facet
|
||||
import com.intellij.facet.FacetManager
|
||||
import com.intellij.facet.FacetTypeRegistry
|
||||
import com.intellij.openapi.module.Module
|
||||
|
||||
class KotlinFacet(
|
||||
module: Module,
|
||||
name: String,
|
||||
configuration: KotlinFacetConfiguration
|
||||
) : Facet<KotlinFacetConfiguration>(KotlinFacetType.INSTANCE, module, name, configuration, null) {
|
||||
companion object {
|
||||
fun get(module: Module): KotlinFacet? {
|
||||
if (module.isDisposed) return null
|
||||
return FacetManager.getInstance(module).getFacetByType<KotlinFacet>(KotlinFacetType.TYPE_ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.facet
|
||||
|
||||
import com.intellij.facet.FacetConfiguration
|
||||
import org.jetbrains.kotlin.config.KotlinFacetSettings
|
||||
|
||||
interface KotlinFacetConfiguration : FacetConfiguration {
|
||||
val settings: KotlinFacetSettings
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.facet
|
||||
|
||||
import com.intellij.facet.FacetType
|
||||
import com.intellij.facet.FacetTypeId
|
||||
import com.intellij.facet.FacetTypeRegistry
|
||||
import com.intellij.openapi.module.JavaModuleType
|
||||
import com.intellij.openapi.module.ModuleType
|
||||
import org.jetbrains.kotlin.idea.KotlinIcons
|
||||
import javax.swing.Icon
|
||||
|
||||
abstract class KotlinFacetType<C : KotlinFacetConfiguration> :
|
||||
FacetType<KotlinFacet, C>(TYPE_ID, ID, NAME) {
|
||||
companion object {
|
||||
const val ID = "kotlin-language"
|
||||
val TYPE_ID = FacetTypeId<KotlinFacet>(ID)
|
||||
const val NAME = "Kotlin"
|
||||
|
||||
val INSTANCE
|
||||
get() = FacetTypeRegistry.getInstance().findFacetType(TYPE_ID)
|
||||
}
|
||||
|
||||
override fun isSuitableModuleType(moduleType: ModuleType<*>) = moduleType is JavaModuleType
|
||||
|
||||
override fun getIcon(): Icon = KotlinIcons.SMALL_LOGO
|
||||
}
|
||||
Reference in New Issue
Block a user