-
Notifications
You must be signed in to change notification settings - Fork 192
/
Copy pathworkspace_symbol.rb
60 lines (51 loc) · 2.2 KB
/
workspace_symbol.rb
1
2
3
4
5
6
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# typed: strict
# frozen_string_literal: true
module RubyLsp
module Requests
# The [workspace symbol](https://microsoft.github.io/language-server-protocol/specification#workspace_symbol)
# request allows fuzzy searching declarations in the entire project. On VS Code, use CTRL/CMD + T to search for
# symbols.
class WorkspaceSymbol < Request
extend T::Sig
include Support::Common
sig { params(global_state: GlobalState, query: T.nilable(String)).void }
def initialize(global_state, query)
super()
@global_state = global_state
@query = query
@index = T.let(global_state.index, RubyIndexer::Index)
end
sig { override.returns(T::Array[Interface::WorkspaceSymbol]) }
def perform
@index.fuzzy_search(@query).filter_map do |entry|
uri = entry.uri
file_path = T.must(uri.full_path)
# We only show symbols declared in the workspace
in_dependencies = !not_in_dependencies?(file_path)
next if in_dependencies
# We should never show private symbols when searching the entire workspace
next if entry.private?
kind = kind_for_entry(entry)
loc = entry.location
# We use the namespace as the container name, but we also use the full name as the regular name. The reason we
# do this is to allow people to search for fully qualified names (e.g.: `Foo::Bar`). If we only included the
# short name `Bar`, then searching for `Foo::Bar` would not return any results
*container, _short_name = entry.name.split("::")
external_uri = @global_state.to_external_uri(uri)
Interface::WorkspaceSymbol.new(
name: entry.name,
container_name: container.join("::"),
kind: kind,
location: Interface::Location.new(
uri: external_uri.to_s,
range: Interface::Range.new(
start: Interface::Position.new(line: loc.start_line - 1, character: loc.start_column),
end: Interface::Position.new(line: loc.end_line - 1, character: loc.end_column),
),
),
)
end
end
end
end
end