Module: MilkTea::LSP::Server::ServerLinkedEditingRange

Included in:
MilkTea::LSP::Server
Defined in:
lib/milk_tea/lsp/server/linked_editing_range.rb

Instance Method Summary collapse

Instance Method Details

#handle_linked_editing_range(params) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/milk_tea/lsp/server/linked_editing_range.rb', line 7

def handle_linked_editing_range(params)
  uri = params.dig("textDocument", "uri")
  lsp_line = params.dig("position", "line")
  lsp_char = params.dig("position", "character")
  return nil unless uri && lsp_line && lsp_char

  token = @workspace.find_token_at(uri, lsp_line, lsp_char)
  return nil unless token&.type == :identifier

  facts = @workspace.get_facts(uri)
  return nil unless facts

  binding_id = rename_target_binding_id(uri, token, lsp_line, lsp_char, facts)
  return nil unless binding_id
  return nil unless local_binding_id?(uri, facts, binding_id)

  ranges = scoped_binding_occurrence_ranges(uri, token.lexeme, facts, binding_id, include_declaration: true)
  return nil if ranges.empty?

  {
    ranges: ranges.map do |r|
      {
        start: { line: r[:line] - 1, character: r[:column] - 1 },
        end: { line: r[:line] - 1, character: r[:column] - 1 + r[:length] },
      }
    end,
  }
rescue StandardError => e
  warn "Error in linkedEditingRange handler: #{e.message}"
  nil
end