rubocop 0.87.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 (593) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +225 -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 +4203 -0
  9. data/exe/rubocop +17 -0
  10. data/lib/rubocop.rb +598 -0
  11. data/lib/rubocop/ast_aliases.rb +8 -0
  12. data/lib/rubocop/cached_data.rb +58 -0
  13. data/lib/rubocop/cli.rb +131 -0
  14. data/lib/rubocop/cli/command.rb +21 -0
  15. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  16. data/lib/rubocop/cli/command/base.rb +33 -0
  17. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  18. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  19. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  20. data/lib/rubocop/cli/command/version.rb +17 -0
  21. data/lib/rubocop/cli/environment.rb +21 -0
  22. data/lib/rubocop/comment_config.rb +206 -0
  23. data/lib/rubocop/config.rb +281 -0
  24. data/lib/rubocop/config_loader.rb +236 -0
  25. data/lib/rubocop/config_loader_resolver.rb +234 -0
  26. data/lib/rubocop/config_obsoletion.rb +277 -0
  27. data/lib/rubocop/config_store.rb +58 -0
  28. data/lib/rubocop/config_validator.rb +223 -0
  29. data/lib/rubocop/cop/autocorrect_logic.rb +95 -0
  30. data/lib/rubocop/cop/badge.rb +73 -0
  31. data/lib/rubocop/cop/base.rb +399 -0
  32. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  34. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +59 -0
  35. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  36. data/lib/rubocop/cop/commissioner.rb +122 -0
  37. data/lib/rubocop/cop/cop.rb +160 -0
  38. data/lib/rubocop/cop/corrector.rb +119 -0
  39. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  40. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  41. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  42. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  43. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  44. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  45. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  46. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  47. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  48. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  49. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  50. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  51. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  52. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  53. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  54. data/lib/rubocop/cop/force.rb +42 -0
  55. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  56. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
  57. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  58. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  59. data/lib/rubocop/cop/generator.rb +223 -0
  60. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  61. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  62. data/lib/rubocop/cop/ignored_node.rb +36 -0
  63. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  64. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  65. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  66. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +41 -0
  67. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  68. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  69. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  70. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  71. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  72. data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
  73. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  74. data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
  75. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  76. data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
  77. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  78. data/lib/rubocop/cop/layout/class_structure.rb +308 -0
  79. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  80. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  81. data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
  82. data/lib/rubocop/cop/layout/condition_position.rb +66 -0
  83. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  84. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  85. data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
  86. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  87. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  88. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  89. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
  90. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
  92. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  93. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  94. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  95. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  96. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  97. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  98. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  99. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  100. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  101. data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
  102. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  103. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  104. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  105. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  106. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
  107. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  108. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
  109. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  110. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
  111. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  112. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  113. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  114. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  115. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  116. data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
  117. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  118. data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
  119. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  120. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  121. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  122. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  123. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  124. data/lib/rubocop/cop/layout/multiline_block_layout.rb +154 -0
  125. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
  126. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  127. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  128. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  129. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  130. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  131. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
  132. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  133. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
  134. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  135. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  136. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  137. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  138. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  139. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +163 -0
  140. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  141. data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
  142. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  143. data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
  144. data/lib/rubocop/cop/layout/space_before_block_braces.rb +150 -0
  145. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  146. data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
  147. data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
  148. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  149. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
  150. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  151. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  152. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  153. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
  154. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  155. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  156. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  157. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  158. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  159. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
  161. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  162. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  163. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  164. data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
  166. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  167. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  168. data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
  169. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  170. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  171. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  172. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  173. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  174. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  175. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  176. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
  177. data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
  178. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  179. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  180. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  181. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  182. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  183. data/lib/rubocop/cop/lint/empty_when.rb +61 -0
  184. data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
  185. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  186. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  187. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  188. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +195 -0
  189. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  190. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  191. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  192. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  193. data/lib/rubocop/cop/lint/interpolation_check.rb +53 -0
  194. data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
  195. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  196. data/lib/rubocop/cop/lint/loop.rb +65 -0
  197. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  198. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  199. data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
  200. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  201. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  202. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  203. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  204. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  205. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  206. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  207. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +91 -0
  208. data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
  209. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  210. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  211. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  212. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +264 -0
  213. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  214. data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
  215. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
  216. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
  217. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  218. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  219. data/lib/rubocop/cop/lint/regexp_as_condition.rb +35 -0
  220. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  221. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  222. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  223. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  224. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
  225. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  226. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  227. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  228. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  229. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  230. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  231. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  232. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  233. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  234. data/lib/rubocop/cop/lint/syntax.rb +42 -0
  235. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  236. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  237. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  238. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  239. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  240. data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
  241. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  242. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  243. data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
  244. data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
  245. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  246. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
  247. data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
  248. data/lib/rubocop/cop/lint/void.rb +151 -0
  249. data/lib/rubocop/cop/message_annotator.rb +129 -0
  250. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  251. data/lib/rubocop/cop/metrics/block_length.rb +72 -0
  252. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  253. data/lib/rubocop/cop/metrics/class_length.rb +59 -0
  254. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +64 -0
  255. data/lib/rubocop/cop/metrics/method_length.rb +59 -0
  256. data/lib/rubocop/cop/metrics/module_length.rb +59 -0
  257. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  258. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  259. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  260. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  261. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  262. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  263. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  264. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  265. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  266. data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
  267. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  268. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  269. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  270. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  271. data/lib/rubocop/cop/mixin/code_length.rb +42 -0
  272. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
  273. data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
  274. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  275. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  276. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  277. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  278. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  279. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  280. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  281. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  282. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
  283. data/lib/rubocop/cop/mixin/enforce_superclass.rb +32 -0
  284. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  285. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
  286. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
  287. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  288. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  289. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  290. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  291. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  292. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  293. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  294. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  295. data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
  296. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  297. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  298. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  299. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  300. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  301. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  302. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  303. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  304. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  305. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +61 -0
  306. data/lib/rubocop/cop/mixin/parentheses.rb +16 -0
  307. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  308. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  309. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  310. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  311. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  312. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  313. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  314. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  315. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  316. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  317. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  318. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  319. data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
  320. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  321. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  322. data/lib/rubocop/cop/mixin/surrounding_space.rb +151 -0
  323. data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
  324. data/lib/rubocop/cop/mixin/too_many_lines.rb +25 -0
  325. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  326. data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
  327. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  328. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  329. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  330. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  331. data/lib/rubocop/cop/naming/ascii_identifiers.rb +95 -0
  332. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  333. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  334. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
  335. data/lib/rubocop/cop/naming/constant_name.rb +82 -0
  336. data/lib/rubocop/cop/naming/file_name.rb +223 -0
  337. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  338. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  339. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  340. data/lib/rubocop/cop/naming/method_name.rb +79 -0
  341. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  342. data/lib/rubocop/cop/naming/predicate_name.rb +106 -0
  343. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  344. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  345. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  346. data/lib/rubocop/cop/offense.rb +230 -0
  347. data/lib/rubocop/cop/registry.rb +276 -0
  348. data/lib/rubocop/cop/security/eval.rb +31 -0
  349. data/lib/rubocop/cop/security/json_load.rb +46 -0
  350. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  351. data/lib/rubocop/cop/security/open.rb +71 -0
  352. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  353. data/lib/rubocop/cop/severity.rb +75 -0
  354. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  355. data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
  356. data/lib/rubocop/cop/style/alias.rb +147 -0
  357. data/lib/rubocop/cop/style/and_or.rb +145 -0
  358. data/lib/rubocop/cop/style/array_join.rb +39 -0
  359. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  360. data/lib/rubocop/cop/style/attr.rb +68 -0
  361. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  362. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  363. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  364. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
  365. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  366. data/lib/rubocop/cop/style/block_delimiters.rb +382 -0
  367. data/lib/rubocop/cop/style/case_equality.rb +53 -0
  368. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  369. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  370. data/lib/rubocop/cop/style/class_check.rb +59 -0
  371. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  372. data/lib/rubocop/cop/style/class_vars.rb +69 -0
  373. data/lib/rubocop/cop/style/collection_methods.rb +79 -0
  374. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  375. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  376. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  377. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  378. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  379. data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
  380. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  381. data/lib/rubocop/cop/style/copyright.rb +99 -0
  382. data/lib/rubocop/cop/style/date_time.rb +77 -0
  383. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  384. data/lib/rubocop/cop/style/dir.rb +48 -0
  385. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  386. data/lib/rubocop/cop/style/documentation.rb +135 -0
  387. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  388. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  389. data/lib/rubocop/cop/style/double_negation.rb +72 -0
  390. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  391. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  392. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  393. data/lib/rubocop/cop/style/empty_case_condition.rb +109 -0
  394. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  395. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  396. data/lib/rubocop/cop/style/empty_literal.rb +121 -0
  397. data/lib/rubocop/cop/style/empty_method.rb +111 -0
  398. data/lib/rubocop/cop/style/encoding.rb +56 -0
  399. data/lib/rubocop/cop/style/end_block.rb +31 -0
  400. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  401. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  402. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  403. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  404. data/lib/rubocop/cop/style/float_division.rb +94 -0
  405. data/lib/rubocop/cop/style/for.rb +88 -0
  406. data/lib/rubocop/cop/style/format_string.rb +127 -0
  407. data/lib/rubocop/cop/style/format_string_token.rb +120 -0
  408. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
  409. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  410. data/lib/rubocop/cop/style/guard_clause.rb +145 -0
  411. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  412. data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
  413. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  414. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  415. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  416. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  417. data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
  418. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +51 -0
  419. data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
  420. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  421. data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
  422. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  423. data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
  424. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  425. data/lib/rubocop/cop/style/lambda.rb +132 -0
  426. data/lib/rubocop/cop/style/lambda_call.rb +73 -0
  427. data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
  428. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
  429. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  430. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  431. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
  432. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  433. data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
  434. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  435. data/lib/rubocop/cop/style/min_max.rb +68 -0
  436. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  437. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  438. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  439. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  440. data/lib/rubocop/cop/style/module_function.rb +150 -0
  441. data/lib/rubocop/cop/style/multiline_block_chain.rb +49 -0
  442. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  443. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  444. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  445. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  446. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +49 -0
  447. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  448. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  449. data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
  450. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  451. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  452. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  453. data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
  454. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +64 -0
  455. data/lib/rubocop/cop/style/nested_ternary_operator.rb +59 -0
  456. data/lib/rubocop/cop/style/next.rb +244 -0
  457. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  458. data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
  459. data/lib/rubocop/cop/style/not.rb +82 -0
  460. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  461. data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
  462. data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
  463. data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
  464. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  465. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  466. data/lib/rubocop/cop/style/or_assignment.rb +96 -0
  467. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  468. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  469. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  470. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  471. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  472. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  473. data/lib/rubocop/cop/style/proc.rb +34 -0
  474. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  475. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  476. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  477. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  478. data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
  479. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  480. data/lib/rubocop/cop/style/redundant_conditional.rb +98 -0
  481. data/lib/rubocop/cop/style/redundant_exception.rb +64 -0
  482. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  483. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  484. data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
  485. data/lib/rubocop/cop/style/redundant_parentheses.rb +233 -0
  486. data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
  487. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  488. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  489. data/lib/rubocop/cop/style/redundant_return.rb +169 -0
  490. data/lib/rubocop/cop/style/redundant_self.rb +168 -0
  491. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  492. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  493. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
  498. data/lib/rubocop/cop/style/sample.rb +144 -0
  499. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  500. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  501. data/lib/rubocop/cop/style/send.rb +31 -0
  502. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  503. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  504. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  505. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  506. data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
  507. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
  508. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  509. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  510. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  511. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  512. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  513. data/lib/rubocop/cop/style/strip.rb +46 -0
  514. data/lib/rubocop/cop/style/struct_inheritance.rb +60 -0
  515. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  516. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  517. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  518. data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
  519. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  520. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  521. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  522. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
  523. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  524. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  525. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  526. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  527. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
  528. data/lib/rubocop/cop/style/trivial_accessors.rb +192 -0
  529. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  530. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  531. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  532. data/lib/rubocop/cop/style/when_then.rb +37 -0
  533. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  534. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  535. data/lib/rubocop/cop/style/word_array.rb +102 -0
  536. data/lib/rubocop/cop/style/yoda_condition.rb +173 -0
  537. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  538. data/lib/rubocop/cop/team.rb +256 -0
  539. data/lib/rubocop/cop/util.rb +151 -0
  540. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  541. data/lib/rubocop/cop/variable_force.rb +463 -0
  542. data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
  543. data/lib/rubocop/cop/variable_force/branch.rb +320 -0
  544. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  545. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  546. data/lib/rubocop/cop/variable_force/scope.rb +110 -0
  547. data/lib/rubocop/cop/variable_force/variable.rb +114 -0
  548. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  549. data/lib/rubocop/core_ext/string.rb +23 -0
  550. data/lib/rubocop/error.rb +34 -0
  551. data/lib/rubocop/ext/processed_source.rb +18 -0
  552. data/lib/rubocop/file_finder.rb +42 -0
  553. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  554. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  555. data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
  556. data/lib/rubocop/formatter/colorizable.rb +41 -0
  557. data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
  558. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  559. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  560. data/lib/rubocop/formatter/formatter_set.rb +104 -0
  561. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  562. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  563. data/lib/rubocop/formatter/json_formatter.rb +81 -0
  564. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  565. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  566. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  567. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  568. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  569. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  570. data/lib/rubocop/formatter/tap_formatter.rb +82 -0
  571. data/lib/rubocop/formatter/text_util.rb +20 -0
  572. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  573. data/lib/rubocop/magic_comment.rb +214 -0
  574. data/lib/rubocop/name_similarity.rb +28 -0
  575. data/lib/rubocop/options.rb +488 -0
  576. data/lib/rubocop/path_util.rb +85 -0
  577. data/lib/rubocop/platform.rb +11 -0
  578. data/lib/rubocop/rake_task.rb +77 -0
  579. data/lib/rubocop/remote_config.rb +104 -0
  580. data/lib/rubocop/result_cache.rb +205 -0
  581. data/lib/rubocop/rspec/cop_helper.rb +71 -0
  582. data/lib/rubocop/rspec/expect_offense.rb +288 -0
  583. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  584. data/lib/rubocop/rspec/shared_contexts.rb +129 -0
  585. data/lib/rubocop/rspec/support.rb +13 -0
  586. data/lib/rubocop/runner.rb +388 -0
  587. data/lib/rubocop/string_interpreter.rb +57 -0
  588. data/lib/rubocop/target_finder.rb +196 -0
  589. data/lib/rubocop/target_ruby.rb +154 -0
  590. data/lib/rubocop/version.rb +23 -0
  591. data/lib/rubocop/warning.rb +11 -0
  592. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  593. metadata +795 -0
@@ -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| /^\s*#{word}\s/.match?(line) } &&
59
+ ALLOWED_COMMENTS.none? { |c| /#\s*#{c}/.match?(line) }
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,666 @@
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 = []) # rubocop:todo Metrics/CyclomaticComplexity
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 = 'Layout/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
+ assignment, = *assignment if assignment.begin_type? && assignment.children.one?
316
+
317
+ assignment
318
+ end
319
+
320
+ def move_assignment_outside_condition(node)
321
+ if node.case_type?
322
+ CaseCorrector.correct(self, node)
323
+ elsif node.ternary?
324
+ TernaryCorrector.correct(node)
325
+ elsif node.if? || node.unless?
326
+ IfCorrector.correct(self, node)
327
+ end
328
+ end
329
+
330
+ def move_assignment_inside_condition(node)
331
+ *_assignment, condition = *node
332
+
333
+ if ternary_condition?(condition)
334
+ TernaryCorrector.move_assignment_inside_condition(node)
335
+ elsif condition.case_type?
336
+ CaseCorrector.move_assignment_inside_condition(node)
337
+ elsif condition.if_type?
338
+ IfCorrector.move_assignment_inside_condition(node)
339
+ end
340
+ end
341
+
342
+ def ternary_condition?(node)
343
+ [node, node.children.first].any? { |n| n.if_type? && n.ternary? }
344
+ end
345
+
346
+ def lhs_all_match?(branches)
347
+ return true if branches.empty?
348
+
349
+ first_lhs = lhs(branches.first)
350
+ branches.all? { |branch| lhs(branch) == first_lhs }
351
+ end
352
+
353
+ def assignment_types_match?(*nodes)
354
+ return unless assignment_type?(nodes.first)
355
+
356
+ nodes.map(&:type).uniq.one?
357
+ end
358
+
359
+ def check_node(node, branches)
360
+ return if allowed_ternary?(node)
361
+ return unless allowed_statements?(branches)
362
+ return if allowed_single_line?(branches)
363
+ return if correction_exceeds_line_limit?(node, branches)
364
+
365
+ add_offense(node)
366
+ end
367
+
368
+ def allowed_statements?(branches)
369
+ return false unless branches.all?
370
+
371
+ statements = branches.map { |branch| tail(branch) }.compact
372
+
373
+ lhs_all_match?(statements) && statements.none?(&:masgn_type?) &&
374
+ assignment_types_match?(*statements)
375
+ end
376
+
377
+ # If `Layout/LineLength` is enabled, we do not want to introduce an
378
+ # offense by auto-correcting this cop. Find the max configured line
379
+ # length. Find the longest line of condition. Remove the assignment
380
+ # from lines that contain the offending assignment because after
381
+ # correcting, this will not be on the line anymore. Check if the length
382
+ # of the longest line + the length of the corrected assignment is
383
+ # greater than the max configured line length
384
+ def correction_exceeds_line_limit?(node, branches)
385
+ return false unless line_length_cop_enabled?
386
+
387
+ assignment = lhs(tail(branches[0]))
388
+
389
+ longest_line_exceeds_line_limit?(node, assignment)
390
+ end
391
+
392
+ def longest_line_exceeds_line_limit?(node, assignment)
393
+ longest_line(node, assignment).length > max_line_length
394
+ end
395
+
396
+ def longest_line(node, assignment)
397
+ assignment_regex = /\s*#{Regexp.escape(assignment).gsub('\ ', '\s*')}/
398
+ lines = node.source.lines.map do |line|
399
+ line.chomp.sub(assignment_regex, '')
400
+ end
401
+ longest_line = lines.max_by(&:length)
402
+ assignment + longest_line
403
+ end
404
+
405
+ def line_length_cop_enabled?
406
+ config.for_cop(LINE_LENGTH)[ENABLED]
407
+ end
408
+
409
+ def max_line_length
410
+ config.for_cop(LINE_LENGTH)[MAX]
411
+ end
412
+
413
+ def indentation_width
414
+ config.for_cop(INDENTATION_WIDTH)[WIDTH] || 2
415
+ end
416
+
417
+ def single_line_conditions_only?
418
+ cop_config[SINGLE_LINE_CONDITIONS_ONLY]
419
+ end
420
+
421
+ def include_ternary?
422
+ cop_config['IncludeTernaryExpressions']
423
+ end
424
+ end
425
+
426
+ # Helper module to provide common methods to ConditionalAssignment
427
+ # correctors
428
+ module ConditionalCorrectorHelper
429
+ def remove_whitespace_in_branches(corrector, branch, condition, column)
430
+ branch.each_node do |child|
431
+ white_space = white_space_range(child, column)
432
+ corrector.remove(white_space) if white_space.source.strip.empty?
433
+ end
434
+
435
+ [condition.loc.else, condition.loc.end].each do |loc|
436
+ corrector.remove_preceding(loc, loc.column - column)
437
+ end
438
+ end
439
+
440
+ def white_space_range(node, column)
441
+ expression = node.loc.expression
442
+ begin_pos = expression.begin_pos - (expression.column - column - 2)
443
+
444
+ Parser::Source::Range.new(expression.source_buffer,
445
+ begin_pos,
446
+ expression.begin_pos)
447
+ end
448
+
449
+ def assignment(node)
450
+ *_, condition = *node
451
+ Parser::Source::Range.new(node.loc.expression.source_buffer,
452
+ node.loc.expression.begin_pos,
453
+ condition.loc.expression.begin_pos)
454
+ end
455
+
456
+ def correct_if_branches(corrector, cop, node)
457
+ if_branch, elsif_branches, else_branch = extract_tail_branches(node)
458
+
459
+ corrector.insert_before(node, lhs(if_branch))
460
+ replace_branch_assignment(corrector, if_branch)
461
+ correct_branches(corrector, elsif_branches)
462
+ replace_branch_assignment(corrector, else_branch)
463
+ corrector.insert_before(node.loc.end, indent(cop, lhs(if_branch)))
464
+ end
465
+
466
+ def replace_branch_assignment(corrector, branch)
467
+ _variable, *_operator, assignment = *branch
468
+ source = assignment.source
469
+
470
+ replacement = if assignment.array_type? && !assignment.bracketed?
471
+ "[#{source}]"
472
+ else
473
+ source
474
+ end
475
+
476
+ corrector.replace(branch, replacement)
477
+ end
478
+
479
+ def correct_branches(corrector, branches)
480
+ branches.each do |branch|
481
+ *_, assignment = *branch
482
+ corrector.replace(branch, assignment.source)
483
+ end
484
+ end
485
+ end
486
+
487
+ # Corrector to correct conditional assignment in ternary conditions.
488
+ class TernaryCorrector
489
+ class << self
490
+ include ConditionalAssignmentHelper
491
+ include ConditionalCorrectorHelper
492
+
493
+ def correct(node)
494
+ lambda do |corrector|
495
+ corrector.replace(node, correction(node))
496
+ end
497
+ end
498
+
499
+ def move_assignment_inside_condition(node)
500
+ *_var, rhs = *node
501
+ if_branch, else_branch = extract_branches(node)
502
+ assignment = assignment(node)
503
+
504
+ lambda do |corrector|
505
+ remove_parentheses(corrector, rhs) if Util.parentheses?(rhs)
506
+ corrector.remove(assignment)
507
+
508
+ move_branch_inside_condition(corrector, if_branch, assignment)
509
+ move_branch_inside_condition(corrector, else_branch, assignment)
510
+ end
511
+ end
512
+
513
+ private
514
+
515
+ def correction(node)
516
+ "#{lhs(node.if_branch)}#{ternary(node)}"
517
+ end
518
+
519
+ def ternary(node)
520
+ _variable, *_operator, if_rhs = *node.if_branch
521
+ _else_variable, *_operator, else_rhs = *node.else_branch
522
+
523
+ expr = "#{node.condition.source} ? " \
524
+ "#{if_rhs.source} : " \
525
+ "#{else_rhs.source}"
526
+
527
+ element_assignment?(node.if_branch) ? "(#{expr})" : expr
528
+ end
529
+
530
+ def element_assignment?(node)
531
+ node.send_type? && node.method_name != :[]=
532
+ end
533
+
534
+ def extract_branches(node)
535
+ *_var, rhs = *node
536
+ condition, = *rhs if rhs.begin_type? && rhs.children.one?
537
+ _condition, if_branch, else_branch = *(condition || rhs)
538
+
539
+ [if_branch, else_branch]
540
+ end
541
+
542
+ def remove_parentheses(corrector, node)
543
+ corrector.remove(node.loc.begin)
544
+ corrector.remove(node.loc.end)
545
+ end
546
+
547
+ def move_branch_inside_condition(corrector, branch, assignment)
548
+ corrector.insert_before(branch, assignment.source)
549
+ end
550
+ end
551
+ end
552
+
553
+ # Corrector to correct conditional assignment in `if` statements.
554
+ class IfCorrector
555
+ class << self
556
+ include ConditionalAssignmentHelper
557
+ include ConditionalCorrectorHelper
558
+
559
+ def correct(cop, node)
560
+ ->(corrector) { correct_if_branches(corrector, cop, node) }
561
+ end
562
+
563
+ def move_assignment_inside_condition(node)
564
+ column = node.loc.expression.column
565
+ *_var, condition = *node
566
+ assignment = assignment(node)
567
+
568
+ lambda do |corrector|
569
+ corrector.remove(assignment)
570
+
571
+ condition.branches.flatten.each do |branch|
572
+ move_branch_inside_condition(corrector, branch, condition,
573
+ assignment, column)
574
+ end
575
+ end
576
+ end
577
+
578
+ private
579
+
580
+ def extract_tail_branches(node)
581
+ if_branch, *elsif_branches, else_branch = *node.branches
582
+ elsif_branches.map! { |branch| tail(branch) }
583
+
584
+ [tail(if_branch), elsif_branches, tail(else_branch)]
585
+ end
586
+
587
+ def move_branch_inside_condition(corrector, branch, condition,
588
+ assignment, column)
589
+ branch_assignment = tail(branch)
590
+ corrector.insert_before(branch_assignment,
591
+ assignment.source)
592
+
593
+ remove_whitespace_in_branches(corrector, branch, condition, column)
594
+
595
+ return unless (branch_else = branch.parent.loc.else)
596
+
597
+ corrector.remove_preceding(branch_else, branch_else.column - column)
598
+ end
599
+ end
600
+ end
601
+
602
+ # Corrector to correct conditional assignment in `case` statements.
603
+ class CaseCorrector
604
+ class << self
605
+ include ConditionalAssignmentHelper
606
+ include ConditionalCorrectorHelper
607
+
608
+ def correct(cop, node)
609
+ when_branches, else_branch = extract_tail_branches(node)
610
+
611
+ lambda do |corrector|
612
+ corrector.insert_before(node, lhs(else_branch))
613
+ correct_branches(corrector, when_branches)
614
+ replace_branch_assignment(corrector, else_branch)
615
+
616
+ corrector.insert_before(node.loc.end,
617
+ indent(cop, lhs(else_branch)))
618
+ end
619
+ end
620
+
621
+ def move_assignment_inside_condition(node)
622
+ column = node.loc.expression.column
623
+ *_var, condition = *node
624
+ assignment = assignment(node)
625
+
626
+ lambda do |corrector|
627
+ corrector.remove(assignment)
628
+
629
+ extract_branches(condition).flatten.each do |branch|
630
+ move_branch_inside_condition(corrector, branch, condition,
631
+ assignment, column)
632
+ end
633
+ end
634
+ end
635
+
636
+ private
637
+
638
+ def extract_tail_branches(node)
639
+ when_branches, else_branch = extract_branches(node)
640
+ when_branches.map! { |branch| tail(branch) }
641
+ [when_branches, tail(else_branch)]
642
+ end
643
+
644
+ def extract_branches(case_node)
645
+ when_branches = expand_when_branches(case_node.when_branches)
646
+
647
+ [when_branches, case_node.else_branch]
648
+ end
649
+
650
+ def move_branch_inside_condition(corrector, branch, condition,
651
+ assignment, column)
652
+ branch_assignment = tail(branch)
653
+ corrector.insert_before(branch_assignment,
654
+ assignment.source)
655
+
656
+ remove_whitespace_in_branches(corrector, branch, condition, column)
657
+
658
+ parent_keyword = branch.parent.loc.keyword
659
+ corrector.remove_preceding(parent_keyword,
660
+ parent_keyword.column - column)
661
+ end
662
+ end
663
+ end
664
+ end
665
+ end
666
+ end