Provide dependency on buildSrc module for .gradle.kts files

#KT-23603 Fixed
#KT-14862 Fixed
#KT-24623 Fixed
#KT-25354 Fixed
This commit is contained in:
Natalia Selezneva
2018-08-09 13:37:23 +03:00
parent 285620cb28
commit 6decd06b1b
10 changed files with 117 additions and 12 deletions
@@ -15,6 +15,7 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.NonClasspathDirectoriesScope
import com.intellij.util.containers.SLRUCache
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.script.KotlinScriptDefinition
@@ -35,18 +36,20 @@ data class ScriptModuleInfo(
override val moduleOrigin: ModuleOrigin
get() = ModuleOrigin.OTHER
val relatedModuleSourceInfo: ModuleSourceInfo?
get() = getScriptRelatedModuleInfo(project, scriptFile)
override val name: Name = Name.special("<script ${scriptFile.name} ${scriptDefinition.name}>")
override fun contentScope() = GlobalSearchScope.fileScope(project, scriptFile)
override fun dependencies(): List<IdeaModuleInfo> {
return arrayListOf<IdeaModuleInfo>(this).apply {
val scriptDependentModules = ScriptRelatedModulesProvider.getRelatedModules(scriptFile, project)
if (scriptDependentModules.isNotEmpty()) {
addAll(scriptDependentModules.mapNotNull { it.productionSourceInfo() ?: it.testSourceInfo() })
}
val dependenciesInfo = ScriptDependenciesInfo.ForFile(project, scriptFile, scriptDefinition)
add(dependenciesInfo)
relatedModuleSourceInfo?.let { addAll(it.dependencies()) }
dependenciesInfo.sdk?.let { add(SdkInfo(project, it)) }
}
}
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
import org.jetbrains.kotlin.idea.caches.resolve.util.contextWithNewLockAndCompositeExceptionTracker
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.project.outOfBlockModificationCount
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
@@ -58,8 +59,6 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.sumByLong
import java.lang.AssertionError
import java.lang.IllegalStateException
internal val LOG = Logger.getInstance(KotlinCacheService::class.java)
@@ -111,12 +110,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
)
val scriptFile = (dependenciesModuleInfo as? ScriptDependenciesInfo.ForFile)?.scriptFile
val relatedModuleSourceInfo = scriptFile?.let { getScriptRelatedModuleInfo(project, it) }
val globalFacade = if (relatedModuleSourceInfo != null) {
globalFacade(settings)
} else {
getOrBuildGlobalFacade(settings).facadeForSdk
}
val relatedModules = scriptFile?.let { ScriptRelatedModulesProvider.getRelatedModules(it, project) }
val globalFacade =
if (relatedModules?.isNotEmpty() == true) {
globalFacade(settings)
} else {
getOrBuildGlobalFacade(settings).facadeForSdk
}
val globalContext = globalFacade.globalContext.contextWithNewLockAndCompositeExceptionTracker()
return ProjectResolutionFacade(
@@ -0,0 +1,27 @@
/*
* Copyright 2010-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.core.script.dependencies
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
abstract class ScriptRelatedModulesProvider {
abstract fun getRelatedModules(file: VirtualFile, project: Project): List<Module>
companion object {
private val EP_NAME: ExtensionPointName<ScriptRelatedModulesProvider> =
ExtensionPointName.create<ScriptRelatedModulesProvider>("org.jetbrains.kotlin.scriptRelatedModulesProvider")
fun getRelatedModules(file: VirtualFile, project: Project): List<Module> {
return Extensions.getArea(project).getExtensionPoint(EP_NAME).extensions
.filterIsInstance<ScriptRelatedModulesProvider>()
.flatMap { it.getRelatedModules(file, project) }
}
}
}
@@ -0,0 +1,36 @@
/*
* Copyright 2010-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.core.script
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider
import org.jetbrains.kotlin.idea.util.projectStructure.getModule
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
import org.jetbrains.plugins.gradle.util.GradleConstants
class GradleBuildSrcModuleDependencyProvider : ScriptRelatedModulesProvider() {
override fun getRelatedModules(file: VirtualFile, project: Project): List<Module> {
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull()
?: return emptyList()
val includedModulesPath: List<String> = projectSettings.compositeBuild?.compositeParticipants?.mapNotNull { part ->
projectSettings.modules.find { it == part.rootPath }
} ?: emptyList()
val moduleForScript = ExternalSystemApiUtil.getExternalProjectPath(file.getModule(project))
val buildSrcProjectPath = "$moduleForScript/buildSrc"
return (includedModulesPath + buildSrcProjectPath).flatMap { path ->
ModuleManager.getInstance(project).modules.filter {
ExternalSystemApiUtil.getExternalProjectPath(it) == path
}
}
}
}
@@ -0,0 +1,26 @@
/*
* Copyright 2010-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.scratch
import com.intellij.ide.scratch.ScratchFileService
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider
import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName
class ScratchModuleDependencyProvider : ScriptRelatedModulesProvider() {
override fun getRelatedModules(file: VirtualFile, project: Project): List<Module> {
if (ScratchFileService.isInScratchRoot(file)) {
val scratchModule = file.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) }
if (scratchModule != null) {
return listOf(scratchModule)
}
}
return emptyList()
}
}
+5
View File
@@ -42,6 +42,10 @@
interface="org.jetbrains.kotlin.platform.IdePlatformKind"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.idePlatformKindTooling"
interface="org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptRelatedModulesProvider"
interface="org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider"
area="IDEA_PROJECT"/>
</extensionPoints>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
@@ -68,5 +72,6 @@
<idePlatformKindResolution implementation="org.jetbrains.kotlin.caches.resolve.CommonPlatformKindResolution"/>
<scratchFileLanguageProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.scratch.KtScratchFileLanguageProvider"/>
<scriptRelatedModulesProvider implementation="org.jetbrains.kotlin.idea.scratch.ScratchModuleDependencyProvider"/>
</extensions>
</idea-plugin>
@@ -34,6 +34,10 @@
interface="org.jetbrains.kotlin.platform.IdePlatformKind"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.idePlatformKindTooling"
interface="org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptRelatedModulesProvider"
interface="org.jetbrains.kotlin.idea.core.script.dependencies.ScriptRelatedModulesProvider"
area="IDEA_PROJECT"/>
</extensionPoints>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
@@ -60,5 +64,6 @@
<idePlatformKindResolution implementation="org.jetbrains.kotlin.caches.resolve.CommonPlatformKindResolution"/>
<scratchFileLanguageProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.scratch.KtScratchFileLanguageProvider"/>
<scriptRelatedModulesProvider implementation="org.jetbrains.kotlin.idea.scratch.ScratchModuleDependencyProvider"/>
</extensions>
</idea-plugin>
+1
View File
@@ -78,6 +78,7 @@
<gradleModelFacade implementation="org.jetbrains.kotlin.idea.inspections.gradle.DefaultGradleModelFacade"/>
<scriptDefinitionContributor implementation="org.jetbrains.kotlin.idea.core.script.GradleScriptDefinitionsContributor" order="first"/>
<scriptRelatedModulesProvider implementation="org.jetbrains.kotlin.idea.core.script.GradleBuildSrcModuleDependencyProvider"/>
<moduleBuilder implementation="org.jetbrains.kotlin.ide.konan.gradle.KotlinGradleNativeMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
+1
View File
@@ -77,6 +77,7 @@
<gradleModelFacade implementation="org.jetbrains.kotlin.idea.inspections.gradle.DefaultGradleModelFacade"/>
<scriptDefinitionContributor implementation="org.jetbrains.kotlin.idea.core.script.GradleScriptDefinitionsContributor" order="first"/>
<scriptRelatedModulesProvider implementation="org.jetbrains.kotlin.idea.core.script.GradleBuildSrcModuleDependencyProvider"/>
<moduleBuilder implementation="org.jetbrains.kotlin.ide.konan.gradle.KotlinGradleNativeMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
+1
View File
@@ -86,6 +86,7 @@
<gradleModelFacade implementation="org.jetbrains.kotlin.idea.inspections.gradle.DefaultGradleModelFacade"/>
<scriptDefinitionContributor implementation="org.jetbrains.kotlin.idea.core.script.GradleScriptDefinitionsContributor" order="first"/>
<scriptRelatedModulesProvider implementation="org.jetbrains.kotlin.idea.core.script.GradleBuildSrcModuleDependencyProvider"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSharedMultiplatformModuleBuilder"/>