rubocop 0.75.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 (602) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +217 -0
  4. data/assets/logo.png +0 -0
  5. data/assets/output.html.erb +261 -0
  6. data/bin/console +10 -0
  7. data/bin/setup +7 -0
  8. data/config/default.yml +3939 -0
  9. data/exe/rubocop +17 -0
  10. data/lib/rubocop.rb +608 -0
  11. data/lib/rubocop/ast/builder.rb +81 -0
  12. data/lib/rubocop/ast/node.rb +640 -0
  13. data/lib/rubocop/ast/node/alias_node.rb +24 -0
  14. data/lib/rubocop/ast/node/and_node.rb +29 -0
  15. data/lib/rubocop/ast/node/args_node.rb +29 -0
  16. data/lib/rubocop/ast/node/array_node.rb +57 -0
  17. data/lib/rubocop/ast/node/block_node.rb +115 -0
  18. data/lib/rubocop/ast/node/break_node.rb +17 -0
  19. data/lib/rubocop/ast/node/case_node.rb +56 -0
  20. data/lib/rubocop/ast/node/class_node.rb +31 -0
  21. data/lib/rubocop/ast/node/def_node.rb +71 -0
  22. data/lib/rubocop/ast/node/defined_node.rb +17 -0
  23. data/lib/rubocop/ast/node/ensure_node.rb +17 -0
  24. data/lib/rubocop/ast/node/float_node.rb +12 -0
  25. data/lib/rubocop/ast/node/for_node.rb +53 -0
  26. data/lib/rubocop/ast/node/hash_node.rb +109 -0
  27. data/lib/rubocop/ast/node/if_node.rb +175 -0
  28. data/lib/rubocop/ast/node/int_node.rb +12 -0
  29. data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
  30. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  31. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +43 -0
  32. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  33. data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
  34. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
  35. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +261 -0
  36. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +114 -0
  37. data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
  38. data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -0
  39. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
  40. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  41. data/lib/rubocop/ast/node/module_node.rb +24 -0
  42. data/lib/rubocop/ast/node/or_node.rb +29 -0
  43. data/lib/rubocop/ast/node/pair_node.rb +63 -0
  44. data/lib/rubocop/ast/node/range_node.rb +18 -0
  45. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  46. data/lib/rubocop/ast/node/resbody_node.rb +24 -0
  47. data/lib/rubocop/ast/node/retry_node.rb +17 -0
  48. data/lib/rubocop/ast/node/self_class_node.rb +24 -0
  49. data/lib/rubocop/ast/node/send_node.rb +13 -0
  50. data/lib/rubocop/ast/node/str_node.rb +16 -0
  51. data/lib/rubocop/ast/node/super_node.rb +21 -0
  52. data/lib/rubocop/ast/node/symbol_node.rb +12 -0
  53. data/lib/rubocop/ast/node/until_node.rb +35 -0
  54. data/lib/rubocop/ast/node/when_node.rb +53 -0
  55. data/lib/rubocop/ast/node/while_node.rb +35 -0
  56. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  57. data/lib/rubocop/ast/sexp.rb +16 -0
  58. data/lib/rubocop/ast/traversal.rb +183 -0
  59. data/lib/rubocop/cached_data.rb +58 -0
  60. data/lib/rubocop/cli.rb +343 -0
  61. data/lib/rubocop/comment_config.rb +201 -0
  62. data/lib/rubocop/config.rb +244 -0
  63. data/lib/rubocop/config_loader.rb +273 -0
  64. data/lib/rubocop/config_loader_resolver.rb +194 -0
  65. data/lib/rubocop/config_obsoletion.rb +213 -0
  66. data/lib/rubocop/config_store.rb +48 -0
  67. data/lib/rubocop/config_validator.rb +239 -0
  68. data/lib/rubocop/cop/autocorrect_logic.rb +103 -0
  69. data/lib/rubocop/cop/badge.rb +73 -0
  70. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  71. data/lib/rubocop/cop/bundler/gem_comment.rb +64 -0
  72. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +69 -0
  73. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  74. data/lib/rubocop/cop/commissioner.rb +137 -0
  75. data/lib/rubocop/cop/cop.rb +271 -0
  76. data/lib/rubocop/cop/corrector.rb +171 -0
  77. data/lib/rubocop/cop/correctors/alignment_corrector.rb +146 -0
  78. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  79. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  80. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  81. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  82. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  83. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  84. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  85. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  86. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  87. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  88. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  89. data/lib/rubocop/cop/correctors/space_corrector.rb +49 -0
  90. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  91. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  92. data/lib/rubocop/cop/force.rb +42 -0
  93. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  94. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
  95. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  96. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  97. data/lib/rubocop/cop/generator.rb +223 -0
  98. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  99. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  100. data/lib/rubocop/cop/ignored_node.rb +38 -0
  101. data/lib/rubocop/cop/internal_affairs.rb +8 -0
  102. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  103. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  104. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  105. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  106. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  107. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  108. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  109. data/lib/rubocop/cop/layout/align_arguments.rb +93 -0
  110. data/lib/rubocop/cop/layout/align_array.rb +39 -0
  111. data/lib/rubocop/cop/layout/align_hash.rb +358 -0
  112. data/lib/rubocop/cop/layout/align_parameters.rb +118 -0
  113. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  114. data/lib/rubocop/cop/layout/block_end_newline.rb +62 -0
  115. data/lib/rubocop/cop/layout/case_indentation.rb +161 -0
  116. data/lib/rubocop/cop/layout/class_structure.rb +340 -0
  117. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  118. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  119. data/lib/rubocop/cop/layout/comment_indentation.rb +144 -0
  120. data/lib/rubocop/cop/layout/condition_position.rb +56 -0
  121. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  122. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  123. data/lib/rubocop/cop/layout/else_alignment.rb +134 -0
  124. data/lib/rubocop/cop/layout/empty_comment.rb +160 -0
  125. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  126. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  127. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +151 -0
  128. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  129. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +215 -0
  130. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  131. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  132. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  133. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  134. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  135. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  136. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  137. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  138. data/lib/rubocop/cop/layout/end_of_line.rb +87 -0
  139. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  140. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  141. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  142. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +55 -0
  143. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  144. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +289 -0
  145. data/lib/rubocop/cop/layout/indent_assignment.rb +55 -0
  146. data/lib/rubocop/cop/layout/indent_first_argument.rb +247 -0
  147. data/lib/rubocop/cop/layout/indent_first_array_element.rb +167 -0
  148. data/lib/rubocop/cop/layout/indent_first_hash_element.rb +184 -0
  149. data/lib/rubocop/cop/layout/indent_first_parameter.rb +100 -0
  150. data/lib/rubocop/cop/layout/indent_heredoc.rb +256 -0
  151. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  152. data/lib/rubocop/cop/layout/indentation_width.rb +364 -0
  153. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  154. data/lib/rubocop/cop/layout/leading_blank_lines.rb +53 -0
  155. data/lib/rubocop/cop/layout/leading_comment_space.rb +88 -0
  156. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  157. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  158. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  159. data/lib/rubocop/cop/layout/multiline_block_layout.rb +146 -0
  160. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +122 -0
  161. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  162. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +54 -0
  163. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  164. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  165. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  166. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +114 -0
  167. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +189 -0
  168. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  169. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  170. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  171. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  172. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  173. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +169 -0
  174. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  175. data/lib/rubocop/cop/layout/space_around_keyword.rb +232 -0
  176. data/lib/rubocop/cop/layout/space_around_operators.rb +182 -0
  177. data/lib/rubocop/cop/layout/space_before_block_braces.rb +119 -0
  178. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  179. data/lib/rubocop/cop/layout/space_before_comment.rb +35 -0
  180. data/lib/rubocop/cop/layout/space_before_first_arg.rb +67 -0
  181. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  182. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +80 -0
  183. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +228 -0
  184. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  185. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  186. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +207 -0
  187. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  188. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  189. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  190. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +150 -0
  191. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  192. data/lib/rubocop/cop/layout/tab.rb +75 -0
  193. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +113 -0
  194. data/lib/rubocop/cop/layout/trailing_whitespace.rb +61 -0
  195. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  196. data/lib/rubocop/cop/lint/ambiguous_operator.rb +55 -0
  197. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +43 -0
  198. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  199. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  200. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  201. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  202. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  203. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  204. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  205. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  206. data/lib/rubocop/cop/lint/duplicate_methods.rb +239 -0
  207. data/lib/rubocop/cop/lint/duplicated_key.rb +38 -0
  208. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  209. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  210. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  211. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  212. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  213. data/lib/rubocop/cop/lint/empty_when.rb +38 -0
  214. data/lib/rubocop/cop/lint/end_in_method.rb +40 -0
  215. data/lib/rubocop/cop/lint/ensure_return.rb +46 -0
  216. data/lib/rubocop/cop/lint/erb_new_arguments.rb +163 -0
  217. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  218. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  219. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +159 -0
  220. data/lib/rubocop/cop/lint/handle_exceptions.rb +95 -0
  221. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  222. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  223. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  224. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  225. data/lib/rubocop/cop/lint/interpolation_check.rb +40 -0
  226. data/lib/rubocop/cop/lint/literal_as_condition.rb +138 -0
  227. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  228. data/lib/rubocop/cop/lint/loop.rb +63 -0
  229. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  230. data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
  231. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  232. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  233. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  234. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  235. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  236. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  237. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +64 -0
  238. data/lib/rubocop/cop/lint/percent_string_array.rb +73 -0
  239. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  240. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  241. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  242. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  243. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  244. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  245. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  246. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  247. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  248. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +66 -0
  249. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  250. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +38 -0
  251. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  252. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  253. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  254. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  255. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  256. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +59 -0
  257. data/lib/rubocop/cop/lint/syntax.rb +59 -0
  258. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  259. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  260. data/lib/rubocop/cop/lint/unified_integer.rb +45 -0
  261. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +263 -0
  262. data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +116 -0
  263. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +50 -0
  264. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +172 -0
  265. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  266. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  267. data/lib/rubocop/cop/lint/unused_method_argument.rb +86 -0
  268. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  269. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  270. data/lib/rubocop/cop/lint/useless_access_modifier.rb +240 -0
  271. data/lib/rubocop/cop/lint/useless_assignment.rb +129 -0
  272. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  273. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +49 -0
  274. data/lib/rubocop/cop/lint/useless_setter_call.rb +164 -0
  275. data/lib/rubocop/cop/lint/void.rb +151 -0
  276. data/lib/rubocop/cop/message_annotator.rb +129 -0
  277. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  278. data/lib/rubocop/cop/metrics/block_length.rb +50 -0
  279. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  280. data/lib/rubocop/cop/metrics/class_length.rb +36 -0
  281. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +32 -0
  282. data/lib/rubocop/cop/metrics/line_length.rb +321 -0
  283. data/lib/rubocop/cop/metrics/method_length.rb +36 -0
  284. data/lib/rubocop/cop/metrics/module_length.rb +36 -0
  285. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  286. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  287. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +67 -0
  288. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  289. data/lib/rubocop/cop/mixin/alignment.rb +74 -0
  290. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  291. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  292. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  293. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  294. data/lib/rubocop/cop/mixin/check_line_breakable.rb +190 -0
  295. data/lib/rubocop/cop/mixin/classish_length.rb +37 -0
  296. data/lib/rubocop/cop/mixin/code_length.rb +38 -0
  297. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +98 -0
  298. data/lib/rubocop/cop/mixin/configurable_formatting.rb +47 -0
  299. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  300. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  301. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  302. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  303. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  304. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  305. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  306. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  307. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +67 -0
  308. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  309. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  310. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +53 -0
  311. data/lib/rubocop/cop/mixin/hash_alignment.rb +147 -0
  312. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  313. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  314. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  315. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  316. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  317. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  318. data/lib/rubocop/cop/mixin/method_complexity.rb +56 -0
  319. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  320. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  321. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  322. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  323. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  324. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  325. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  326. data/lib/rubocop/cop/mixin/nil_methods.rb +25 -0
  327. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  328. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +56 -0
  329. data/lib/rubocop/cop/mixin/parentheses.rb +17 -0
  330. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  331. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  332. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  333. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  334. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  335. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  336. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  337. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  338. data/lib/rubocop/cop/mixin/safe_mode.rb +24 -0
  339. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  340. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  341. data/lib/rubocop/cop/mixin/statement_modifier.rb +68 -0
  342. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  343. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  344. data/lib/rubocop/cop/mixin/surrounding_space.rb +146 -0
  345. data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
  346. data/lib/rubocop/cop/mixin/too_many_lines.rb +35 -0
  347. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  348. data/lib/rubocop/cop/mixin/trailing_comma.rb +216 -0
  349. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +111 -0
  350. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  351. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  352. data/lib/rubocop/cop/naming/ascii_identifiers.rb +72 -0
  353. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  354. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  355. data/lib/rubocop/cop/naming/constant_name.rb +81 -0
  356. data/lib/rubocop/cop/naming/file_name.rb +205 -0
  357. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  358. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  359. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  360. data/lib/rubocop/cop/naming/method_name.rb +53 -0
  361. data/lib/rubocop/cop/naming/predicate_name.rb +108 -0
  362. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  363. data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +49 -0
  364. data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +58 -0
  365. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  366. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  367. data/lib/rubocop/cop/offense.rb +205 -0
  368. data/lib/rubocop/cop/registry.rb +211 -0
  369. data/lib/rubocop/cop/security/eval.rb +31 -0
  370. data/lib/rubocop/cop/security/json_load.rb +46 -0
  371. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  372. data/lib/rubocop/cop/security/open.rb +71 -0
  373. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  374. data/lib/rubocop/cop/severity.rb +77 -0
  375. data/lib/rubocop/cop/style/access_modifier_declarations.rb +112 -0
  376. data/lib/rubocop/cop/style/alias.rb +147 -0
  377. data/lib/rubocop/cop/style/and_or.rb +146 -0
  378. data/lib/rubocop/cop/style/array_join.rb +39 -0
  379. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  380. data/lib/rubocop/cop/style/attr.rb +62 -0
  381. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  382. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  383. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  384. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  385. data/lib/rubocop/cop/style/block_delimiters.rb +331 -0
  386. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +209 -0
  387. data/lib/rubocop/cop/style/case_equality.rb +30 -0
  388. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  389. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  390. data/lib/rubocop/cop/style/class_check.rb +59 -0
  391. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  392. data/lib/rubocop/cop/style/class_vars.rb +48 -0
  393. data/lib/rubocop/cop/style/collection_methods.rb +77 -0
  394. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  395. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  396. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  397. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  398. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  399. data/lib/rubocop/cop/style/conditional_assignment.rb +668 -0
  400. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  401. data/lib/rubocop/cop/style/copyright.rb +95 -0
  402. data/lib/rubocop/cop/style/date_time.rb +77 -0
  403. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  404. data/lib/rubocop/cop/style/dir.rb +48 -0
  405. data/lib/rubocop/cop/style/documentation.rb +97 -0
  406. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  407. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  408. data/lib/rubocop/cop/style/double_negation.rb +35 -0
  409. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  410. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  411. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  412. data/lib/rubocop/cop/style/empty_case_condition.rb +107 -0
  413. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  414. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  415. data/lib/rubocop/cop/style/empty_literal.rb +123 -0
  416. data/lib/rubocop/cop/style/empty_method.rb +115 -0
  417. data/lib/rubocop/cop/style/encoding.rb +56 -0
  418. data/lib/rubocop/cop/style/end_block.rb +25 -0
  419. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  420. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  421. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  422. data/lib/rubocop/cop/style/float_division.rb +94 -0
  423. data/lib/rubocop/cop/style/for.rb +88 -0
  424. data/lib/rubocop/cop/style/format_string.rb +124 -0
  425. data/lib/rubocop/cop/style/format_string_token.rb +119 -0
  426. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +149 -0
  427. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  428. data/lib/rubocop/cop/style/guard_clause.rb +121 -0
  429. data/lib/rubocop/cop/style/hash_syntax.rb +214 -0
  430. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  431. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  432. data/lib/rubocop/cop/style/if_unless_modifier.rb +127 -0
  433. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +39 -0
  434. data/lib/rubocop/cop/style/if_with_semicolon.rb +30 -0
  435. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  436. data/lib/rubocop/cop/style/infinite_loop.rb +127 -0
  437. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  438. data/lib/rubocop/cop/style/inverse_methods.rb +187 -0
  439. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  440. data/lib/rubocop/cop/style/lambda.rb +131 -0
  441. data/lib/rubocop/cop/style/lambda_call.rb +93 -0
  442. data/lib/rubocop/cop/style/line_end_concatenation.rb +121 -0
  443. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +388 -0
  444. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +77 -0
  445. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  446. data/lib/rubocop/cop/style/method_def_parentheses.rb +158 -0
  447. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  448. data/lib/rubocop/cop/style/min_max.rb +68 -0
  449. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  450. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  451. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  452. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  453. data/lib/rubocop/cop/style/module_function.rb +104 -0
  454. data/lib/rubocop/cop/style/multiline_block_chain.rb +40 -0
  455. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  456. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  457. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  458. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  459. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +38 -0
  460. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  461. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  462. data/lib/rubocop/cop/style/mutable_constant.rb +174 -0
  463. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  464. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  465. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  466. data/lib/rubocop/cop/style/nested_modifier.rb +105 -0
  467. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +67 -0
  468. data/lib/rubocop/cop/style/nested_ternary_operator.rb +32 -0
  469. data/lib/rubocop/cop/style/next.rb +244 -0
  470. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  471. data/lib/rubocop/cop/style/non_nil_check.rb +124 -0
  472. data/lib/rubocop/cop/style/not.rb +82 -0
  473. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  474. data/lib/rubocop/cop/style/numeric_literals.rb +110 -0
  475. data/lib/rubocop/cop/style/numeric_predicate.rb +137 -0
  476. data/lib/rubocop/cop/style/one_line_conditional.rb +101 -0
  477. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  478. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  479. data/lib/rubocop/cop/style/or_assignment.rb +95 -0
  480. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  481. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  482. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  483. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  484. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  485. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  486. data/lib/rubocop/cop/style/proc.rb +34 -0
  487. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  488. data/lib/rubocop/cop/style/random_with_offset.rb +158 -0
  489. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  490. data/lib/rubocop/cop/style/redundant_conditional.rb +97 -0
  491. data/lib/rubocop/cop/style/redundant_exception.rb +60 -0
  492. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  493. data/lib/rubocop/cop/style/redundant_parentheses.rb +231 -0
  494. data/lib/rubocop/cop/style/redundant_return.rb +173 -0
  495. data/lib/rubocop/cop/style/redundant_self.rb +171 -0
  496. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  497. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  498. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  499. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  500. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  501. data/lib/rubocop/cop/style/safe_navigation.rb +272 -0
  502. data/lib/rubocop/cop/style/sample.rb +144 -0
  503. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  504. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  505. data/lib/rubocop/cop/style/send.rb +31 -0
  506. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  507. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  508. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  509. data/lib/rubocop/cop/style/special_global_vars.rb +213 -0
  510. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +86 -0
  511. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  512. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  513. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  514. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  515. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  516. data/lib/rubocop/cop/style/strip.rb +46 -0
  517. data/lib/rubocop/cop/style/struct_inheritance.rb +39 -0
  518. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  519. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  520. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  521. data/lib/rubocop/cop/style/ternary_parentheses.rb +223 -0
  522. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  523. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  524. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  525. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +96 -0
  526. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +58 -0
  527. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
  528. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  529. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +161 -0
  530. data/lib/rubocop/cop/style/trivial_accessors.rb +191 -0
  531. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  532. data/lib/rubocop/cop/style/unneeded_capital_w.rb +51 -0
  533. data/lib/rubocop/cop/style/unneeded_condition.rb +112 -0
  534. data/lib/rubocop/cop/style/unneeded_interpolation.rb +98 -0
  535. data/lib/rubocop/cop/style/unneeded_percent_q.rb +112 -0
  536. data/lib/rubocop/cop/style/unneeded_sort.rb +165 -0
  537. data/lib/rubocop/cop/style/unpack_first.rb +65 -0
  538. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  539. data/lib/rubocop/cop/style/when_then.rb +37 -0
  540. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  541. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  542. data/lib/rubocop/cop/style/word_array.rb +102 -0
  543. data/lib/rubocop/cop/style/yoda_condition.rb +141 -0
  544. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  545. data/lib/rubocop/cop/team.rb +191 -0
  546. data/lib/rubocop/cop/util.rb +127 -0
  547. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  548. data/lib/rubocop/cop/variable_force.rb +464 -0
  549. data/lib/rubocop/cop/variable_force/assignment.rb +96 -0
  550. data/lib/rubocop/cop/variable_force/branch.rb +322 -0
  551. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  552. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  553. data/lib/rubocop/cop/variable_force/scope.rb +109 -0
  554. data/lib/rubocop/cop/variable_force/variable.rb +117 -0
  555. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  556. data/lib/rubocop/core_ext/string.rb +23 -0
  557. data/lib/rubocop/error.rb +34 -0
  558. data/lib/rubocop/file_finder.rb +42 -0
  559. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  560. data/lib/rubocop/formatter/base_formatter.rb +123 -0
  561. data/lib/rubocop/formatter/clang_style_formatter.rb +59 -0
  562. data/lib/rubocop/formatter/colorizable.rb +41 -0
  563. data/lib/rubocop/formatter/disabled_config_formatter.rb +224 -0
  564. data/lib/rubocop/formatter/disabled_lines_formatter.rb +57 -0
  565. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  566. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  567. data/lib/rubocop/formatter/formatter_set.rb +106 -0
  568. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  569. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  570. data/lib/rubocop/formatter/json_formatter.rb +80 -0
  571. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  572. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  573. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  574. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  575. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  576. data/lib/rubocop/formatter/tap_formatter.rb +84 -0
  577. data/lib/rubocop/formatter/text_util.rb +20 -0
  578. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  579. data/lib/rubocop/magic_comment.rb +214 -0
  580. data/lib/rubocop/name_similarity.rb +21 -0
  581. data/lib/rubocop/node_pattern.rb +799 -0
  582. data/lib/rubocop/options.rb +454 -0
  583. data/lib/rubocop/path_util.rb +85 -0
  584. data/lib/rubocop/platform.rb +11 -0
  585. data/lib/rubocop/processed_source.rb +216 -0
  586. data/lib/rubocop/rake_task.rb +79 -0
  587. data/lib/rubocop/remote_config.rb +106 -0
  588. data/lib/rubocop/result_cache.rb +191 -0
  589. data/lib/rubocop/rspec/cop_helper.rb +94 -0
  590. data/lib/rubocop/rspec/expect_offense.rb +240 -0
  591. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  592. data/lib/rubocop/rspec/shared_contexts.rb +90 -0
  593. data/lib/rubocop/rspec/support.rb +13 -0
  594. data/lib/rubocop/runner.rb +358 -0
  595. data/lib/rubocop/string_interpreter.rb +57 -0
  596. data/lib/rubocop/string_util.rb +14 -0
  597. data/lib/rubocop/target_finder.rb +190 -0
  598. data/lib/rubocop/token.rb +114 -0
  599. data/lib/rubocop/version.rb +21 -0
  600. data/lib/rubocop/warning.rb +11 -0
  601. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  602. metadata +770 -0
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks that comment annotation keywords are written according
7
+ # to guidelines.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # # TODO make better
12
+ #
13
+ # # good
14
+ # # TODO: make better
15
+ #
16
+ # # bad
17
+ # # TODO:make better
18
+ #
19
+ # # good
20
+ # # TODO: make better
21
+ #
22
+ # # bad
23
+ # # fixme: does not work
24
+ #
25
+ # # good
26
+ # # FIXME: does not work
27
+ #
28
+ # # bad
29
+ # # Optimize does not work
30
+ #
31
+ # # good
32
+ # # OPTIMIZE: does not work
33
+ class CommentAnnotation < Cop
34
+ include AnnotationComment
35
+ include RangeHelp
36
+
37
+ MSG = 'Annotation keywords like `%<keyword>s` should be all ' \
38
+ 'upper case, followed by a colon, and a space, ' \
39
+ 'then a note describing the problem.'
40
+ MISSING_NOTE = 'Annotation comment, with keyword `%<keyword>s`, ' \
41
+ 'is missing a note.'
42
+
43
+ def investigate(processed_source)
44
+ processed_source.comments.each_with_index do |comment, index|
45
+ next unless first_comment_line?(processed_source.comments, index) ||
46
+ inline_comment?(comment)
47
+
48
+ margin, first_word, colon, space, note = split_comment(comment)
49
+ next unless annotation?(comment) &&
50
+ !correct_annotation?(first_word, colon, space, note)
51
+
52
+ length = concat_length(first_word, colon, space)
53
+ add_offense(
54
+ comment,
55
+ location: annotation_range(comment, margin, length),
56
+ message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
57
+ )
58
+ end
59
+ end
60
+
61
+ def autocorrect(comment)
62
+ margin, first_word, colon, space, note = split_comment(comment)
63
+ return if note.nil?
64
+
65
+ length = concat_length(first_word, colon, space)
66
+ range = annotation_range(comment, margin, length)
67
+
68
+ ->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
69
+ end
70
+
71
+ private
72
+
73
+ def first_comment_line?(comments, index)
74
+ index.zero? ||
75
+ comments[index - 1].loc.line < comments[index].loc.line - 1
76
+ end
77
+
78
+ def inline_comment?(comment)
79
+ !comment_line?(comment.loc.expression.source_line)
80
+ end
81
+
82
+ def annotation_range(comment, margin, length)
83
+ start = comment.loc.expression.begin_pos + margin.length
84
+ range_between(start, start + length)
85
+ end
86
+
87
+ def concat_length(*args)
88
+ args.reduce(0) { |acc, elem| acc + elem.to_s.length }
89
+ end
90
+
91
+ def correct_annotation?(first_word, colon, space, note)
92
+ keyword?(first_word) && (colon && space && note || !colon && !note)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for comments put on the same line as some keywords.
7
+ # These keywords are: `begin`, `class`, `def`, `end`, `module`.
8
+ #
9
+ # Note that some comments
10
+ # (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
11
+ # are allowed.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # if condition
16
+ # statement
17
+ # end # end if
18
+ #
19
+ # # bad
20
+ # class X # comment
21
+ # statement
22
+ # end
23
+ #
24
+ # # bad
25
+ # def x; end # comment
26
+ #
27
+ # # good
28
+ # if condition
29
+ # statement
30
+ # end
31
+ #
32
+ # # good
33
+ # class X # :nodoc:
34
+ # y
35
+ # end
36
+ class CommentedKeyword < Cop
37
+ MSG = 'Do not place comments on the same line as the ' \
38
+ '`%<keyword>s` keyword.'
39
+
40
+ def investigate(processed_source)
41
+ processed_source.each_comment do |comment|
42
+ add_offense(comment) if offensive?(comment)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ KEYWORDS = %w[begin class def end module].freeze
49
+ ALLOWED_COMMENTS = %w[
50
+ :nodoc:
51
+ :yields:
52
+ rubocop:disable
53
+ rubocop:todo
54
+ ].freeze
55
+
56
+ def offensive?(comment)
57
+ line = line(comment)
58
+ KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
59
+ ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
60
+ end
61
+
62
+ def message(comment)
63
+ keyword = line(comment).match(/(\S+).*#/)[1]
64
+ format(MSG, keyword: keyword)
65
+ end
66
+
67
+ def line(comment)
68
+ comment.location.expression.source_line
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,668 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Helper module to provide common methods to classes needed for the
7
+ # ConditionalAssignment Cop.
8
+ module ConditionalAssignmentHelper
9
+ extend NodePattern::Macros
10
+
11
+ EQUAL = '='
12
+ END_ALIGNMENT = 'Layout/EndAlignment'
13
+ ALIGN_WITH = 'EnforcedStyleAlignWith'
14
+ KEYWORD = 'keyword'
15
+
16
+ # `elsif` branches show up in the `node` as an `else`. We need
17
+ # to recursively iterate over all `else` branches and consider all
18
+ # but the last `node` an `elsif` branch and consider the last `node`
19
+ # the actual `else` branch.
20
+ def expand_elses(branch)
21
+ elsif_branches = expand_elsif(branch)
22
+ else_branch = elsif_branches.any? ? elsif_branches.pop : branch
23
+ [elsif_branches, else_branch]
24
+ end
25
+
26
+ # `when` nodes contain the entire branch including the condition.
27
+ # We only need the contents of the branch, not the condition.
28
+ def expand_when_branches(when_branches)
29
+ when_branches.map { |branch| branch.children[1] }
30
+ end
31
+
32
+ def tail(branch)
33
+ branch.begin_type? ? [*branch].last : branch
34
+ end
35
+
36
+ # rubocop:disable Metrics/AbcSize
37
+ def lhs(node)
38
+ case node.type
39
+ when :send
40
+ lhs_for_send(node)
41
+ when :op_asgn
42
+ "#{node.children[0].source} #{node.children[1]}= "
43
+ when :and_asgn, :or_asgn
44
+ "#{node.children[0].source} #{node.loc.operator.source} "
45
+ when :casgn
46
+ "#{node.children[1]} = "
47
+ when *ConditionalAssignment::VARIABLE_ASSIGNMENT_TYPES
48
+ "#{node.children[0]} = "
49
+ else
50
+ node.source
51
+ end
52
+ end
53
+ # rubocop:enable Metrics/AbcSize
54
+
55
+ def indent(cop, source)
56
+ conf = cop.config.for_cop(END_ALIGNMENT)
57
+ if conf[ALIGN_WITH] == KEYWORD
58
+ ' ' * source.length
59
+ else
60
+ ''
61
+ end
62
+ end
63
+
64
+ def end_with_eq?(sym)
65
+ sym.to_s.end_with?(EQUAL)
66
+ end
67
+
68
+ private
69
+
70
+ def expand_elsif(node, elsif_branches = [])
71
+ return [] if node.nil? || !node.if_type? || !node.elsif?
72
+
73
+ elsif_branches << node.if_branch
74
+
75
+ else_branch = node.else_branch
76
+ if else_branch&.if_type? && else_branch&.elsif?
77
+ expand_elsif(else_branch, elsif_branches)
78
+ else
79
+ elsif_branches << else_branch
80
+ end
81
+ end
82
+
83
+ def lhs_for_send(node)
84
+ receiver = node.receiver ? node.receiver.source : ''
85
+
86
+ if node.method?(:[]=)
87
+ indices = node.arguments[0...-1].map(&:source).join(', ')
88
+ "#{receiver}[#{indices}] = "
89
+ elsif node.setter_method?
90
+ "#{receiver}.#{node.method_name[0...-1]} = "
91
+ else
92
+ "#{receiver} #{node.method_name} "
93
+ end
94
+ end
95
+
96
+ def setter_method?(method_name)
97
+ method_name.to_s.end_with?(EQUAL) &&
98
+ !%i[!= == === >= <=].include?(method_name)
99
+ end
100
+
101
+ def assignment_rhs_exist?(node)
102
+ parent = node.parent
103
+ return true unless parent
104
+
105
+ !(parent.mlhs_type? || parent.resbody_type?)
106
+ end
107
+ end
108
+
109
+ # Check for `if` and `case` statements where each branch is used for
110
+ # assignment to the same variable when using the return of the
111
+ # condition can be used instead.
112
+ #
113
+ # @example EnforcedStyle: assign_to_condition (default)
114
+ # # bad
115
+ # if foo
116
+ # bar = 1
117
+ # else
118
+ # bar = 2
119
+ # end
120
+ #
121
+ # case foo
122
+ # when 'a'
123
+ # bar += 1
124
+ # else
125
+ # bar += 2
126
+ # end
127
+ #
128
+ # if foo
129
+ # some_method
130
+ # bar = 1
131
+ # else
132
+ # some_other_method
133
+ # bar = 2
134
+ # end
135
+ #
136
+ # # good
137
+ # bar = if foo
138
+ # 1
139
+ # else
140
+ # 2
141
+ # end
142
+ #
143
+ # bar += case foo
144
+ # when 'a'
145
+ # 1
146
+ # else
147
+ # 2
148
+ # end
149
+ #
150
+ # bar << if foo
151
+ # some_method
152
+ # 1
153
+ # else
154
+ # some_other_method
155
+ # 2
156
+ # end
157
+ #
158
+ # @example EnforcedStyle: assign_inside_condition
159
+ # # bad
160
+ # bar = if foo
161
+ # 1
162
+ # else
163
+ # 2
164
+ # end
165
+ #
166
+ # bar += case foo
167
+ # when 'a'
168
+ # 1
169
+ # else
170
+ # 2
171
+ # end
172
+ #
173
+ # bar << if foo
174
+ # some_method
175
+ # 1
176
+ # else
177
+ # some_other_method
178
+ # 2
179
+ # end
180
+ #
181
+ # # good
182
+ # if foo
183
+ # bar = 1
184
+ # else
185
+ # bar = 2
186
+ # end
187
+ #
188
+ # case foo
189
+ # when 'a'
190
+ # bar += 1
191
+ # else
192
+ # bar += 2
193
+ # end
194
+ #
195
+ # if foo
196
+ # some_method
197
+ # bar = 1
198
+ # else
199
+ # some_other_method
200
+ # bar = 2
201
+ # end
202
+ class ConditionalAssignment < Cop
203
+ include ConditionalAssignmentHelper
204
+ include ConfigurableEnforcedStyle
205
+ include IgnoredNode
206
+
207
+ MSG = 'Use the return of the conditional for variable assignment ' \
208
+ 'and comparison.'
209
+ ASSIGN_TO_CONDITION_MSG =
210
+ 'Assign variables inside of conditionals'
211
+ VARIABLE_ASSIGNMENT_TYPES =
212
+ %i[casgn cvasgn gvasgn ivasgn lvasgn].freeze
213
+ ASSIGNMENT_TYPES = VARIABLE_ASSIGNMENT_TYPES +
214
+ %i[and_asgn or_asgn op_asgn masgn].freeze
215
+ LINE_LENGTH = 'Metrics/LineLength'
216
+ INDENTATION_WIDTH = 'Layout/IndentationWidth'
217
+ ENABLED = 'Enabled'
218
+ MAX = 'Max'
219
+ SINGLE_LINE_CONDITIONS_ONLY = 'SingleLineConditionsOnly'
220
+ WIDTH = 'Width'
221
+
222
+ # The shovel operator `<<` does not have its own type. It is a `send`
223
+ # type.
224
+ def_node_matcher :assignment_type?, <<~PATTERN
225
+ {
226
+ #{ASSIGNMENT_TYPES.join(' ')}
227
+ (send _recv {:[]= :<< :=~ :!~ :<=> #end_with_eq?} ...)
228
+ }
229
+ PATTERN
230
+
231
+ ASSIGNMENT_TYPES.each do |type|
232
+ define_method "on_#{type}" do |node|
233
+ return if part_of_ignored_node?(node)
234
+
235
+ check_assignment_to_condition(node)
236
+ end
237
+ end
238
+
239
+ def on_send(node)
240
+ return unless assignment_type?(node)
241
+
242
+ check_assignment_to_condition(node)
243
+ end
244
+
245
+ def on_if(node)
246
+ return unless style == :assign_to_condition
247
+ return if node.elsif?
248
+
249
+ else_branch = node.else_branch
250
+ elsif_branches, else_branch = expand_elses(else_branch)
251
+
252
+ return unless else_branch
253
+
254
+ branches = [node.if_branch, *elsif_branches, else_branch]
255
+
256
+ check_node(node, branches)
257
+ end
258
+
259
+ def on_case(node)
260
+ return unless style == :assign_to_condition
261
+ return unless node.else_branch
262
+
263
+ when_branches = expand_when_branches(node.when_branches)
264
+ branches = [*when_branches, node.else_branch]
265
+
266
+ check_node(node, branches)
267
+ end
268
+
269
+ def autocorrect(node)
270
+ if assignment_type?(node)
271
+ move_assignment_inside_condition(node)
272
+ else
273
+ move_assignment_outside_condition(node)
274
+ end
275
+ end
276
+
277
+ private
278
+
279
+ def check_assignment_to_condition(node)
280
+ return unless candidate_node?(node)
281
+
282
+ ignore_node(node)
283
+
284
+ assignment = assignment_node(node)
285
+ return unless candidate_condition?(assignment)
286
+
287
+ _condition, *branches, else_branch = *assignment
288
+
289
+ return unless else_branch
290
+ return if allowed_single_line?([*branches, else_branch])
291
+
292
+ add_offense(node, message: ASSIGN_TO_CONDITION_MSG)
293
+ end
294
+
295
+ def candidate_node?(node)
296
+ style == :assign_inside_condition && assignment_rhs_exist?(node)
297
+ end
298
+
299
+ def_node_matcher :candidate_condition?, '[{if case} !#allowed_ternary?]'
300
+
301
+ def allowed_ternary?(assignment)
302
+ assignment.if_type? && assignment.ternary? && !include_ternary?
303
+ end
304
+
305
+ def allowed_single_line?(branches)
306
+ single_line_conditions_only? && branches.any?(&:begin_type?)
307
+ end
308
+
309
+ def assignment_node(node)
310
+ *_variable, assignment = *node
311
+
312
+ # ignore pseudo-assignments without rhs in for nodes
313
+ return if node.parent&.for_type?
314
+
315
+ if assignment.begin_type? && assignment.children.one?
316
+ assignment, = *assignment
317
+ end
318
+
319
+ assignment
320
+ end
321
+
322
+ def move_assignment_outside_condition(node)
323
+ if node.case_type?
324
+ CaseCorrector.correct(self, node)
325
+ elsif node.ternary?
326
+ TernaryCorrector.correct(node)
327
+ elsif node.if? || node.unless?
328
+ IfCorrector.correct(self, node)
329
+ end
330
+ end
331
+
332
+ def move_assignment_inside_condition(node)
333
+ *_assignment, condition = *node
334
+
335
+ if ternary_condition?(condition)
336
+ TernaryCorrector.move_assignment_inside_condition(node)
337
+ elsif condition.case_type?
338
+ CaseCorrector.move_assignment_inside_condition(node)
339
+ elsif condition.if_type?
340
+ IfCorrector.move_assignment_inside_condition(node)
341
+ end
342
+ end
343
+
344
+ def ternary_condition?(node)
345
+ [node, node.children.first].any? { |n| n.if_type? && n.ternary? }
346
+ end
347
+
348
+ def lhs_all_match?(branches)
349
+ return true if branches.empty?
350
+
351
+ first_lhs = lhs(branches.first)
352
+ branches.all? { |branch| lhs(branch) == first_lhs }
353
+ end
354
+
355
+ def assignment_types_match?(*nodes)
356
+ return unless assignment_type?(nodes.first)
357
+
358
+ nodes.map(&:type).uniq.one?
359
+ end
360
+
361
+ def check_node(node, branches)
362
+ return if allowed_ternary?(node)
363
+ return unless allowed_statements?(branches)
364
+ return if allowed_single_line?(branches)
365
+ return if correction_exceeds_line_limit?(node, branches)
366
+
367
+ add_offense(node)
368
+ end
369
+
370
+ def allowed_statements?(branches)
371
+ return false unless branches.all?
372
+
373
+ statements = branches.map { |branch| tail(branch) }.compact
374
+
375
+ lhs_all_match?(statements) && statements.none?(&:masgn_type?) &&
376
+ assignment_types_match?(*statements)
377
+ end
378
+
379
+ # If `Metrics/LineLength` is enabled, we do not want to introduce an
380
+ # offense by auto-correcting this cop. Find the max configured line
381
+ # length. Find the longest line of condition. Remove the assignment
382
+ # from lines that contain the offending assignment because after
383
+ # correcting, this will not be on the line anymore. Check if the length
384
+ # of the longest line + the length of the corrected assignment is
385
+ # greater than the max configured line length
386
+ def correction_exceeds_line_limit?(node, branches)
387
+ return false unless line_length_cop_enabled?
388
+
389
+ assignment = lhs(tail(branches[0]))
390
+
391
+ longest_line_exceeds_line_limit?(node, assignment)
392
+ end
393
+
394
+ def longest_line_exceeds_line_limit?(node, assignment)
395
+ longest_line(node, assignment).length > max_line_length
396
+ end
397
+
398
+ def longest_line(node, assignment)
399
+ assignment_regex = /\s*#{Regexp.escape(assignment).gsub('\ ', '\s*')}/
400
+ lines = node.source.lines.map do |line|
401
+ line.chomp.sub(assignment_regex, '')
402
+ end
403
+ longest_line = lines.max_by(&:length)
404
+ assignment + longest_line
405
+ end
406
+
407
+ def line_length_cop_enabled?
408
+ config.for_cop(LINE_LENGTH)[ENABLED]
409
+ end
410
+
411
+ def max_line_length
412
+ config.for_cop(LINE_LENGTH)[MAX]
413
+ end
414
+
415
+ def indentation_width
416
+ config.for_cop(INDENTATION_WIDTH)[WIDTH] || 2
417
+ end
418
+
419
+ def single_line_conditions_only?
420
+ cop_config[SINGLE_LINE_CONDITIONS_ONLY]
421
+ end
422
+
423
+ def include_ternary?
424
+ cop_config['IncludeTernaryExpressions']
425
+ end
426
+ end
427
+
428
+ # Helper module to provide common methods to ConditionalAssignment
429
+ # correctors
430
+ module ConditionalCorrectorHelper
431
+ def remove_whitespace_in_branches(corrector, branch, condition, column)
432
+ branch.each_node do |child|
433
+ white_space = white_space_range(child, column)
434
+ corrector.remove(white_space) if white_space.source.strip.empty?
435
+ end
436
+
437
+ [condition.loc.else, condition.loc.end].each do |loc|
438
+ corrector.remove_preceding(loc, loc.column - column)
439
+ end
440
+ end
441
+
442
+ def white_space_range(node, column)
443
+ expression = node.loc.expression
444
+ begin_pos = expression.begin_pos - (expression.column - column - 2)
445
+
446
+ Parser::Source::Range.new(expression.source_buffer,
447
+ begin_pos,
448
+ expression.begin_pos)
449
+ end
450
+
451
+ def assignment(node)
452
+ *_, condition = *node
453
+ Parser::Source::Range.new(node.loc.expression.source_buffer,
454
+ node.loc.expression.begin_pos,
455
+ condition.loc.expression.begin_pos)
456
+ end
457
+
458
+ def correct_if_branches(corrector, cop, node)
459
+ if_branch, elsif_branches, else_branch = extract_tail_branches(node)
460
+
461
+ corrector.insert_before(node.source_range, lhs(if_branch))
462
+ replace_branch_assignment(corrector, if_branch)
463
+ correct_branches(corrector, elsif_branches)
464
+ replace_branch_assignment(corrector, else_branch)
465
+ corrector.insert_before(node.loc.end, indent(cop, lhs(if_branch)))
466
+ end
467
+
468
+ def replace_branch_assignment(corrector, branch)
469
+ _variable, *_operator, assignment = *branch
470
+ source = assignment.source
471
+
472
+ replacement = if assignment.array_type? && !assignment.bracketed?
473
+ "[#{source}]"
474
+ else
475
+ source
476
+ end
477
+
478
+ corrector.replace(branch.source_range, replacement)
479
+ end
480
+
481
+ def correct_branches(corrector, branches)
482
+ branches.each do |branch|
483
+ *_, assignment = *branch
484
+ corrector.replace(branch.source_range, assignment.source)
485
+ end
486
+ end
487
+ end
488
+
489
+ # Corrector to correct conditional assignment in ternary conditions.
490
+ class TernaryCorrector
491
+ class << self
492
+ include ConditionalAssignmentHelper
493
+ include ConditionalCorrectorHelper
494
+
495
+ def correct(node)
496
+ lambda do |corrector|
497
+ corrector.replace(node.source_range, correction(node))
498
+ end
499
+ end
500
+
501
+ def move_assignment_inside_condition(node)
502
+ *_var, rhs = *node
503
+ if_branch, else_branch = extract_branches(node)
504
+ assignment = assignment(node)
505
+
506
+ lambda do |corrector|
507
+ remove_parentheses(corrector, rhs) if Util.parentheses?(rhs)
508
+ corrector.remove(assignment)
509
+
510
+ move_branch_inside_condition(corrector, if_branch, assignment)
511
+ move_branch_inside_condition(corrector, else_branch, assignment)
512
+ end
513
+ end
514
+
515
+ private
516
+
517
+ def correction(node)
518
+ "#{lhs(node.if_branch)}#{ternary(node)}"
519
+ end
520
+
521
+ def ternary(node)
522
+ _variable, *_operator, if_rhs = *node.if_branch
523
+ _else_variable, *_operator, else_rhs = *node.else_branch
524
+
525
+ expr = "#{node.condition.source} ? " \
526
+ "#{if_rhs.source} : " \
527
+ "#{else_rhs.source}"
528
+
529
+ element_assignment?(node.if_branch) ? "(#{expr})" : expr
530
+ end
531
+
532
+ def element_assignment?(node)
533
+ node.send_type? && node.method_name != :[]=
534
+ end
535
+
536
+ def extract_branches(node)
537
+ *_var, rhs = *node
538
+ condition, = *rhs if rhs.begin_type? && rhs.children.one?
539
+ _condition, if_branch, else_branch = *(condition || rhs)
540
+
541
+ [if_branch, else_branch]
542
+ end
543
+
544
+ def remove_parentheses(corrector, node)
545
+ corrector.remove(node.loc.begin)
546
+ corrector.remove(node.loc.end)
547
+ end
548
+
549
+ def move_branch_inside_condition(corrector, branch, assignment)
550
+ corrector.insert_before(branch.loc.expression, assignment.source)
551
+ end
552
+ end
553
+ end
554
+
555
+ # Corrector to correct conditional assignment in `if` statements.
556
+ class IfCorrector
557
+ class << self
558
+ include ConditionalAssignmentHelper
559
+ include ConditionalCorrectorHelper
560
+
561
+ def correct(cop, node)
562
+ ->(corrector) { correct_if_branches(corrector, cop, node) }
563
+ end
564
+
565
+ def move_assignment_inside_condition(node)
566
+ column = node.loc.expression.column
567
+ *_var, condition = *node
568
+ assignment = assignment(node)
569
+
570
+ lambda do |corrector|
571
+ corrector.remove(assignment)
572
+
573
+ condition.branches.flatten.each do |branch|
574
+ move_branch_inside_condition(corrector, branch, condition,
575
+ assignment, column)
576
+ end
577
+ end
578
+ end
579
+
580
+ private
581
+
582
+ def extract_tail_branches(node)
583
+ if_branch, *elsif_branches, else_branch = *node.branches
584
+ elsif_branches.map! { |branch| tail(branch) }
585
+
586
+ [tail(if_branch), elsif_branches, tail(else_branch)]
587
+ end
588
+
589
+ def move_branch_inside_condition(corrector, branch, condition,
590
+ assignment, column)
591
+ branch_assignment = tail(branch)
592
+ corrector.insert_before(branch_assignment.loc.expression,
593
+ assignment.source)
594
+
595
+ remove_whitespace_in_branches(corrector, branch, condition, column)
596
+
597
+ return unless (branch_else = branch.parent.loc.else)
598
+
599
+ corrector.remove_preceding(branch_else, branch_else.column - column)
600
+ end
601
+ end
602
+ end
603
+
604
+ # Corrector to correct conditional assignment in `case` statements.
605
+ class CaseCorrector
606
+ class << self
607
+ include ConditionalAssignmentHelper
608
+ include ConditionalCorrectorHelper
609
+
610
+ def correct(cop, node)
611
+ when_branches, else_branch = extract_tail_branches(node)
612
+
613
+ lambda do |corrector|
614
+ corrector.insert_before(node.source_range, lhs(else_branch))
615
+ correct_branches(corrector, when_branches)
616
+ replace_branch_assignment(corrector, else_branch)
617
+
618
+ corrector.insert_before(node.loc.end,
619
+ indent(cop, lhs(else_branch)))
620
+ end
621
+ end
622
+
623
+ def move_assignment_inside_condition(node)
624
+ column = node.loc.expression.column
625
+ *_var, condition = *node
626
+ assignment = assignment(node)
627
+
628
+ lambda do |corrector|
629
+ corrector.remove(assignment)
630
+
631
+ extract_branches(condition).flatten.each do |branch|
632
+ move_branch_inside_condition(corrector, branch, condition,
633
+ assignment, column)
634
+ end
635
+ end
636
+ end
637
+
638
+ private
639
+
640
+ def extract_tail_branches(node)
641
+ when_branches, else_branch = extract_branches(node)
642
+ when_branches.map! { |branch| tail(branch) }
643
+ [when_branches, tail(else_branch)]
644
+ end
645
+
646
+ def extract_branches(case_node)
647
+ when_branches = expand_when_branches(case_node.when_branches)
648
+
649
+ [when_branches, case_node.else_branch]
650
+ end
651
+
652
+ def move_branch_inside_condition(corrector, branch, condition,
653
+ assignment, column)
654
+ branch_assignment = tail(branch)
655
+ corrector.insert_before(branch_assignment.loc.expression,
656
+ assignment.source)
657
+
658
+ remove_whitespace_in_branches(corrector, branch, condition, column)
659
+
660
+ parent_keyword = branch.parent.loc.keyword
661
+ corrector.remove_preceding(parent_keyword,
662
+ parent_keyword.column - column)
663
+ end
664
+ end
665
+ end
666
+ end
667
+ end
668
+ end