in rider/src/main/kotlin/com/jetbrains/rider/plugins/godot/lang/service/GodotLspServerSupportProvider.kt [65:108]
override fun fileOpened(project: Project, file: VirtualFile, serverStarter: LspServerSupportProvider.LspServerStarter) {
if (Util.isGdFile(file)) {
val discoverer = GodotProjectDiscoverer.getInstance(project)
val lspService = GodotLspProjectService.getInstance(project)
// subscribe one time to everything
if (lspService.isScheduled.compareAndSet(false, true)){
val pluginLifetime = GodotProjectLifetimeService.getLifetime(project)
pluginLifetime.async(Dispatchers.IO) {
discoverer.lspConnectionMode.adviseNotNull(pluginLifetime) { lspConnectionMode ->
if (lspConnectionMode == LanguageServerConnectionMode.Never) {
LspServerManager.getInstance(project).stopServers(GodotLspServerSupportProvider::class.java)
}
else
scheduleStartIfNeeded(project)
}
discoverer.useDynamicPort.adviseNotNull(pluginLifetime) {
scheduleStartIfNeeded(project)
}
discoverer.godotDescriptor.adviseNotNull(pluginLifetime) {
scheduleStartIfNeeded(project)
}
discoverer.godotPath.adviseNotNull(pluginLifetime) {
scheduleStartIfNeeded(project)
}
// RIDER-127016 Trigger Godot LSP reconnect with Editor start
discoverer.projectMetadataModificationSignal.adviseNotNull(pluginLifetime) {
if (discoverer.lspConnectionMode.value == LanguageServerConnectionMode.ConnectRunningEditor) {
scheduleStartIfNeeded(project)
}
}
}
}
// start, it is ok to call multiple times, but not too often
if (allReady(discoverer)) {
thisLogger().info("ensureServerStarted")
// this does not start a server if the `fileOpened` has already ended
serverStarter.ensureServerStarted(GodotLspServerDescriptor(project))
}
}
}