rubocop 0.42.0 → 0.52.1

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 (627) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +106 -20
  4. data/assets/output.html.erb +21 -10
  5. data/bin/rubocop +1 -2
  6. data/config/default.yml +914 -483
  7. data/config/disabled.yml +61 -41
  8. data/config/enabled.yml +1396 -878
  9. data/lib/rubocop/ast/builder.rb +72 -0
  10. data/lib/rubocop/ast/node/and_node.rb +37 -0
  11. data/lib/rubocop/ast/node/args_node.rb +29 -0
  12. data/lib/rubocop/ast/node/array_node.rb +57 -0
  13. data/lib/rubocop/ast/node/block_node.rb +116 -0
  14. data/lib/rubocop/ast/node/case_node.rb +64 -0
  15. data/lib/rubocop/ast/node/def_node.rb +71 -0
  16. data/lib/rubocop/ast/node/ensure_node.rb +25 -0
  17. data/lib/rubocop/ast/node/for_node.rb +61 -0
  18. data/lib/rubocop/ast/node/hash_node.rb +109 -0
  19. data/lib/rubocop/ast/node/if_node.rb +146 -0
  20. data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
  21. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  22. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
  23. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  24. data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
  25. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
  26. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  27. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  28. data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
  29. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
  30. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  31. data/lib/rubocop/ast/node/or_node.rb +37 -0
  32. data/lib/rubocop/ast/node/pair_node.rb +64 -0
  33. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  34. data/lib/rubocop/ast/node/resbody_node.rb +25 -0
  35. data/lib/rubocop/ast/node/send_node.rb +45 -0
  36. data/lib/rubocop/ast/node/str_node.rb +14 -0
  37. data/lib/rubocop/ast/node/super_node.rb +21 -0
  38. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  39. data/lib/rubocop/ast/node/until_node.rb +43 -0
  40. data/lib/rubocop/ast/node/when_node.rb +61 -0
  41. data/lib/rubocop/ast/node/while_node.rb +43 -0
  42. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  43. data/lib/rubocop/ast/node.rb +634 -0
  44. data/lib/rubocop/ast/sexp.rb +16 -0
  45. data/lib/rubocop/{ast_node → ast}/traversal.rb +23 -24
  46. data/lib/rubocop/cached_data.rb +11 -31
  47. data/lib/rubocop/cli.rb +116 -33
  48. data/lib/rubocop/comment_config.rb +4 -10
  49. data/lib/rubocop/config.rb +355 -102
  50. data/lib/rubocop/config_loader.rb +93 -78
  51. data/lib/rubocop/config_loader_resolver.rb +106 -7
  52. data/lib/rubocop/config_store.rb +4 -1
  53. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  54. data/lib/rubocop/cop/badge.rb +73 -0
  55. data/lib/rubocop/cop/bundler/duplicated_gem.rb +71 -0
  56. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  57. data/lib/rubocop/cop/bundler/ordered_gems.rb +71 -0
  58. data/lib/rubocop/cop/commissioner.rb +27 -10
  59. data/lib/rubocop/cop/cop.rb +62 -107
  60. data/lib/rubocop/cop/corrector.rb +0 -1
  61. data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
  62. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  63. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  64. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
  65. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  66. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  67. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  68. data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
  69. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  70. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
  71. data/lib/rubocop/cop/force.rb +0 -1
  72. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  73. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
  74. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  75. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  76. data/lib/rubocop/cop/generator.rb +191 -0
  77. data/lib/rubocop/cop/ignored_node.rb +0 -1
  78. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  79. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  80. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  81. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  82. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  83. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  84. data/lib/rubocop/cop/internal_affairs.rb +8 -0
  85. data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +39 -10
  86. data/lib/rubocop/cop/layout/align_array.rb +39 -0
  87. data/lib/rubocop/cop/layout/align_hash.rb +235 -0
  88. data/lib/rubocop/cop/{style → layout}/align_parameters.rb +38 -19
  89. data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +26 -8
  90. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  91. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  92. data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +18 -13
  93. data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +48 -6
  94. data/lib/rubocop/cop/{style → layout}/dot_position.rb +34 -21
  95. data/lib/rubocop/cop/{style → layout}/else_alignment.rb +55 -37
  96. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -0
  97. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +147 -0
  98. data/lib/rubocop/cop/{style → layout}/empty_lines.rb +17 -4
  99. data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +40 -24
  100. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +87 -0
  101. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +46 -0
  102. data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +9 -12
  103. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +68 -0
  104. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +135 -0
  105. data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +10 -7
  106. data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +27 -9
  107. data/lib/rubocop/cop/layout/end_of_line.rb +52 -0
  108. data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +63 -53
  109. data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +5 -2
  110. data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +5 -2
  111. data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +7 -4
  112. data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +8 -5
  113. data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +32 -26
  114. data/lib/rubocop/cop/{style → layout}/indent_array.rb +75 -25
  115. data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +9 -6
  116. data/lib/rubocop/cop/{style → layout}/indent_hash.rb +80 -31
  117. data/lib/rubocop/cop/layout/indent_heredoc.rb +208 -0
  118. data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +7 -5
  119. data/lib/rubocop/cop/{style → layout}/indentation_width.rb +151 -117
  120. data/lib/rubocop/cop/layout/initial_indentation.rb +45 -0
  121. data/lib/rubocop/cop/layout/leading_comment_space.rb +58 -0
  122. data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +52 -16
  123. data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +18 -21
  124. data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +37 -43
  125. data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +55 -15
  126. data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +15 -4
  127. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +221 -0
  128. data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +12 -5
  129. data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +23 -13
  130. data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +24 -13
  131. data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +17 -13
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  133. data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +11 -11
  134. data/lib/rubocop/cop/layout/space_after_not.rb +38 -0
  135. data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +14 -4
  136. data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +52 -28
  137. data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +29 -21
  138. data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +33 -29
  139. data/lib/rubocop/cop/layout/space_around_operators.rb +159 -0
  140. data/lib/rubocop/cop/layout/space_before_block_braces.rb +107 -0
  141. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  142. data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +11 -7
  143. data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +23 -20
  144. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  145. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +85 -0
  146. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +236 -0
  147. data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +8 -8
  148. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +228 -0
  149. data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +91 -51
  150. data/lib/rubocop/cop/layout/space_inside_parens.rb +53 -0
  151. data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +14 -13
  152. data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +16 -17
  153. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +90 -0
  154. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +80 -0
  155. data/lib/rubocop/cop/{style → layout}/tab.rb +8 -6
  156. data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +14 -15
  157. data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +3 -4
  158. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +59 -0
  159. data/lib/rubocop/cop/lint/ambiguous_operator.rb +13 -9
  160. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +7 -1
  161. data/lib/rubocop/cop/lint/assignment_in_condition.rb +55 -25
  162. data/lib/rubocop/cop/lint/block_alignment.rb +75 -34
  163. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  164. data/lib/rubocop/cop/lint/circular_argument_reference.rb +17 -15
  165. data/lib/rubocop/cop/lint/condition_position.rb +16 -15
  166. data/lib/rubocop/cop/lint/debugger.rb +57 -23
  167. data/lib/rubocop/cop/lint/def_end_alignment.rb +28 -14
  168. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +19 -10
  169. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  170. data/lib/rubocop/cop/lint/duplicate_methods.rb +108 -14
  171. data/lib/rubocop/cop/lint/duplicated_key.rb +16 -9
  172. data/lib/rubocop/cop/lint/each_with_object_argument.rb +15 -6
  173. data/lib/rubocop/cop/lint/else_layout.rb +27 -31
  174. data/lib/rubocop/cop/lint/empty_ensure.rb +44 -3
  175. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  176. data/lib/rubocop/cop/lint/empty_interpolation.rb +16 -3
  177. data/lib/rubocop/cop/lint/empty_when.rb +38 -0
  178. data/lib/rubocop/cop/lint/end_alignment.rb +57 -39
  179. data/lib/rubocop/cop/lint/end_in_method.rb +24 -2
  180. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  181. data/lib/rubocop/cop/lint/float_out_of_range.rb +10 -6
  182. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +67 -46
  183. data/lib/rubocop/cop/lint/handle_exceptions.rb +41 -4
  184. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +9 -5
  185. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +42 -29
  186. data/lib/rubocop/cop/lint/inherit_exception.rb +34 -23
  187. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  188. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +51 -40
  189. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -8
  190. data/lib/rubocop/cop/lint/loop.rb +37 -2
  191. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  192. data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
  193. data/lib/rubocop/cop/lint/nested_method_definition.rb +54 -12
  194. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  195. data/lib/rubocop/cop/lint/next_without_accumulator.rb +7 -3
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +32 -23
  197. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +22 -14
  198. data/lib/rubocop/cop/lint/percent_string_array.rb +42 -27
  199. data/lib/rubocop/cop/lint/percent_symbol_array.rb +28 -19
  200. data/lib/rubocop/cop/lint/rand_one.rb +17 -8
  201. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  202. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  203. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  204. data/lib/rubocop/cop/lint/require_parentheses.rb +24 -30
  205. data/lib/rubocop/cop/lint/rescue_exception.rb +21 -2
  206. data/lib/rubocop/cop/lint/rescue_type.rb +90 -0
  207. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  208. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +70 -0
  209. data/lib/rubocop/cop/lint/script_permission.rb +49 -0
  210. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  211. data/lib/rubocop/cop/lint/shadowed_exception.rb +78 -57
  212. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -2
  213. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +18 -12
  214. data/lib/rubocop/cop/lint/syntax.rb +23 -21
  215. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -4
  216. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  217. data/lib/rubocop/cop/lint/unneeded_disable.rb +117 -56
  218. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  219. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +167 -0
  220. data/lib/rubocop/cop/lint/unreachable_code.rb +72 -8
  221. data/lib/rubocop/cop/lint/unused_block_argument.rb +87 -27
  222. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  223. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +75 -0
  224. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  225. data/lib/rubocop/cop/lint/useless_access_modifier.rb +40 -18
  226. data/lib/rubocop/cop/lint/useless_assignment.rb +45 -14
  227. data/lib/rubocop/cop/lint/useless_comparison.rb +8 -10
  228. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +16 -2
  229. data/lib/rubocop/cop/lint/useless_setter_call.rb +57 -43
  230. data/lib/rubocop/cop/lint/void.rb +83 -23
  231. data/lib/rubocop/cop/message_annotator.rb +118 -0
  232. data/lib/rubocop/cop/metrics/abc_size.rb +3 -4
  233. data/lib/rubocop/cop/metrics/block_length.rb +32 -0
  234. data/lib/rubocop/cop/metrics/block_nesting.rb +21 -10
  235. data/lib/rubocop/cop/metrics/class_length.rb +3 -2
  236. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -4
  237. data/lib/rubocop/cop/metrics/line_length.rb +67 -14
  238. data/lib/rubocop/cop/metrics/method_length.rb +10 -10
  239. data/lib/rubocop/cop/metrics/module_length.rb +3 -2
  240. data/lib/rubocop/cop/metrics/parameter_lists.rb +15 -6
  241. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -6
  242. data/lib/rubocop/cop/mixin/alignment.rb +70 -0
  243. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -1
  244. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +26 -22
  245. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  246. data/lib/rubocop/cop/mixin/array_syntax.rb +4 -12
  247. data/lib/rubocop/cop/mixin/check_assignment.rb +6 -7
  248. data/lib/rubocop/cop/mixin/classish_length.rb +0 -1
  249. data/lib/rubocop/cop/mixin/code_length.rb +4 -3
  250. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -16
  251. data/lib/rubocop/cop/mixin/configurable_formatting.rb +48 -0
  252. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -4
  253. data/lib/rubocop/cop/mixin/configurable_naming.rb +5 -35
  254. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  255. data/lib/rubocop/cop/mixin/def_node.rb +29 -0
  256. data/lib/rubocop/cop/mixin/documentation_comment.rb +46 -0
  257. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  258. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +119 -27
  259. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  260. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +11 -27
  261. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  262. data/lib/rubocop/cop/mixin/first_element_line_break.rb +15 -11
  263. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +15 -13
  264. data/lib/rubocop/cop/mixin/hash_alignment.rb +116 -0
  265. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  266. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  267. data/lib/rubocop/cop/mixin/integer_node.rb +2 -1
  268. data/lib/rubocop/cop/mixin/match_range.rb +4 -6
  269. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -8
  270. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  271. data/lib/rubocop/cop/mixin/min_body_length.rb +2 -1
  272. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +100 -66
  273. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +49 -51
  274. data/lib/rubocop/cop/mixin/negative_conditional.rb +18 -13
  275. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -25
  276. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +48 -0
  277. data/lib/rubocop/cop/mixin/parentheses.rb +2 -8
  278. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -2
  279. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  280. data/lib/rubocop/cop/mixin/percent_literal.rb +69 -6
  281. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +16 -5
  282. data/lib/rubocop/cop/mixin/rescue_node.rb +23 -0
  283. data/lib/rubocop/cop/mixin/safe_assignment.rb +3 -1
  284. data/lib/rubocop/cop/mixin/safe_mode.rb +22 -0
  285. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -10
  286. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -14
  287. data/lib/rubocop/cop/mixin/statement_modifier.rb +29 -32
  288. data/lib/rubocop/cop/mixin/string_help.rb +3 -2
  289. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -15
  290. data/lib/rubocop/cop/mixin/surrounding_space.rb +78 -9
  291. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  292. data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
  293. data/lib/rubocop/cop/mixin/too_many_lines.rb +39 -0
  294. data/lib/rubocop/cop/mixin/trailing_comma.rb +37 -38
  295. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -16
  296. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  297. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +36 -5
  298. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +42 -0
  299. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  300. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  301. data/lib/rubocop/cop/{style → naming}/file_name.rb +72 -29
  302. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  303. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  304. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  305. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  306. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  307. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  308. data/lib/rubocop/cop/offense.rb +9 -5
  309. data/lib/rubocop/cop/performance/caller.rb +69 -0
  310. data/lib/rubocop/cop/performance/case_when_splat.rb +65 -89
  311. data/lib/rubocop/cop/performance/casecmp.rb +37 -25
  312. data/lib/rubocop/cop/performance/compare_with_block.rb +117 -0
  313. data/lib/rubocop/cop/performance/count.rb +33 -43
  314. data/lib/rubocop/cop/performance/detect.rb +30 -31
  315. data/lib/rubocop/cop/performance/double_start_end_with.rb +55 -26
  316. data/lib/rubocop/cop/performance/end_with.rb +9 -9
  317. data/lib/rubocop/cop/performance/fixed_size.rb +21 -17
  318. data/lib/rubocop/cop/performance/flat_map.rb +30 -33
  319. data/lib/rubocop/cop/performance/hash_each_methods.rb +129 -0
  320. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +14 -14
  321. data/lib/rubocop/cop/performance/range_include.rb +5 -4
  322. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -29
  323. data/lib/rubocop/cop/performance/redundant_match.rb +19 -15
  324. data/lib/rubocop/cop/performance/redundant_merge.rb +100 -52
  325. data/lib/rubocop/cop/performance/redundant_sort_by.rb +17 -14
  326. data/lib/rubocop/cop/performance/regexp_match.rb +224 -0
  327. data/lib/rubocop/cop/performance/reverse_each.rb +3 -6
  328. data/lib/rubocop/cop/performance/sample.rb +84 -83
  329. data/lib/rubocop/cop/performance/size.rb +22 -15
  330. data/lib/rubocop/cop/performance/start_with.rb +9 -9
  331. data/lib/rubocop/cop/performance/string_replacement.rb +35 -70
  332. data/lib/rubocop/cop/performance/times_map.rb +33 -24
  333. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  334. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  335. data/lib/rubocop/cop/rails/action_filter.rb +67 -47
  336. data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
  337. data/lib/rubocop/cop/rails/application_job.rb +40 -0
  338. data/lib/rubocop/cop/rails/application_record.rb +40 -0
  339. data/lib/rubocop/cop/rails/blank.rb +142 -0
  340. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  341. data/lib/rubocop/cop/rails/date.rb +47 -42
  342. data/lib/rubocop/cop/rails/delegate.rb +55 -33
  343. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +51 -0
  344. data/lib/rubocop/cop/rails/dynamic_find_by.rb +82 -0
  345. data/lib/rubocop/cop/rails/enum_uniqueness.rb +45 -0
  346. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  347. data/lib/rubocop/cop/rails/exit.rb +17 -11
  348. data/lib/rubocop/cop/rails/file_path.rb +72 -0
  349. data/lib/rubocop/cop/rails/find_by.rb +14 -20
  350. data/lib/rubocop/cop/rails/find_each.rb +8 -21
  351. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +9 -2
  352. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +84 -0
  353. data/lib/rubocop/cop/rails/http_positional_arguments.rb +102 -0
  354. data/lib/rubocop/cop/rails/inverse_of.rb +218 -0
  355. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  356. data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
  357. data/lib/rubocop/cop/rails/output.rb +15 -13
  358. data/lib/rubocop/cop/rails/output_safety.rb +65 -17
  359. data/lib/rubocop/cop/rails/pluralization_grammar.rb +30 -29
  360. data/lib/rubocop/cop/rails/presence.rb +118 -0
  361. data/lib/rubocop/cop/rails/present.rb +143 -0
  362. data/lib/rubocop/cop/rails/read_write_attribute.rb +20 -26
  363. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +133 -0
  364. data/lib/rubocop/cop/rails/relative_date_constant.rb +88 -0
  365. data/lib/rubocop/cop/rails/request_referer.rb +28 -13
  366. data/lib/rubocop/cop/rails/reversible_migration.rb +281 -0
  367. data/lib/rubocop/cop/rails/safe_navigation.rb +90 -0
  368. data/lib/rubocop/cop/rails/save_bang.rb +104 -19
  369. data/lib/rubocop/cop/rails/scope_args.rb +5 -10
  370. data/lib/rubocop/cop/rails/skips_model_validations.rb +70 -0
  371. data/lib/rubocop/cop/rails/time_zone.rb +34 -21
  372. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +17 -14
  373. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  374. data/lib/rubocop/cop/rails/validation.rb +16 -20
  375. data/lib/rubocop/cop/registry.rb +172 -0
  376. data/lib/rubocop/cop/security/eval.rb +30 -0
  377. data/lib/rubocop/cop/security/json_load.rb +46 -0
  378. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  379. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  380. data/lib/rubocop/cop/severity.rb +1 -2
  381. data/lib/rubocop/cop/style/alias.rb +54 -33
  382. data/lib/rubocop/cop/style/and_or.rb +77 -63
  383. data/lib/rubocop/cop/style/array_join.rb +13 -9
  384. data/lib/rubocop/cop/style/ascii_comments.rb +25 -7
  385. data/lib/rubocop/cop/style/attr.rb +24 -11
  386. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -16
  387. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -11
  388. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  389. data/lib/rubocop/cop/style/block_comments.rb +20 -11
  390. data/lib/rubocop/cop/style/block_delimiters.rb +122 -51
  391. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +142 -54
  392. data/lib/rubocop/cop/style/case_equality.rb +15 -4
  393. data/lib/rubocop/cop/style/character_literal.rb +12 -5
  394. data/lib/rubocop/cop/style/class_and_module_children.rb +85 -6
  395. data/lib/rubocop/cop/style/class_check.rb +35 -19
  396. data/lib/rubocop/cop/style/class_methods.rb +13 -14
  397. data/lib/rubocop/cop/style/class_vars.rb +5 -5
  398. data/lib/rubocop/cop/style/collection_methods.rb +12 -13
  399. data/lib/rubocop/cop/style/colon_method_call.rb +24 -16
  400. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  401. data/lib/rubocop/cop/style/command_literal.rb +98 -32
  402. data/lib/rubocop/cop/style/comment_annotation.rb +41 -15
  403. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  404. data/lib/rubocop/cop/style/conditional_assignment.rb +161 -112
  405. data/lib/rubocop/cop/style/copyright.rb +32 -34
  406. data/lib/rubocop/cop/style/date_time.rb +44 -0
  407. data/lib/rubocop/cop/style/def_with_parentheses.rb +32 -9
  408. data/lib/rubocop/cop/style/dir.rb +48 -0
  409. data/lib/rubocop/cop/style/documentation.rb +44 -58
  410. data/lib/rubocop/cop/style/documentation_method.rb +76 -0
  411. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  412. data/lib/rubocop/cop/style/each_for_simple_loop.rb +14 -13
  413. data/lib/rubocop/cop/style/each_with_object.rb +28 -25
  414. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  415. data/lib/rubocop/cop/style/empty_case_condition.rb +18 -30
  416. data/lib/rubocop/cop/style/empty_else.rb +82 -51
  417. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  418. data/lib/rubocop/cop/style/empty_literal.rb +76 -48
  419. data/lib/rubocop/cop/style/empty_method.rb +112 -0
  420. data/lib/rubocop/cop/style/encoding.rb +10 -40
  421. data/lib/rubocop/cop/style/end_block.rb +1 -2
  422. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  423. data/lib/rubocop/cop/style/even_odd.rb +25 -44
  424. data/lib/rubocop/cop/style/flip_flop.rb +13 -3
  425. data/lib/rubocop/cop/style/for.rb +19 -15
  426. data/lib/rubocop/cop/style/format_string.rb +88 -42
  427. data/lib/rubocop/cop/style/format_string_token.rb +163 -0
  428. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +90 -15
  429. data/lib/rubocop/cop/style/global_vars.rb +14 -5
  430. data/lib/rubocop/cop/style/guard_clause.rb +22 -62
  431. data/lib/rubocop/cop/style/hash_syntax.rb +109 -59
  432. data/lib/rubocop/cop/style/identical_conditional_branches.rb +73 -32
  433. data/lib/rubocop/cop/style/if_inside_else.rb +16 -20
  434. data/lib/rubocop/cop/style/if_unless_modifier.rb +48 -39
  435. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +6 -12
  436. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -2
  437. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -7
  438. data/lib/rubocop/cop/style/infinite_loop.rb +33 -32
  439. data/lib/rubocop/cop/style/inline_comment.rb +17 -5
  440. data/lib/rubocop/cop/style/inverse_methods.rb +149 -0
  441. data/lib/rubocop/cop/style/lambda.rb +66 -63
  442. data/lib/rubocop/cop/style/lambda_call.rb +50 -20
  443. data/lib/rubocop/cop/style/line_end_concatenation.rb +38 -17
  444. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +90 -0
  445. data/lib/rubocop/cop/style/{method_call_parentheses.rb → method_call_without_args_parentheses.rb} +32 -25
  446. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +9 -9
  447. data/lib/rubocop/cop/style/method_def_parentheses.rb +101 -29
  448. data/lib/rubocop/cop/style/method_missing.rb +14 -20
  449. data/lib/rubocop/cop/style/min_max.rb +68 -0
  450. data/lib/rubocop/cop/style/missing_else.rb +61 -21
  451. data/lib/rubocop/cop/style/mixin_grouping.rb +145 -0
  452. data/lib/rubocop/cop/style/mixin_usage.rb +82 -0
  453. data/lib/rubocop/cop/style/module_function.rb +44 -18
  454. data/lib/rubocop/cop/style/multiline_block_chain.rb +8 -15
  455. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  456. data/lib/rubocop/cop/style/multiline_if_then.rb +21 -14
  457. data/lib/rubocop/cop/style/multiline_memoization.rb +93 -0
  458. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -9
  459. data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
  460. data/lib/rubocop/cop/style/mutable_constant.rb +17 -9
  461. data/lib/rubocop/cop/style/negated_if.rb +76 -25
  462. data/lib/rubocop/cop/style/negated_while.rb +4 -22
  463. data/lib/rubocop/cop/style/nested_modifier.rb +17 -47
  464. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +32 -28
  465. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -6
  466. data/lib/rubocop/cop/style/next.rb +72 -53
  467. data/lib/rubocop/cop/style/nil_comparison.rb +10 -14
  468. data/lib/rubocop/cop/style/non_nil_check.rb +69 -62
  469. data/lib/rubocop/cop/style/not.rb +19 -13
  470. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +16 -7
  471. data/lib/rubocop/cop/style/numeric_literals.rb +33 -12
  472. data/lib/rubocop/cop/style/numeric_predicate.rb +30 -32
  473. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -17
  474. data/lib/rubocop/cop/style/option_hash.rb +11 -37
  475. data/lib/rubocop/cop/style/optional_arguments.rb +20 -9
  476. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  477. data/lib/rubocop/cop/style/parallel_assignment.rb +83 -64
  478. data/lib/rubocop/cop/style/parentheses_around_condition.rb +37 -19
  479. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +50 -15
  480. data/lib/rubocop/cop/style/percent_q_literals.rb +40 -17
  481. data/lib/rubocop/cop/style/perl_backrefs.rb +9 -3
  482. data/lib/rubocop/cop/style/preferred_hash_methods.rb +48 -14
  483. data/lib/rubocop/cop/style/proc.rb +13 -10
  484. data/lib/rubocop/cop/style/raise_args.rb +46 -50
  485. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  486. data/lib/rubocop/cop/style/redundant_begin.rb +16 -6
  487. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  488. data/lib/rubocop/cop/style/redundant_exception.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_freeze.rb +7 -10
  490. data/lib/rubocop/cop/style/redundant_parentheses.rb +70 -31
  491. data/lib/rubocop/cop/style/redundant_return.rb +61 -23
  492. data/lib/rubocop/cop/style/redundant_self.rb +62 -60
  493. data/lib/rubocop/cop/style/regexp_literal.rb +100 -34
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -17
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +197 -0
  498. data/lib/rubocop/cop/style/self_assignment.rb +20 -17
  499. data/lib/rubocop/cop/style/semicolon.rb +25 -17
  500. data/lib/rubocop/cop/style/send.rb +14 -4
  501. data/lib/rubocop/cop/style/signal_exception.rb +105 -7
  502. data/lib/rubocop/cop/style/single_line_block_params.rb +27 -21
  503. data/lib/rubocop/cop/style/single_line_methods.rb +45 -31
  504. data/lib/rubocop/cop/style/special_global_vars.rb +32 -28
  505. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +24 -53
  506. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  507. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  508. data/lib/rubocop/cop/style/string_literals.rb +31 -5
  509. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +20 -2
  510. data/lib/rubocop/cop/style/string_methods.rb +22 -9
  511. data/lib/rubocop/cop/style/struct_inheritance.rb +5 -17
  512. data/lib/rubocop/cop/style/symbol_array.rb +39 -65
  513. data/lib/rubocop/cop/style/symbol_literal.rb +1 -2
  514. data/lib/rubocop/cop/style/symbol_proc.rb +35 -52
  515. data/lib/rubocop/cop/style/ternary_parentheses.rb +143 -42
  516. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +31 -20
  518. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +26 -8
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +97 -37
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -66
  522. data/lib/rubocop/cop/style/unless_else.rb +19 -13
  523. data/lib/rubocop/cop/style/unneeded_capital_w.rb +24 -10
  524. data/lib/rubocop/cop/style/unneeded_interpolation.rb +22 -24
  525. data/lib/rubocop/cop/style/unneeded_percent_q.rb +28 -22
  526. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -10
  527. data/lib/rubocop/cop/style/when_then.rb +18 -4
  528. data/lib/rubocop/cop/style/while_until_do.rb +34 -16
  529. data/lib/rubocop/cop/style/while_until_modifier.rb +32 -12
  530. data/lib/rubocop/cop/style/word_array.rb +45 -102
  531. data/lib/rubocop/cop/style/yoda_condition.rb +107 -0
  532. data/lib/rubocop/cop/style/zero_length_predicate.rb +55 -32
  533. data/lib/rubocop/cop/team.rb +33 -35
  534. data/lib/rubocop/cop/util.rb +120 -54
  535. data/lib/rubocop/cop/variable_force/assignment.rb +5 -9
  536. data/lib/rubocop/cop/variable_force/branch.rb +318 -0
  537. data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
  538. data/lib/rubocop/cop/variable_force/reference.rb +1 -2
  539. data/lib/rubocop/cop/variable_force/scope.rb +37 -26
  540. data/lib/rubocop/cop/variable_force/variable.rb +12 -12
  541. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -4
  542. data/lib/rubocop/cop/variable_force.rb +72 -39
  543. data/lib/rubocop/error.rb +0 -1
  544. data/lib/rubocop/formatter/base_formatter.rb +4 -9
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +2 -3
  546. data/lib/rubocop/formatter/colorizable.rb +9 -10
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +48 -35
  548. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -1
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +0 -1
  550. data/lib/rubocop/formatter/file_list_formatter.rb +0 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +16 -13
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +6 -1
  553. data/lib/rubocop/formatter/html_formatter.rb +5 -5
  554. data/lib/rubocop/formatter/json_formatter.rb +9 -4
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -1
  556. data/lib/rubocop/formatter/progress_formatter.rb +0 -1
  557. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  558. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -17
  559. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  560. data/lib/rubocop/formatter/text_util.rb +0 -1
  561. data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -5
  562. data/lib/rubocop/magic_comment.rb +210 -0
  563. data/lib/rubocop/name_similarity.rb +0 -1
  564. data/lib/rubocop/node_pattern.rb +181 -118
  565. data/lib/rubocop/options.rb +154 -88
  566. data/lib/rubocop/path_util.rb +38 -4
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/processed_source.rb +23 -20
  569. data/lib/rubocop/rake_task.rb +16 -24
  570. data/lib/rubocop/remote_config.rb +40 -13
  571. data/lib/rubocop/result_cache.rb +33 -24
  572. data/lib/rubocop/rspec/cop_helper.rb +21 -7
  573. data/lib/rubocop/rspec/expect_offense.rb +165 -0
  574. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -2
  575. data/lib/rubocop/rspec/shared_contexts.rb +24 -9
  576. data/lib/rubocop/rspec/shared_examples.rb +10 -19
  577. data/lib/rubocop/rspec/support.rb +5 -5
  578. data/lib/rubocop/runner.rb +74 -39
  579. data/lib/rubocop/string_interpreter.rb +0 -1
  580. data/lib/rubocop/string_util.rb +11 -6
  581. data/lib/rubocop/target_finder.rb +70 -8
  582. data/lib/rubocop/token.rb +79 -2
  583. data/lib/rubocop/version.rb +2 -5
  584. data/lib/rubocop/warning.rb +0 -1
  585. data/lib/rubocop.rb +569 -398
  586. metadata +301 -112
  587. data/lib/rubocop/ast_node/builder.rb +0 -31
  588. data/lib/rubocop/ast_node/sexp.rb +0 -14
  589. data/lib/rubocop/ast_node.rb +0 -623
  590. data/lib/rubocop/cop/lint/eval.rb +0 -23
  591. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -39
  592. data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
  593. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -42
  594. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -152
  595. data/lib/rubocop/cop/mixin/hash_node.rb +0 -15
  596. data/lib/rubocop/cop/mixin/if_node.rb +0 -37
  597. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -31
  598. data/lib/rubocop/cop/mixin/space_inside.rb +0 -79
  599. data/lib/rubocop/cop/performance/hash_each.rb +0 -86
  600. data/lib/rubocop/cop/performance/push_splat.rb +0 -47
  601. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -46
  602. data/lib/rubocop/cop/style/align_array.rb +0 -21
  603. data/lib/rubocop/cop/style/align_hash.rb +0 -256
  604. data/lib/rubocop/cop/style/case_indentation.rb +0 -92
  605. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -30
  606. data/lib/rubocop/cop/style/constant_name.rb +0 -30
  607. data/lib/rubocop/cop/style/empty_line_between_defs.rb +0 -76
  608. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +0 -40
  609. data/lib/rubocop/cop/style/end_of_line.rb +0 -31
  610. data/lib/rubocop/cop/style/initial_indentation.rb +0 -38
  611. data/lib/rubocop/cop/style/leading_comment_space.rb +0 -33
  612. data/lib/rubocop/cop/style/method_name.rb +0 -29
  613. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +0 -176
  614. data/lib/rubocop/cop/style/op_method.rb +0 -44
  615. data/lib/rubocop/cop/style/predicate_name.rb +0 -68
  616. data/lib/rubocop/cop/style/space_after_comma.rb +0 -22
  617. data/lib/rubocop/cop/style/space_after_not.rb +0 -42
  618. data/lib/rubocop/cop/style/space_around_operators.rb +0 -132
  619. data/lib/rubocop/cop/style/space_before_block_braces.rb +0 -65
  620. data/lib/rubocop/cop/style/space_before_comma.rb +0 -17
  621. data/lib/rubocop/cop/style/space_before_semicolon.rb +0 -17
  622. data/lib/rubocop/cop/style/space_inside_block_braces.rb +0 -166
  623. data/lib/rubocop/cop/style/space_inside_brackets.rb +0 -21
  624. data/lib/rubocop/cop/style/space_inside_parens.rb +0 -17
  625. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +0 -52
  626. data/lib/rubocop/cop/style/variable_name.rb +0 -40
  627. data/lib/rubocop/cop/variable_force/locatable.rb +0 -197
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for Yoda conditions, i.e. comparison operations where
7
+ # readability is reduced because the operands are not ordered the same
8
+ # way as they would be ordered in spoken English.
9
+ #
10
+ # @example EnforcedStyle: all_comparison_operators (default)
11
+ # # bad
12
+ # 99 == foo
13
+ # "bar" != foo
14
+ # 42 >= foo
15
+ # 10 < bar
16
+ #
17
+ # # good
18
+ # foo == 99
19
+ # foo == "bar"
20
+ # foo <= 42
21
+ # bar > 10
22
+ #
23
+ # @example EnforcedStyle: equality_operators_only
24
+ # # bad
25
+ # 99 == foo
26
+ # "bar" != foo
27
+ #
28
+ # # good
29
+ # 99 >= foo
30
+ # 3 < a && a < 5
31
+ class YodaCondition < Cop
32
+ include ConfigurableEnforcedStyle
33
+
34
+ MSG = 'Reverse the order of the operands `%<source>s`.'.freeze
35
+
36
+ REVERSE_COMPARISON = {
37
+ '<' => '>',
38
+ '<=' => '>=',
39
+ '>' => '<',
40
+ '>=' => '<='
41
+ }.freeze
42
+
43
+ EQUALITY_OPERATORS = %i[== !=].freeze
44
+
45
+ NONCOMMUTATIVE_OPERATORS = %i[===].freeze
46
+
47
+ def on_send(node)
48
+ return unless yoda_condition?(node)
49
+
50
+ add_offense(node)
51
+ end
52
+
53
+ def autocorrect(node)
54
+ lambda do |corrector|
55
+ corrector.replace(actual_code_range(node), corrected_code(node))
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def yoda_condition?(node)
62
+ return false unless node.comparison_method?
63
+
64
+ lhs, operator, rhs = *node
65
+ if check_equality_only?
66
+ return false if non_equality_operator?(operator)
67
+ end
68
+
69
+ return false if noncommutative_operator?(operator)
70
+
71
+ lhs.literal? && !rhs.literal?
72
+ end
73
+
74
+ def message(node)
75
+ format(MSG, source: node.source)
76
+ end
77
+
78
+ def corrected_code(node)
79
+ lhs, operator, rhs = *node
80
+ "#{rhs.source} #{reverse_comparison(operator)} #{lhs.source}"
81
+ end
82
+
83
+ def actual_code_range(node)
84
+ range_between(
85
+ node.loc.expression.begin_pos, node.loc.expression.end_pos
86
+ )
87
+ end
88
+
89
+ def reverse_comparison(operator)
90
+ REVERSE_COMPARISON.fetch(operator.to_s, operator)
91
+ end
92
+
93
+ def check_equality_only?
94
+ style == :equality_operators_only
95
+ end
96
+
97
+ def non_equality_operator?(operator)
98
+ !EQUALITY_OPERATORS.include?(operator)
99
+ end
100
+
101
+ def noncommutative_operator?(operator)
102
+ NONCOMMUTATIVE_OPERATORS.include?(operator)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,62 +1,85 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module RuboCop
5
4
  module Cop
6
5
  module Style
7
- # This cop checks for receiver.length == 0 predicates and the
8
- # negated versions receiver.length > 0 and receiver.length != 0.
9
- # These can be replaced with receiver.empty? and
10
- # !receiver.empty? respectively.
6
+ # This cop checks for numeric comparisons that can be replaced
7
+ # by a predicate method, such as receiver.length == 0,
8
+ # receiver.length > 0, receiver.length != 0,
9
+ # receiver.length < 1 and receiver.size == 0 that can be
10
+ # replaced by receiver.empty? and !receiver.empty.
11
11
  #
12
12
  # @example
13
- #
14
- # @bad
13
+ # # bad
15
14
  # [1, 2, 3].length == 0
16
15
  # 0 == "foobar".length
16
+ # array.length < 1
17
+ # {a: 1, b: 2}.length != 0
18
+ # string.length > 0
17
19
  # hash.size > 0
18
20
  #
19
- # @good
21
+ # # good
20
22
  # [1, 2, 3].empty?
21
23
  # "foobar".empty?
24
+ # array.empty?
25
+ # !{a: 1, b: 2}.empty?
26
+ # !string.empty?
22
27
  # !hash.empty?
23
28
  class ZeroLengthPredicate < Cop
24
- ZERO_MSG = 'Use `empty?` instead of `%s %s %s`.'.freeze
25
- NONZERO_MSG = 'Use `!empty?` instead of `%s %s %s`.'.freeze
29
+ ZERO_MSG = 'Use `empty?` instead of `%<lhs>s %<opr>s %<rhs>s`.'.freeze
30
+ NONZERO_MSG = 'Use `!empty?` instead of ' \
31
+ '`%<lhs>s %<opr>s %<rhs>s`.'.freeze
26
32
 
27
33
  def on_send(node)
28
- zero_length_predicate = zero_length_predicate(node)
34
+ check_zero_length_predicate(node)
35
+ check_nonzero_length_predicate(node)
36
+ end
29
37
 
30
- if zero_length_predicate
31
- add_offense(node, :expression,
32
- format(ZERO_MSG, *zero_length_predicate))
38
+ def autocorrect(node)
39
+ lambda do |corrector|
40
+ corrector.replace(node.loc.expression, replacement(node))
33
41
  end
42
+ end
43
+
44
+ private
45
+
46
+ def check_zero_length_predicate(node)
47
+ zero_length_predicate = zero_length_predicate(node)
48
+
49
+ return unless zero_length_predicate
50
+
51
+ lhs, opr, rhs = zero_length_predicate
34
52
 
53
+ add_offense(
54
+ node,
55
+ message: format(ZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
56
+ )
57
+ end
58
+
59
+ def check_nonzero_length_predicate(node)
35
60
  nonzero_length_predicate = nonzero_length_predicate(node)
36
61
 
37
- if nonzero_length_predicate
38
- add_offense(node, :expression,
39
- format(NONZERO_MSG, *nonzero_length_predicate))
40
- end
62
+ return unless nonzero_length_predicate
63
+
64
+ lhs, opr, rhs = nonzero_length_predicate
65
+
66
+ add_offense(
67
+ node,
68
+ message: format(NONZERO_MSG, lhs: lhs, opr: opr, rhs: rhs)
69
+ )
41
70
  end
42
71
 
43
- def_node_matcher :zero_length_predicate, <<-END
72
+ def_node_matcher :zero_length_predicate, <<-PATTERN
44
73
  {(send (send (...) ${:length :size}) $:== (int $0))
45
74
  (send (int $0) $:== (send (...) ${:length :size}))
46
75
  (send (send (...) ${:length :size}) $:< (int $1))
47
76
  (send (int $1) $:> (send (...) ${:length :size}))}
48
- END
77
+ PATTERN
49
78
 
50
- def_node_matcher :nonzero_length_predicate, <<-END
79
+ def_node_matcher :nonzero_length_predicate, <<-PATTERN
51
80
  {(send (send (...) ${:length :size}) ${:> :!=} (int $0))
52
81
  (send (int $0) ${:< :!=} (send (...) ${:length :size}))}
53
- END
54
-
55
- def autocorrect(node)
56
- lambda do |corrector|
57
- corrector.replace(node.loc.expression, replacement(node))
58
- end
59
- end
82
+ PATTERN
60
83
 
61
84
  def replacement(node)
62
85
  receiver = zero_length_receiver(node)
@@ -65,17 +88,17 @@ module RuboCop
65
88
  "!#{other_receiver(node).source}.empty?"
66
89
  end
67
90
 
68
- def_node_matcher :zero_length_receiver, <<-END
91
+ def_node_matcher :zero_length_receiver, <<-PATTERN
69
92
  {(send (send $_ _) :== (int 0))
70
93
  (send (int 0) :== (send $_ _))
71
94
  (send (send $_ _) :< (int 1))
72
95
  (send (int 1) :> (send $_ _))}
73
- END
96
+ PATTERN
74
97
 
75
- def_node_matcher :other_receiver, <<-END
98
+ def_node_matcher :other_receiver, <<-PATTERN
76
99
  {(send (send $_ _) _ _)
77
100
  (send _ _ (send $_ _))}
78
- END
101
+ PATTERN
79
102
  end
80
103
  end
81
104
  end
@@ -1,19 +1,9 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  module RuboCop
5
4
  module Cop
6
5
  # FIXME
7
6
  class Team
8
- # If these cops try to autocorrect the same file at the same time,
9
- # bad things are liable to happen
10
- INCOMPATIBLE_COPS = {
11
- Style::SymbolProc => [Style::SpaceBeforeBlockBraces],
12
- Style::SpaceBeforeBlockBraces => [Style::SymbolProc],
13
- Style::LineEndConcatenation => [Style::UnneededInterpolation],
14
- Style::UnneededInterpolation => [Style::LineEndConcatenation]
15
- }.freeze
16
-
17
7
  DEFAULT_OPTIONS = {
18
8
  auto_correct: false,
19
9
  debug: false
@@ -46,14 +36,17 @@ module RuboCop
46
36
  def inspect_file(processed_source)
47
37
  # If we got any syntax errors, return only the syntax offenses.
48
38
  unless processed_source.valid_syntax?
49
- return Lint::Syntax.offenses_from_processed_source(processed_source)
39
+ return Lint::Syntax.offenses_from_processed_source(
40
+ processed_source, @config, @options
41
+ )
50
42
  end
51
43
 
52
44
  offenses(processed_source)
53
45
  end
54
46
 
55
47
  def cops
56
- @cops ||= @cop_classes.select { |c| cop_enabled?(c) }.map do |cop_class|
48
+ only_options = @options.fetch(:only, [])
49
+ @cops ||= @cop_classes.enabled(@config, only_options).map do |cop_class|
57
50
  cop_class.new(@config, @options)
58
51
  end
59
52
  end
@@ -83,7 +76,7 @@ module RuboCop
83
76
  @options[:stdin] = new_source
84
77
  else
85
78
  filename = buffer.name
86
- File.open(filename, 'wb') { |f| f.write(new_source) }
79
+ File.open(filename, 'w') { |f| f.write(new_source) }
87
80
  end
88
81
  @updated_source_file = true
89
82
  end
@@ -124,22 +117,10 @@ module RuboCop
124
117
  Investigation.new(offenses, commissioner.errors)
125
118
  end
126
119
 
127
- def cop_enabled?(cop_class)
128
- @config.cop_enabled?(cop_class) ||
129
- (@options[:only] || []).include?(cop_class.cop_name)
130
- end
131
-
132
120
  def autocorrect_all_cops(buffer, cops)
133
121
  corrector = Corrector.new(buffer)
134
- skip = Set.new
135
122
 
136
- cops.each do |cop|
137
- next if cop.corrections.empty?
138
- next if skip.include?(cop.class)
139
- corrector.corrections.concat(cop.corrections)
140
- incompatible = INCOMPATIBLE_COPS[cop.class]
141
- skip.merge(incompatible) if incompatible
142
- end
123
+ collate_corrections(corrector, cops)
143
124
 
144
125
  if !corrector.corrections.empty?
145
126
  corrector.rewrite
@@ -148,6 +129,18 @@ module RuboCop
148
129
  end
149
130
  end
150
131
 
132
+ def collate_corrections(corrector, cops)
133
+ skips = Set.new
134
+
135
+ cops.each do |cop|
136
+ next if cop.corrections.empty?
137
+ next if skips.include?(cop.class)
138
+
139
+ corrector.corrections.concat(cop.corrections)
140
+ skips.merge(cop.class.autocorrect_incompatible_with)
141
+ end
142
+ end
143
+
151
144
  def validate_config
152
145
  cops.each do |cop|
153
146
  cop.validate_config if cop.respond_to?(:validate_config)
@@ -156,27 +149,32 @@ module RuboCop
156
149
 
157
150
  def process_commissioner_errors(file, file_errors)
158
151
  file_errors.each do |cop, errors|
159
- errors.each do |e|
152
+ errors.each do |cop_error|
153
+ e = cop_error.error
154
+ line = ":#{cop_error.line}" if cop_error.line
155
+ column = ":#{cop_error.column}" if cop_error.column
156
+ location = "#{file}#{line}#{column}"
157
+
160
158
  if e.is_a?(Warning)
161
- handle_warning(e,
162
- Rainbow("#{e.message} (from file: " \
163
- "#{file})").yellow)
159
+ handle_warning(e, location)
164
160
  else
165
- handle_error(e,
166
- Rainbow("An error occurred while #{cop.name}" \
167
- " cop was inspecting #{file}.").red)
161
+ handle_error(e, location, cop)
168
162
  end
169
163
  end
170
164
  end
171
165
  end
172
166
 
173
- def handle_warning(e, message)
167
+ def handle_warning(e, location)
168
+ message = Rainbow("#{e.message} (from file: #{location})").yellow
169
+
174
170
  @warnings << message
175
171
  warn message
176
172
  puts e.backtrace if debug?
177
173
  end
178
174
 
179
- def handle_error(e, message)
175
+ def handle_error(e, location, cop)
176
+ message = Rainbow("An error occurred while #{cop.name}" \
177
+ " cop was inspecting #{location}.").red
180
178
  @errors << message
181
179
  warn message
182
180
  if debug?
@@ -1,31 +1,34 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
- # rubocop:disable Metrics/ModuleLength
4
2
 
3
+ # rubocop:disable Metrics/ModuleLength
5
4
  module RuboCop
6
5
  module Cop
7
6
  # This module contains a collection of useful utility methods.
8
7
  module Util
9
8
  include PathUtil
10
- extend RuboCop::Sexp
9
+ extend RuboCop::AST::Sexp
11
10
 
12
11
  BYTE_ORDER_MARK = 0xfeff # The Unicode codepoint
13
12
 
14
- EQUALS_ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn,
15
- :casgn, :masgn].freeze
16
- SHORTHAND_ASGN_NODES = [:op_asgn, :or_asgn, :and_asgn].freeze
13
+ EQUALS_ASGN_NODES = %i[lvasgn ivasgn cvasgn gvasgn
14
+ casgn masgn].freeze
15
+ SHORTHAND_ASGN_NODES = %i[op_asgn or_asgn and_asgn].freeze
17
16
  ASGN_NODES = (EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES).freeze
18
17
 
18
+ MODIFIER_NODES = %i[if while until].freeze
19
+ CONDITIONAL_NODES = (MODIFIER_NODES + [:case]).freeze
20
+ LOGICAL_OPERATOR_NODES = %i[and or].freeze
21
+
19
22
  # http://phrogz.net/programmingruby/language.html#table_18.4
20
23
  # Backtick is added last just to help editors parse this code.
21
24
  OPERATOR_METHODS = %w(
22
25
  | ^ & <=> == === =~ > >= < <= << >>
23
- + - * / % ** ~ +@ -@ [] []= ! != !~
26
+ + - * / % ** ~ +@ -@ !@ ~@ [] []= ! != !~
24
27
  ).map(&:to_sym).push(:'`').freeze
25
28
 
26
29
  # Match literal regex characters, not including anchors, character
27
30
  # classes, alternatives, groups, repetitions, references, etc
28
- LITERAL_REGEX = /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGhHkpPRwWXsSzZS0-9]/
31
+ LITERAL_REGEX = /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]/
29
32
 
30
33
  module_function
31
34
 
@@ -45,10 +48,6 @@ module RuboCop
45
48
  str
46
49
  end
47
50
 
48
- def block_length(block_node)
49
- block_node.loc.end.line - block_node.loc.begin.line
50
- end
51
-
52
51
  def comment_line?(line_source)
53
52
  line_source =~ /^\s*#/
54
53
  end
@@ -81,16 +80,13 @@ module RuboCop
81
80
  yield sexp if Array(syms).include?(sexp.type)
82
81
  return if Array(excludes).include?(sexp.type)
83
82
 
84
- sexp.children.each do |elem|
85
- next unless elem.is_a?(Parser::AST::Node)
86
- on_node(syms, elem, excludes, &block)
87
- end
83
+ sexp.each_child_node { |elem| on_node(syms, elem, excludes, &block) }
88
84
  end
89
85
 
90
86
  def source_range(source_buffer, line_number, column, length = 1)
91
87
  if column.is_a?(Range)
92
88
  column_index = column.begin
93
- length = numeric_range_size(column)
89
+ length = column.size
94
90
  else
95
91
  column_index = column
96
92
  end
@@ -119,6 +115,10 @@ module RuboCop
119
115
  end
120
116
  end
121
117
 
118
+ def range_between(start_pos, end_pos)
119
+ Parser::Source::Range.new(processed_source.buffer, start_pos, end_pos)
120
+ end
121
+
122
122
  def range_with_surrounding_comma(range, side = :both)
123
123
  buffer = @processed_source.buffer
124
124
  src = buffer.source
@@ -133,33 +133,39 @@ module RuboCop
133
133
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
134
134
  end
135
135
 
136
- def range_with_surrounding_space(range, side = :both, with_newline = true)
136
+ def range_with_surrounding_space(range:,
137
+ side: :both,
138
+ newlines: true,
139
+ whitespace: false)
137
140
  buffer = @processed_source.buffer
138
141
  src = buffer.source
139
142
 
140
143
  go_left, go_right = directions(side)
141
144
 
142
145
  begin_pos = range.begin_pos
146
+ if go_left
147
+ begin_pos =
148
+ final_pos(src, begin_pos, -1, newlines, whitespace)
149
+ end
143
150
  end_pos = range.end_pos
144
- begin_pos = move_pos(src, begin_pos, -1, go_left, /[ \t]/)
145
- begin_pos = move_pos(src, begin_pos, -1, go_left && with_newline, /\n/)
146
- end_pos = move_pos(src, end_pos, 1, go_right, /[ \t]/)
147
- end_pos = move_pos(src, end_pos, 1, go_right && with_newline, /\n/)
151
+ end_pos = final_pos(src, end_pos, 1, newlines, whitespace) if go_right
148
152
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
149
153
  end
150
154
 
151
- def move_pos(src, pos, step, condition, regexp)
152
- offset = step == -1 ? -1 : 0
153
- pos += step while condition && src[pos + offset] =~ regexp
154
- pos < 0 ? 0 : pos
155
- end
155
+ def range_by_whole_lines(range, include_final_newline: false)
156
+ buffer = @processed_source.buffer
156
157
 
157
- def directions(side)
158
- if side == :both
159
- [true, true]
160
- else
161
- [side == :left, side == :right]
162
- end
158
+ begin_pos = range.begin_pos
159
+ begin_offset = range.column
160
+ begin_of_first_line = begin_pos - begin_offset
161
+
162
+ last_line = buffer.source_line(range.last_line)
163
+ end_pos = range.end_pos
164
+ end_offset = last_line.length - range.last_column
165
+ end_offset += 1 if include_final_newline
166
+ end_of_last_line = end_pos + end_offset
167
+
168
+ Parser::Source::Range.new(buffer, begin_of_first_line, end_of_last_line)
163
169
  end
164
170
 
165
171
  def begins_its_line?(range)
@@ -172,8 +178,8 @@ module RuboCop
172
178
  end
173
179
 
174
180
  def within_node?(inner, outer)
175
- o = outer.is_a?(Node) ? outer.source_range : outer
176
- i = inner.is_a?(Node) ? inner.source_range : inner
181
+ o = outer.is_a?(AST::Node) ? outer.source_range : outer
182
+ i = inner.is_a?(AST::Node) ? inner.source_range : inner
177
183
  i.begin_pos >= o.begin_pos && i.end_pos <= o.end_pos
178
184
  end
179
185
 
@@ -195,14 +201,6 @@ module RuboCop
195
201
  node
196
202
  end
197
203
 
198
- # Range#size is not available prior to Ruby 2.0.
199
- def numeric_range_size(range)
200
- size = range.end - range.begin
201
- size += 1 unless range.exclude_end?
202
- size = 0 if size < 0
203
- size
204
- end
205
-
206
204
  # If converting a string to Ruby string literal source code, must
207
205
  # double quotes be used?
208
206
  def double_quotes_required?(string)
@@ -215,15 +213,6 @@ module RuboCop
215
213
  string =~ /'|(?<! \\) \\{2}* \\ (?![\\"])/x
216
214
  end
217
215
 
218
- # If double quoted string literals are found in Ruby code, and they are
219
- # not the preferred style, should they be flagged?
220
- def double_quotes_acceptable?(string)
221
- # If a string literal contains hard-to-type characters which would
222
- # not appear on a "normal" keyboard, then double-quotes are acceptable
223
- needs_escaping?(string) ||
224
- string.codepoints.any? { |cp| cp < 32 || cp > 126 }
225
- end
226
-
227
216
  def needs_escaping?(string)
228
217
  double_quotes_required?(escape_string(string))
229
218
  end
@@ -233,7 +222,7 @@ module RuboCop
233
222
  end
234
223
 
235
224
  def to_string_literal(string)
236
- if needs_escaping?(string)
225
+ if needs_escaping?(string) && compatible_external_encoding_for?(string)
237
226
  string.inspect
238
227
  else
239
228
  "'#{string.gsub('\\') { '\\\\' }}'"
@@ -241,12 +230,89 @@ module RuboCop
241
230
  end
242
231
 
243
232
  def to_symbol_literal(string)
244
- ":#{string.to_sym}"
233
+ if symbol_without_quote?(string)
234
+ ":#{string}"
235
+ else
236
+ ":#{to_string_literal(string)}"
237
+ end
238
+ end
239
+
240
+ def symbol_without_quote?(string)
241
+ special_gvars = %w[
242
+ $! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
243
+ $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
244
+ ]
245
+ redefinable_operators = %w(
246
+ | ^ & <=> == === =~ > >= < <= << >>
247
+ + - * / % ** ~ +@ -@ [] []= ` ! != !~
248
+ )
249
+
250
+ # method name
251
+ string =~ /\A[a-zA-Z_]\w*[!?]?\z/ ||
252
+ # instance / class variable
253
+ string =~ /\A\@\@?[a-zA-Z_]\w*\z/ ||
254
+ # global variable
255
+ string =~ /\A\$[1-9]\d*\z/ ||
256
+ string =~ /\A\$[a-zA-Z_]\w*\z/ ||
257
+ special_gvars.include?(string) ||
258
+ redefinable_operators.include?(string)
245
259
  end
246
260
 
247
261
  def interpret_string_escapes(string)
248
262
  StringInterpreter.interpret(string)
249
263
  end
264
+
265
+ def same_line?(n1, n2)
266
+ n1.respond_to?(:loc) &&
267
+ n2.respond_to?(:loc) &&
268
+ n1.loc.line == n2.loc.line
269
+ end
270
+
271
+ def precede?(n1, n2)
272
+ line_distance(n1, n2) == 1
273
+ end
274
+
275
+ def stripped_source_upto(line)
276
+ processed_source[0..line].map(&:strip)
277
+ end
278
+
279
+ def to_supported_styles(enforced_style)
280
+ enforced_style
281
+ .sub(/^Enforced/, 'Supported')
282
+ .sub('Style', 'Styles')
283
+ end
284
+
285
+ private
286
+
287
+ def directions(side)
288
+ if side == :both
289
+ [true, true]
290
+ else
291
+ [side == :left, side == :right]
292
+ end
293
+ end
294
+
295
+ def final_pos(src, pos, increment, newlines, whitespace)
296
+ pos = move_pos(src, pos, increment, true, /[ \t]/)
297
+ pos = move_pos(src, pos, increment, newlines, /\n/)
298
+ move_pos(src, pos, increment, whitespace, /\s/)
299
+ end
300
+
301
+ def move_pos(src, pos, step, condition, regexp)
302
+ offset = step == -1 ? -1 : 0
303
+ pos += step while condition && src[pos + offset] =~ regexp
304
+ pos < 0 ? 0 : pos
305
+ end
306
+
307
+ def compatible_external_encoding_for?(src)
308
+ src = src.dup if RUBY_VERSION < '2.3' || RUBY_ENGINE == 'jruby'
309
+ src.force_encoding(Encoding.default_external).valid_encoding?
310
+ end
311
+
312
+ def line_distance(n1, n2)
313
+ n2.loc.line - n1.loc.line
314
+ end
250
315
  end
251
316
  end
252
317
  end
318
+ # rubocop:enable Metrics/ModuleLength