gradle.kts: improve service initializtion
- prevent analyzing .gradle.kts files until all services are loaded - remove services caches where it is not required - replace cached services with cache only during vfs events batch processing - prevent services loading in actions updating
This commit is contained in:
+2
-1
@@ -33,9 +33,10 @@ fun addVfsListener(
|
||||
}
|
||||
|
||||
override fun apply() {
|
||||
val fileChangesProcessor = watcher.fileChangesProcessor
|
||||
changedFiles.forEach {
|
||||
LocalFileSystem.getInstance().findFileByPath(it)?.let { f ->
|
||||
watcher.fileChanged(f.path, f.timeStamp)
|
||||
fileChangesProcessor(f.path, f.timeStamp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-3
@@ -17,19 +17,22 @@ fun addVfsListener(
|
||||
) {
|
||||
VirtualFileManager.getInstance().addAsyncFileListener(
|
||||
object : AsyncFileChangeListenerBase() {
|
||||
var fileChangesProcessor = watcher.fileChangesProcessor
|
||||
|
||||
override fun isRelevant(path: String): Boolean {
|
||||
return buildRootsManager.maybeAffectedGradleProjectFile(path)
|
||||
}
|
||||
|
||||
override fun updateFile(file: VirtualFile, event: VFileEvent) {
|
||||
watcher.fileChanged(event.path, file.timeStamp)
|
||||
fileChangesProcessor(event.path, file.timeStamp)
|
||||
}
|
||||
|
||||
// do nothing
|
||||
override fun prepareFileDeletion(file: VirtualFile) {}
|
||||
override fun apply() {}
|
||||
override fun reset() {}
|
||||
|
||||
override fun reset() {
|
||||
fileChangesProcessor = watcher.fileChangesProcessor
|
||||
}
|
||||
},
|
||||
watcher.project
|
||||
)
|
||||
|
||||
+6
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||
import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModelResolver
|
||||
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRoot
|
||||
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||
import org.jetbrains.plugins.gradle.service.project.GradlePartialResolverPolicy
|
||||
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
|
||||
@@ -98,10 +99,14 @@ class LoadConfigurationAction : AnAction(
|
||||
|
||||
private fun getNotificationVisibility(editor: Editor): Boolean {
|
||||
if (!scriptConfigurationsNeedToBeUpdatedBalloon) return false
|
||||
|
||||
if (DiffUtil.isDiffEditor(editor)) return false
|
||||
|
||||
val project = editor.project ?: return false
|
||||
|
||||
// prevent services initializtion
|
||||
// (all services actually initialized under the ScriptDefinitionProvider during startup activity)
|
||||
if (ScriptDefinitionProvider.getServiceIfCreated(project) == null) return false
|
||||
|
||||
val file = getKotlinScriptFile(editor) ?: return false
|
||||
|
||||
if (autoReloadScriptConfigurations(project, file)) {
|
||||
|
||||
+13
-2
@@ -14,15 +14,26 @@ import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
||||
class GradleScriptListener(project: Project) : ScriptChangeListener(project) {
|
||||
// todo(gradle6): remove
|
||||
private val legacy = GradleLegacyScriptListener(project)
|
||||
private val buildRootsManager = GradleBuildRootsManager.getInstance(project)
|
||||
|
||||
private val buildRootsManager
|
||||
get() = GradleBuildRootsManager.getInstance(project)
|
||||
|
||||
init {
|
||||
// listen changes using VFS events, including gradle-configuration related files
|
||||
addVfsListener(this, buildRootsManager)
|
||||
}
|
||||
|
||||
// cache buildRootsManager service for hot path under vfs changes listener
|
||||
val fileChangesProcessor: (filePath: String, ts: Long) -> Unit
|
||||
get() {
|
||||
val buildRootsManager = buildRootsManager
|
||||
return { filePath, ts ->
|
||||
buildRootsManager.fileChanged(filePath, ts)
|
||||
}
|
||||
}
|
||||
|
||||
fun fileChanged(filePath: String, ts: Long) =
|
||||
buildRootsManager.fileChanged(filePath, ts)
|
||||
fileChangesProcessor(filePath, ts)
|
||||
|
||||
override fun isApplicable(vFile: VirtualFile) =
|
||||
// todo(gradle6): replace with `isCustomScriptingSupport(vFile)`
|
||||
|
||||
+2
-1
@@ -27,7 +27,8 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||
* TODO(gradle6): remove
|
||||
*/
|
||||
class GradleLegacyScriptConfigurationLoader(project: Project) : DefaultScriptConfigurationLoader(project) {
|
||||
private val buildRootsManager = GradleBuildRootsManager.getInstance(project)
|
||||
private val buildRootsManager
|
||||
get() = GradleBuildRootsManager.getInstance(project)
|
||||
|
||||
override fun interceptBackgroundLoading(file: VirtualFile, isFirstLoad: Boolean, doLoad: () -> Unit): Boolean {
|
||||
if (!isGradleKotlinScript(file)) return false
|
||||
|
||||
+2
-1
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
|
||||
// called from GradleScriptListener
|
||||
// todo(gradle6): remove
|
||||
class GradleLegacyScriptListener(project: Project) : ScriptChangeListener(project) {
|
||||
private val buildRootsManager = GradleBuildRootsManager.getInstance(project)
|
||||
private val buildRootsManager
|
||||
get() = GradleBuildRootsManager.getInstance(project)
|
||||
|
||||
override fun isApplicable(vFile: VirtualFile) =
|
||||
isGradleKotlinScript(vFile)
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
||||
import org.jetbrains.kotlin.idea.core.script.configuration.CompositeScriptConfigurationManager
|
||||
import org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptingSupport
|
||||
import org.jetbrains.kotlin.idea.core.script.configuration.ScriptingSupport
|
||||
import org.jetbrains.kotlin.idea.core.script.configuration.ScriptingSupport.Companion.EPN
|
||||
import org.jetbrains.kotlin.idea.core.script.ucache.ScriptClassRootsBuilder
|
||||
import org.jetbrains.kotlin.idea.core.util.EDT
|
||||
import org.jetbrains.kotlin.idea.scripting.gradle.*
|
||||
@@ -456,6 +455,6 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(),
|
||||
|
||||
companion object {
|
||||
fun getInstance(project: Project): GradleBuildRootsManager =
|
||||
EPN.getPoint(project).extensionList.firstIsInstance()
|
||||
ScriptingSupport.EPN.findExtensionOrFail(GradleBuildRootsManager::class.java, project)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user