diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 9edefc8aa81..82178086c8b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -236,6 +236,7 @@ interface ModuleInfo { val name: Name val displayedName: String get() = name.asString() fun dependencies(): List + val expectedBy: ModuleInfo? get() = null val platform: TargetPlatform? get() = null fun modulesWhoseInternalsAreVisible(): Collection = listOf() val capabilities: Map, Any?> 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 2d4bda4cd91..f01199c0706 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 @@ -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("") +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 = 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("") + + 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("") 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() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt new file mode 100644 index 00000000000..b04746683e1 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt @@ -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(KotlinFacetType.INSTANCE, module, name, configuration, null) { + companion object { + fun get(module: Module): KotlinFacet? { + if (module.isDisposed) return null + return FacetManager.getInstance(module).getFacetByType(KotlinFacetType.TYPE_ID) + } + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt new file mode 100644 index 00000000000..4593c6185e7 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt @@ -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 +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt new file mode 100644 index 00000000000..42832f5297e --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt @@ -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 : + FacetType(TYPE_ID, ID, NAME) { + companion object { + const val ID = "kotlin-language" + val TYPE_ID = FacetTypeId(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 +} \ No newline at end of file diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinProjectDescriptorWithFacet.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinProjectDescriptorWithFacet.kt index 41065431223..ffc46d5f3c4 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinProjectDescriptorWithFacet.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinProjectDescriptorWithFacet.kt @@ -22,16 +22,13 @@ import com.intellij.openapi.roots.ContentEntry import com.intellij.openapi.roots.ModifiableRootModel import org.jetbrains.kotlin.config.CompilerSettings import org.jetbrains.kotlin.config.LanguageVersion -import org.jetbrains.kotlin.idea.facet.KotlinFacet -import org.jetbrains.kotlin.idea.facet.KotlinFacetConfiguration -import org.jetbrains.kotlin.idea.facet.KotlinFacetType -import org.jetbrains.kotlin.idea.facet.initializeIfNeeded +import org.jetbrains.kotlin.idea.facet.* import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait import org.jetbrains.kotlin.test.testFramework.runWriteAction class KotlinProjectDescriptorWithFacet( - private val languageVersion: LanguageVersion, - private val multiPlatform: Boolean = false + private val languageVersion: LanguageVersion, + private val multiPlatform: Boolean = false ) : KotlinLightProjectDescriptor() { override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) { configureKotlinFacet(module) { @@ -54,7 +51,7 @@ class KotlinProjectDescriptorWithFacet( fun configureKotlinFacet(module: Module, configureCallback: KotlinFacetConfiguration.() -> Unit = {}): KotlinFacet { val facetManager = FacetManager.getInstance(module) val facetModel = facetManager.createModifiableModel() - val configuration = KotlinFacetConfiguration() + val configuration = KotlinFacetConfigurationImpl() configuration.settings.initializeIfNeeded(module, null) configuration.settings.useProjectSettings = false configuration.configureCallback() diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index c12a4526b73..b193a53f675 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -775,7 +775,7 @@ - + diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt deleted file mode 100644 index f6d2e746997..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacet.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea.facet - -import com.intellij.facet.Facet -import com.intellij.facet.FacetManager.getInstance -import com.intellij.openapi.module.Module - -class KotlinFacet( - module: Module, - name: String, - configuration: KotlinFacetConfiguration -) : Facet(KotlinFacetType.INSTANCE, module, name, configuration, null) { - companion object { - fun get(module: Module): KotlinFacet? { - if (module.isDisposed) return null - return getInstance(module).getFacetByType(KotlinFacetType.TYPE_ID) - } - } -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfigurationImpl.kt similarity index 93% rename from idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt rename to idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfigurationImpl.kt index ad700de6741..55c17cd6b0f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfigurationImpl.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.facet -import com.intellij.facet.FacetConfiguration import com.intellij.facet.ui.FacetEditorContext import com.intellij.facet.ui.FacetEditorTab import com.intellij.facet.ui.FacetValidatorsManager @@ -25,8 +24,8 @@ import org.jetbrains.kotlin.config.KotlinFacetSettings import org.jetbrains.kotlin.config.deserializeFacetSettings import org.jetbrains.kotlin.config.serializeFacetSettings -class KotlinFacetConfiguration : FacetConfiguration { - var settings = KotlinFacetSettings() +class KotlinFacetConfigurationImpl : KotlinFacetConfiguration { + override var settings = KotlinFacetSettings() private set @Suppress("OverridingDeprecatedMember") diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetTypeImpl.kt similarity index 75% rename from idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt rename to idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetTypeImpl.kt index 928ed01570b..0f8c2d95f68 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetType.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetTypeImpl.kt @@ -17,9 +17,6 @@ package org.jetbrains.kotlin.idea.facet import com.intellij.facet.Facet -import com.intellij.facet.FacetType -import com.intellij.facet.FacetTypeId -import com.intellij.facet.FacetTypeRegistry import com.intellij.facet.ui.FacetEditor import com.intellij.openapi.module.JavaModuleType import com.intellij.openapi.module.Module @@ -28,21 +25,13 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.idea.KotlinIcons import javax.swing.Icon -class KotlinFacetType : FacetType(TYPE_ID, ID, NAME) { - companion object { - val TYPE_ID = FacetTypeId("kotlin-language") - val ID = "kotlin-language" - val NAME = "Kotlin" - - val INSTANCE: KotlinFacetType - get() = FacetTypeRegistry.getInstance().findFacetType(TYPE_ID) as KotlinFacetType - } +class KotlinFacetTypeImpl : KotlinFacetType() { override fun isSuitableModuleType(moduleType: ModuleType<*>) = moduleType is JavaModuleType override fun getIcon(): Icon = KotlinIcons.SMALL_LOGO - override fun createDefaultConfiguration() = KotlinFacetConfiguration() + override fun createDefaultConfiguration() = KotlinFacetConfigurationImpl() override fun createFacet( module: Module, diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 0b85fe7c09c..3591af741c1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -123,12 +123,6 @@ val mavenLibraryIdToPlatform: Map> by lazy { .toMap() } -private fun Module.findImplementedModuleName(modelsProvider: IdeModifiableModelsProvider): String? { - val facetModel = modelsProvider.getModifiableFacetModel(this) - val facet = facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName) - return facet?.configuration?.settings?.implementedModuleName -} - private fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsProvider): List { return modelsProvider.modules.filter { module -> module.findImplementedModuleName(modelsProvider) == name @@ -144,11 +138,11 @@ val Module.implementingModules: List }) private fun Module.getModuleInfo(baseModuleSourceInfo: ModuleSourceInfo): ModuleSourceInfo? = - when (baseModuleSourceInfo) { - is ModuleProductionSourceInfo -> productionSourceInfo() - is ModuleTestSourceInfo -> testSourceInfo() - else -> null - } + when (baseModuleSourceInfo) { + is ModuleProductionSourceInfo -> productionSourceInfo() + is ModuleTestSourceInfo -> testSourceInfo() + else -> null + } private fun Module.findImplementingModuleInfos(moduleSourceInfo: ModuleSourceInfo): List { val modelsProvider = IdeModifiableModelsProviderImpl(project) @@ -176,14 +170,11 @@ val ModuleDescriptor.implementingDescriptors: List val ModuleDescriptor.implementedDescriptor: ModuleDescriptor? get() { val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return null - val module = moduleSourceInfo.module - val modelsProvider = IdeModifiableModelsProviderImpl(module.project) - val implementedModuleName = module.findImplementedModuleName(modelsProvider) - val implementedModule = implementedModuleName?.let { modelsProvider.findIdeModule(it) } - val implementedModuleInfo = implementedModule?.getModuleInfo(moduleSourceInfo) + val implementedModuleInfo = moduleSourceInfo.expectedBy return implementedModuleInfo?.let { - KotlinCacheService.getInstance(module.project).getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor + KotlinCacheService.getInstance(moduleSourceInfo.module.project) + .getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor } }