spoom 1.5.4 → 1.6.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.
- checksums.yaml +4 -4
- data/lib/spoom/backtrace_filter/minitest.rb +2 -3
- data/lib/spoom/cli/deadcode.rb +1 -2
- data/lib/spoom/cli/helper.rb +36 -28
- data/lib/spoom/cli/srb/assertions.rb +48 -0
- data/lib/spoom/cli/srb/bump.rb +1 -2
- data/lib/spoom/cli/srb/sigs.rb +133 -18
- data/lib/spoom/cli/srb.rb +8 -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 +2 -5
- data/lib/spoom/context/file_system.rb +12 -19
- data/lib/spoom/context/git.rb +14 -19
- data/lib/spoom/context/sorbet.rb +13 -26
- data/lib/spoom/context.rb +3 -7
- 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 +38 -76
- data/lib/spoom/coverage/snapshot.rb +7 -13
- 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 +19 -23
- 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 +4 -4
- data/lib/spoom/deadcode/plugins/active_model.rb +2 -3
- data/lib/spoom/deadcode/plugins/active_record.rb +2 -3
- data/lib/spoom/deadcode/plugins/active_support.rb +2 -1
- 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 +4 -4
- 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 +2 -4
- data/lib/spoom/deadcode/remover.rb +37 -59
- data/lib/spoom/deadcode/send.rb +2 -8
- data/lib/spoom/file_collector.rb +10 -18
- data/lib/spoom/file_tree.rb +31 -46
- data/lib/spoom/location.rb +9 -20
- data/lib/spoom/model/builder.rb +60 -15
- data/lib/spoom/model/model.rb +65 -68
- data/lib/spoom/model/namespace_visitor.rb +3 -2
- data/lib/spoom/model/reference.rb +4 -8
- data/lib/spoom/model/references_visitor.rb +49 -29
- data/lib/spoom/parse.rb +17 -3
- data/lib/spoom/poset.rb +17 -19
- data/lib/spoom/printer.rb +10 -13
- data/lib/spoom/sorbet/assertions.rb +278 -0
- data/lib/spoom/sorbet/config.rb +8 -12
- data/lib/spoom/sorbet/errors.rb +16 -31
- data/lib/spoom/sorbet/lsp/base.rb +9 -15
- data/lib/spoom/sorbet/lsp/errors.rb +8 -16
- data/lib/spoom/sorbet/lsp/structures.rb +36 -59
- data/lib/spoom/sorbet/lsp.rb +15 -17
- data/lib/spoom/sorbet/metrics.rb +3 -5
- data/lib/spoom/sorbet/sigils.rb +7 -11
- data/lib/spoom/sorbet/sigs.rb +118 -25
- data/lib/spoom/sorbet.rb +3 -9
- 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 +0 -2
- data/rbi/spoom.rbi +3963 -0
- metadata +6 -3
data/lib/spoom/sorbet/errors.rb
CHANGED
@@ -7,17 +7,13 @@ module Spoom
|
|
7
7
|
DEFAULT_ERROR_URL_BASE = "https://srb.help/"
|
8
8
|
|
9
9
|
class << self
|
10
|
-
|
11
|
-
|
12
|
-
sig { params(errors: T::Array[Error]).returns(T::Array[Error]) }
|
10
|
+
#: (Array[Error] errors) -> Array[Error]
|
13
11
|
def sort_errors_by_code(errors)
|
14
12
|
errors.sort_by { |e| [e.code, e.file, e.line, e.message] }
|
15
13
|
end
|
16
14
|
end
|
17
15
|
# Parse errors from Sorbet output
|
18
16
|
class Parser
|
19
|
-
extend T::Sig
|
20
|
-
|
21
17
|
class ParseError < Spoom::Error; end
|
22
18
|
|
23
19
|
HEADER = T.let(
|
@@ -32,23 +28,21 @@ module Spoom
|
|
32
28
|
)
|
33
29
|
|
34
30
|
class << self
|
35
|
-
|
36
|
-
|
37
|
-
sig { params(output: String, error_url_base: String).returns(T::Array[Error]) }
|
31
|
+
#: (String output, ?error_url_base: String) -> Array[Error]
|
38
32
|
def parse_string(output, error_url_base: DEFAULT_ERROR_URL_BASE)
|
39
33
|
parser = Spoom::Sorbet::Errors::Parser.new(error_url_base: error_url_base)
|
40
34
|
parser.parse(output)
|
41
35
|
end
|
42
36
|
end
|
43
37
|
|
44
|
-
|
38
|
+
#: (?error_url_base: String) -> void
|
45
39
|
def initialize(error_url_base: DEFAULT_ERROR_URL_BASE)
|
46
40
|
@errors = T.let([], T::Array[Error])
|
47
41
|
@error_line_match_regex = T.let(error_line_match_regexp(error_url_base), Regexp)
|
48
42
|
@current_error = T.let(nil, T.nilable(Error))
|
49
43
|
end
|
50
44
|
|
51
|
-
|
45
|
+
#: (String output) -> Array[Error]
|
52
46
|
def parse(output)
|
53
47
|
output.each_line do |line|
|
54
48
|
break if /^No errors! Great job\./.match?(line)
|
@@ -71,7 +65,7 @@ module Spoom
|
|
71
65
|
|
72
66
|
private
|
73
67
|
|
74
|
-
|
68
|
+
#: (String error_url_base) -> Regexp
|
75
69
|
def error_line_match_regexp(error_url_base)
|
76
70
|
url = Regexp.escape(error_url_base)
|
77
71
|
%r{
|
@@ -88,7 +82,7 @@ module Spoom
|
|
88
82
|
}x
|
89
83
|
end
|
90
84
|
|
91
|
-
|
85
|
+
#: (String line) -> Error?
|
92
86
|
def match_error_line(line)
|
93
87
|
match = line.match(@error_line_match_regex)
|
94
88
|
return unless match
|
@@ -97,14 +91,14 @@ module Spoom
|
|
97
91
|
Error.new(file, line&.to_i, message, code&.to_i)
|
98
92
|
end
|
99
93
|
|
100
|
-
|
94
|
+
#: (Error error) -> void
|
101
95
|
def open_error(error)
|
102
96
|
raise ParseError, "Error: Already parsing an error!" if @current_error
|
103
97
|
|
104
98
|
@current_error = error
|
105
99
|
end
|
106
100
|
|
107
|
-
|
101
|
+
#: -> void
|
108
102
|
def close_error
|
109
103
|
raise ParseError, "Error: Not already parsing an error!" unless @current_error
|
110
104
|
|
@@ -112,7 +106,7 @@ module Spoom
|
|
112
106
|
@current_error = nil
|
113
107
|
end
|
114
108
|
|
115
|
-
|
109
|
+
#: (String line) -> void
|
116
110
|
def append_error(line)
|
117
111
|
raise ParseError, "Error: Not already parsing an error!" unless @current_error
|
118
112
|
|
@@ -126,30 +120,21 @@ module Spoom
|
|
126
120
|
|
127
121
|
class Error
|
128
122
|
include Comparable
|
129
|
-
extend T::Sig
|
130
123
|
|
131
|
-
|
124
|
+
#: String?
|
132
125
|
attr_reader :file, :message
|
133
126
|
|
134
|
-
|
127
|
+
#: Integer?
|
135
128
|
attr_reader :line, :code
|
136
129
|
|
137
|
-
|
130
|
+
#: Array[String]
|
138
131
|
attr_reader :more
|
139
132
|
|
140
133
|
# Other files associated with the error
|
141
|
-
|
134
|
+
#: Set[String]
|
142
135
|
attr_reader :files_from_error_sections
|
143
136
|
|
144
|
-
|
145
|
-
params(
|
146
|
-
file: T.nilable(String),
|
147
|
-
line: T.nilable(Integer),
|
148
|
-
message: T.nilable(String),
|
149
|
-
code: T.nilable(Integer),
|
150
|
-
more: T::Array[String],
|
151
|
-
).void
|
152
|
-
end
|
137
|
+
#: (String? file, Integer? line, String? message, Integer? code, ?Array[String] more) -> void
|
153
138
|
def initialize(file, line, message, code, more = [])
|
154
139
|
@file = file
|
155
140
|
@line = line
|
@@ -160,14 +145,14 @@ module Spoom
|
|
160
145
|
end
|
161
146
|
|
162
147
|
# By default errors are sorted by location
|
163
|
-
|
148
|
+
#: (untyped other) -> Integer
|
164
149
|
def <=>(other)
|
165
150
|
return 0 unless other.is_a?(Error)
|
166
151
|
|
167
152
|
[file, line, code, message] <=> [other.file, other.line, other.code, other.message]
|
168
153
|
end
|
169
154
|
|
170
|
-
|
155
|
+
#: -> String
|
171
156
|
def to_s
|
172
157
|
"#{file}:#{line}: #{message} (#{code})"
|
173
158
|
end
|
@@ -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
15
|
@jsonrpc = T.let("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,12 +249,12 @@ 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
|
@@ -307,22 +293,13 @@ module Spoom
|
|
307
293
|
end
|
308
294
|
|
309
295
|
class SymbolPrinter < Printer
|
310
|
-
|
311
|
-
|
312
|
-
sig { returns(T::Set[Integer]) }
|
296
|
+
#: Set[Integer]
|
313
297
|
attr_reader :seen
|
314
298
|
|
315
|
-
|
299
|
+
#: String?
|
316
300
|
attr_accessor :prefix
|
317
301
|
|
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
|
302
|
+
#: (?out: (IO | StringIO), ?colors: bool, ?indent_level: Integer, ?prefix: String?) -> void
|
326
303
|
def initialize(out: $stdout, colors: true, indent_level: 0, prefix: nil)
|
327
304
|
super(out: out, colors: colors, indent_level: indent_level)
|
328
305
|
@seen = T.let(Set.new, T::Set[Integer])
|
@@ -332,19 +309,19 @@ module Spoom
|
|
332
309
|
@prefix = prefix
|
333
310
|
end
|
334
311
|
|
335
|
-
|
312
|
+
#: (PrintableSymbol? object) -> void
|
336
313
|
def print_object(object)
|
337
314
|
return unless object
|
338
315
|
|
339
316
|
object.accept_printer(self)
|
340
317
|
end
|
341
318
|
|
342
|
-
|
319
|
+
#: (Array[PrintableSymbol] objects) -> void
|
343
320
|
def print_objects(objects)
|
344
321
|
objects.each { |object| print_object(object) }
|
345
322
|
end
|
346
323
|
|
347
|
-
|
324
|
+
#: (String uri) -> String
|
348
325
|
def clean_uri(uri)
|
349
326
|
prefix = self.prefix
|
350
327
|
return uri unless prefix
|
@@ -352,7 +329,7 @@ module Spoom
|
|
352
329
|
uri.delete_prefix(prefix)
|
353
330
|
end
|
354
331
|
|
355
|
-
|
332
|
+
#: (Array[PrintableSymbol] objects) -> void
|
356
333
|
def print_list(objects)
|
357
334
|
objects.each do |object|
|
358
335
|
printt
|