rubocop 0.51.0 → 0.87.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 (702) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +1 -1
  3. data/README.md +53 -42
  4. data/assets/output.html.erb +1 -1
  5. data/bin/console +10 -0
  6. data/bin/setup +7 -0
  7. data/config/default.yml +3137 -552
  8. data/lib/rubocop/ast_aliases.rb +8 -0
  9. data/lib/rubocop/cached_data.rb +2 -2
  10. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  11. data/lib/rubocop/cli/command/base.rb +33 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  13. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  15. data/lib/rubocop/cli/command/version.rb +17 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/environment.rb +21 -0
  18. data/lib/rubocop/cli.rb +58 -131
  19. data/lib/rubocop/comment_config.rb +65 -14
  20. data/lib/rubocop/config.rb +106 -342
  21. data/lib/rubocop/config_loader.rb +122 -153
  22. data/lib/rubocop/config_loader_resolver.rb +198 -8
  23. data/lib/rubocop/config_obsoletion.rb +277 -0
  24. data/lib/rubocop/config_store.rb +12 -2
  25. data/lib/rubocop/config_validator.rb +223 -0
  26. data/lib/rubocop/cop/autocorrect_logic.rb +73 -4
  27. data/lib/rubocop/cop/badge.rb +6 -6
  28. data/lib/rubocop/cop/base.rb +399 -0
  29. data/lib/rubocop/cop/bundler/duplicated_gem.rb +12 -10
  30. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  31. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +21 -28
  32. data/lib/rubocop/cop/bundler/ordered_gems.rb +16 -5
  33. data/lib/rubocop/cop/commissioner.rb +68 -67
  34. data/lib/rubocop/cop/cop.rb +101 -208
  35. data/lib/rubocop/cop/corrector.rb +82 -98
  36. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  37. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  38. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  39. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  41. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  42. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  43. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  44. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  45. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  46. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  47. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  48. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  49. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  50. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  51. data/lib/rubocop/cop/force.rb +1 -0
  52. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  53. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +16 -8
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  56. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  57. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  58. data/lib/rubocop/cop/generator.rb +81 -99
  59. data/lib/rubocop/cop/ignored_node.rb +1 -3
  60. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  61. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  62. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +13 -16
  63. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +11 -10
  64. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +7 -18
  65. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -4
  66. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  67. data/lib/rubocop/cop/internal_affairs.rb +2 -1
  68. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +22 -33
  69. data/lib/rubocop/cop/layout/{align_parameters.rb → argument_alignment.rb} +26 -24
  70. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  71. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +18 -5
  72. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +38 -32
  73. data/lib/rubocop/cop/layout/block_end_newline.rb +16 -13
  74. data/lib/rubocop/cop/layout/case_indentation.rb +26 -29
  75. data/lib/rubocop/cop/layout/class_structure.rb +343 -0
  76. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  77. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +145 -30
  78. data/lib/rubocop/cop/layout/comment_indentation.rb +76 -8
  79. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +15 -5
  80. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +10 -14
  81. data/lib/rubocop/cop/layout/dot_position.rb +34 -22
  82. data/lib/rubocop/cop/layout/else_alignment.rb +37 -20
  83. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  84. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  85. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +6 -5
  86. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +30 -25
  87. data/lib/rubocop/cop/layout/empty_lines.rb +20 -4
  88. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +138 -33
  89. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  90. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +8 -5
  92. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -11
  93. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +60 -11
  94. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +13 -4
  95. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +8 -4
  96. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +29 -11
  97. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +53 -21
  98. data/lib/rubocop/cop/layout/end_of_line.rb +48 -8
  99. data/lib/rubocop/cop/layout/extra_spacing.rb +66 -102
  100. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  101. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  102. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +6 -2
  103. data/lib/rubocop/cop/layout/{indent_hash.rb → first_hash_element_indentation.rb} +83 -33
  104. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +5 -1
  105. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -4
  106. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +5 -1
  107. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +61 -73
  108. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  109. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  110. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  111. data/lib/rubocop/cop/layout/indentation_consistency.rb +160 -8
  112. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  113. data/lib/rubocop/cop/layout/indentation_width.rb +100 -45
  114. data/lib/rubocop/cop/layout/initial_indentation.rb +24 -8
  115. data/lib/rubocop/cop/layout/leading_comment_space.rb +67 -6
  116. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  117. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  118. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +61 -24
  119. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  120. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +21 -14
  121. data/lib/rubocop/cop/layout/multiline_block_layout.rb +63 -28
  122. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +54 -21
  123. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  124. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  125. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +70 -33
  126. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -18
  127. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +82 -33
  128. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +34 -6
  129. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  130. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +125 -22
  131. data/lib/rubocop/cop/layout/space_after_colon.rb +6 -6
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +7 -3
  133. data/lib/rubocop/cop/layout/space_after_method_name.rb +10 -7
  134. data/lib/rubocop/cop/layout/space_after_not.rb +4 -2
  135. data/lib/rubocop/cop/layout/space_after_semicolon.rb +12 -1
  136. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +74 -49
  137. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +41 -17
  138. data/lib/rubocop/cop/layout/space_around_keyword.rb +36 -20
  139. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  140. data/lib/rubocop/cop/layout/space_around_operators.rb +142 -46
  141. data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -11
  142. data/lib/rubocop/cop/layout/space_before_comma.rb +16 -1
  143. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -7
  144. data/lib/rubocop/cop/layout/space_before_first_arg.rb +15 -4
  145. data/lib/rubocop/cop/layout/space_before_semicolon.rb +5 -1
  146. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +30 -39
  147. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  148. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +5 -5
  149. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +110 -19
  150. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +93 -46
  151. data/lib/rubocop/cop/layout/space_inside_parens.rb +92 -4
  152. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +3 -3
  153. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +17 -17
  154. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  155. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +37 -41
  156. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +54 -21
  157. data/lib/rubocop/cop/layout/trailing_whitespace.rb +51 -2
  158. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  159. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  160. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +16 -22
  161. data/lib/rubocop/cop/lint/ambiguous_operator.rb +42 -1
  162. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  163. data/lib/rubocop/cop/lint/assignment_in_condition.rb +29 -26
  164. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  165. data/lib/rubocop/cop/lint/boolean_symbol.rb +14 -2
  166. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  167. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  168. data/lib/rubocop/cop/lint/debugger.rb +8 -10
  169. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +34 -13
  170. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  171. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  172. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  173. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +2 -2
  174. data/lib/rubocop/cop/lint/duplicate_methods.rb +38 -25
  175. data/lib/rubocop/cop/lint/each_with_object_argument.rb +5 -2
  176. data/lib/rubocop/cop/lint/else_layout.rb +4 -3
  177. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  178. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  179. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -5
  180. data/lib/rubocop/cop/lint/empty_when.rb +30 -7
  181. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  182. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  183. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  184. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  185. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +62 -44
  186. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  187. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +21 -15
  188. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +37 -59
  189. data/lib/rubocop/cop/lint/inherit_exception.rb +32 -16
  190. data/lib/rubocop/cop/lint/interpolation_check.rb +19 -3
  191. data/lib/rubocop/cop/lint/literal_as_condition.rb +16 -22
  192. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +33 -11
  193. data/lib/rubocop/cop/lint/loop.rb +8 -6
  194. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  195. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  196. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +4 -4
  197. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -7
  198. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  199. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -2
  200. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  201. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +14 -16
  202. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  203. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  204. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +45 -15
  205. data/lib/rubocop/cop/lint/percent_string_array.rb +18 -22
  206. data/lib/rubocop/cop/lint/percent_symbol_array.rb +18 -15
  207. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  208. data/lib/rubocop/cop/lint/rand_one.rb +5 -5
  209. data/lib/rubocop/cop/lint/{unneeded_disable.rb → redundant_cop_disable_directive.rb} +87 -61
  210. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  211. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +10 -10
  212. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +58 -27
  213. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +18 -17
  214. data/lib/rubocop/cop/lint/redundant_with_index.rb +13 -8
  215. data/lib/rubocop/cop/lint/redundant_with_object.rb +9 -7
  216. data/lib/rubocop/cop/lint/regexp_as_condition.rb +7 -1
  217. data/lib/rubocop/cop/lint/require_parentheses.rb +7 -2
  218. data/lib/rubocop/cop/lint/rescue_exception.rb +3 -2
  219. data/lib/rubocop/cop/lint/rescue_type.rb +10 -6
  220. data/lib/rubocop/cop/lint/return_in_void_context.rb +3 -3
  221. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +23 -28
  222. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  223. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  224. data/lib/rubocop/cop/lint/script_permission.rb +33 -11
  225. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  226. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  227. data/lib/rubocop/cop/lint/shadowed_exception.rb +42 -23
  228. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  229. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  230. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  231. data/lib/rubocop/cop/lint/syntax.rb +12 -28
  232. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  233. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -6
  234. data/lib/rubocop/cop/lint/unified_integer.rb +3 -3
  235. data/lib/rubocop/cop/lint/unreachable_code.rb +9 -7
  236. data/lib/rubocop/cop/lint/unused_block_argument.rb +26 -6
  237. data/lib/rubocop/cop/lint/unused_method_argument.rb +62 -12
  238. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +17 -15
  239. data/lib/rubocop/cop/lint/uri_regexp.rb +7 -7
  240. data/lib/rubocop/cop/lint/useless_access_modifier.rb +96 -37
  241. data/lib/rubocop/cop/lint/useless_assignment.rb +8 -10
  242. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  243. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +9 -1
  244. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -11
  245. data/lib/rubocop/cop/lint/void.rb +62 -30
  246. data/lib/rubocop/cop/message_annotator.rb +26 -13
  247. data/lib/rubocop/cop/metrics/abc_size.rb +4 -19
  248. data/lib/rubocop/cop/metrics/block_length.rb +42 -2
  249. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -1
  250. data/lib/rubocop/cop/metrics/class_length.rb +37 -2
  251. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  252. data/lib/rubocop/cop/metrics/method_length.rb +29 -2
  253. data/lib/rubocop/cop/metrics/module_length.rb +37 -2
  254. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  255. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -5
  256. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  257. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  258. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  259. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  260. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  261. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  262. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -0
  263. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  264. data/lib/rubocop/cop/mixin/array_syntax.rb +3 -1
  265. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  266. data/lib/rubocop/cop/mixin/check_assignment.rb +13 -9
  267. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  268. data/lib/rubocop/cop/mixin/code_length.rb +11 -1
  269. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +8 -5
  270. data/lib/rubocop/cop/mixin/configurable_formatting.rb +4 -7
  271. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -2
  272. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  273. data/lib/rubocop/cop/mixin/def_node.rb +8 -2
  274. data/lib/rubocop/cop/mixin/documentation_comment.rb +13 -7
  275. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +34 -28
  276. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  277. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +19 -32
  278. data/lib/rubocop/cop/mixin/enforce_superclass.rb +6 -10
  279. data/lib/rubocop/cop/mixin/first_element_line_break.rb +6 -10
  280. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +32 -7
  281. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +38 -7
  282. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  283. data/lib/rubocop/cop/mixin/heredoc.rb +22 -18
  284. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  285. data/lib/rubocop/cop/mixin/ignored_pattern.rb +3 -1
  286. data/lib/rubocop/cop/mixin/integer_node.rb +3 -1
  287. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  288. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  289. data/lib/rubocop/cop/mixin/match_range.rb +4 -0
  290. data/lib/rubocop/cop/mixin/method_complexity.rb +38 -8
  291. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  292. data/lib/rubocop/cop/mixin/min_body_length.rb +3 -1
  293. data/lib/rubocop/cop/mixin/{array_hash_indentation.rb → multiline_element_indentation.rb} +5 -2
  294. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  295. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +50 -15
  296. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +15 -50
  297. data/lib/rubocop/cop/mixin/negative_conditional.rb +5 -16
  298. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  299. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +30 -32
  300. data/lib/rubocop/cop/mixin/parentheses.rb +3 -9
  301. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  302. data/lib/rubocop/cop/mixin/percent_array.rb +2 -2
  303. data/lib/rubocop/cop/mixin/percent_literal.rb +3 -65
  304. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +98 -6
  305. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  306. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  307. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  308. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  309. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -3
  310. data/lib/rubocop/cop/mixin/safe_assignment.rb +4 -1
  311. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +13 -14
  312. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +16 -16
  313. data/lib/rubocop/cop/mixin/statement_modifier.rb +20 -33
  314. data/lib/rubocop/cop/mixin/string_help.rb +2 -0
  315. data/lib/rubocop/cop/mixin/string_literals_help.rb +4 -14
  316. data/lib/rubocop/cop/mixin/surrounding_space.rb +120 -9
  317. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  318. data/lib/rubocop/cop/mixin/too_many_lines.rb +5 -19
  319. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  320. data/lib/rubocop/cop/mixin/trailing_comma.rb +96 -45
  321. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  322. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -53
  323. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  324. data/lib/rubocop/cop/naming/ascii_identifiers.rb +64 -5
  325. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +11 -9
  326. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  327. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +28 -14
  328. data/lib/rubocop/cop/naming/constant_name.rb +59 -6
  329. data/lib/rubocop/cop/naming/file_name.rb +72 -36
  330. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  331. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +8 -12
  332. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  333. data/lib/rubocop/cop/naming/method_name.rb +58 -13
  334. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  335. data/lib/rubocop/cop/naming/predicate_name.rb +22 -13
  336. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  337. data/lib/rubocop/cop/naming/variable_name.rb +20 -3
  338. data/lib/rubocop/cop/naming/variable_number.rb +12 -29
  339. data/lib/rubocop/cop/offense.rb +55 -13
  340. data/lib/rubocop/cop/registry.rb +118 -14
  341. data/lib/rubocop/cop/security/eval.rb +3 -2
  342. data/lib/rubocop/cop/security/json_load.rb +7 -5
  343. data/lib/rubocop/cop/security/marshal_load.rb +5 -3
  344. data/lib/rubocop/cop/security/open.rb +71 -0
  345. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  346. data/lib/rubocop/cop/severity.rb +2 -3
  347. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  348. data/lib/rubocop/cop/style/accessor_grouping.rb +136 -0
  349. data/lib/rubocop/cop/style/alias.rb +41 -37
  350. data/lib/rubocop/cop/style/and_or.rb +44 -38
  351. data/lib/rubocop/cop/style/array_join.rb +12 -3
  352. data/lib/rubocop/cop/style/ascii_comments.rb +29 -6
  353. data/lib/rubocop/cop/style/attr.rb +26 -8
  354. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +14 -5
  355. data/lib/rubocop/cop/style/bare_percent_literals.rb +34 -13
  356. data/lib/rubocop/cop/style/begin_block.rb +7 -1
  357. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +121 -0
  358. data/lib/rubocop/cop/style/block_comments.rb +27 -5
  359. data/lib/rubocop/cop/style/block_delimiters.rb +189 -30
  360. data/lib/rubocop/cop/style/case_equality.rb +37 -2
  361. data/lib/rubocop/cop/style/character_literal.rb +13 -3
  362. data/lib/rubocop/cop/style/class_and_module_children.rb +92 -10
  363. data/lib/rubocop/cop/style/class_check.rb +28 -9
  364. data/lib/rubocop/cop/style/class_methods.rb +20 -28
  365. data/lib/rubocop/cop/style/class_vars.rb +49 -3
  366. data/lib/rubocop/cop/style/collection_methods.rb +32 -2
  367. data/lib/rubocop/cop/style/colon_method_call.rb +19 -4
  368. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  369. data/lib/rubocop/cop/style/command_literal.rb +85 -28
  370. data/lib/rubocop/cop/style/comment_annotation.rb +51 -19
  371. data/lib/rubocop/cop/style/commented_keyword.rb +22 -30
  372. data/lib/rubocop/cop/style/conditional_assignment.rb +62 -92
  373. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  374. data/lib/rubocop/cop/style/copyright.rb +39 -29
  375. data/lib/rubocop/cop/style/date_time.rb +44 -11
  376. data/lib/rubocop/cop/style/def_with_parentheses.rb +28 -3
  377. data/lib/rubocop/cop/style/dir.rb +7 -7
  378. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  379. data/lib/rubocop/cop/style/documentation.rb +72 -16
  380. data/lib/rubocop/cop/style/documentation_method.rb +51 -2
  381. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  382. data/lib/rubocop/cop/style/double_negation.rb +43 -6
  383. data/lib/rubocop/cop/style/each_for_simple_loop.rb +9 -9
  384. data/lib/rubocop/cop/style/each_with_object.rb +25 -11
  385. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  386. data/lib/rubocop/cop/style/empty_case_condition.rb +30 -5
  387. data/lib/rubocop/cop/style/empty_else.rb +62 -26
  388. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  389. data/lib/rubocop/cop/style/empty_literal.rb +32 -18
  390. data/lib/rubocop/cop/style/empty_method.rb +14 -21
  391. data/lib/rubocop/cop/style/encoding.rb +13 -5
  392. data/lib/rubocop/cop/style/end_block.rb +15 -1
  393. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  394. data/lib/rubocop/cop/style/even_odd.rb +9 -7
  395. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  396. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  397. data/lib/rubocop/cop/style/float_division.rb +94 -0
  398. data/lib/rubocop/cop/style/for.rb +54 -19
  399. data/lib/rubocop/cop/style/format_string.rb +63 -32
  400. data/lib/rubocop/cop/style/format_string_token.rb +45 -67
  401. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +170 -32
  402. data/lib/rubocop/cop/style/global_vars.rb +14 -4
  403. data/lib/rubocop/cop/style/guard_clause.rb +66 -13
  404. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  405. data/lib/rubocop/cop/style/hash_syntax.rb +69 -61
  406. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  407. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  408. data/lib/rubocop/cop/style/identical_conditional_branches.rb +17 -21
  409. data/lib/rubocop/cop/style/if_inside_else.rb +52 -10
  410. data/lib/rubocop/cop/style/if_unless_modifier.rb +132 -24
  411. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +14 -2
  412. data/lib/rubocop/cop/style/if_with_semicolon.rb +28 -2
  413. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  414. data/lib/rubocop/cop/style/infinite_loop.rb +51 -14
  415. data/lib/rubocop/cop/style/inline_comment.rb +5 -3
  416. data/lib/rubocop/cop/style/inverse_methods.rb +70 -22
  417. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  418. data/lib/rubocop/cop/style/lambda.rb +25 -112
  419. data/lib/rubocop/cop/style/lambda_call.rb +13 -27
  420. data/lib/rubocop/cop/style/line_end_concatenation.rb +22 -16
  421. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  422. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  423. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +134 -34
  424. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -14
  425. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
  426. data/lib/rubocop/cop/style/method_def_parentheses.rb +102 -13
  427. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  428. data/lib/rubocop/cop/style/min_max.rb +14 -14
  429. data/lib/rubocop/cop/style/missing_else.rb +79 -12
  430. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  431. data/lib/rubocop/cop/style/mixin_grouping.rb +46 -33
  432. data/lib/rubocop/cop/style/mixin_usage.rb +32 -15
  433. data/lib/rubocop/cop/style/module_function.rb +102 -20
  434. data/lib/rubocop/cop/style/multiline_block_chain.rb +14 -3
  435. data/lib/rubocop/cop/style/multiline_if_modifier.rb +7 -7
  436. data/lib/rubocop/cop/style/multiline_if_then.rb +16 -14
  437. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -17
  438. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  439. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +31 -1
  440. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  441. data/lib/rubocop/cop/style/multiple_comparison.rb +19 -4
  442. data/lib/rubocop/cop/style/mutable_constant.rb +123 -15
  443. data/lib/rubocop/cop/style/negated_if.rb +26 -34
  444. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  445. data/lib/rubocop/cop/style/negated_while.rb +22 -6
  446. data/lib/rubocop/cop/style/nested_modifier.rb +28 -8
  447. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +25 -24
  448. data/lib/rubocop/cop/style/nested_ternary_operator.rb +39 -1
  449. data/lib/rubocop/cop/style/next.rb +64 -35
  450. data/lib/rubocop/cop/style/nil_comparison.rb +51 -11
  451. data/lib/rubocop/cop/style/non_nil_check.rb +42 -27
  452. data/lib/rubocop/cop/style/not.rb +21 -8
  453. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +46 -23
  454. data/lib/rubocop/cop/style/numeric_literals.rb +31 -18
  455. data/lib/rubocop/cop/style/numeric_predicate.rb +26 -32
  456. data/lib/rubocop/cop/style/one_line_conditional.rb +36 -18
  457. data/lib/rubocop/cop/style/option_hash.rb +22 -14
  458. data/lib/rubocop/cop/style/optional_arguments.rb +3 -6
  459. data/lib/rubocop/cop/style/or_assignment.rb +17 -9
  460. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  461. data/lib/rubocop/cop/style/parentheses_around_condition.rb +65 -5
  462. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +33 -6
  463. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  464. data/lib/rubocop/cop/style/perl_backrefs.rb +10 -3
  465. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -10
  466. data/lib/rubocop/cop/style/proc.rb +12 -4
  467. data/lib/rubocop/cop/style/raise_args.rb +27 -21
  468. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  469. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  470. data/lib/rubocop/cop/style/redundant_begin.rb +48 -5
  471. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +19 -9
  472. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  473. data/lib/rubocop/cop/style/redundant_conditional.rb +17 -14
  474. data/lib/rubocop/cop/style/redundant_exception.rb +26 -17
  475. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  476. data/lib/rubocop/cop/style/redundant_freeze.rb +24 -2
  477. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +20 -24
  478. data/lib/rubocop/cop/style/redundant_parentheses.rb +59 -27
  479. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +40 -24
  480. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  481. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  482. data/lib/rubocop/cop/style/redundant_return.rb +87 -51
  483. data/lib/rubocop/cop/style/redundant_self.rb +56 -41
  484. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  485. data/lib/rubocop/cop/{performance → style}/redundant_sort_by.rb +9 -7
  486. data/lib/rubocop/cop/style/regexp_literal.rb +126 -20
  487. data/lib/rubocop/cop/style/rescue_modifier.rb +39 -3
  488. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  489. data/lib/rubocop/cop/style/return_nil.rb +8 -12
  490. data/lib/rubocop/cop/style/safe_navigation.rb +123 -31
  491. data/lib/rubocop/cop/{performance → style}/sample.rb +17 -13
  492. data/lib/rubocop/cop/style/self_assignment.rb +14 -14
  493. data/lib/rubocop/cop/style/semicolon.rb +45 -14
  494. data/lib/rubocop/cop/style/send.rb +12 -2
  495. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  496. data/lib/rubocop/cop/style/single_line_block_params.rb +22 -2
  497. data/lib/rubocop/cop/style/single_line_methods.rb +41 -31
  498. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  499. data/lib/rubocop/cop/style/special_global_vars.rb +75 -24
  500. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +13 -21
  501. data/lib/rubocop/cop/style/stderr_puts.rb +14 -5
  502. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  503. data/lib/rubocop/cop/style/string_literals.rb +29 -3
  504. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +7 -9
  505. data/lib/rubocop/cop/style/string_methods.rb +19 -7
  506. data/lib/rubocop/cop/{performance/lstrip_rstrip.rb → style/strip.rb} +10 -7
  507. data/lib/rubocop/cop/style/struct_inheritance.rb +36 -8
  508. data/lib/rubocop/cop/style/symbol_array.rb +51 -17
  509. data/lib/rubocop/cop/style/symbol_literal.rb +3 -3
  510. data/lib/rubocop/cop/style/symbol_proc.rb +32 -54
  511. data/lib/rubocop/cop/style/ternary_parentheses.rb +69 -53
  512. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  513. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  514. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  515. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +69 -24
  516. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  518. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +19 -9
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +51 -20
  522. data/lib/rubocop/cop/style/unless_else.rb +21 -5
  523. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  524. data/lib/rubocop/cop/style/variable_interpolation.rb +22 -21
  525. data/lib/rubocop/cop/style/when_then.rb +15 -2
  526. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  527. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -7
  528. data/lib/rubocop/cop/style/word_array.rb +22 -18
  529. data/lib/rubocop/cop/style/yoda_condition.rb +96 -36
  530. data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -20
  531. data/lib/rubocop/cop/team.rb +159 -91
  532. data/lib/rubocop/cop/util.rb +51 -209
  533. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  534. data/lib/rubocop/cop/variable_force/assignment.rb +9 -2
  535. data/lib/rubocop/cop/variable_force/branch.rb +5 -3
  536. data/lib/rubocop/cop/variable_force/branchable.rb +2 -0
  537. data/lib/rubocop/cop/variable_force/scope.rb +8 -5
  538. data/lib/rubocop/cop/variable_force/variable.rb +21 -10
  539. data/lib/rubocop/cop/variable_force/variable_table.rb +4 -3
  540. data/lib/rubocop/cop/variable_force.rb +41 -36
  541. data/lib/rubocop/core_ext/string.rb +23 -0
  542. data/lib/rubocop/error.rb +23 -0
  543. data/lib/rubocop/ext/processed_source.rb +18 -0
  544. data/lib/rubocop/file_finder.rb +42 -0
  545. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  546. data/lib/rubocop/formatter/base_formatter.rb +3 -7
  547. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  548. data/lib/rubocop/formatter/disabled_config_formatter.rb +84 -49
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  550. data/lib/rubocop/formatter/file_list_formatter.rb +2 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +17 -16
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -2
  553. data/lib/rubocop/formatter/html_formatter.rb +13 -6
  554. data/lib/rubocop/formatter/json_formatter.rb +16 -9
  555. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  556. data/lib/rubocop/formatter/offense_count_formatter.rb +17 -0
  557. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  558. data/lib/rubocop/formatter/progress_formatter.rb +1 -1
  559. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  560. data/lib/rubocop/formatter/simple_text_formatter.rb +18 -5
  561. data/lib/rubocop/formatter/tap_formatter.rb +17 -6
  562. data/lib/rubocop/magic_comment.rb +15 -11
  563. data/lib/rubocop/name_similarity.rb +17 -10
  564. data/lib/rubocop/options.rb +267 -139
  565. data/lib/rubocop/path_util.rb +45 -7
  566. data/lib/rubocop/platform.rb +1 -1
  567. data/lib/rubocop/rake_task.rb +7 -9
  568. data/lib/rubocop/remote_config.rb +23 -9
  569. data/lib/rubocop/result_cache.rb +50 -23
  570. data/lib/rubocop/rspec/cop_helper.rb +10 -37
  571. data/lib/rubocop/rspec/expect_offense.rb +124 -12
  572. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -5
  573. data/lib/rubocop/rspec/shared_contexts.rb +78 -39
  574. data/lib/rubocop/rspec/support.rb +5 -1
  575. data/lib/rubocop/runner.rb +109 -59
  576. data/lib/rubocop/string_interpreter.rb +8 -8
  577. data/lib/rubocop/target_finder.rb +62 -68
  578. data/lib/rubocop/target_ruby.rb +154 -0
  579. data/lib/rubocop/version.rb +8 -4
  580. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  581. data/lib/rubocop.rb +188 -149
  582. metadata +257 -182
  583. data/config/disabled.yml +0 -118
  584. data/config/enabled.yml +0 -1892
  585. data/lib/rubocop/ast/builder.rb +0 -70
  586. data/lib/rubocop/ast/node/and_node.rb +0 -37
  587. data/lib/rubocop/ast/node/args_node.rb +0 -12
  588. data/lib/rubocop/ast/node/array_node.rb +0 -57
  589. data/lib/rubocop/ast/node/block_node.rb +0 -116
  590. data/lib/rubocop/ast/node/case_node.rb +0 -64
  591. data/lib/rubocop/ast/node/def_node.rb +0 -71
  592. data/lib/rubocop/ast/node/ensure_node.rb +0 -25
  593. data/lib/rubocop/ast/node/for_node.rb +0 -61
  594. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  595. data/lib/rubocop/ast/node/if_node.rb +0 -146
  596. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  597. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -23
  598. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  599. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  600. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  601. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -174
  602. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -89
  603. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  604. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  605. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  606. data/lib/rubocop/ast/node/or_node.rb +0 -37
  607. data/lib/rubocop/ast/node/pair_node.rb +0 -64
  608. data/lib/rubocop/ast/node/regexp_node.rb +0 -35
  609. data/lib/rubocop/ast/node/resbody_node.rb +0 -25
  610. data/lib/rubocop/ast/node/send_node.rb +0 -25
  611. data/lib/rubocop/ast/node/super_node.rb +0 -21
  612. data/lib/rubocop/ast/node/until_node.rb +0 -43
  613. data/lib/rubocop/ast/node/when_node.rb +0 -61
  614. data/lib/rubocop/ast/node/while_node.rb +0 -43
  615. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  616. data/lib/rubocop/ast/node.rb +0 -604
  617. data/lib/rubocop/ast/sexp.rb +0 -16
  618. data/lib/rubocop/ast/traversal.rb +0 -171
  619. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  620. data/lib/rubocop/cop/layout/align_array.rb +0 -35
  621. data/lib/rubocop/cop/layout/align_hash.rb +0 -235
  622. data/lib/rubocop/cop/layout/indent_array.rb +0 -114
  623. data/lib/rubocop/cop/layout/indent_heredoc.rb +0 -168
  624. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  625. data/lib/rubocop/cop/layout/tab.rb +0 -60
  626. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  627. data/lib/rubocop/cop/lint/handle_exceptions.rb +0 -56
  628. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  629. data/lib/rubocop/cop/metrics/line_length.rb +0 -171
  630. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -149
  631. data/lib/rubocop/cop/mixin/classish_length.rb +0 -36
  632. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
  633. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  634. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  635. data/lib/rubocop/cop/performance/caller.rb +0 -69
  636. data/lib/rubocop/cop/performance/case_when_splat.rb +0 -176
  637. data/lib/rubocop/cop/performance/casecmp.rb +0 -107
  638. data/lib/rubocop/cop/performance/compare_with_block.rb +0 -111
  639. data/lib/rubocop/cop/performance/count.rb +0 -100
  640. data/lib/rubocop/cop/performance/detect.rb +0 -107
  641. data/lib/rubocop/cop/performance/double_start_end_with.rb +0 -99
  642. data/lib/rubocop/cop/performance/end_with.rb +0 -55
  643. data/lib/rubocop/cop/performance/fixed_size.rb +0 -56
  644. data/lib/rubocop/cop/performance/flat_map.rb +0 -75
  645. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -128
  646. data/lib/rubocop/cop/performance/range_include.rb +0 -41
  647. data/lib/rubocop/cop/performance/redundant_block_call.rb +0 -93
  648. data/lib/rubocop/cop/performance/redundant_match.rb +0 -56
  649. data/lib/rubocop/cop/performance/redundant_merge.rb +0 -167
  650. data/lib/rubocop/cop/performance/regexp_match.rb +0 -223
  651. data/lib/rubocop/cop/performance/reverse_each.rb +0 -40
  652. data/lib/rubocop/cop/performance/size.rb +0 -71
  653. data/lib/rubocop/cop/performance/start_with.rb +0 -58
  654. data/lib/rubocop/cop/performance/string_replacement.rb +0 -170
  655. data/lib/rubocop/cop/performance/times_map.rb +0 -72
  656. data/lib/rubocop/cop/performance/unfreeze_string.rb +0 -50
  657. data/lib/rubocop/cop/performance/uri_default_parser.rb +0 -47
  658. data/lib/rubocop/cop/rails/action_filter.rb +0 -94
  659. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -67
  660. data/lib/rubocop/cop/rails/application_job.rb +0 -32
  661. data/lib/rubocop/cop/rails/application_record.rb +0 -32
  662. data/lib/rubocop/cop/rails/blank.rb +0 -141
  663. data/lib/rubocop/cop/rails/date.rb +0 -128
  664. data/lib/rubocop/cop/rails/delegate.rb +0 -135
  665. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -51
  666. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -81
  667. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -43
  668. data/lib/rubocop/cop/rails/exit.rb +0 -61
  669. data/lib/rubocop/cop/rails/file_path.rb +0 -72
  670. data/lib/rubocop/cop/rails/find_by.rb +0 -52
  671. data/lib/rubocop/cop/rails/find_each.rb +0 -47
  672. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -18
  673. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -72
  674. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -107
  675. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  676. data/lib/rubocop/cop/rails/output.rb +0 -23
  677. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  678. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -106
  679. data/lib/rubocop/cop/rails/present.rb +0 -140
  680. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -65
  681. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -88
  682. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  683. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -282
  684. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -91
  685. data/lib/rubocop/cop/rails/save_bang.rb +0 -162
  686. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  687. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -70
  688. data/lib/rubocop/cop/rails/time_zone.rb +0 -198
  689. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -95
  690. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  691. data/lib/rubocop/cop/rails/validation.rb +0 -64
  692. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -141
  693. data/lib/rubocop/cop/style/flip_flop.rb +0 -20
  694. data/lib/rubocop/cop/style/method_missing.rb +0 -68
  695. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +0 -56
  696. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  697. data/lib/rubocop/node_pattern.rb +0 -561
  698. data/lib/rubocop/processed_source.rb +0 -147
  699. data/lib/rubocop/rspec/shared_examples.rb +0 -92
  700. data/lib/rubocop/string_util.rb +0 -158
  701. data/lib/rubocop/token.rb +0 -25
  702. /data/{bin → exe}/rubocop +0 -0
@@ -1,81 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ModuleLength
4
3
  module RuboCop
5
4
  module Cop
6
5
  # This module contains a collection of useful utility methods.
7
6
  module Util
8
7
  include PathUtil
9
- extend RuboCop::AST::Sexp
10
-
11
- BYTE_ORDER_MARK = 0xfeff # The Unicode codepoint
12
-
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
16
- ASGN_NODES = (EQUALS_ASGN_NODES + SHORTHAND_ASGN_NODES).freeze
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
-
22
- # http://phrogz.net/programmingruby/language.html#table_18.4
23
- # Backtick is added last just to help editors parse this code.
24
- OPERATOR_METHODS = %w(
25
- | ^ & <=> == === =~ > >= < <= << >>
26
- + - * / % ** ~ +@ -@ [] []= ! != !~
27
- ).map(&:to_sym).push(:'`').freeze
28
8
 
29
9
  # Match literal regex characters, not including anchors, character
30
10
  # classes, alternatives, groups, repetitions, references, etc
31
- LITERAL_REGEX = /[\w\s\-,"'!#%&<>=;:`~]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]/
11
+ LITERAL_REGEX =
12
+ %r{[\w\s\-,"'!#%&<>=;:`~/]|\\[^AbBdDgGhHkpPRwWXsSzZ0-9]}.freeze
32
13
 
33
14
  module_function
34
15
 
35
- def operator?(symbol)
36
- OPERATOR_METHODS.include?(symbol)
16
+ def comment_line?(line_source)
17
+ /^\s*#/.match?(line_source)
37
18
  end
38
19
 
39
- def strip_quotes(str)
40
- if str[0] == '"' || str[0] == "'"
41
- str[0] = ''
42
- else
43
- # we're dealing with %q or %Q
44
- str[0, 3] = ''
45
- end
46
- str[-1] = ''
47
-
48
- str
20
+ def comment_lines?(node)
21
+ processed_source[line_range(node)].any? { |line| comment_line?(line) }
49
22
  end
50
23
 
51
- def block_length(block_node)
52
- block_node.loc.end.line - block_node.loc.begin.line
24
+ def line_range(node)
25
+ node.first_line..node.last_line
53
26
  end
54
27
 
55
- def comment_line?(line_source)
56
- line_source =~ /^\s*#/
28
+ def parentheses?(node)
29
+ node.loc.respond_to?(:end) && node.loc.end &&
30
+ node.loc.end.is?(')')
57
31
  end
58
32
 
59
- def line_range(arg)
60
- source_range = case arg
61
- when Parser::Source::Range
62
- arg
63
- when Parser::AST::Node
64
- arg.source_range
65
- else
66
- raise ArgumentError, "Invalid argument #{arg}"
67
- end
68
-
69
- source_range.begin.line..source_range.end.line
33
+ def add_parentheses(node, corrector)
34
+ if node.arguments.empty?
35
+ corrector.insert_after(node, '()')
36
+ else
37
+ corrector.replace(args_begin(node), '(')
38
+ corrector.insert_after(args_end(node), ')')
39
+ end
70
40
  end
71
41
 
72
- def parentheses?(node)
73
- node.loc.respond_to?(:end) && node.loc.end &&
74
- node.loc.end.is?(')'.freeze)
42
+ def args_begin(node)
43
+ loc = node.loc
44
+ selector =
45
+ node.super_type? || node.yield_type? ? loc.keyword : loc.selector
46
+ selector.end.resize(1)
75
47
  end
76
48
 
77
- def parenthesized_call?(send)
78
- send.loc.begin && send.loc.begin.is?('(')
49
+ def args_end(node)
50
+ node.loc.expression.end
79
51
  end
80
52
 
81
53
  def on_node(syms, sexp, excludes = [], &block)
@@ -87,127 +59,19 @@ module RuboCop
87
59
  sexp.each_child_node { |elem| on_node(syms, elem, excludes, &block) }
88
60
  end
89
61
 
90
- def source_range(source_buffer, line_number, column, length = 1)
91
- if column.is_a?(Range)
92
- column_index = column.begin
93
- length = column.size
94
- else
95
- column_index = column
96
- end
97
-
98
- line_begin_pos = if line_number.zero?
99
- 0
100
- else
101
- source_buffer.line_range(line_number).begin_pos
102
- end
103
- begin_pos = line_begin_pos + column_index
104
- end_pos = begin_pos + length
105
-
106
- Parser::Source::Range.new(source_buffer, begin_pos, end_pos)
107
- end
108
-
109
- # Returns the column attribute of the range, except if the range is on
110
- # the first line and there's a byte order mark at the beginning of that
111
- # line, in which case 1 is subtracted from the column value. This gives
112
- # the column as it appears when viewing the file in an editor.
113
- def effective_column(range)
114
- if range.line == 1 &&
115
- @processed_source.raw_source.codepoints.first == BYTE_ORDER_MARK
116
- range.column - 1
117
- else
118
- range.column
119
- end
120
- end
121
-
122
- def range_between(start_pos, end_pos)
123
- Parser::Source::Range.new(processed_source.buffer, start_pos, end_pos)
124
- end
125
-
126
- def range_with_surrounding_comma(range, side = :both)
127
- buffer = @processed_source.buffer
128
- src = buffer.source
129
-
130
- go_left, go_right = directions(side)
131
-
132
- begin_pos = range.begin_pos
133
- end_pos = range.end_pos
134
- begin_pos = move_pos(src, begin_pos, -1, go_left, /,/)
135
- end_pos = move_pos(src, end_pos, 1, go_right, /,/)
136
-
137
- Parser::Source::Range.new(buffer, begin_pos, end_pos)
138
- end
139
-
140
- def range_with_surrounding_space(range, side = :both, with_newline = true)
141
- buffer = @processed_source.buffer
142
- src = buffer.source
143
-
144
- go_left, go_right = directions(side)
145
-
146
- begin_pos = range.begin_pos
147
- end_pos = range.end_pos
148
- begin_pos = move_pos(src, begin_pos, -1, go_left, /[ \t]/)
149
- begin_pos = move_pos(src, begin_pos, -1, go_left && with_newline, /\n/)
150
- end_pos = move_pos(src, end_pos, 1, go_right, /[ \t]/)
151
- end_pos = move_pos(src, end_pos, 1, go_right && with_newline, /\n/)
152
- Parser::Source::Range.new(buffer, begin_pos, end_pos)
153
- end
154
-
155
- def range_by_whole_lines(range, include_final_newline: false)
156
- buffer = @processed_source.buffer
157
-
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)
169
- end
170
-
171
- def move_pos(src, pos, step, condition, regexp)
172
- offset = step == -1 ? -1 : 0
173
- pos += step while condition && src[pos + offset] =~ regexp
174
- pos < 0 ? 0 : pos
175
- end
176
-
177
- def directions(side)
178
- if side == :both
179
- [true, true]
180
- else
181
- [side == :left, side == :right]
182
- end
183
- end
184
-
185
62
  def begins_its_line?(range)
186
63
  (range.source_line =~ /\S/) == range.column
187
64
  end
188
65
 
189
- def ends_its_line?(range)
190
- line = range.source_buffer.source_line(range.last_line)
191
- (line =~ /\s*\z/) == range.last_column
192
- end
193
-
194
- def within_node?(inner, outer)
195
- o = outer.is_a?(AST::Node) ? outer.source_range : outer
196
- i = inner.is_a?(AST::Node) ? inner.source_range : inner
197
- i.begin_pos >= o.begin_pos && i.end_pos <= o.end_pos
198
- end
199
-
200
66
  # Returns, for example, a bare `if` node if the given node is an `if`
201
67
  # with calls chained to the end of it.
202
68
  def first_part_of_call_chain(node)
203
69
  while node
204
70
  case node.type
205
71
  when :send
206
- receiver, _method_name, _args = *node
207
- node = receiver
72
+ node = node.receiver
208
73
  when :block
209
- method, _args, _body = *node
210
- node = method
74
+ node = node.send_node
211
75
  else
212
76
  break
213
77
  end
@@ -224,7 +88,7 @@ module RuboCop
224
88
 
225
89
  # Regex matches IF there is a ' or there is a \\ in the string that is
226
90
  # not preceded/followed by another \\ (e.g. "\\x34") but not "\\\\".
227
- string =~ /'|(?<! \\) \\{2}* \\ (?![\\"])/x
91
+ /'|(?<! \\) \\{2}* \\ (?![\\"])/x.match?(string)
228
92
  end
229
93
 
230
94
  def needs_escaping?(string)
@@ -243,67 +107,45 @@ module RuboCop
243
107
  end
244
108
  end
245
109
 
246
- def to_symbol_literal(string)
247
- if symbol_without_quote?(string)
248
- ":#{string}"
249
- else
250
- ":#{to_string_literal(string)}"
251
- end
252
- end
253
-
254
- def symbol_without_quote?(string)
255
- special_gvars = %w[
256
- $! $" $$ $& $' $* $+ $, $/ $; $: $. $< $= $> $? $@ $\\ $_ $` $~ $0
257
- $-0 $-F $-I $-K $-W $-a $-d $-i $-l $-p $-v $-w
258
- ]
259
- redefinable_operators = %w(
260
- | ^ & <=> == === =~ > >= < <= << >>
261
- + - * / % ** ~ +@ -@ [] []= ` ! != !~
262
- )
263
-
264
- # method name
265
- string =~ /\A[a-zA-Z_]\w*[!?]?\z/ ||
266
- # instance / class variable
267
- string =~ /\A\@\@?[a-zA-Z_]\w*\z/ ||
268
- # global variable
269
- string =~ /\A\$[1-9]\d*\z/ ||
270
- string =~ /\A\$[a-zA-Z_]\w*\z/ ||
271
- special_gvars.include?(string) ||
272
- redefinable_operators.include?(string)
110
+ def trim_string_interporation_escape_character(str)
111
+ str.gsub(/\\\#\{(.*?)\}/) { "\#{#{Regexp.last_match(1)}}" }
273
112
  end
274
113
 
275
114
  def interpret_string_escapes(string)
276
115
  StringInterpreter.interpret(string)
277
116
  end
278
117
 
279
- def same_line?(n1, n2)
280
- n1.respond_to?(:loc) &&
281
- n2.respond_to?(:loc) &&
282
- n1.loc.line == n2.loc.line
118
+ def same_line?(node1, node2)
119
+ node1.respond_to?(:loc) &&
120
+ node2.respond_to?(:loc) &&
121
+ node1.loc.line == node2.loc.line
283
122
  end
284
123
 
285
- def line_distance(n1, n2)
286
- n2.loc.line - n1.loc.line
124
+ def to_supported_styles(enforced_style)
125
+ enforced_style
126
+ .sub(/^Enforced/, 'Supported')
127
+ .sub('Style', 'Styles')
287
128
  end
288
129
 
289
- def preceed?(n1, n2)
290
- line_distance(n1, n2) == 1
291
- end
130
+ def tokens(node)
131
+ @tokens ||= {}
132
+ return @tokens[node.object_id] if @tokens[node.object_id]
133
+
134
+ source_range = node.source_range
135
+ begin_pos = source_range.begin_pos
136
+ end_pos = source_range.end_pos
292
137
 
293
- def stripped_source_upto(line)
294
- processed_source[0..line].map(&:strip)
138
+ @tokens[node.object_id] = processed_source.tokens.select do |token|
139
+ token.end_pos <= end_pos && token.begin_pos >= begin_pos
140
+ end
295
141
  end
296
142
 
143
+ private
144
+
297
145
  def compatible_external_encoding_for?(src)
298
- src = src.dup if RUBY_VERSION < '2.3' || RUBY_ENGINE == 'jruby'
146
+ src = src.dup if RUBY_ENGINE == 'jruby'
299
147
  src.force_encoding(Encoding.default_external).valid_encoding?
300
148
  end
301
-
302
- def to_supported_styles(enforced_style)
303
- enforced_style
304
- .sub(/^Enforced/, 'Supported')
305
- .sub('Style', 'Styles')
306
- end
307
149
  end
308
150
  end
309
151
  end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Utils
6
+ # Parses {Kernel#sprintf} format strings.
7
+ class FormatString
8
+ DIGIT_DOLLAR = /(\d+)\$/.freeze
9
+ FLAG = /[ #0+-]|#{DIGIT_DOLLAR}/.freeze
10
+ NUMBER_ARG = /\*#{DIGIT_DOLLAR}?/.freeze
11
+ NUMBER = /\d+|#{NUMBER_ARG}/.freeze
12
+ WIDTH = /(?<width>#{NUMBER})/.freeze
13
+ PRECISION = /\.(?<precision>#{NUMBER})/.freeze
14
+ TYPE = /(?<type>[bBdiouxXeEfgGaAcps])/.freeze
15
+ NAME = /<(?<name>\w+)>/.freeze
16
+ TEMPLATE_NAME = /\{(?<name>\w+)\}/.freeze
17
+
18
+ SEQUENCE = /
19
+ % (?<type>%)
20
+ | % (?<flags>#{FLAG}*)
21
+ (?:
22
+ (?: #{WIDTH}? #{PRECISION}? #{NAME}?
23
+ | #{WIDTH}? #{NAME} #{PRECISION}?
24
+ | #{NAME} (?<more_flags>#{FLAG}*) #{WIDTH}? #{PRECISION}?
25
+ ) #{TYPE}
26
+ | #{WIDTH}? #{PRECISION}? #{TEMPLATE_NAME}
27
+ )
28
+ /x.freeze
29
+
30
+ # The syntax of a format sequence is as follows.
31
+ #
32
+ # ```
33
+ # %[flags][width][.precision]type
34
+ # ```
35
+ #
36
+ # A format sequence consists of a percent sign, followed by optional
37
+ # flags, width, and precision indicators, then terminated with a field
38
+ # type character.
39
+ #
40
+ # For more complex formatting, Ruby supports a reference by name.
41
+ #
42
+ # @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
43
+ class FormatSequence
44
+ attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
45
+
46
+ def initialize(match)
47
+ @source = match[0]
48
+ @begin_pos = match.begin(0)
49
+ @end_pos = match.end(0)
50
+ @flags = match[:flags].to_s + match[:more_flags].to_s
51
+ @width = match[:width]
52
+ @precision = match[:precision]
53
+ @name = match[:name]
54
+ @type = match[:type]
55
+ end
56
+
57
+ def percent?
58
+ type == '%'
59
+ end
60
+
61
+ def annotated?
62
+ name && @source.include?('<')
63
+ end
64
+
65
+ def template?
66
+ name && @source.include?('{')
67
+ end
68
+
69
+ # Number of arguments required for the format sequence
70
+ def arity
71
+ @source.scan('*').count + 1
72
+ end
73
+
74
+ def max_digit_dollar_num
75
+ @source.scan(DIGIT_DOLLAR).map do |(digit_dollar_num)|
76
+ digit_dollar_num.to_i
77
+ end.max
78
+ end
79
+
80
+ def style
81
+ if annotated?
82
+ :annotated
83
+ elsif template?
84
+ :template
85
+ else
86
+ :unannotated
87
+ end
88
+ end
89
+ end
90
+
91
+ def initialize(string)
92
+ @source = string
93
+ end
94
+
95
+ def format_sequences
96
+ @format_sequences ||= parse
97
+ end
98
+
99
+ def valid?
100
+ !mixed_formats?
101
+ end
102
+
103
+ def named_interpolation?
104
+ format_sequences.any?(&:name)
105
+ end
106
+
107
+ def max_digit_dollar_num
108
+ format_sequences.map(&:max_digit_dollar_num).max
109
+ end
110
+
111
+ private
112
+
113
+ def parse
114
+ @source.to_enum(:scan, SEQUENCE).map do
115
+ FormatSequence.new(
116
+ Regexp.last_match
117
+ )
118
+ end
119
+ end
120
+
121
+ def mixed_formats?
122
+ formats = format_sequences.reject(&:percent?).map do |seq|
123
+ if seq.name
124
+ :named
125
+ elsif seq.max_digit_dollar_num
126
+ :numbered
127
+ else
128
+ :unnumbered
129
+ end
130
+ end
131
+
132
+ formats.uniq.size > 1
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -9,7 +9,8 @@ module RuboCop
9
9
 
10
10
  MULTIPLE_LEFT_HAND_SIDE_TYPE = :mlhs
11
11
 
12
- attr_reader :node, :variable, :referenced
12
+ attr_reader :node, :variable, :referenced, :references
13
+
13
14
  alias referenced? referenced
14
15
 
15
16
  def initialize(node, variable)
@@ -22,6 +23,7 @@ module RuboCop
22
23
  @node = node
23
24
  @variable = variable
24
25
  @referenced = false
26
+ @references = []
25
27
  end
26
28
 
27
29
  def name
@@ -32,7 +34,8 @@ module RuboCop
32
34
  @variable.scope
33
35
  end
34
36
 
35
- def reference!
37
+ def reference!(node)
38
+ @references << node
36
39
  @referenced = true
37
40
  end
38
41
 
@@ -46,11 +49,13 @@ module RuboCop
46
49
 
47
50
  def operator_assignment?
48
51
  return false unless meta_assignment_node
52
+
49
53
  OPERATOR_ASSIGNMENT_TYPES.include?(meta_assignment_node.type)
50
54
  end
51
55
 
52
56
  def multiple_assignment?
53
57
  return false unless meta_assignment_node
58
+
54
59
  meta_assignment_node.type == MULTIPLE_ASSIGNMENT_TYPE
55
60
  end
56
61
 
@@ -74,6 +79,7 @@ module RuboCop
74
79
  return nil unless node.parent
75
80
  return nil unless OPERATOR_ASSIGNMENT_TYPES.include?(node.parent.type)
76
81
  return nil unless node.sibling_index.zero?
82
+
77
83
  node.parent
78
84
  end
79
85
 
@@ -82,6 +88,7 @@ module RuboCop
82
88
  return nil unless grandparent_node
83
89
  return nil unless grandparent_node.type == MULTIPLE_ASSIGNMENT_TYPE
84
90
  return nil unless node.parent.type == MULTIPLE_LEFT_HAND_SIDE_TYPE
91
+
85
92
  grandparent_node
86
93
  end
87
94
  end
@@ -9,8 +9,10 @@ module RuboCop
9
9
  ([target_node] + target_node.ancestors).each do |node|
10
10
  return nil unless node.parent
11
11
  return nil unless scope.include?(node)
12
+
12
13
  klass = CLASSES_BY_TYPE[node.parent.type]
13
14
  next unless klass
15
+
14
16
  branch = klass.new(node, scope)
15
17
  return branch if branch.branched?
16
18
  end
@@ -74,13 +76,12 @@ module RuboCop
74
76
 
75
77
  def parent
76
78
  return @parent if instance_variable_defined?(:@parent)
79
+
77
80
  @branch = Branch.of(control_node, scope: scope)
78
81
  end
79
82
 
80
83
  def each_ancestor(include_self: false, &block)
81
- unless block_given?
82
- return to_enum(__method__, include_self: include_self)
83
- end
84
+ return to_enum(__method__, include_self: include_self) unless block_given?
84
85
 
85
86
  yield self if include_self
86
87
  scan_ancestors(&block)
@@ -122,6 +123,7 @@ module RuboCop
122
123
 
123
124
  def ==(other)
124
125
  return false unless other
126
+
125
127
  control_node.equal?(other.control_node) &&
126
128
  child_node.equal?(other.child_node)
127
129
  end
@@ -8,11 +8,13 @@ module RuboCop
8
8
  module Branchable
9
9
  def branch
10
10
  return @branch if instance_variable_defined?(:@branch)
11
+
11
12
  @branch = Branch.of(node, scope: scope)
12
13
  end
13
14
 
14
15
  def run_exclusively_with?(other)
15
16
  return false if !branch || !other.branch
17
+
16
18
  branch.exclusive_with?(other.branch)
17
19
  end
18
20
  end
@@ -16,6 +16,7 @@ module RuboCop
16
16
  }.freeze
17
17
 
18
18
  attr_reader :node, :variables, :naked_top_level
19
+
19
20
  alias naked_top_level? naked_top_level
20
21
 
21
22
  def initialize(node)
@@ -37,11 +38,7 @@ module RuboCop
37
38
  end
38
39
 
39
40
  def name
40
- # TODO: Add an else clause
41
- case @node.type
42
- when :def then @node.children[0]
43
- when :defs then @node.children[1]
44
- end
41
+ @node.method_name
45
42
  end
46
43
 
47
44
  def body_node
@@ -65,6 +62,7 @@ module RuboCop
65
62
 
66
63
  def each_node(&block)
67
64
  return to_enum(__method__) unless block_given?
65
+
68
66
  yield node if naked_top_level?
69
67
  scan_node(node, &block)
70
68
  end
@@ -74,6 +72,7 @@ module RuboCop
74
72
  def scan_node(node, &block)
75
73
  node.each_child_node do |child_node|
76
74
  next unless include?(child_node)
75
+
77
76
  yield child_node
78
77
  scan_node(child_node, &block)
79
78
  end
@@ -83,16 +82,20 @@ module RuboCop
83
82
  return true if !naked_top_level? && target_node.equal?(node)
84
83
  return true if ancestor_node?(target_node)
85
84
  return false unless target_node.parent.equal?(node)
85
+
86
86
  indices = OUTER_SCOPE_CHILD_INDICES[target_node.parent.type]
87
87
  return false unless indices
88
+
88
89
  indices.include?(target_node.sibling_index)
89
90
  end
90
91
 
91
92
  def belong_to_inner_scope?(target_node)
92
93
  return false if !target_node.parent || target_node.parent.equal?(node)
93
94
  return false unless SCOPE_TYPES.include?(target_node.parent.type)
95
+
94
96
  indices = OUTER_SCOPE_CHILD_INDICES[target_node.parent.type]
95
97
  return true unless indices
98
+
96
99
  !indices.include?(target_node.sibling_index)
97
100
  end
98
101