ruby-lsp 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,88 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Requests
6
+ # ![Path completion demo](../../misc/path_completion.gif)
7
+ #
8
+ # The [completion](https://microsoft.github.io/language-server-protocol/specification#textDocument_completion)
9
+ # request looks up Ruby files in the $LOAD_PATH to suggest path completion inside `require` statements.
10
+ #
11
+ # # Example
12
+ #
13
+ # ```ruby
14
+ # require "ruby_lsp/requests" # --> completion: suggests `base_request`, `code_actions`, ...
15
+ # ```
16
+ class PathCompletion < BaseRequest
17
+ extend T::Sig
18
+
19
+ sig { params(document: Document, position: Document::PositionShape).void }
20
+ def initialize(document, position)
21
+ super(document)
22
+
23
+ @tree = T.let(Support::PrefixTree.new(collect_load_path_files), Support::PrefixTree)
24
+
25
+ char_position = document.create_scanner.find_char_position(position)
26
+ @target = T.let(find(char_position), T.nilable(SyntaxTree::TStringContent))
27
+ end
28
+
29
+ sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::CompletionItem], Object)) }
30
+ def run
31
+ # no @target means the we are not inside a `require` call
32
+ return [] unless @target
33
+
34
+ text = @target.value
35
+ @tree.search(text).sort.map! do |path|
36
+ build_completion(path, path.delete_prefix(text))
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ sig { returns(T::Array[String]) }
43
+ def collect_load_path_files
44
+ $LOAD_PATH.flat_map do |p|
45
+ Dir.glob("**/*.rb", base: p)
46
+ end.map! do |result|
47
+ result.delete_suffix!(".rb")
48
+ end
49
+ end
50
+
51
+ sig { params(position: Integer).returns(T.nilable(SyntaxTree::TStringContent)) }
52
+ def find(position)
53
+ matched, parent = locate(
54
+ T.must(@document.tree),
55
+ position,
56
+ node_types: [SyntaxTree::Command, SyntaxTree::CommandCall, SyntaxTree::CallNode],
57
+ )
58
+
59
+ return unless matched && parent
60
+
61
+ case matched
62
+ when SyntaxTree::Command, SyntaxTree::CallNode, SyntaxTree::CommandCall
63
+ return unless matched.message.value == "require"
64
+
65
+ args = matched.arguments
66
+ args = args.arguments if args.is_a?(SyntaxTree::ArgParen)
67
+
68
+ path_node = args.parts.first.parts.first
69
+ return unless path_node
70
+ return unless (path_node.location.start_char..path_node.location.end_char).cover?(position)
71
+
72
+ path_node
73
+ end
74
+ end
75
+
76
+ sig do
77
+ params(label: String, insert_text: String).returns(LanguageServer::Protocol::Interface::CompletionItem)
78
+ end
79
+ def build_completion(label, insert_text)
80
+ LanguageServer::Protocol::Interface::CompletionItem.new(
81
+ label: label,
82
+ insert_text: insert_text,
83
+ kind: LanguageServer::Protocol::Constant::CompletionItemKind::REFERENCE,
84
+ )
85
+ end
86
+ end
87
+ end
88
+ end
@@ -20,7 +20,7 @@ module RubyLsp
20
20
  # ```
21
21
  class SemanticHighlighting < BaseRequest
22
22
  extend T::Sig
23
- include SyntaxTree::WithEnvironment
23
+ include SyntaxTree::WithScope
24
24
 
25
25
  TOKEN_TYPES = T.let(
26
26
  {
@@ -78,11 +78,28 @@ module RubyLsp
78
78
  T::Array[String],
79
79
  )
80
80
 
81
- class SemanticToken < T::Struct
82
- const :location, SyntaxTree::Location
83
- const :length, Integer
84
- const :type, Integer
85
- const :modifier, T::Array[Integer]
81
+ class SemanticToken
82
+ extend T::Sig
83
+
84
+ sig { returns(SyntaxTree::Location) }
85
+ attr_reader :location
86
+
87
+ sig { returns(Integer) }
88
+ attr_reader :length
89
+
90
+ sig { returns(Integer) }
91
+ attr_reader :type
92
+
93
+ sig { returns(T::Array[Integer]) }
94
+ attr_reader :modifier
95
+
96
+ sig { params(location: SyntaxTree::Location, length: Integer, type: Integer, modifier: T::Array[Integer]).void }
97
+ def initialize(location:, length:, type:, modifier:)
98
+ @location = location
99
+ @length = length
100
+ @type = type
101
+ @modifier = modifier
102
+ end
86
103
  end
87
104
 
88
105
  sig do
@@ -126,8 +143,10 @@ module RubyLsp
126
143
  visit(node.receiver)
127
144
 
128
145
  message = node.message
129
- unless message == :call || special_method?(message.value)
130
- add_token(message.location, :method)
146
+ if message != :call && !special_method?(message.value)
147
+ type = Support::Sorbet.annotation?(node) ? :type : :method
148
+
149
+ add_token(message.location, type)
131
150
  end
132
151
 
133
152
  visit(node.arguments)
@@ -137,7 +156,9 @@ module RubyLsp
137
156
  def visit_command(node)
138
157
  return super unless visible?(node, @range)
139
158
 
140
- add_token(node.message.location, :method) unless special_method?(node.message.value)
159
+ unless special_method?(node.message.value)
160
+ add_token(node.message.location, :method)
161
+ end
141
162
  visit(node.arguments)
142
163
  end
143
164
 
@@ -243,7 +264,10 @@ module RubyLsp
243
264
  def visit_vcall(node)
244
265
  return super unless visible?(node, @range)
245
266
 
246
- add_token(node.value.location, :method) unless special_method?(node.value.value)
267
+ return if special_method?(node.value.value)
268
+
269
+ type = Support::Sorbet.annotation?(node) ? :type : :method
270
+ add_token(node.value.location, type)
247
271
  end
248
272
 
249
273
  sig { override.params(node: SyntaxTree::ClassDeclaration).void }
@@ -305,7 +329,7 @@ module RubyLsp
305
329
 
306
330
  sig { params(value: SyntaxTree::Ident).returns(Symbol) }
307
331
  def type_for_local(value)
308
- local = current_environment.find_local(value.value)
332
+ local = current_scope.find_local(value.value)
309
333
 
310
334
  if local.nil? || local.type == :variable
311
335
  :variable
@@ -0,0 +1,46 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Requests
6
+ module Support
7
+ class Annotation
8
+ extend T::Sig
9
+ sig do
10
+ params(
11
+ arity: T.any(Integer, T::Range[Integer]),
12
+ receiver: T::Boolean,
13
+ ).void
14
+ end
15
+ def initialize(arity:, receiver: false)
16
+ @arity = arity
17
+ @receiver = receiver
18
+ end
19
+
20
+ sig { returns(T.any(Integer, T::Range[Integer])) }
21
+ attr_reader :arity
22
+
23
+ sig { returns(T::Boolean) }
24
+ attr_reader :receiver
25
+
26
+ sig { params(arity: T.any(T::Range[Integer], Integer)).returns(T::Boolean) }
27
+ def supports_arity?(arity)
28
+ if @arity.is_a?(Integer)
29
+ @arity == arity
30
+ elsif @arity.is_a?(Range)
31
+ @arity.cover?(arity)
32
+ else
33
+ T.absurd(@arity)
34
+ end
35
+ end
36
+
37
+ sig { params(receiver: T.nilable(String)).returns(T::Boolean) }
38
+ def supports_receiver?(receiver)
39
+ return receiver.nil? || receiver.empty? if @receiver == false
40
+
41
+ receiver == "T"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -10,9 +10,20 @@ module RubyLsp
10
10
  READ = LanguageServer::Protocol::Constant::DocumentHighlightKind::READ
11
11
  WRITE = LanguageServer::Protocol::Constant::DocumentHighlightKind::WRITE
12
12
 
13
- class HighlightMatch < T::Struct
14
- const :type, Integer
15
- const :node, SyntaxTree::Node
13
+ class HighlightMatch
14
+ extend T::Sig
15
+
16
+ sig { returns(Integer) }
17
+ attr_reader :type
18
+
19
+ sig { returns(SyntaxTree::Node) }
20
+ attr_reader :node
21
+
22
+ sig { params(type: Integer, node: SyntaxTree::Node).void }
23
+ def initialize(type:, node:)
24
+ @type = type
25
+ @node = node
26
+ end
16
27
  end
17
28
 
18
29
  sig { params(node: SyntaxTree::Node).void }
@@ -0,0 +1,80 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Requests
6
+ module Support
7
+ class PrefixTree
8
+ extend T::Sig
9
+
10
+ sig { params(items: T::Array[String]).void }
11
+ def initialize(items)
12
+ @root = T.let(Node.new(""), Node)
13
+
14
+ items.each do |item|
15
+ insert(item)
16
+ end
17
+ end
18
+
19
+ sig { params(prefix: String).returns(T::Array[String]) }
20
+ def search(prefix)
21
+ node = T.let(@root, Node)
22
+
23
+ prefix.each_char do |char|
24
+ snode = node.children[char]
25
+ return [] unless snode
26
+
27
+ node = snode
28
+ end
29
+
30
+ node.collect
31
+ end
32
+
33
+ private
34
+
35
+ sig { params(item: String).void }
36
+ def insert(item)
37
+ node = T.let(@root, Node)
38
+
39
+ item.each_char do |char|
40
+ node = node.children[char] ||= Node.new(node.value + char)
41
+ end
42
+
43
+ node.leaf = true
44
+ end
45
+
46
+ class Node
47
+ extend T::Sig
48
+
49
+ sig { returns(T::Hash[String, Node]) }
50
+ attr_reader :children
51
+
52
+ sig { returns(String) }
53
+ attr_reader :value
54
+
55
+ sig { returns(T::Boolean) }
56
+ attr_accessor :leaf
57
+
58
+ sig { params(value: String).void }
59
+ def initialize(value)
60
+ @children = T.let({}, T::Hash[String, Node])
61
+ @value = T.let(value, String)
62
+ @leaf = T.let(false, T::Boolean)
63
+ end
64
+
65
+ sig { returns(T::Array[String]) }
66
+ def collect
67
+ result = T.let([], T::Array[String])
68
+ result << value if leaf
69
+
70
+ children.each_value do |node|
71
+ result.concat(node.collect)
72
+ end
73
+
74
+ result
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -9,52 +9,35 @@ module RubyLsp
9
9
 
10
10
  RUBOCOP_TO_LSP_SEVERITY = T.let(
11
11
  {
12
- convention: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
13
- info: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
14
- refactor: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
15
- warning: LanguageServer::Protocol::Constant::DiagnosticSeverity::WARNING,
16
- error: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
17
- fatal: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
12
+ convention: Constant::DiagnosticSeverity::INFORMATION,
13
+ info: Constant::DiagnosticSeverity::INFORMATION,
14
+ refactor: Constant::DiagnosticSeverity::INFORMATION,
15
+ warning: Constant::DiagnosticSeverity::WARNING,
16
+ error: Constant::DiagnosticSeverity::ERROR,
17
+ fatal: Constant::DiagnosticSeverity::ERROR,
18
18
  }.freeze,
19
19
  T::Hash[Symbol, Integer],
20
20
  )
21
21
 
22
- sig { returns(T::Array[LanguageServer::Protocol::Interface::TextEdit]) }
23
- attr_reader :replacements
24
-
25
22
  sig { params(offense: RuboCop::Cop::Offense, uri: String).void }
26
23
  def initialize(offense, uri)
27
24
  @offense = offense
28
25
  @uri = uri
29
- @replacements = T.let(
30
- offense.correctable? ? offense_replacements : [],
31
- T::Array[LanguageServer::Protocol::Interface::TextEdit],
32
- )
33
- end
34
-
35
- sig { returns(T::Boolean) }
36
- def correctable?
37
- @offense.correctable?
38
26
  end
39
27
 
40
- sig { params(range: T::Range[Integer]).returns(T::Boolean) }
41
- def in_range?(range)
42
- range.cover?(@offense.line - 1)
43
- end
44
-
45
- sig { returns(LanguageServer::Protocol::Interface::CodeAction) }
28
+ sig { returns(Interface::CodeAction) }
46
29
  def to_lsp_code_action
47
- LanguageServer::Protocol::Interface::CodeAction.new(
30
+ Interface::CodeAction.new(
48
31
  title: "Autocorrect #{@offense.cop_name}",
49
- kind: LanguageServer::Protocol::Constant::CodeActionKind::QUICK_FIX,
50
- edit: LanguageServer::Protocol::Interface::WorkspaceEdit.new(
32
+ kind: Constant::CodeActionKind::QUICK_FIX,
33
+ edit: Interface::WorkspaceEdit.new(
51
34
  document_changes: [
52
- LanguageServer::Protocol::Interface::TextDocumentEdit.new(
53
- text_document: LanguageServer::Protocol::Interface::OptionalVersionedTextDocumentIdentifier.new(
35
+ Interface::TextDocumentEdit.new(
36
+ text_document: Interface::OptionalVersionedTextDocumentIdentifier.new(
54
37
  uri: @uri,
55
38
  version: nil,
56
39
  ),
57
- edits: @replacements,
40
+ edits: @offense.correctable? ? offense_replacements : [],
58
41
  ),
59
42
  ],
60
43
  ),
@@ -62,45 +45,47 @@ module RubyLsp
62
45
  )
63
46
  end
64
47
 
65
- sig { returns(LanguageServer::Protocol::Interface::Diagnostic) }
48
+ sig { returns(Interface::Diagnostic) }
66
49
  def to_lsp_diagnostic
67
50
  if @offense.correctable?
68
51
  severity = RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
69
52
  message = @offense.message
70
53
  else
71
- severity = LanguageServer::Protocol::Constant::DiagnosticSeverity::WARNING
54
+ severity = Constant::DiagnosticSeverity::WARNING
72
55
  message = "#{@offense.message}\n\nThis offense is not auto-correctable.\n"
73
56
  end
74
- LanguageServer::Protocol::Interface::Diagnostic.new(
57
+
58
+ Interface::Diagnostic.new(
75
59
  message: message,
76
60
  source: "RuboCop",
77
61
  code: @offense.cop_name,
78
62
  severity: severity,
79
- range: LanguageServer::Protocol::Interface::Range.new(
80
- start: LanguageServer::Protocol::Interface::Position.new(
63
+ range: Interface::Range.new(
64
+ start: Interface::Position.new(
81
65
  line: @offense.line - 1,
82
66
  character: @offense.column,
83
67
  ),
84
- end: LanguageServer::Protocol::Interface::Position.new(
68
+ end: Interface::Position.new(
85
69
  line: @offense.last_line - 1,
86
70
  character: @offense.last_column,
87
71
  ),
88
72
  ),
73
+ data: {
74
+ correctable: @offense.correctable?,
75
+ code_action: to_lsp_code_action,
76
+ },
89
77
  )
90
78
  end
91
79
 
92
80
  private
93
81
 
94
- sig { returns(T::Array[LanguageServer::Protocol::Interface::TextEdit]) }
82
+ sig { returns(T::Array[Interface::TextEdit]) }
95
83
  def offense_replacements
96
84
  @offense.corrector.as_replacements.map do |range, replacement|
97
- LanguageServer::Protocol::Interface::TextEdit.new(
98
- range: LanguageServer::Protocol::Interface::Range.new(
99
- start: LanguageServer::Protocol::Interface::Position.new(line: range.line - 1, character: range.column),
100
- end: LanguageServer::Protocol::Interface::Position.new(
101
- line: range.last_line - 1,
102
- character: range.last_column,
103
- ),
85
+ Interface::TextEdit.new(
86
+ range: Interface::Range.new(
87
+ start: Interface::Position.new(line: range.line - 1, character: range.column),
88
+ end: Interface::Position.new(line: range.last_line - 1, character: range.last_column),
104
89
  ),
105
90
  new_text: replacement,
106
91
  )
@@ -21,7 +21,7 @@ module RubyLsp
21
21
  @runner = T.let(RuboCopRunner.new("-a"), RuboCopRunner)
22
22
  end
23
23
 
24
- sig { params(uri: String, document: Document).returns(T.nilable(String)) }
24
+ sig { params(uri: String, document: Document).returns(String) }
25
25
  def run(uri, document)
26
26
  filename = CGI.unescape(URI.parse(uri).path)
27
27
 
@@ -16,6 +16,22 @@ end
16
16
  module RubyLsp
17
17
  module Requests
18
18
  module Support
19
+ class InternalRuboCopError < StandardError
20
+ extend T::Sig
21
+
22
+ MESSAGE = <<~EOS
23
+ An internal error occurred for the %s cop.
24
+ Updating to a newer version of RuboCop may solve this.
25
+ For more details, run RuboCop on the command line.
26
+ EOS
27
+
28
+ sig { params(rubocop_error: RuboCop::ErrorWithAnalyzedFileLocation).void }
29
+ def initialize(rubocop_error)
30
+ message = format(MESSAGE, rubocop_error.cop.name)
31
+ super(message)
32
+ end
33
+ end
34
+
19
35
  # :nodoc:
20
36
  class RuboCopRunner < RuboCop::Runner
21
37
  extend T::Sig
@@ -31,10 +47,18 @@ module RubyLsp
31
47
  "--force-exclusion",
32
48
  "--format",
33
49
  "RuboCop::Formatter::BaseFormatter", # Suppress any output by using the base formatter
34
- ].freeze,
50
+ ],
35
51
  T::Array[String],
36
52
  )
37
53
 
54
+ begin
55
+ RuboCop::Options.new.parse(["--raise-cop-error"])
56
+ DEFAULT_ARGS << "--raise-cop-error"
57
+ rescue OptionParser::InvalidOption
58
+ # older versions of RuboCop don't support this flag
59
+ end
60
+ DEFAULT_ARGS.freeze
61
+
38
62
  sig { params(args: String).void }
39
63
  def initialize(*args)
40
64
  @options = T.let({}, T::Hash[Symbol, T.untyped])
@@ -63,6 +87,8 @@ module RubyLsp
63
87
  raise Formatting::Error, error.message
64
88
  rescue RuboCop::ValidationError => error
65
89
  raise ConfigurationError, error.message
90
+ rescue RuboCop::ErrorWithAnalyzedFileLocation => error
91
+ raise InternalRuboCopError, error
66
92
  end
67
93
 
68
94
  sig { returns(String) }
@@ -0,0 +1,120 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Requests
6
+ module Support
7
+ class Sorbet
8
+ class << self
9
+ extend T::Sig
10
+
11
+ ANNOTATIONS = T.let(
12
+ {
13
+ "abstract!" => Annotation.new(arity: 0),
14
+ "absurd" => Annotation.new(arity: 1, receiver: true),
15
+ "all" => Annotation.new(arity: (2..), receiver: true),
16
+ "any" => Annotation.new(arity: (2..), receiver: true),
17
+ "assert_type!" => Annotation.new(arity: 2, receiver: true),
18
+ "attached_class" => Annotation.new(arity: 0, receiver: true),
19
+ "bind" => Annotation.new(arity: 2, receiver: true),
20
+ "cast" => Annotation.new(arity: 2, receiver: true),
21
+ "class_of" => Annotation.new(arity: 1, receiver: true),
22
+ "enums" => Annotation.new(arity: 0),
23
+ "interface!" => Annotation.new(arity: 0),
24
+ "let" => Annotation.new(arity: 2, receiver: true),
25
+ "mixes_in_class_methods" => Annotation.new(arity: 1),
26
+ "must" => Annotation.new(arity: 1, receiver: true),
27
+ "must_because" => Annotation.new(arity: 1, receiver: true),
28
+ "nilable" => Annotation.new(arity: 1, receiver: true),
29
+ "noreturn" => Annotation.new(arity: 0, receiver: true),
30
+ "requires_ancestor" => Annotation.new(arity: 0),
31
+ "reveal_type" => Annotation.new(arity: 1, receiver: true),
32
+ "sealed!" => Annotation.new(arity: 0),
33
+ "self_type" => Annotation.new(arity: 0, receiver: true),
34
+ "sig" => Annotation.new(arity: 0),
35
+ "type_member" => Annotation.new(arity: (0..1)),
36
+ "type_template" => Annotation.new(arity: 0),
37
+ "unsafe" => Annotation.new(arity: 1),
38
+ "untyped" => Annotation.new(arity: 0, receiver: true),
39
+ },
40
+ T::Hash[String, Annotation],
41
+ )
42
+
43
+ sig do
44
+ params(
45
+ node: T.any(SyntaxTree::CallNode, SyntaxTree::VCall),
46
+ ).returns(T::Boolean)
47
+ end
48
+ def annotation?(node)
49
+ annotation = annotation(node)
50
+
51
+ return false if annotation.nil?
52
+
53
+ return false unless annotation.supports_receiver?(receiver_name(node))
54
+
55
+ annotation.supports_arity?(node.arity)
56
+ end
57
+
58
+ private
59
+
60
+ sig { params(node: T.any(SyntaxTree::CallNode, SyntaxTree::VCall)).returns(T.nilable(Annotation)) }
61
+ def annotation(node)
62
+ case node
63
+ when SyntaxTree::VCall
64
+ ANNOTATIONS[node.value.value]
65
+ when SyntaxTree::CallNode
66
+ ANNOTATIONS[node.message.value]
67
+ else
68
+ T.absurd(node)
69
+ end
70
+ end
71
+
72
+ sig do
73
+ params(receiver: T.any(SyntaxTree::CallNode, SyntaxTree::VCall)).returns(T.nilable(String))
74
+ end
75
+ def receiver_name(receiver)
76
+ case receiver
77
+ when SyntaxTree::CallNode
78
+ node_name(receiver.receiver)
79
+ when SyntaxTree::VCall
80
+ nil
81
+ else
82
+ T.absurd(receiver)
83
+ end
84
+ end
85
+
86
+ sig do
87
+ params(node: T.nilable(T.any(
88
+ SyntaxTree::VarRef,
89
+ SyntaxTree::CallNode,
90
+ SyntaxTree::VCall,
91
+ SyntaxTree::Ident,
92
+ SyntaxTree::Backtick,
93
+ SyntaxTree::Const,
94
+ SyntaxTree::Op,
95
+ Symbol,
96
+ ))).returns(T.nilable(String))
97
+ end
98
+ def node_name(node)
99
+ case node
100
+ when NilClass
101
+ nil
102
+ when SyntaxTree::VarRef
103
+ node.value.value
104
+ when SyntaxTree::CallNode
105
+ node_name(node.receiver)
106
+ when SyntaxTree::VCall
107
+ node_name(node.value)
108
+ when SyntaxTree::Ident, SyntaxTree::Backtick, SyntaxTree::Const, SyntaxTree::Op
109
+ node.value
110
+ when Symbol
111
+ node.to_s
112
+ else
113
+ T.absurd(node)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -16,6 +16,7 @@ module RubyLsp
16
16
  # - {RubyLsp::Requests::CodeActions}
17
17
  # - {RubyLsp::Requests::DocumentHighlight}
18
18
  # - {RubyLsp::Requests::InlayHints}
19
+ # - {RubyLsp::Requests::PathCompletion}
19
20
 
20
21
  module Requests
21
22
  autoload :BaseRequest, "ruby_lsp/requests/base_request"
@@ -31,15 +32,18 @@ module RubyLsp
31
32
  autoload :CodeActions, "ruby_lsp/requests/code_actions"
32
33
  autoload :DocumentHighlight, "ruby_lsp/requests/document_highlight"
33
34
  autoload :InlayHints, "ruby_lsp/requests/inlay_hints"
35
+ autoload :PathCompletion, "ruby_lsp/requests/path_completion"
34
36
 
35
37
  # :nodoc:
36
38
  module Support
37
39
  autoload :RuboCopDiagnostic, "ruby_lsp/requests/support/rubocop_diagnostic"
38
40
  autoload :SelectionRange, "ruby_lsp/requests/support/selection_range"
39
41
  autoload :SemanticTokenEncoder, "ruby_lsp/requests/support/semantic_token_encoder"
40
- autoload :SyntaxErrorDiagnostic, "ruby_lsp/requests/support/syntax_error_diagnostic"
42
+ autoload :Annotation, "ruby_lsp/requests/support/annotation"
43
+ autoload :Sorbet, "ruby_lsp/requests/support/sorbet"
41
44
  autoload :HighlightTarget, "ruby_lsp/requests/support/highlight_target"
42
45
  autoload :RailsDocumentClient, "ruby_lsp/requests/support/rails_document_client"
46
+ autoload :PrefixTree, "ruby_lsp/requests/support/prefix_tree"
43
47
  end
44
48
  end
45
49
  end