override fun fileOpened()

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))
            }
        }
    }