leftovers 0.8.0 → 0.9.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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +7 -7
  4. data/docs/Configuration.md +141 -32
  5. data/docs/Custom-Precompilers.md +6 -0
  6. data/leftovers.gemspec +2 -1
  7. data/lib/config/actioncable.yml +36 -0
  8. data/lib/config/actionmailbox.yml +28 -0
  9. data/lib/config/actionmailer.yml +87 -11
  10. data/lib/config/actionpack.yml +130 -34
  11. data/lib/config/actiontext.yml +56 -0
  12. data/lib/config/actionview.yml +194 -44
  13. data/lib/config/activejob.yml +15 -8
  14. data/lib/config/activemodel.yml +175 -18
  15. data/lib/config/activerecord.yml +397 -86
  16. data/lib/config/activestorage.yml +26 -0
  17. data/lib/config/activesupport.yml +167 -24
  18. data/lib/config/leftovers.yml +48 -0
  19. data/lib/config/rails.yml +7 -3
  20. data/lib/config/railties.yml +7 -0
  21. data/lib/config/ruby.yml +438 -83
  22. data/lib/config/test-unit.yml +8 -0
  23. data/lib/leftovers/ast/array_node.rb +12 -0
  24. data/lib/leftovers/ast/block_node.rb +12 -0
  25. data/lib/leftovers/ast/builder.rb +24 -5
  26. data/lib/leftovers/ast/casgn_node.rb +20 -0
  27. data/lib/leftovers/ast/const_node.rb +15 -0
  28. data/lib/leftovers/ast/def_node.rb +15 -0
  29. data/lib/leftovers/ast/defs_node.rb +15 -0
  30. data/lib/leftovers/ast/false_node.rb +24 -0
  31. data/lib/leftovers/ast/has_arguments.rb +31 -0
  32. data/lib/leftovers/ast/hash_node.rb +17 -0
  33. data/lib/leftovers/ast/module_node.rb +16 -0
  34. data/lib/leftovers/ast/nil_node.rb +23 -0
  35. data/lib/leftovers/ast/node.rb +33 -90
  36. data/lib/leftovers/ast/numeric_node.rb +22 -0
  37. data/lib/leftovers/ast/send_node.rb +25 -0
  38. data/lib/leftovers/ast/str_node.rb +24 -0
  39. data/lib/leftovers/ast/sym_node.rb +25 -0
  40. data/lib/leftovers/ast/true_node.rb +24 -0
  41. data/lib/leftovers/ast/var_node.rb +14 -0
  42. data/lib/leftovers/ast/vasgn_node.rb +20 -0
  43. data/lib/leftovers/ast.rb +18 -0
  44. data/lib/leftovers/cli.rb +7 -1
  45. data/lib/leftovers/comparable_instance.rb +18 -0
  46. data/lib/leftovers/config_loader/argument_position_schema.rb +3 -1
  47. data/lib/leftovers/config_loader/array_schema.rb +53 -0
  48. data/lib/leftovers/config_loader/document_schema.rb +3 -2
  49. data/lib/leftovers/config_loader/dynamic_schema.rb +1 -0
  50. data/lib/leftovers/config_loader/has_value_schema.rb +4 -0
  51. data/lib/leftovers/config_loader/keyword_argument_schema.rb +13 -0
  52. data/lib/leftovers/config_loader/regexp_schema.rb +27 -0
  53. data/lib/leftovers/config_loader/rule_pattern_schema.rb +2 -0
  54. data/lib/leftovers/config_loader/scalar_value_schema.rb +8 -0
  55. data/lib/leftovers/config_loader/schema.rb +10 -0
  56. data/lib/leftovers/config_loader/string_enum_schema.rb +1 -1
  57. data/lib/leftovers/config_loader/string_pattern_schema.rb +1 -1
  58. data/lib/leftovers/config_loader/transform_schema.rb +12 -6
  59. data/lib/leftovers/config_loader/value_matcher_condition_schema.rb +13 -0
  60. data/lib/leftovers/config_loader/value_matcher_schema.rb +4 -1
  61. data/lib/leftovers/config_loader/value_or_array_schema.rb +2 -34
  62. data/lib/leftovers/config_loader/value_processor_schema.rb +2 -2
  63. data/lib/leftovers/config_loader.rb +11 -4
  64. data/lib/leftovers/definition_collection.rb +37 -0
  65. data/lib/leftovers/definition_node_set.rb +10 -2
  66. data/lib/leftovers/file.rb +1 -1
  67. data/lib/leftovers/file_collector/comments_processor.rb +1 -1
  68. data/lib/leftovers/file_collector/node_processor.rb +7 -7
  69. data/lib/leftovers/file_collector.rb +26 -32
  70. data/lib/leftovers/file_list.rb +3 -2
  71. data/lib/leftovers/matcher_builders/and.rb +26 -9
  72. data/lib/leftovers/matcher_builders/node.rb +32 -20
  73. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +3 -1
  74. data/lib/leftovers/matcher_builders/node_pair_key.rb +16 -0
  75. data/lib/leftovers/matcher_builders/node_type.rb +9 -9
  76. data/lib/leftovers/matcher_builders/node_value.rb +23 -9
  77. data/lib/leftovers/matcher_builders/or.rb +22 -7
  78. data/lib/leftovers/matcher_builders/path.rb +3 -1
  79. data/lib/leftovers/matcher_builders.rb +1 -1
  80. data/lib/leftovers/matchers/all.rb +4 -0
  81. data/lib/leftovers/matchers/and.rb +4 -0
  82. data/lib/leftovers/matchers/any.rb +2 -0
  83. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +7 -4
  84. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +5 -4
  85. data/lib/leftovers/matchers/node_has_positional_argument.rb +5 -1
  86. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +6 -1
  87. data/lib/leftovers/matchers/node_has_receiver.rb +4 -0
  88. data/lib/leftovers/matchers/node_is_proc.rb +13 -0
  89. data/lib/leftovers/matchers/node_name.rb +9 -3
  90. data/lib/leftovers/matchers/node_pair_key.rb +23 -0
  91. data/lib/leftovers/matchers/node_pair_value.rb +7 -3
  92. data/lib/leftovers/matchers/node_path.rb +7 -3
  93. data/lib/leftovers/matchers/node_privacy.rb +7 -3
  94. data/lib/leftovers/matchers/node_scalar_value.rb +6 -1
  95. data/lib/leftovers/matchers/node_type.rb +7 -3
  96. data/lib/leftovers/matchers/not.rb +2 -0
  97. data/lib/leftovers/matchers/or.rb +2 -0
  98. data/lib/leftovers/matchers/path.rb +21 -0
  99. data/lib/leftovers/matchers.rb +3 -1
  100. data/lib/leftovers/merged_config.rb +26 -25
  101. data/lib/leftovers/parser.rb +7 -4
  102. data/lib/leftovers/precompilers.rb +5 -5
  103. data/lib/leftovers/processor_builders/action.rb +55 -37
  104. data/lib/leftovers/processor_builders/add_prefix.rb +18 -10
  105. data/lib/leftovers/processor_builders/add_suffix.rb +18 -10
  106. data/lib/leftovers/processor_builders/argument.rb +28 -11
  107. data/lib/leftovers/processor_builders/dynamic.rb +37 -31
  108. data/lib/leftovers/processor_builders/each.rb +82 -10
  109. data/lib/leftovers/processor_builders/itself.rb +2 -2
  110. data/lib/leftovers/processor_builders/keyword.rb +7 -6
  111. data/lib/leftovers/processor_builders/keyword_argument.rb +4 -2
  112. data/lib/leftovers/processor_builders/receiver.rb +13 -0
  113. data/lib/leftovers/processor_builders/transform.rb +55 -44
  114. data/lib/leftovers/processor_builders/transform_chain.rb +1 -1
  115. data/lib/leftovers/processor_builders/transform_set.rb +9 -29
  116. data/lib/leftovers/processor_builders/value.rb +4 -4
  117. data/lib/leftovers/processor_builders.rb +1 -3
  118. data/lib/leftovers/processors/add_call.rb +14 -0
  119. data/lib/leftovers/processors/add_definition_node.rb +16 -0
  120. data/lib/leftovers/processors/add_dynamic_prefix.rb +29 -0
  121. data/lib/leftovers/processors/add_dynamic_suffix.rb +29 -0
  122. data/lib/leftovers/{value_processors → processors}/add_prefix.rb +7 -3
  123. data/lib/leftovers/{value_processors → processors}/add_suffix.rb +7 -3
  124. data/lib/leftovers/processors/append_sym.rb +13 -0
  125. data/lib/leftovers/{value_processors → processors}/camelize.rb +7 -3
  126. data/lib/leftovers/{value_processors → processors}/capitalize.rb +7 -3
  127. data/lib/leftovers/{value_processors → processors}/deconstantize.rb +7 -3
  128. data/lib/leftovers/{value_processors → processors}/delete_after.rb +9 -5
  129. data/lib/leftovers/processors/delete_after_last.rb +26 -0
  130. data/lib/leftovers/processors/delete_before.rb +27 -0
  131. data/lib/leftovers/processors/delete_before_last.rb +27 -0
  132. data/lib/leftovers/{value_processors → processors}/delete_prefix.rb +7 -3
  133. data/lib/leftovers/{value_processors → processors}/delete_suffix.rb +7 -3
  134. data/lib/leftovers/{value_processors → processors}/demodulize.rb +7 -3
  135. data/lib/leftovers/{value_processors → processors}/downcase.rb +7 -3
  136. data/lib/leftovers/processors/each.rb +25 -0
  137. data/lib/leftovers/processors/each_for_definition_set.rb +33 -0
  138. data/lib/leftovers/processors/each_keyword.rb +29 -0
  139. data/lib/leftovers/processors/each_keyword_argument.rb +29 -0
  140. data/lib/leftovers/processors/each_positional_argument.rb +27 -0
  141. data/lib/leftovers/processors/each_positional_argument_from.rb +30 -0
  142. data/lib/leftovers/processors/eval.rb +16 -0
  143. data/lib/leftovers/processors/itself.rb +21 -0
  144. data/lib/leftovers/processors/keyword_argument.rb +30 -0
  145. data/lib/leftovers/processors/match_current_node.rb +26 -0
  146. data/lib/leftovers/processors/match_matched_node.rb +26 -0
  147. data/lib/leftovers/{value_processors → processors}/parameterize.rb +7 -3
  148. data/lib/leftovers/{value_processors → processors}/placeholder.rb +5 -4
  149. data/lib/leftovers/{value_processors → processors}/pluralize.rb +7 -3
  150. data/lib/leftovers/{value_processors → processors}/positional_argument.rb +8 -6
  151. data/lib/leftovers/processors/receiver.rb +24 -0
  152. data/lib/leftovers/{value_processors → processors}/replace_value.rb +7 -3
  153. data/lib/leftovers/processors/set_default_privacy.rb +21 -0
  154. data/lib/leftovers/processors/set_privacy.rb +23 -0
  155. data/lib/leftovers/{value_processors → processors}/singularize.rb +7 -3
  156. data/lib/leftovers/{value_processors → processors}/split.rb +8 -4
  157. data/lib/leftovers/{value_processors → processors}/swapcase.rb +7 -3
  158. data/lib/leftovers/{value_processors → processors}/titleize.rb +7 -3
  159. data/lib/leftovers/{value_processors → processors}/underscore.rb +7 -3
  160. data/lib/leftovers/{value_processors → processors}/upcase.rb +7 -3
  161. data/lib/leftovers/processors.rb +49 -0
  162. data/lib/leftovers/version.rb +1 -1
  163. data/lib/leftovers.rb +3 -12
  164. metadata +97 -52
  165. data/lib/leftovers/dynamic_processors/call.rb +0 -22
  166. data/lib/leftovers/dynamic_processors/call_definition.rb +0 -34
  167. data/lib/leftovers/dynamic_processors/definition.rb +0 -27
  168. data/lib/leftovers/dynamic_processors/each.rb +0 -19
  169. data/lib/leftovers/dynamic_processors/null.rb +0 -9
  170. data/lib/leftovers/dynamic_processors/set_default_privacy.rb +0 -18
  171. data/lib/leftovers/dynamic_processors/set_privacy.rb +0 -23
  172. data/lib/leftovers/dynamic_processors.rb +0 -13
  173. data/lib/leftovers/matcher_builders/node_pair_name.rb +0 -18
  174. data/lib/leftovers/matchers/predicate.rb +0 -19
  175. data/lib/leftovers/processor_builders/each_action.rb +0 -51
  176. data/lib/leftovers/processor_builders/each_dynamic.rb +0 -50
  177. data/lib/leftovers/processor_builders/each_for_definition_set.rb +0 -40
  178. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +0 -24
  179. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +0 -24
  180. data/lib/leftovers/value_processors/delete_before.rb +0 -22
  181. data/lib/leftovers/value_processors/each.rb +0 -21
  182. data/lib/leftovers/value_processors/each_for_definition_set.rb +0 -23
  183. data/lib/leftovers/value_processors/each_keyword.rb +0 -27
  184. data/lib/leftovers/value_processors/each_keyword_argument.rb +0 -27
  185. data/lib/leftovers/value_processors/each_positional_argument.rb +0 -25
  186. data/lib/leftovers/value_processors/itself.rb +0 -17
  187. data/lib/leftovers/value_processors/keyword.rb +0 -28
  188. data/lib/leftovers/value_processors/keyword_argument.rb +0 -28
  189. data/lib/leftovers/value_processors/return_definition_node.rb +0 -14
  190. data/lib/leftovers/value_processors/return_sym.rb +0 -14
  191. data/lib/leftovers/value_processors.rb +0 -40
data/lib/config/ruby.yml CHANGED
@@ -1,71 +1,253 @@
1
1
  ---
2
2
  include_paths:
3
3
  - '#!:ruby'
4
+ - '*.rb'
5
+
6
+ # Gem
4
7
  - '*.gemspec'
8
+
9
+ # IRB
5
10
  - .irbrc
6
11
  - irb.rc
7
12
  - _irbrc
8
13
  - $irbrc
14
+
15
+ # Bundler
9
16
  - Gemfile
17
+
18
+ # ERB
10
19
  - '*.erb'
11
- - '*.rb'
20
+ - '*.rhtml'
12
21
 
13
22
  test_paths:
14
23
  - /tests/
15
24
  - /test/
16
25
 
17
26
  precompile:
18
- - { paths: '*.erb', format: 'erb' }
19
- - { paths: ['*.yml', '*.yaml'], format: 'yaml' }
20
- - { paths: '*.json', format: 'json' }
27
+ # ERB
28
+ - { paths: ['*.erb', '*.rhtml'], format: 'erb' }
21
29
 
22
30
  keep:
23
- - initialize # called by new
24
- - inspect # called by repl, to_s
25
- - respond_to_missing? # called by respond_to?
26
- - method_missing # called by method dispatch
31
+ # https://ruby-doc.org/core/Kernel.html#method-i-p
32
+ - inspect # called by repl, p, default to_s
33
+
34
+ # https://ruby-doc.org/core/Numeric.html#method-i-coerce
27
35
  - coerce # called by Numeric
28
- - to_s # called by "#{}"
36
+
37
+ # https://ruby-doc.org/core/Kernel.html#method-i-Array
29
38
  - to_ary # called by Array(), []+
30
39
  - to_a # called by Array(), *splat
40
+
41
+ # https://ruby-doc.org/core/Kernel.html#method-i-String
42
+ - to_s # called by String(), "#{}"
31
43
  - to_str # called by String(), ""+
32
- - to_hash # called by Hash(), **splat, {}.merge
33
- - to_int # called by Integer()
34
- - to_i # called by Integer()
35
- - to_f # called by Float()
36
- - <=> # called by Comparable
37
- - each # called by Enumerable
38
- - marshal_dump # called by Marshal.dump
39
- - marshal_load # called by Marshal.load
40
- - _dump # called by Marshal.dump
41
- - _load # called by Marshal.load
42
- - inherited # called by Subclass < Klass or Class.new(Klass)
43
- - extended # called by extend Module
44
- - included # called by include Module
45
- - $VERBOSE # called by whatever is outputting warnings i guess
44
+
45
+ # https://ruby-doc.org/core/Kernel.html#method-i-Hash
46
+ - to_hash # called by Hash(), **splat
47
+
48
+ - to_proc # called by &
49
+
50
+ - <=> # called by all of the Comparable methods
51
+ - each # called by all of the Enumerable methods
52
+
46
53
  - === # called by when
47
- - == # called by Array value, Hash value equality, ===
54
+ - == # called by Array value, Hash value equality,
48
55
  - hash # called by Hash key equality
49
- - eql? # called by Hash key equality
56
+ - eql? # called by Hash key equality, uniq
57
+
58
+ # https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_added
59
+ - singleton_method_added
60
+ # https://ruby-doc.org/core/BasicObject.html#method-i-method_missing
61
+ - method_missing
62
+
63
+ # https://ruby-doc.org/core/Class.html#method-i-inherited
64
+ # called by Subclass < Klass or Class.new(Klass)
65
+ - inherited
66
+
67
+ # https://ruby-doc.org/core/Module.html#method-i-const_missing
68
+ - const_missing
69
+
70
+ # https://ruby-doc.org/core/Module.html#method-i-method_added
71
+ - method_added
72
+
73
+ # https://ruby-doc.com/stdlib/libdoc/delegate/rdoc/Delegator.html
74
+ - __getobj__
75
+ - __setobj__
76
+
77
+ ### GLOBAL VARIABLES
78
+
79
+ # https://ruby-doc.org/core/doc/globals_rdoc.html
80
+ # https://ruby-doc.com/stdlib/libdoc/English/rdoc/English.html
81
+ - $stdin
82
+ - $stderr
83
+ - $stdout
84
+ - $> # $stdout
85
+ - $DEFAULT_OUTPUT # English alias $>
86
+ - $VERBOSE # enable warnings
87
+ - $-v # alias $VERBOSE
88
+ - $-w # alias $VERBOSE
89
+ - $DEBUG # enable debug
90
+ - $-d # alias $DEBUG
91
+ - $, # Array.join/Kernel.print default field separator
92
+ - $OFS # English alias $,
93
+ - $OUTPUT_FIELD_SEPARATOR # English alias $,
94
+ - $; # String.split default separator
95
+ - $-F # alias $;
96
+ - $FS # English alias $;
97
+ - $FIELD_SEPARATOR # English alias $;
98
+ - $/ # input record separator
99
+ - $-0 # alias $/
100
+ - $RS # English alias $/
101
+ - $INPUT_RECORD_SEPARATOR # English alias $/
102
+ - $\ # Kernel.print/IO.write default output record separator
103
+ - $ORS # English alias $\
104
+ - $OUTPUT_RECORD_SEPARATOR # English alias $\
105
+
106
+ ## some technically editable default global variables that shouldn't be written
107
+ # - $. # last line number read
108
+ # - $INPUT_LINE_NUMBER # English alias $.
109
+ # - $_ # last string read by gets or readline
110
+ # - $LAST_READ_LINE # English alias $_
111
+ # - $-i # in place edit mode extension i don't know what this means
112
+ # - $~ # last match
113
+ # - $LAST_MATCH_INFO # English alias $~
114
+ # - $PROGRAM_NAME
115
+ # - $0 # alias $PROGRAM_NAME
116
+
50
117
  dynamic:
51
- - name:
52
- - send
53
- - public_send
54
- - __send__
55
- - method
56
- - respond_to?
57
- - instance_method
118
+ # BasicObject
119
+ #
120
+ # https://ruby-doc.org/core/BasicObject.html
121
+
122
+ # https://ruby-doc.org/core/BasicObject.html#__send__
123
+ - name: __send__
58
124
  calls: 0
59
- - name: attr_reader
125
+
126
+ # https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_removed
127
+ - name: remove_method
128
+ calls:
129
+ value: singleton_method_removed
130
+
131
+ # https://ruby-doc.org/core/BasicObject.html#method-i-singleton_method_undefined
132
+ - name: undef_method
133
+ calls:
134
+ value: singleton_method_undefined
135
+
136
+ # https://ruby-doc.org/core/BasicObject.html#method-i-instance_eval
137
+ - name: instance_eval
138
+ eval: 0
139
+
140
+ # Kernel
141
+ #
142
+ # https://ruby-doc.org/core/Kernel.html
143
+
144
+ # https://ruby-doc.org/core/Kernel.html#method-i-Float
145
+ - name: Float
146
+ calls:
147
+ value: to_f
148
+
149
+ # https://ruby-doc.org/core/Kernel.html#method-i-Integer
150
+ - name: Integer
151
+ calls:
152
+ values: [to_int, to_i]
153
+
154
+ # https://ruby-doc.org/core/Kernel.html#method-i-eval
155
+ - name: eval
156
+ calls: 0
157
+
158
+
159
+ # Object
160
+ #
161
+ # https://ruby-doc.org/core/Object.html
162
+
163
+ # https://ruby-doc.org/core/Object.html#method-i-define_singleton_method
164
+ - name: define_singleton_method
165
+ defines: 0
166
+
167
+ # https://ruby-doc.org/core/Object.html#method-i-dup
168
+ - name: dup
169
+ calls:
170
+ value: initialize_copy
171
+
172
+ # https://ruby-doc.org/core/Object.html#method-i-enum_for
173
+ # https://ruby-doc.org/core/Object.html#method-i-to_enum
174
+ - name: [enum_for, to_enum]
175
+ calls: 0
176
+
177
+ # https://ruby-doc.org/core/Object.html#method-i-extend
178
+ - name: extend
179
+ calls:
180
+ value: extended
181
+
182
+ # https://ruby-doc.org/core/Object.html#method-i-instance_variable_get
183
+ - name: instance_variable_get
184
+ calls: 0
185
+
186
+ # https://ruby-doc.org/core/Object.html#method-i-instance_variable_set
187
+ - name: instance_variable_set
188
+ defines: 0
189
+
190
+ # https://ruby-doc.org/core/Object.html#method-i-method
191
+ - name: method
192
+ calls: 0
193
+
194
+ # https://ruby-doc.org/core/Object.html#method-i-public_method
195
+ - name: public_method
196
+ calls: 0
197
+
198
+ # https://ruby-doc.org/core/Object.html#method-i-public_send
199
+ - name: public_send
200
+ calls: 0
201
+
202
+ # https://ruby-doc.org/core/Object.html#method-i-remove_instance_variable
203
+ - name: remove_instance_variable
204
+ calls: 0
205
+
206
+ # https://ruby-doc.org/core/Object.html#method-i-respond_to-3F
207
+ - name: respond_to?
208
+ calls:
209
+ value: respond_to_missing?
210
+
211
+ # https://ruby-doc.org/core/Object.html#method-i-send
212
+ - name: send
213
+ calls: 0
214
+
215
+ # https://ruby-doc.org/core/Object.html#method-i-singleton_method
216
+ - name: singleton_method
217
+ calls: 0
218
+
219
+ # Module
220
+ #
221
+ # https://ruby-doc.org/core/Module.html
222
+
223
+ # https://ruby-doc.org/core/Module.html#method-i-alias_method
224
+ # Makes new_name a new copy of the method old_name.
225
+ - name: alias_method
226
+ defines: 0
227
+ calls: 1
228
+
229
+ # https://ruby-doc.org/core/Module.html#method-i-attr
230
+ # attr(name, ...) is equivalent to attr_reader.
231
+ # attr(name, true) is equivalent to attr_accessor(name) but deprecated.
232
+ # attr(name, false) is equivalent to attr_reader(name) but deprecated.
233
+ - name: attr
60
234
  defines:
61
235
  argument: '*'
62
236
  calls:
63
237
  argument: '*'
64
238
  add_prefix: '@'
65
- - name: attr_writer
239
+
240
+ - name: attr
66
241
  defines:
67
- argument: '*'
68
- add_suffix: '='
242
+ - argument: '0'
243
+ add_suffix: '='
244
+ has_argument:
245
+ at: 1
246
+ has_value: true
247
+ unless:
248
+ has_argument: 2
249
+
250
+ # https://ruby-doc.org/core/Module.html#method-i-attr_accessor
69
251
  - name: attr_accessor
70
252
  defines:
71
253
  - argument: '*'
@@ -74,68 +256,121 @@ dynamic:
74
256
  calls:
75
257
  argument: '*'
76
258
  add_prefix: '@'
77
- - name: define_method
259
+
260
+ # https://ruby-doc.org/core/Module.html#method-i-attr_reader
261
+ - name: attr_reader
262
+ defines:
263
+ argument: '*'
264
+ calls:
265
+ argument: '*'
266
+ add_prefix: '@'
267
+
268
+ # https://ruby-doc.org/core/Module.html#method-i-attr_reader
269
+ - name: attr_writer
270
+ defines:
271
+ argument: '*'
272
+ add_suffix: '='
273
+
274
+ # https://ruby-doc.org/core/Module.html#method-i-autoload
275
+ # autoload(module, filename)
276
+ # Registers filename to be loaded (using Kernel::require) the first time that module (which may
277
+ # be a String or a symbol) is accessed in the namespace of mod.
278
+ - name: autoload
78
279
  defines: 0
79
- - name: alias_method
280
+
281
+ # https://ruby-doc.org/core/Module.html#method-i-class_variable_get
282
+ - name: class_variable_get
283
+ calls: 0
284
+
285
+ # https://ruby-doc.org/core/Module.html#method-i-class_variable_set
286
+ - name: class_variable_set
80
287
  defines: 0
81
- calls: 1
82
- - name:
83
- - instance_variable_get
84
- - class_variable_get
288
+
289
+ # https://ruby-doc.org/core/Module.html#method-i-const_get
290
+ - name: const_get
291
+ calls:
292
+ argument: 0
293
+ split: '::'
294
+
295
+ # https://ruby-doc.org/core/Module.html#method-i-const_set
296
+ - name: const_set
85
297
  calls: 0
86
- - name:
87
- - instance_variable_set
88
- - class_variable_set
298
+
299
+ # https://ruby-doc.org/core/Module.html#method-i-define_method
300
+ - name: define_method
89
301
  defines: 0
90
302
 
91
- # Module
92
- - name: public
93
- unless:
94
- has_argument: 0
95
- set_default_privacy: public
303
+ # https://ruby-doc.org/core/Module.html#method-i-extend_object
304
+ # https://ruby-doc.org/core/Module.html#method-i-extended
305
+ - name: extend
306
+ calls:
307
+ values: [extend_object, extended]
96
308
 
97
- - name:
98
- - public
99
- - public_class_method
100
- - public_constant
101
- has_argument: 0
102
- set_privacy:
103
- argument: '*'
104
- to: public
309
+ # https://ruby-doc.org/core/Module.html#method-i-include
310
+ # https://ruby-doc.org/core/Module.html#method-i-included
311
+ # https://ruby-doc.org/core/Module.html#method-i-append_features
312
+ - name: include
313
+ calls:
314
+ values: [append_features, included]
105
315
 
106
- - name:
107
- - public
108
- - public_class_method
316
+ # https://ruby-doc.org/core/Module.html#method-i-instance_method
317
+ - name: instance_method
318
+ calls: 0
319
+
320
+ # https://ruby-doc.org/core/Module.html#method-i-prepend
321
+ # https://ruby-doc.org/core/Module.html#method-i-prepend_features
322
+ # https://ruby-doc.org/core/Module.html#method-i-prepended
323
+ - name: prepend
324
+ calls:
325
+ values: [prepend_features, prepended]
326
+
327
+ # https://ruby-doc.org/core/Module.html#method-i-private_class_method
328
+ # private_class_method(symbol, ...)
329
+ # private_class_method(string, ...)
330
+ # private_class_method(array)
331
+ - name: private_class_method
109
332
  has_argument: 0
110
- unless:
111
- has_argument: 1
112
333
  set_privacy:
113
- argument: 0
334
+ argument: '*'
114
335
  nested:
115
336
  argument: '*'
116
- to: public
117
-
118
- - name: protected
119
- unless:
120
- has_argument: 0
121
- set_default_privacy: protected
337
+ to: private
122
338
 
123
- - name: protected
339
+ # https://ruby-doc.org/core/Module.html#method-i-private_constant
340
+ - name: private_constant
124
341
  has_argument: 0
125
342
  set_privacy:
126
343
  argument: '*'
127
- to: protected
344
+ to: private
128
345
 
129
- - name: protected
346
+ # https://ruby-doc.org/core/Module.html#method-i-public_class_method
347
+ # public_class_method(symbol, ...)
348
+ # public_class_method(string, ...)
349
+ # public_class_method(array)
350
+ - name: public_class_method
130
351
  has_argument: 0
131
- unless:
132
- has_argument: 1
133
352
  set_privacy:
134
- argument: 0
353
+ argument: '*'
135
354
  nested:
136
355
  argument: '*'
137
- to: protected
356
+ to: private
138
357
 
358
+ # https://ruby-doc.org/core/Module.html#method-i-public_constant
359
+ - name: public_constant
360
+ has_argument: 0
361
+ set_privacy:
362
+ argument: '*'
363
+ to: private
364
+
365
+ # https://ruby-doc.org/core/Module.html#method-i-remove_class_variable
366
+ - name: remove_class_variable
367
+ calls: 0
368
+
369
+ # https://ruby-doc.org/core/Module.html#method-i-private
370
+ # private sets the default visibility for subsequently defined methods to private
371
+ # private(method_name) sets the named methods to have private visibility
372
+ # private(method_name, method_name, ...)
373
+ # private(array)
139
374
  - name: private
140
375
  unless:
141
376
  has_argument: 0
@@ -143,19 +378,139 @@ dynamic:
143
378
 
144
379
  - name:
145
380
  - private
146
- - private_class_method
147
- - private_constant
148
381
  has_argument: 0
149
382
  set_privacy:
150
383
  argument: '*'
384
+ nested:
385
+ argument: '*'
151
386
  to: private
152
387
 
153
- - name: private
388
+ # https://ruby-doc.org/core/Module.html#method-i-protected
389
+ # protected sets the default visibility for subsequently defined methods to protected
390
+ # protected(method_name) sets the named methods to have protected visibility
391
+ # protected(method_name, method_name, ...)
392
+ # protected(array)
393
+
394
+ - name: protected
395
+ unless:
396
+ has_argument: 0
397
+ set_default_privacy: protected
398
+
399
+ - name: protected
154
400
  has_argument: 0
401
+ set_privacy:
402
+ argument: '*'
403
+ nested:
404
+ argument: '*'
405
+ to: protected
406
+
407
+ # https://ruby-doc.org/core/Module.html#method-i-public
408
+ # public sets the default visibility for subsequently defined methods to public
409
+ # public(method_name) sets the named methods to have public visibility
410
+ # public(method_name, method_name, ...)
411
+ # public(array)
412
+
413
+ - name: public
155
414
  unless:
156
- has_argument: 1
415
+ has_argument: 0
416
+ set_default_privacy: public
417
+
418
+ - name: public
419
+ has_argument: 0
157
420
  set_privacy:
158
- argument: 0
421
+ argument: '*'
159
422
  nested:
160
423
  argument: '*'
161
- to: private
424
+ to: public
425
+
426
+ # https://ruby-doc.org/core/Module.html#method-i-remove_const
427
+ # Removes the definition of the given constant, returning that constant's previous value
428
+ - name: remove_const
429
+ calls: 0
430
+
431
+ # https://ruby-doc.org/core/Module.html#method-i-remove_method
432
+ # https://ruby-doc.org/core/Module.html#method-i-method_removed
433
+ - name: removed_method
434
+ calls:
435
+ value: method_removed
436
+
437
+ # https://ruby-doc.org/core/Module.html#method-i-undef_method
438
+ # https://ruby-doc.org/core/Module.html#method-i-method_undefined
439
+ - name: undef_method
440
+ calls:
441
+ value: method_undefined
442
+
443
+ # https://ruby-doc.org/core/Module.html#method-i-module_eval
444
+ # https://ruby-doc.org/core/Module.html#method-i-class_eval
445
+ - name: [module_eval, class_eval]
446
+ eval: 0
447
+
448
+
449
+ # Class
450
+ #
451
+ # https://ruby-doc.org/core/Class.html
452
+
453
+ # https://ruby-doc.org/core/Class.html#method-i-new
454
+ - name: new
455
+ calls:
456
+ values: [allocate, initialize]
457
+
458
+ # Enumerable
459
+ #
460
+ # https://ruby-doc.org/core/Enumerable.html
461
+
462
+ # https://ruby-doc.org/core/Enumerable.html#method-i-inject
463
+ # https://ruby-doc.org/core/Enumerable.html#method-i-reject
464
+ # inject(symbol)
465
+ # inject(initial_operand, symbol)
466
+ # inject {|memo, operand| ... }
467
+ # inject(initial_operand) {|memo, operand| ... }
468
+ - name: [inject, reduce]
469
+ calls: -1
470
+ # unless:
471
+ # has_block: true
472
+
473
+ # Marshal
474
+ #
475
+ # https://ruby-doc.org/core/Marshal.html
476
+
477
+ # https://ruby-doc.org/core/Marshal.html#method-c-dump
478
+ - names: dump
479
+ has_receiver: Marshal
480
+ calls:
481
+ values: [marshal_dump, _dump]
482
+
483
+ # https://ruby-doc.org/core/Marshal.html#method-c-load
484
+ - names: [load, restore]
485
+ has_receiver: Marshal
486
+ calls:
487
+ values: [marshal_load, _load]
488
+
489
+ # Forwardable
490
+ #
491
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/Forwardable.html
492
+
493
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/Forwardable.html#method-i-def_instance_delegator
494
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/SingleForwardable.html#method-i-def_single_delegator
495
+ - names: [def_delegator, def_instance_delegator, def_single_delegator]
496
+ defines: 2
497
+ calls:
498
+ - 1
499
+ - argument: 0
500
+ split: '::'
501
+
502
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/Forwardable.html#method-i-def_instance_delegators
503
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/SingleForwardable.html#method-i-def_single_delegators
504
+ - name: [def_delegators, def_instance_delegators, def_single_delegators]
505
+ calls:
506
+ argument: 0
507
+ split: '::'
508
+
509
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/Forwardable.html#method-i-instance_delegate
510
+ # https://ruby-doc.com/stdlib/libdoc/forwardable/rdoc/SingleForwardable.html#method-i-single_delegate
511
+ - name: [delegate, instance_delegate, single_delegate]
512
+ calls:
513
+ arguments: '**'
514
+ split: '::'
515
+ unless:
516
+ has_argument: 0
@@ -0,0 +1,8 @@
1
+ # https://ruby-doc.com/stdlib-3.1.1/libdoc/test-unit/rdoc/Test/Unit.html
2
+
3
+ keep:
4
+ - setup
5
+ - teardown
6
+ - startup
7
+ - shutdown
8
+ - has_prefix: test
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module AST
5
+ class ArrayNode < ::Leftovers::AST::Node
6
+ include Leftovers::AST::HasArguments
7
+
8
+ alias_method :arguments, :children
9
+ alias_method :as_arguments_list, :arguments
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module AST
5
+ class BlockNode < ::Leftovers::AST::Node
6
+ def proc?
7
+ name = first.name
8
+ name == :lambda || name == :proc
9
+ end
10
+ end
11
+ end
12
+ end
@@ -5,12 +5,31 @@ require 'parser'
5
5
  module Leftovers
6
6
  module AST
7
7
  class Builder < ::Parser::Builders::Default
8
- # Generates {Node} from the given information.
9
- #
10
- # @return [Node] the generated node
11
-
12
8
  def n(type, children, source_map) # leftovers:keep
13
- ::Leftovers::AST::Node.new(type, children, location: source_map)
9
+ self.class.node_class(type).new(type, children, location: source_map)
10
+ end
11
+
12
+ def self.node_class(type) # rubocop:disable Metrics
13
+ case type
14
+ when :array then ::Leftovers::AST::ArrayNode
15
+ when :block then ::Leftovers::AST::BlockNode
16
+ when :casgn then ::Leftovers::AST::CasgnNode
17
+ when :const then ::Leftovers::AST::ConstNode
18
+ when :def then ::Leftovers::AST::DefNode
19
+ when :defs then ::Leftovers::AST::DefsNode
20
+ when :false then ::Leftovers::AST::FalseNode
21
+ when :hash then ::Leftovers::AST::HashNode
22
+ when :int, :float then ::Leftovers::AST::NumericNode
23
+ when :lvar, :ivar, :gvar, :cvar then ::Leftovers::AST::VarNode
24
+ when :ivasgn, :cvasgn, :gvasgn then ::Leftovers::AST::VasgnNode
25
+ when :module, :class then ::Leftovers::AST::ModuleNode
26
+ when :nil then ::Leftovers::AST::NilNode
27
+ when :send, :csend then ::Leftovers::AST::SendNode
28
+ when :str then ::Leftovers::AST::StrNode
29
+ when :sym then ::Leftovers::AST::SymNode
30
+ when :true then ::Leftovers::AST::TrueNode
31
+ else ::Leftovers::AST::Node
32
+ end
14
33
  end
15
34
 
16
35
  # Don't complain about invalid strings
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module AST
5
+ class CasgnNode < ::Leftovers::AST::Node
6
+ include Leftovers::AST::HasArguments
7
+
8
+ alias_method :name, :second
9
+ alias_method :to_sym, :second
10
+
11
+ def to_s
12
+ name.to_s
13
+ end
14
+
15
+ def arguments
16
+ children[2].as_arguments_list
17
+ end
18
+ end
19
+ end
20
+ end