Class: Textbringer::LSP::ServerRegistry
- Inherits:
-
Object
- Object
- Textbringer::LSP::ServerRegistry
- Defined in:
- lib/textbringer/lsp/server_registry.rb
Constant Summary collapse
- PROJECT_ROOT_MARKERS =
Project root marker files/directories
%w[ .git .hg .svn Gemfile package.json Cargo.toml go.mod setup.py pyproject.toml Makefile CMakeLists.txt ].freeze
Class Attribute Summary collapse
-
.server_configs ⇒ Object
readonly
Returns the value of attribute server_configs.
Class Method Summary collapse
- .find_config_for_buffer(buffer) ⇒ Object
- .find_project_root(file_path) ⇒ Object
- .get_client_for_buffer(buffer) ⇒ Object
- .language_id_for_buffer(buffer) ⇒ Object
- .register(language_id, command:, args: [], file_patterns: [], interpreter_patterns: [], mode: nil) ⇒ Object
- .stop_all_clients ⇒ Object
- .stop_client_for_buffer(buffer) ⇒ Object
- .unregister(language_id) ⇒ Object
Class Attribute Details
.server_configs ⇒ Object (readonly)
Returns the value of attribute server_configs.
23 24 25 |
# File 'lib/textbringer/lsp/server_registry.rb', line 23 def server_configs @server_configs end |
Class Method Details
.find_config_for_buffer(buffer) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/textbringer/lsp/server_registry.rb', line 51 def find_config_for_buffer(buffer) mode_name = buffer.mode&.name @server_configs.find do |config| if config.mode && mode_name config.mode == mode_name elsif buffer.file_name && !config.file_patterns.empty? config.file_patterns.any? { |pattern| pattern.match?(buffer.file_name) } else false end end end |
.find_project_root(file_path) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/textbringer/lsp/server_registry.rb', line 102 def find_project_root(file_path) dir = File.dirname(File.(file_path)) while dir != "/" if PROJECT_ROOT_MARKERS.any? { |marker| File.exist?(File.join(dir, marker)) } return dir end parent = File.dirname(dir) break if parent == dir dir = parent end # Fallback to the file's directory File.dirname(File.(file_path)) end |
.get_client_for_buffer(buffer) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/textbringer/lsp/server_registry.rb', line 65 def get_client_for_buffer(buffer) config = find_config_for_buffer(buffer) return nil unless config root_path = find_project_root(buffer.file_name || Dir.pwd) client_key = "#{config.language_id}:#{root_path}" @clients[client_key] ||= begin client = Client.new( command: config.command, args: config.args, root_path: root_path, server_name: config.language_id ) client.start client end end |
.language_id_for_buffer(buffer) ⇒ Object
118 119 120 121 |
# File 'lib/textbringer/lsp/server_registry.rb', line 118 def language_id_for_buffer(buffer) config = find_config_for_buffer(buffer) config&.language_id end |
.register(language_id, command:, args: [], file_patterns: [], interpreter_patterns: [], mode: nil) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/textbringer/lsp/server_registry.rb', line 25 def register(language_id, command:, args: [], file_patterns: [], interpreter_patterns: [], mode: nil) config = ServerConfig.new( language_id: language_id, command: command, args: args, file_patterns: file_patterns, interpreter_patterns: interpreter_patterns, mode: mode ) @server_configs << config config end |
.stop_all_clients ⇒ Object
95 96 97 98 99 100 |
# File 'lib/textbringer/lsp/server_registry.rb', line 95 def stop_all_clients @clients.each_value do |client| client.stop rescue nil end @clients.clear end |
.stop_client_for_buffer(buffer) ⇒ Object
84 85 86 87 88 89 90 91 92 93 |
# File 'lib/textbringer/lsp/server_registry.rb', line 84 def stop_client_for_buffer(buffer) config = find_config_for_buffer(buffer) return unless config root_path = find_project_root(buffer.file_name || Dir.pwd) client_key = "#{config.language_id}:#{root_path}" client = @clients.delete(client_key) client&.stop end |
.unregister(language_id) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/textbringer/lsp/server_registry.rb', line 38 def unregister(language_id) @server_configs.reject! { |c| c.language_id == language_id } # Stop any running clients for this language @clients.delete_if do |key, client| if key.start_with?("#{language_id}:") client.stop rescue nil true else false end end end |