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.
- checksums.yaml +4 -4
- data/README.md +14 -0
- data/lib/spoom/backtrace_filter/minitest.rb +3 -4
- data/lib/spoom/cli/deadcode.rb +1 -2
- data/lib/spoom/cli/helper.rb +41 -31
- data/lib/spoom/cli/srb/assertions.rb +48 -0
- data/lib/spoom/cli/srb/bump.rb +1 -2
- data/lib/spoom/cli/srb/coverage.rb +1 -1
- data/lib/spoom/cli/srb/metrics.rb +68 -0
- data/lib/spoom/cli/srb/sigs.rb +209 -0
- data/lib/spoom/cli/srb/tc.rb +16 -1
- data/lib/spoom/cli/srb.rb +16 -4
- data/lib/spoom/cli.rb +1 -2
- data/lib/spoom/colors.rb +2 -6
- data/lib/spoom/context/bundle.rb +8 -9
- data/lib/spoom/context/exec.rb +3 -6
- data/lib/spoom/context/file_system.rb +12 -19
- data/lib/spoom/context/git.rb +14 -19
- data/lib/spoom/context/sorbet.rb +14 -27
- data/lib/spoom/context.rb +4 -8
- data/lib/spoom/counters.rb +22 -0
- data/lib/spoom/coverage/d3/base.rb +6 -8
- data/lib/spoom/coverage/d3/circle_map.rb +6 -16
- data/lib/spoom/coverage/d3/pie.rb +14 -19
- data/lib/spoom/coverage/d3/timeline.rb +46 -47
- data/lib/spoom/coverage/d3.rb +2 -4
- data/lib/spoom/coverage/report.rb +41 -79
- data/lib/spoom/coverage/snapshot.rb +8 -14
- data/lib/spoom/coverage.rb +3 -5
- data/lib/spoom/deadcode/definition.rb +12 -14
- data/lib/spoom/deadcode/erb.rb +10 -8
- data/lib/spoom/deadcode/index.rb +21 -25
- data/lib/spoom/deadcode/indexer.rb +5 -6
- data/lib/spoom/deadcode/plugins/action_mailer.rb +2 -3
- data/lib/spoom/deadcode/plugins/action_mailer_preview.rb +2 -3
- data/lib/spoom/deadcode/plugins/actionpack.rb +19 -22
- data/lib/spoom/deadcode/plugins/active_model.rb +2 -3
- data/lib/spoom/deadcode/plugins/active_record.rb +62 -53
- data/lib/spoom/deadcode/plugins/active_support.rb +3 -2
- data/lib/spoom/deadcode/plugins/base.rb +29 -32
- data/lib/spoom/deadcode/plugins/graphql.rb +2 -3
- data/lib/spoom/deadcode/plugins/minitest.rb +4 -4
- data/lib/spoom/deadcode/plugins/namespaces.rb +5 -5
- data/lib/spoom/deadcode/plugins/rails.rb +5 -5
- data/lib/spoom/deadcode/plugins/rubocop.rb +5 -5
- data/lib/spoom/deadcode/plugins/ruby.rb +3 -4
- data/lib/spoom/deadcode/plugins/sorbet.rb +12 -6
- data/lib/spoom/deadcode/plugins/thor.rb +2 -3
- data/lib/spoom/deadcode/plugins.rb +23 -31
- data/lib/spoom/deadcode/remover.rb +58 -79
- data/lib/spoom/deadcode/send.rb +2 -8
- data/lib/spoom/file_collector.rb +11 -19
- data/lib/spoom/file_tree.rb +36 -51
- data/lib/spoom/location.rb +9 -20
- data/lib/spoom/model/builder.rb +54 -17
- data/lib/spoom/model/model.rb +71 -74
- data/lib/spoom/model/namespace_visitor.rb +4 -3
- data/lib/spoom/model/reference.rb +4 -8
- data/lib/spoom/model/references_visitor.rb +50 -30
- data/lib/spoom/parse.rb +4 -4
- data/lib/spoom/poset.rb +22 -24
- data/lib/spoom/printer.rb +10 -13
- data/lib/spoom/rbs.rb +77 -0
- data/lib/spoom/sorbet/config.rb +17 -24
- data/lib/spoom/sorbet/errors.rb +87 -45
- data/lib/spoom/sorbet/lsp/base.rb +10 -16
- data/lib/spoom/sorbet/lsp/errors.rb +8 -16
- data/lib/spoom/sorbet/lsp/structures.rb +65 -91
- data/lib/spoom/sorbet/lsp.rb +20 -22
- data/lib/spoom/sorbet/metrics/code_metrics_visitor.rb +236 -0
- data/lib/spoom/sorbet/metrics/metrics_file_parser.rb +34 -0
- data/lib/spoom/sorbet/metrics.rb +2 -32
- data/lib/spoom/sorbet/sigils.rb +16 -23
- data/lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb +242 -0
- data/lib/spoom/sorbet/translate/sorbet_assertions_to_rbs_comments.rb +123 -0
- data/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +293 -0
- data/lib/spoom/sorbet/translate/strip_sorbet_sigs.rb +23 -0
- data/lib/spoom/sorbet/translate/translator.rb +71 -0
- data/lib/spoom/sorbet/translate.rb +49 -0
- data/lib/spoom/sorbet.rb +6 -12
- data/lib/spoom/source/rewriter.rb +167 -0
- data/lib/spoom/source.rb +4 -0
- data/lib/spoom/timeline.rb +4 -6
- data/lib/spoom/version.rb +1 -1
- data/lib/spoom/visitor.rb +298 -151
- data/lib/spoom.rb +4 -3
- data/rbi/spoom.rbi +3567 -0
- 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
|
-
|
14
|
-
|
15
|
-
sig { void }
|
13
|
+
#: -> void
|
16
14
|
def initialize
|
17
|
-
@jsonrpc =
|
15
|
+
@jsonrpc = "2.0" #: String
|
18
16
|
end
|
19
17
|
|
20
|
-
|
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
|
-
|
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
|
-
|
39
|
-
|
40
|
-
sig { returns(Integer) }
|
36
|
+
#: Integer
|
41
37
|
attr_reader :id
|
42
38
|
|
43
|
-
|
39
|
+
#: Hash[untyped, untyped]
|
44
40
|
attr_reader :params
|
45
41
|
|
46
|
-
|
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
|
-
|
60
|
-
|
61
|
-
sig { returns(String) }
|
55
|
+
#: String
|
62
56
|
attr_reader :method
|
63
57
|
|
64
|
-
|
58
|
+
#: Hash[untyped, untyped]
|
65
59
|
attr_reader :params
|
66
60
|
|
67
|
-
|
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
|
-
|
12
|
-
|
13
|
-
sig { returns(String) }
|
11
|
+
#: String
|
14
12
|
attr_reader :uri
|
15
13
|
|
16
|
-
|
14
|
+
#: Array[Diagnostic]
|
17
15
|
attr_reader :diagnostics
|
18
16
|
|
19
17
|
class << self
|
20
|
-
|
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
|
-
|
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
|
-
|
42
|
-
|
43
|
-
sig { returns(Integer) }
|
37
|
+
#: Integer
|
44
38
|
attr_reader :code
|
45
39
|
|
46
|
-
|
40
|
+
#: Hash[untyped, untyped]
|
47
41
|
attr_reader :data
|
48
42
|
|
49
43
|
class << self
|
50
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
188
|
+
# @override
|
189
|
+
#: (SymbolPrinter printer) -> void
|
202
190
|
def accept_printer(printer)
|
203
191
|
printer.print(to_s)
|
204
192
|
end
|
205
193
|
|
206
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
252
|
+
#: -> String
|
267
253
|
def to_s
|
268
254
|
"#{name} (#{range})"
|
269
255
|
end
|
270
256
|
|
271
|
-
|
257
|
+
#: -> String
|
272
258
|
def kind_string
|
273
259
|
SYMBOL_KINDS[kind] || "<unknown:#{kind}>"
|
274
260
|
end
|
275
261
|
|
276
|
-
SYMBOL_KINDS =
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
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
|
-
|
311
|
-
|
312
|
-
sig { returns(T::Set[Integer]) }
|
293
|
+
#: Set[Integer]
|
313
294
|
attr_reader :seen
|
314
295
|
|
315
|
-
|
296
|
+
#: String?
|
316
297
|
attr_accessor :prefix
|
317
298
|
|
318
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
329
|
+
#: (Array[PrintableSymbol] objects) -> void
|
356
330
|
def print_list(objects)
|
357
331
|
objects.each do |object|
|
358
332
|
printt
|
data/lib/spoom/sorbet/lsp.rb
CHANGED
@@ -11,35 +11,33 @@ require_relative "lsp/errors"
|
|
11
11
|
module Spoom
|
12
12
|
module LSP
|
13
13
|
class Client
|
14
|
-
|
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 =
|
19
|
-
@open =
|
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 =
|
22
|
-
@out =
|
23
|
-
@err =
|
19
|
+
@in = io_in #: IO
|
20
|
+
@out = io_out #: IO
|
21
|
+
@err = io_err #: IO
|
24
22
|
end
|
25
23
|
|
26
|
-
|
24
|
+
#: -> Integer
|
27
25
|
def next_id
|
28
26
|
@id += 1
|
29
27
|
end
|
30
28
|
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
226
|
+
#: -> void
|
229
227
|
def close
|
230
228
|
send(Request.new(next_id, "shutdown", {}))
|
231
229
|
@in.close
|