spoom 1.5.0 → 1.7.2

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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/lib/spoom/backtrace_filter/minitest.rb +3 -4
  4. data/lib/spoom/cli/deadcode.rb +1 -2
  5. data/lib/spoom/cli/helper.rb +41 -31
  6. data/lib/spoom/cli/srb/assertions.rb +48 -0
  7. data/lib/spoom/cli/srb/bump.rb +1 -2
  8. data/lib/spoom/cli/srb/coverage.rb +1 -1
  9. data/lib/spoom/cli/srb/metrics.rb +68 -0
  10. data/lib/spoom/cli/srb/sigs.rb +209 -0
  11. data/lib/spoom/cli/srb/tc.rb +16 -1
  12. data/lib/spoom/cli/srb.rb +16 -4
  13. data/lib/spoom/cli.rb +1 -2
  14. data/lib/spoom/colors.rb +2 -6
  15. data/lib/spoom/context/bundle.rb +8 -9
  16. data/lib/spoom/context/exec.rb +3 -6
  17. data/lib/spoom/context/file_system.rb +12 -19
  18. data/lib/spoom/context/git.rb +14 -19
  19. data/lib/spoom/context/sorbet.rb +14 -27
  20. data/lib/spoom/context.rb +4 -8
  21. data/lib/spoom/counters.rb +22 -0
  22. data/lib/spoom/coverage/d3/base.rb +6 -8
  23. data/lib/spoom/coverage/d3/circle_map.rb +6 -16
  24. data/lib/spoom/coverage/d3/pie.rb +14 -19
  25. data/lib/spoom/coverage/d3/timeline.rb +46 -47
  26. data/lib/spoom/coverage/d3.rb +2 -4
  27. data/lib/spoom/coverage/report.rb +41 -79
  28. data/lib/spoom/coverage/snapshot.rb +8 -14
  29. data/lib/spoom/coverage.rb +3 -5
  30. data/lib/spoom/deadcode/definition.rb +12 -14
  31. data/lib/spoom/deadcode/erb.rb +10 -8
  32. data/lib/spoom/deadcode/index.rb +21 -25
  33. data/lib/spoom/deadcode/indexer.rb +5 -6
  34. data/lib/spoom/deadcode/plugins/action_mailer.rb +2 -3
  35. data/lib/spoom/deadcode/plugins/action_mailer_preview.rb +2 -3
  36. data/lib/spoom/deadcode/plugins/actionpack.rb +19 -22
  37. data/lib/spoom/deadcode/plugins/active_model.rb +2 -3
  38. data/lib/spoom/deadcode/plugins/active_record.rb +62 -53
  39. data/lib/spoom/deadcode/plugins/active_support.rb +3 -2
  40. data/lib/spoom/deadcode/plugins/base.rb +29 -32
  41. data/lib/spoom/deadcode/plugins/graphql.rb +2 -3
  42. data/lib/spoom/deadcode/plugins/minitest.rb +4 -4
  43. data/lib/spoom/deadcode/plugins/namespaces.rb +5 -5
  44. data/lib/spoom/deadcode/plugins/rails.rb +5 -5
  45. data/lib/spoom/deadcode/plugins/rubocop.rb +5 -5
  46. data/lib/spoom/deadcode/plugins/ruby.rb +3 -4
  47. data/lib/spoom/deadcode/plugins/sorbet.rb +12 -6
  48. data/lib/spoom/deadcode/plugins/thor.rb +2 -3
  49. data/lib/spoom/deadcode/plugins.rb +23 -31
  50. data/lib/spoom/deadcode/remover.rb +58 -79
  51. data/lib/spoom/deadcode/send.rb +2 -8
  52. data/lib/spoom/file_collector.rb +11 -19
  53. data/lib/spoom/file_tree.rb +36 -51
  54. data/lib/spoom/location.rb +9 -20
  55. data/lib/spoom/model/builder.rb +54 -17
  56. data/lib/spoom/model/model.rb +71 -74
  57. data/lib/spoom/model/namespace_visitor.rb +4 -3
  58. data/lib/spoom/model/reference.rb +4 -8
  59. data/lib/spoom/model/references_visitor.rb +50 -30
  60. data/lib/spoom/parse.rb +4 -4
  61. data/lib/spoom/poset.rb +22 -24
  62. data/lib/spoom/printer.rb +10 -13
  63. data/lib/spoom/rbs.rb +77 -0
  64. data/lib/spoom/sorbet/config.rb +17 -24
  65. data/lib/spoom/sorbet/errors.rb +87 -45
  66. data/lib/spoom/sorbet/lsp/base.rb +10 -16
  67. data/lib/spoom/sorbet/lsp/errors.rb +8 -16
  68. data/lib/spoom/sorbet/lsp/structures.rb +65 -91
  69. data/lib/spoom/sorbet/lsp.rb +20 -22
  70. data/lib/spoom/sorbet/metrics/code_metrics_visitor.rb +236 -0
  71. data/lib/spoom/sorbet/metrics/metrics_file_parser.rb +34 -0
  72. data/lib/spoom/sorbet/metrics.rb +2 -32
  73. data/lib/spoom/sorbet/sigils.rb +16 -23
  74. data/lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb +242 -0
  75. data/lib/spoom/sorbet/translate/sorbet_assertions_to_rbs_comments.rb +123 -0
  76. data/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +293 -0
  77. data/lib/spoom/sorbet/translate/strip_sorbet_sigs.rb +23 -0
  78. data/lib/spoom/sorbet/translate/translator.rb +71 -0
  79. data/lib/spoom/sorbet/translate.rb +49 -0
  80. data/lib/spoom/sorbet.rb +6 -12
  81. data/lib/spoom/source/rewriter.rb +167 -0
  82. data/lib/spoom/source.rb +4 -0
  83. data/lib/spoom/timeline.rb +4 -6
  84. data/lib/spoom/version.rb +1 -1
  85. data/lib/spoom/visitor.rb +298 -151
  86. data/lib/spoom.rb +4 -3
  87. data/rbi/spoom.rbi +3567 -0
  88. metadata +62 -8
@@ -10,14 +10,12 @@ module Spoom
10
10
  #
11
11
  # The language server protocol always uses `"2.0"` as the `jsonrpc` version.
12
12
  class Message
13
- extend T::Sig
14
-
15
- sig { void }
13
+ #: -> void
16
14
  def initialize
17
- @jsonrpc = T.let("2.0", String)
15
+ @jsonrpc = "2.0" #: String
18
16
  end
19
17
 
20
- sig { returns(T::Hash[T.untyped, T.untyped]) }
18
+ #: -> Hash[untyped, untyped]
21
19
  def as_json
22
20
  instance_variables.each_with_object({}) do |var, obj|
23
21
  val = instance_variable_get(var)
@@ -25,7 +23,7 @@ module Spoom
25
23
  end
26
24
  end
27
25
 
28
- sig { params(args: T.untyped).returns(String) }
26
+ #: (*untyped args) -> String
29
27
  def to_json(*args)
30
28
  T.unsafe(as_json).to_json(*args)
31
29
  end
@@ -35,15 +33,13 @@ module Spoom
35
33
  #
36
34
  # Every processed request must send a response back to the sender of the request.
37
35
  class Request < Message
38
- extend T::Sig
39
-
40
- sig { returns(Integer) }
36
+ #: Integer
41
37
  attr_reader :id
42
38
 
43
- sig { returns(T::Hash[T.untyped, T.untyped]) }
39
+ #: Hash[untyped, untyped]
44
40
  attr_reader :params
45
41
 
46
- sig { params(id: Integer, method: String, params: T::Hash[T.untyped, T.untyped]).void }
42
+ #: (Integer id, String method, Hash[untyped, untyped] params) -> void
47
43
  def initialize(id, method, params)
48
44
  super()
49
45
  @id = id
@@ -56,15 +52,13 @@ module Spoom
56
52
  #
57
53
  # A processed notification message must not send a response back. They work like events.
58
54
  class Notification < Message
59
- extend T::Sig
60
-
61
- sig { returns(String) }
55
+ #: String
62
56
  attr_reader :method
63
57
 
64
- sig { returns(T::Hash[T.untyped, T.untyped]) }
58
+ #: Hash[untyped, untyped]
65
59
  attr_reader :params
66
60
 
67
- sig { params(method: String, params: T::Hash[T.untyped, T.untyped]).void }
61
+ #: (String method, Hash[untyped, untyped] params) -> void
68
62
  def initialize(method, params)
69
63
  super()
70
64
  @method = method
@@ -8,18 +8,14 @@ module Spoom
8
8
  class BadHeaders < Error; end
9
9
 
10
10
  class Diagnostics < Error
11
- extend T::Sig
12
-
13
- sig { returns(String) }
11
+ #: String
14
12
  attr_reader :uri
15
13
 
16
- sig { returns(T::Array[Diagnostic]) }
14
+ #: Array[Diagnostic]
17
15
  attr_reader :diagnostics
18
16
 
19
17
  class << self
20
- extend T::Sig
21
-
22
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Diagnostics) }
18
+ #: (Hash[untyped, untyped] json) -> Diagnostics
23
19
  def from_json(json)
24
20
  Diagnostics.new(
25
21
  json["uri"],
@@ -28,7 +24,7 @@ module Spoom
28
24
  end
29
25
  end
30
26
 
31
- sig { params(uri: String, diagnostics: T::Array[Diagnostic]).void }
27
+ #: (String uri, Array[Diagnostic] diagnostics) -> void
32
28
  def initialize(uri, diagnostics)
33
29
  @uri = uri
34
30
  @diagnostics = diagnostics
@@ -38,18 +34,14 @@ module Spoom
38
34
  end
39
35
 
40
36
  class ResponseError < Error
41
- extend T::Sig
42
-
43
- sig { returns(Integer) }
37
+ #: Integer
44
38
  attr_reader :code
45
39
 
46
- sig { returns(T::Hash[T.untyped, T.untyped]) }
40
+ #: Hash[untyped, untyped]
47
41
  attr_reader :data
48
42
 
49
43
  class << self
50
- extend T::Sig
51
-
52
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(ResponseError) }
44
+ #: (Hash[untyped, untyped] json) -> ResponseError
53
45
  def from_json(json)
54
46
  ResponseError.new(
55
47
  json["code"],
@@ -59,7 +51,7 @@ module Spoom
59
51
  end
60
52
  end
61
53
 
62
- sig { params(code: Integer, message: String, data: T::Hash[T.untyped, T.untyped]).void }
54
+ #: (Integer code, String message, Hash[untyped, untyped] data) -> void
63
55
  def initialize(code, message, data)
64
56
  super(message)
65
57
  @code = code
@@ -17,16 +17,13 @@ module Spoom
17
17
  end
18
18
 
19
19
  class Hover < T::Struct
20
- extend T::Sig
21
20
  include PrintableSymbol
22
21
 
23
22
  const :contents, String
24
23
  const :range, T.nilable(Range)
25
24
 
26
25
  class << self
27
- extend T::Sig
28
-
29
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Hover) }
26
+ #: (Hash[untyped, untyped] json) -> Hover
30
27
  def from_json(json)
31
28
  Hover.new(
32
29
  contents: json["contents"]["value"],
@@ -35,29 +32,27 @@ module Spoom
35
32
  end
36
33
  end
37
34
 
38
- sig { override.params(printer: SymbolPrinter).void }
35
+ # @override
36
+ #: (SymbolPrinter printer) -> void
39
37
  def accept_printer(printer)
40
38
  printer.print("#{contents}\n")
41
39
  printer.print_object(range) if range
42
40
  end
43
41
 
44
- sig { returns(String) }
42
+ #: -> String
45
43
  def to_s
46
44
  "#{contents} (#{range})."
47
45
  end
48
46
  end
49
47
 
50
48
  class Position < T::Struct
51
- extend T::Sig
52
49
  include PrintableSymbol
53
50
 
54
51
  const :line, Integer
55
52
  const :char, Integer
56
53
 
57
54
  class << self
58
- extend T::Sig
59
-
60
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Position) }
55
+ #: (Hash[untyped, untyped] json) -> Position
61
56
  def from_json(json)
62
57
  Position.new(
63
58
  line: json["line"].to_i,
@@ -66,28 +61,26 @@ module Spoom
66
61
  end
67
62
  end
68
63
 
69
- sig { override.params(printer: SymbolPrinter).void }
64
+ # @override
65
+ #: (SymbolPrinter printer) -> void
70
66
  def accept_printer(printer)
71
67
  printer.print_colored("#{line}:#{char}", Color::LIGHT_BLACK)
72
68
  end
73
69
 
74
- sig { returns(String) }
70
+ #: -> String
75
71
  def to_s
76
72
  "#{line}:#{char}"
77
73
  end
78
74
  end
79
75
 
80
76
  class Range < T::Struct
81
- extend T::Sig
82
77
  include PrintableSymbol
83
78
 
84
79
  const :start, Position
85
80
  const :end, Position
86
81
 
87
82
  class << self
88
- extend T::Sig
89
-
90
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Range) }
83
+ #: (Hash[untyped, untyped] json) -> Range
91
84
  def from_json(json)
92
85
  Range.new(
93
86
  start: Position.from_json(json["start"]),
@@ -96,30 +89,28 @@ module Spoom
96
89
  end
97
90
  end
98
91
 
99
- sig { override.params(printer: SymbolPrinter).void }
92
+ # @override
93
+ #: (SymbolPrinter printer) -> void
100
94
  def accept_printer(printer)
101
95
  printer.print_object(start)
102
96
  printer.print_colored("-", Color::LIGHT_BLACK)
103
97
  printer.print_object(self.end)
104
98
  end
105
99
 
106
- sig { returns(String) }
100
+ #: -> String
107
101
  def to_s
108
102
  "#{start}-#{self.end}"
109
103
  end
110
104
  end
111
105
 
112
106
  class Location < T::Struct
113
- extend T::Sig
114
107
  include PrintableSymbol
115
108
 
116
109
  const :uri, String
117
110
  const :range, LSP::Range
118
111
 
119
112
  class << self
120
- extend T::Sig
121
-
122
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Location) }
113
+ #: (Hash[untyped, untyped] json) -> Location
123
114
  def from_json(json)
124
115
  Location.new(
125
116
  uri: json["uri"],
@@ -128,20 +119,20 @@ module Spoom
128
119
  end
129
120
  end
130
121
 
131
- sig { override.params(printer: SymbolPrinter).void }
122
+ # @override
123
+ #: (SymbolPrinter printer) -> void
132
124
  def accept_printer(printer)
133
125
  printer.print_colored("#{printer.clean_uri(uri)}:", Color::LIGHT_BLACK)
134
126
  printer.print_object(range)
135
127
  end
136
128
 
137
- sig { returns(String) }
129
+ #: -> String
138
130
  def to_s
139
131
  "#{uri}:#{range}"
140
132
  end
141
133
  end
142
134
 
143
135
  class SignatureHelp < T::Struct
144
- extend T::Sig
145
136
  include PrintableSymbol
146
137
 
147
138
  const :label, T.nilable(String)
@@ -149,9 +140,7 @@ module Spoom
149
140
  const :params, T::Array[T.untyped] # TODO
150
141
 
151
142
  class << self
152
- extend T::Sig
153
-
154
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(SignatureHelp) }
143
+ #: (Hash[untyped, untyped] json) -> SignatureHelp
155
144
  def from_json(json)
156
145
  SignatureHelp.new(
157
146
  label: json["label"],
@@ -161,7 +150,8 @@ module Spoom
161
150
  end
162
151
  end
163
152
 
164
- sig { override.params(printer: SymbolPrinter).void }
153
+ # @override
154
+ #: (SymbolPrinter printer) -> void
165
155
  def accept_printer(printer)
166
156
  printer.print(label)
167
157
  printer.print("(")
@@ -169,14 +159,13 @@ module Spoom
169
159
  printer.print(")")
170
160
  end
171
161
 
172
- sig { returns(String) }
162
+ #: -> String
173
163
  def to_s
174
164
  "#{label}(#{params})."
175
165
  end
176
166
  end
177
167
 
178
168
  class Diagnostic < T::Struct
179
- extend T::Sig
180
169
  include PrintableSymbol
181
170
 
182
171
  const :range, LSP::Range
@@ -185,9 +174,7 @@ module Spoom
185
174
  const :information, Object
186
175
 
187
176
  class << self
188
- extend T::Sig
189
-
190
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(Diagnostic) }
177
+ #: (Hash[untyped, untyped] json) -> Diagnostic
191
178
  def from_json(json)
192
179
  Diagnostic.new(
193
180
  range: Range.from_json(json["range"]),
@@ -198,19 +185,19 @@ module Spoom
198
185
  end
199
186
  end
200
187
 
201
- sig { override.params(printer: SymbolPrinter).void }
188
+ # @override
189
+ #: (SymbolPrinter printer) -> void
202
190
  def accept_printer(printer)
203
191
  printer.print(to_s)
204
192
  end
205
193
 
206
- sig { returns(String) }
194
+ #: -> String
207
195
  def to_s
208
196
  "Error: #{message} (#{code})."
209
197
  end
210
198
  end
211
199
 
212
200
  class DocumentSymbol < T::Struct
213
- extend T::Sig
214
201
  include PrintableSymbol
215
202
 
216
203
  const :name, String
@@ -221,9 +208,7 @@ module Spoom
221
208
  const :children, T::Array[DocumentSymbol]
222
209
 
223
210
  class << self
224
- extend T::Sig
225
-
226
- sig { params(json: T::Hash[T.untyped, T.untyped]).returns(DocumentSymbol) }
211
+ #: (Hash[untyped, untyped] json) -> DocumentSymbol
227
212
  def from_json(json)
228
213
  DocumentSymbol.new(
229
214
  name: json["name"],
@@ -236,7 +221,8 @@ module Spoom
236
221
  end
237
222
  end
238
223
 
239
- sig { override.params(printer: SymbolPrinter).void }
224
+ # @override
225
+ #: (SymbolPrinter printer) -> void
240
226
  def accept_printer(printer)
241
227
  h = serialize.hash
242
228
  return if printer.seen.include?(h)
@@ -263,88 +249,76 @@ module Spoom
263
249
  # TODO: also display details?
264
250
  end
265
251
 
266
- sig { returns(String) }
252
+ #: -> String
267
253
  def to_s
268
254
  "#{name} (#{range})"
269
255
  end
270
256
 
271
- sig { returns(String) }
257
+ #: -> String
272
258
  def kind_string
273
259
  SYMBOL_KINDS[kind] || "<unknown:#{kind}>"
274
260
  end
275
261
 
276
- SYMBOL_KINDS = T.let(
277
- {
278
- 1 => "file",
279
- 2 => "module",
280
- 3 => "namespace",
281
- 4 => "package",
282
- 5 => "class",
283
- 6 => "def",
284
- 7 => "property",
285
- 8 => "field",
286
- 9 => "constructor",
287
- 10 => "enum",
288
- 11 => "interface",
289
- 12 => "function",
290
- 13 => "variable",
291
- 14 => "const",
292
- 15 => "string",
293
- 16 => "number",
294
- 17 => "boolean",
295
- 18 => "array",
296
- 19 => "object",
297
- 20 => "key",
298
- 21 => "null",
299
- 22 => "enum_member",
300
- 23 => "struct",
301
- 24 => "event",
302
- 25 => "operator",
303
- 26 => "type_parameter",
304
- },
305
- T::Hash[Integer, String],
306
- )
262
+ SYMBOL_KINDS = {
263
+ 1 => "file",
264
+ 2 => "module",
265
+ 3 => "namespace",
266
+ 4 => "package",
267
+ 5 => "class",
268
+ 6 => "def",
269
+ 7 => "property",
270
+ 8 => "field",
271
+ 9 => "constructor",
272
+ 10 => "enum",
273
+ 11 => "interface",
274
+ 12 => "function",
275
+ 13 => "variable",
276
+ 14 => "const",
277
+ 15 => "string",
278
+ 16 => "number",
279
+ 17 => "boolean",
280
+ 18 => "array",
281
+ 19 => "object",
282
+ 20 => "key",
283
+ 21 => "null",
284
+ 22 => "enum_member",
285
+ 23 => "struct",
286
+ 24 => "event",
287
+ 25 => "operator",
288
+ 26 => "type_parameter",
289
+ } #: Hash[Integer, String]
307
290
  end
308
291
 
309
292
  class SymbolPrinter < Printer
310
- extend T::Sig
311
-
312
- sig { returns(T::Set[Integer]) }
293
+ #: Set[Integer]
313
294
  attr_reader :seen
314
295
 
315
- sig { returns(T.nilable(String)) }
296
+ #: String?
316
297
  attr_accessor :prefix
317
298
 
318
- sig do
319
- params(
320
- out: T.any(IO, StringIO),
321
- colors: T::Boolean,
322
- indent_level: Integer,
323
- prefix: T.nilable(String),
324
- ).void
325
- end
299
+ #: (?out: (IO | StringIO), ?colors: bool, ?indent_level: Integer, ?prefix: String?) -> void
326
300
  def initialize(out: $stdout, colors: true, indent_level: 0, prefix: nil)
327
301
  super(out: out, colors: colors, indent_level: indent_level)
328
- @seen = T.let(Set.new, T::Set[Integer])
302
+ @seen = Set.new #: Set[Integer]
329
303
  @out = out
330
304
  @colors = colors
331
305
  @indent_level = indent_level
332
306
  @prefix = prefix
333
307
  end
334
308
 
335
- sig { params(object: T.nilable(PrintableSymbol)).void }
309
+ #: (PrintableSymbol? object) -> void
336
310
  def print_object(object)
337
311
  return unless object
338
312
 
339
313
  object.accept_printer(self)
340
314
  end
341
315
 
342
- sig { params(objects: T::Array[PrintableSymbol]).void }
316
+ #: (Array[PrintableSymbol] objects) -> void
343
317
  def print_objects(objects)
344
318
  objects.each { |object| print_object(object) }
345
319
  end
346
320
 
347
- sig { params(uri: String).returns(String) }
321
+ #: (String uri) -> String
348
322
  def clean_uri(uri)
349
323
  prefix = self.prefix
350
324
  return uri unless prefix
@@ -352,7 +326,7 @@ module Spoom
352
326
  uri.delete_prefix(prefix)
353
327
  end
354
328
 
355
- sig { params(objects: T::Array[PrintableSymbol]).void }
329
+ #: (Array[PrintableSymbol] objects) -> void
356
330
  def print_list(objects)
357
331
  objects.each do |object|
358
332
  printt
@@ -11,35 +11,33 @@ require_relative "lsp/errors"
11
11
  module Spoom
12
12
  module LSP
13
13
  class Client
14
- extend T::Sig
15
-
16
- sig { params(sorbet_bin: String, sorbet_args: String, path: String).void }
14
+ #: (String sorbet_bin, *String sorbet_args, ?path: String) -> void
17
15
  def initialize(sorbet_bin, *sorbet_args, path: ".")
18
- @id = T.let(0, Integer)
19
- @open = T.let(false, T::Boolean)
16
+ @id = 0 #: Integer
17
+ @open = false #: bool
20
18
  io_in, io_out, io_err, _status = T.unsafe(Open3).popen3(sorbet_bin, *sorbet_args, chdir: path)
21
- @in = T.let(io_in, IO)
22
- @out = T.let(io_out, IO)
23
- @err = T.let(io_err, IO)
19
+ @in = io_in #: IO
20
+ @out = io_out #: IO
21
+ @err = io_err #: IO
24
22
  end
25
23
 
26
- sig { returns(Integer) }
24
+ #: -> Integer
27
25
  def next_id
28
26
  @id += 1
29
27
  end
30
28
 
31
- sig { params(json_string: String).void }
29
+ #: (String json_string) -> void
32
30
  def send_raw(json_string)
33
31
  @in.puts("Content-Length:#{json_string.length}\r\n\r\n#{json_string}")
34
32
  end
35
33
 
36
- sig { params(message: Message).returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
34
+ #: (Message message) -> Hash[untyped, untyped]?
37
35
  def send(message)
38
36
  send_raw(message.to_json)
39
37
  read if message.is_a?(Request)
40
38
  end
41
39
 
42
- sig { returns(T.nilable(String)) }
40
+ #: -> String?
43
41
  def read_raw
44
42
  header = @out.gets
45
43
 
@@ -50,7 +48,7 @@ module Spoom
50
48
  @out.read(len + 2) # +2 'cause of the final \r\n
51
49
  end
52
50
 
53
- sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
51
+ #: -> Hash[untyped, untyped]?
54
52
  def read
55
53
  raw_string = read_raw
56
54
  return unless raw_string
@@ -68,7 +66,7 @@ module Spoom
68
66
 
69
67
  # LSP requests
70
68
 
71
- sig { params(workspace_path: String).void }
69
+ #: (String workspace_path) -> void
72
70
  def open(workspace_path)
73
71
  raise Error::AlreadyOpen, "Error: CLI already opened" if @open
74
72
 
@@ -85,7 +83,7 @@ module Spoom
85
83
  @open = true
86
84
  end
87
85
 
88
- sig { params(uri: String, line: Integer, column: Integer).returns(T.nilable(Hover)) }
86
+ #: (String uri, Integer line, Integer column) -> Hover?
89
87
  def hover(uri, line, column)
90
88
  json = send(Request.new(
91
89
  next_id,
@@ -106,7 +104,7 @@ module Spoom
106
104
  Hover.from_json(json["result"])
107
105
  end
108
106
 
109
- sig { params(uri: String, line: Integer, column: Integer).returns(T::Array[SignatureHelp]) }
107
+ #: (String uri, Integer line, Integer column) -> Array[SignatureHelp]
110
108
  def signatures(uri, line, column)
111
109
  json = send(Request.new(
112
110
  next_id,
@@ -127,7 +125,7 @@ module Spoom
127
125
  json["result"]["signatures"].map { |loc| SignatureHelp.from_json(loc) }
128
126
  end
129
127
 
130
- sig { params(uri: String, line: Integer, column: Integer).returns(T::Array[Location]) }
128
+ #: (String uri, Integer line, Integer column) -> Array[Location]
131
129
  def definitions(uri, line, column)
132
130
  json = send(Request.new(
133
131
  next_id,
@@ -148,7 +146,7 @@ module Spoom
148
146
  json["result"].map { |loc| Location.from_json(loc) }
149
147
  end
150
148
 
151
- sig { params(uri: String, line: Integer, column: Integer).returns(T::Array[Location]) }
149
+ #: (String uri, Integer line, Integer column) -> Array[Location]
152
150
  def type_definitions(uri, line, column)
153
151
  json = send(Request.new(
154
152
  next_id,
@@ -169,7 +167,7 @@ module Spoom
169
167
  json["result"].map { |loc| Location.from_json(loc) }
170
168
  end
171
169
 
172
- sig { params(uri: String, line: Integer, column: Integer, include_decl: T::Boolean).returns(T::Array[Location]) }
170
+ #: (String uri, Integer line, Integer column, ?bool include_decl) -> Array[Location]
173
171
  def references(uri, line, column, include_decl = true)
174
172
  json = send(Request.new(
175
173
  next_id,
@@ -193,7 +191,7 @@ module Spoom
193
191
  json["result"].map { |loc| Location.from_json(loc) }
194
192
  end
195
193
 
196
- sig { params(query: String).returns(T::Array[DocumentSymbol]) }
194
+ #: (String query) -> Array[DocumentSymbol]
197
195
  def symbols(query)
198
196
  json = send(Request.new(
199
197
  next_id,
@@ -208,7 +206,7 @@ module Spoom
208
206
  json["result"].map { |loc| DocumentSymbol.from_json(loc) }
209
207
  end
210
208
 
211
- sig { params(uri: String).returns(T::Array[DocumentSymbol]) }
209
+ #: (String uri) -> Array[DocumentSymbol]
212
210
  def document_symbols(uri)
213
211
  json = send(Request.new(
214
212
  next_id,
@@ -225,7 +223,7 @@ module Spoom
225
223
  json["result"].map { |loc| DocumentSymbol.from_json(loc) }
226
224
  end
227
225
 
228
- sig { void }
226
+ #: -> void
229
227
  def close
230
228
  send(Request.new(next_id, "shutdown", {}))
231
229
  @in.close