Class: Dispersion::Annotator

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/dispersion/annotator.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(code) ⇒ Annotator

Returns a new instance of Annotator.



11
12
13
14
# File 'lib/dispersion/annotator.rb', line 11

def initialize(code)
  @code = code
  @annotations = []
end

Class Method Details

.call(code) ⇒ Object



7
8
9
# File 'lib/dispersion/annotator.rb', line 7

def self.call(code)
  new(code).call
end

Instance Method Details

#callObject



16
17
18
19
20
21
22
23
# File 'lib/dispersion/annotator.rb', line 16

def call
  @prev_end = 0
  parsed = Prism.parse(@code)
  parsed.comments.each { |c| visit_comment(c) }
  visit(parsed.value)

  @annotations.sort_by(&:first)
end

#highlight(token, loc) ⇒ Object



25
26
27
28
29
30
# File 'lib/dispersion/annotator.rb', line 25

def highlight(token, loc)
  return unless loc
  return if loc.start_line == loc.end_line && loc.start_column == loc.end_column

  @annotations << [loc.start_offset, loc.end_offset, token].freeze
end

#visit_alternation_pattern_node(node) ⇒ Object



306
307
308
309
# File 'lib/dispersion/annotator.rb', line 306

def visit_alternation_pattern_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_and_node(node) ⇒ Object



181
182
183
184
# File 'lib/dispersion/annotator.rb', line 181

def visit_and_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_array_node(node) ⇒ Object



257
258
259
260
261
# File 'lib/dispersion/annotator.rb', line 257

def visit_array_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_array_pattern_node(node) ⇒ Object



300
301
302
303
304
# File 'lib/dispersion/annotator.rb', line 300

def visit_array_pattern_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_assoc_node(node) ⇒ Object



263
264
265
266
# File 'lib/dispersion/annotator.rb', line 263

def visit_assoc_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_block_argument_node(node) ⇒ Object



176
177
178
179
# File 'lib/dispersion/annotator.rb', line 176

def visit_block_argument_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_block_node(node) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/dispersion/annotator.rb', line 114

def visit_block_node(node)
  if node.opening_loc.length == 1
    highlight Tokens::PUNCTUATION, node.opening_loc
  else
    highlight Tokens::KEYWORD, node.opening_loc
  end

  if node.closing_loc.length == 1
    highlight Tokens::PUNCTUATION, node.closing_loc
  else
    highlight Tokens::KEYWORD, node.closing_loc
  end

  super
end

#visit_block_parameter_node(node) ⇒ Object



219
220
221
222
# File 'lib/dispersion/annotator.rb', line 219

def visit_block_parameter_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_call_node(node) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/dispersion/annotator.rb', line 90

def visit_call_node(node)
  unless node.name in :[] | :[]=
    highlight Tokens::FUNCTION, node.message_loc
  end

  super
end

#visit_capture_pattern_node(node) ⇒ Object



322
323
324
325
# File 'lib/dispersion/annotator.rb', line 322

def visit_capture_pattern_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_case_match_node(node) ⇒ Object



136
137
138
139
140
# File 'lib/dispersion/annotator.rb', line 136

def visit_case_match_node(node)
  highlight Tokens::KEYWORD, node.case_keyword_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc
  super
end

#visit_case_node(node) ⇒ Object



130
131
132
133
134
# File 'lib/dispersion/annotator.rb', line 130

def visit_case_node(node)
  highlight Tokens::KEYWORD, node.case_keyword_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc
  super
end

#visit_class_node(node) ⇒ Object



84
85
86
87
88
# File 'lib/dispersion/annotator.rb', line 84

def visit_class_node(node)
  highlight Tokens::KEYWORD, node.class_keyword_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc
  super
end

#visit_comment(node) ⇒ Object



32
33
34
# File 'lib/dispersion/annotator.rb', line 32

def visit_comment(node)
  highlight Tokens::COMMENT, node.location
end

#visit_constant_read_node(node) ⇒ Object



79
80
81
82
# File 'lib/dispersion/annotator.rb', line 79

def visit_constant_read_node(node)
  highlight Tokens::CONSTANT, node.location
  super
end

#visit_def_node(node) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/dispersion/annotator.rb', line 36

def visit_def_node(node)
  highlight Tokens::KEYWORD, node.def_keyword_loc
  highlight Tokens::FUNCTION, node.name_loc
  highlight Tokens::PUNCTUATION, node.lparen_loc
  highlight Tokens::PUNCTUATION, node.rparen_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc
  super
end

#visit_else_node(node) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/dispersion/annotator.rb', line 166

def visit_else_node(node)
  if node.else_keyword.length == 1
    highlight Tokens::OPERATOR, node.else_keyword_loc
  else
    highlight Tokens::KEYWORD, node.else_keyword_loc
  end

  super
end

#visit_embedded_statements_node(node) ⇒ Object



277
278
279
280
281
# File 'lib/dispersion/annotator.rb', line 277

def visit_embedded_statements_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_float_node(node) ⇒ Object



246
247
248
249
# File 'lib/dispersion/annotator.rb', line 246

def visit_float_node(node)
  highlight Tokens::FLOAT, node.location
  super
end

#visit_forwarding_parameter_node(node) ⇒ Object



268
269
270
271
# File 'lib/dispersion/annotator.rb', line 268

def visit_forwarding_parameter_node(node)
  highlight Tokens::OPERATOR, node.location
  super
end

#visit_forwarding_super_node(node) ⇒ Object



273
274
275
# File 'lib/dispersion/annotator.rb', line 273

def visit_forwarding_super_node(node)
  highlight Tokens::KEYWORD, node.location
end

#visit_hash_node(node) ⇒ Object



251
252
253
254
255
# File 'lib/dispersion/annotator.rb', line 251

def visit_hash_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_if_node(node) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/dispersion/annotator.rb', line 148

def visit_if_node(node)
  highlight Tokens::KEYWORD, node.if_keyword_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc

  if node.then_keyword&.length == 1
    highlight Tokens::OPERATOR, node.then_keyword_loc
  else
    highlight Tokens::KEYWORD, node.then_keyword_loc
  end

  super
end

#visit_in_node(node) ⇒ Object



294
295
296
297
298
# File 'lib/dispersion/annotator.rb', line 294

def visit_in_node(node)
  highlight Tokens::KEYWORD, node.in_loc
  highlight Tokens::KEYWORD, node.then_loc
  super
end

#visit_instance_variable_and_write_node(node) ⇒ Object



62
63
64
65
66
# File 'lib/dispersion/annotator.rb', line 62

def visit_instance_variable_and_write_node(node)
  highlight Tokens::INSTANCE_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_instance_variable_or_write_node(node) ⇒ Object



68
69
70
71
72
# File 'lib/dispersion/annotator.rb', line 68

def visit_instance_variable_or_write_node(node)
  highlight Tokens::INSTANCE_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_instance_variable_read_node(node) ⇒ Object



74
75
76
77
# File 'lib/dispersion/annotator.rb', line 74

def visit_instance_variable_read_node(node)
  highlight Tokens::INSTANCE_VARIABLE, node.location
  super
end

#visit_instance_variable_write_node(node) ⇒ Object



56
57
58
59
60
# File 'lib/dispersion/annotator.rb', line 56

def visit_instance_variable_write_node(node)
  highlight Tokens::INSTANCE_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_integer_node(node) ⇒ Object



241
242
243
244
# File 'lib/dispersion/annotator.rb', line 241

def visit_integer_node(node)
  highlight Tokens::INTEGER, node.location
  super
end

#visit_interpolated_string_node(node) ⇒ Object



103
104
105
106
107
# File 'lib/dispersion/annotator.rb', line 103

def visit_interpolated_string_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_keyword_rest_parameter_node(node) ⇒ Object



214
215
216
217
# File 'lib/dispersion/annotator.rb', line 214

def visit_keyword_rest_parameter_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_local_variable_and_write_node(node) ⇒ Object



197
198
199
200
201
# File 'lib/dispersion/annotator.rb', line 197

def visit_local_variable_and_write_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_local_variable_or_write_node(node) ⇒ Object



191
192
193
194
195
# File 'lib/dispersion/annotator.rb', line 191

def visit_local_variable_or_write_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_local_variable_read_node(node) ⇒ Object



51
52
53
54
# File 'lib/dispersion/annotator.rb', line 51

def visit_local_variable_read_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.location
  super
end

#visit_local_variable_write_node(node) ⇒ Object



45
46
47
48
49
# File 'lib/dispersion/annotator.rb', line 45

def visit_local_variable_write_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_module_node(node) ⇒ Object



142
143
144
145
146
# File 'lib/dispersion/annotator.rb', line 142

def visit_module_node(node)
  highlight Tokens::KEYWORD, node.module_keyword_loc
  highlight Tokens::KEYWORD, node.end_keyword_loc
  super
end

#visit_next_node(node) ⇒ Object



236
237
238
239
# File 'lib/dispersion/annotator.rb', line 236

def visit_next_node(node)
  highlight Tokens::KEYWORD, node.keyword_loc
  super
end

#visit_optional_parameter_node(node) ⇒ Object



316
317
318
319
320
# File 'lib/dispersion/annotator.rb', line 316

def visit_optional_parameter_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.name_loc
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_or_node(node) ⇒ Object



186
187
188
189
# File 'lib/dispersion/annotator.rb', line 186

def visit_or_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_parentheses_node(node) ⇒ Object



283
284
285
286
287
# File 'lib/dispersion/annotator.rb', line 283

def visit_parentheses_node(node)
  highlight Tokens::PUNCTUATION, node.opening_loc
  highlight Tokens::PUNCTUATION, node.closing_loc
  super
end

#visit_range_node(node) ⇒ Object



289
290
291
292
# File 'lib/dispersion/annotator.rb', line 289

def visit_range_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_required_parameter_node(node) ⇒ Object



311
312
313
314
# File 'lib/dispersion/annotator.rb', line 311

def visit_required_parameter_node(node)
  highlight Tokens::LOCAL_VARIABLE, node.location
  super
end

#visit_rescue_node(node) ⇒ Object



203
204
205
206
207
# File 'lib/dispersion/annotator.rb', line 203

def visit_rescue_node(node)
  highlight Tokens::KEYWORD, node.keyword_loc
  highlight Tokens::KEYWORD, node.operator_loc
  super
end

#visit_rest_parameter_node(node) ⇒ Object



209
210
211
212
# File 'lib/dispersion/annotator.rb', line 209

def visit_rest_parameter_node(node)
  highlight Tokens::OPERATOR, node.operator_loc
  super
end

#visit_string_node(node) ⇒ Object



98
99
100
101
# File 'lib/dispersion/annotator.rb', line 98

def visit_string_node(node)
  highlight Tokens::STRING, node.location
  super
end

#visit_symbol_node(node) ⇒ Object



109
110
111
112
# File 'lib/dispersion/annotator.rb', line 109

def visit_symbol_node(node)
  highlight Tokens::SYMBOL, node.location
  super
end

#visit_until_node(node) ⇒ Object



230
231
232
233
234
# File 'lib/dispersion/annotator.rb', line 230

def visit_until_node(node)
  highlight Tokens::KEYWORD, node.keyword_loc
  highlight Tokens::KEYWORD, node.closing_loc
  super
end

#visit_when_node(node) ⇒ Object



161
162
163
164
# File 'lib/dispersion/annotator.rb', line 161

def visit_when_node(node)
  highlight Tokens::KEYWORD, node.keyword_loc
  super
end

#visit_while_node(node) ⇒ Object



224
225
226
227
228
# File 'lib/dispersion/annotator.rb', line 224

def visit_while_node(node)
  highlight Tokens::KEYWORD, node.keyword_loc
  highlight Tokens::KEYWORD, node.closing_loc
  super
end