Class: Textbringer::LSP::ServerRegistry

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Class Attribute Details

.server_configsObject (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.expand_path(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.expand_path(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_clientsObject



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