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,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop check to make sure that if safe navigation is used for a method
7
+ # call in an `&&` or `||` condition that safe navigation is used for all
8
+ # method calls on that same object.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # foo&.bar && foo.baz
13
+ #
14
+ # # bad
15
+ # foo.bar || foo&.baz
16
+ #
17
+ # # bad
18
+ # foo&.bar && (foobar.baz || foo.baz)
19
+ #
20
+ # # good
21
+ # foo.bar && foo.baz
22
+ #
23
+ # # good
24
+ # foo&.bar || foo&.baz
25
+ #
26
+ # # good
27
+ # foo&.bar && (foobar.baz || foo&.baz)
28
+ #
29
+ class SafeNavigationConsistency < Cop
30
+ include IgnoredNode
31
+ include NilMethods
32
+
33
+ MSG = 'Ensure that safe navigation is used consistently ' \
34
+ 'inside of `&&` and `||`.'
35
+
36
+ def on_csend(node)
37
+ return unless node.parent&.operator_keyword?
38
+
39
+ check(node)
40
+ end
41
+
42
+ def check(node)
43
+ ancestor = top_conditional_ancestor(node)
44
+ conditions = ancestor.conditions
45
+ safe_nav_receiver = node.receiver
46
+
47
+ method_calls = conditions.select(&:send_type?)
48
+ unsafe_method_calls =
49
+ unsafe_method_calls(method_calls, safe_nav_receiver)
50
+
51
+ unsafe_method_calls.each do |unsafe_method_call|
52
+ location =
53
+ node.loc.expression.join(unsafe_method_call.loc.expression)
54
+ add_offense(unsafe_method_call,
55
+ location: location)
56
+
57
+ ignore_node(unsafe_method_call)
58
+ end
59
+ end
60
+
61
+ def autocorrect(node)
62
+ return unless node.dot?
63
+
64
+ lambda do |corrector|
65
+ corrector.insert_before(node.loc.dot, '&')
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def top_conditional_ancestor(node)
72
+ parent = node.parent
73
+ unless parent &&
74
+ (parent.operator_keyword? ||
75
+ (parent.begin_type? &&
76
+ parent.parent &&
77
+ parent.parent.operator_keyword?))
78
+ return node
79
+ end
80
+
81
+ top_conditional_ancestor(parent)
82
+ end
83
+
84
+ def unsafe_method_calls(method_calls, safe_nav_receiver)
85
+ method_calls.select do |method_call|
86
+ safe_nav_receiver == method_call.receiver &&
87
+ !nil_methods.include?(method_call.method_name) &&
88
+ !ignored_node?(method_call)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks to make sure safe navigation isn't used with `empty?` in
7
+ # a conditional.
8
+ #
9
+ # While the safe navigation operator is generally a good idea, when
10
+ # checking `foo&.empty?` in a conditional, `foo` being `nil` will actually
11
+ # do the opposite of what the author intends.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # return if foo&.empty?
16
+ # return unless foo&.empty?
17
+ #
18
+ # # good
19
+ # return if foo && foo.empty?
20
+ # return unless foo && foo.empty?
21
+ #
22
+ class SafeNavigationWithEmpty < Cop
23
+ MSG = 'Avoid calling `empty?` with the safe navigation operator ' \
24
+ 'in conditionals.'
25
+
26
+ def_node_matcher :safe_navigation_empty_in_conditional?, <<~PATTERN
27
+ (if (csend (send ...) :empty?) ...)
28
+ PATTERN
29
+
30
+ def on_if(node)
31
+ return unless safe_navigation_empty_in_conditional?(node)
32
+
33
+ add_offense(node.condition)
34
+ end
35
+
36
+ def autocorrect(node)
37
+ lambda do |corrector|
38
+ receiver = node.receiver.source
39
+
40
+ corrector.replace(node, "#{receiver} && #{receiver}.#{node.method_name}")
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks if a file which has a shebang line as
7
+ # its first line is granted execute permission.
8
+ #
9
+ # @example
10
+ # # bad
11
+ #
12
+ # # A file which has a shebang line as its first line is not
13
+ # # granted execute permission.
14
+ #
15
+ # #!/usr/bin/env ruby
16
+ # puts 'hello, world'
17
+ #
18
+ # # good
19
+ #
20
+ # # A file which has a shebang line as its first line is
21
+ # # granted execute permission.
22
+ #
23
+ # #!/usr/bin/env ruby
24
+ # puts 'hello, world'
25
+ #
26
+ # # good
27
+ #
28
+ # # A file which has not a shebang line as its first line is not
29
+ # # granted execute permission.
30
+ #
31
+ # puts 'hello, world'
32
+ #
33
+ class ScriptPermission < Cop
34
+ MSG = "Script file %<file>s doesn't have execute permission."
35
+ SHEBANG = '#!'
36
+
37
+ def investigate(processed_source)
38
+ return if @options.key?(:stdin)
39
+ return if Platform.windows?
40
+ return unless processed_source.start_with?(SHEBANG)
41
+ return if executable?(processed_source)
42
+
43
+ comment = processed_source.comments[0]
44
+ message = format_message_from(processed_source)
45
+ add_offense(comment, message: message)
46
+ end
47
+
48
+ def autocorrect(node)
49
+ lambda do |_corrector|
50
+ FileUtils.chmod('+x', node.loc.expression.source_buffer.name)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def executable?(processed_source)
57
+ # Returns true if stat is executable or if the operating system
58
+ # doesn't distinguish executable files from nonexecutable files.
59
+ # See at: https://github.com/ruby/ruby/blob/ruby_2_4/file.c#L5362
60
+ File.stat(processed_source.file_path).executable?
61
+ end
62
+
63
+ def format_message_from(processed_source)
64
+ basename = File.basename(processed_source.file_path)
65
+ format(MSG, file: basename)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ #
7
+ # This cop checks for `send`, `public_send`, and `__send__` methods
8
+ # when using mix-in.
9
+ #
10
+ # `include` and `prepend` methods were private methods until Ruby 2.0,
11
+ # they were mixed-in via `send` method. This cop uses Ruby 2.1 or
12
+ # higher style that can be called by public methods.
13
+ # And `extend` method that was originally a public method is also targeted
14
+ # for style unification.
15
+ #
16
+ # @example
17
+ # # bad
18
+ # Foo.send(:include, Bar)
19
+ # Foo.send(:prepend, Bar)
20
+ # Foo.send(:extend, Bar)
21
+ #
22
+ # # bad
23
+ # Foo.public_send(:include, Bar)
24
+ # Foo.public_send(:prepend, Bar)
25
+ # Foo.public_send(:extend, Bar)
26
+ #
27
+ # # bad
28
+ # Foo.__send__(:include, Bar)
29
+ # Foo.__send__(:prepend, Bar)
30
+ # Foo.__send__(:extend, Bar)
31
+ #
32
+ # # good
33
+ # Foo.include Bar
34
+ # Foo.prepend Bar
35
+ # Foo.extend Bar
36
+ #
37
+ class SendWithMixinArgument < Cop
38
+ include RangeHelp
39
+
40
+ MSG = 'Use `%<method>s %<module_name>s` instead of `%<bad_method>s`.'
41
+ MIXIN_METHODS = %i[include prepend extend].freeze
42
+
43
+ def_node_matcher :send_with_mixin_argument?, <<~PATTERN
44
+ (send
45
+ (const _ _) {:send :public_send :__send__}
46
+ ({sym str} $#mixin_method?)
47
+ $(const _ _))
48
+ PATTERN
49
+
50
+ def on_send(node)
51
+ send_with_mixin_argument?(node) do |method, module_name|
52
+ message = message(
53
+ method, module_name.source, bad_location(node).source
54
+ )
55
+
56
+ add_offense(node, location: bad_location(node), message: message)
57
+ end
58
+ end
59
+
60
+ def autocorrect(node)
61
+ send_with_mixin_argument?(node) do |method, module_name|
62
+ lambda do |corrector|
63
+ corrector.replace(
64
+ bad_location(node), "#{method} #{module_name.source}"
65
+ )
66
+ end
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def bad_location(node)
73
+ loc = node.loc
74
+
75
+ range_between(loc.selector.begin_pos, loc.expression.end_pos)
76
+ end
77
+
78
+ def message(method, module_name, bad_method)
79
+ format(
80
+ MSG,
81
+ method: method, module_name: module_name, bad_method: bad_method
82
+ )
83
+ end
84
+
85
+ def mixin_method?(node)
86
+ MIXIN_METHODS.include?(node.to_sym)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for shadowed arguments.
7
+ #
8
+ # This cop has `IgnoreImplicitReferences` configuration option.
9
+ # It means argument shadowing is used in order to pass parameters
10
+ # to zero arity `super` when `IgnoreImplicitReferences` is `true`.
11
+ #
12
+ # @example
13
+ #
14
+ # # bad
15
+ # do_something do |foo|
16
+ # foo = 42
17
+ # puts foo
18
+ # end
19
+ #
20
+ # def do_something(foo)
21
+ # foo = 42
22
+ # puts foo
23
+ # end
24
+ #
25
+ # # good
26
+ # do_something do |foo|
27
+ # foo = foo + 42
28
+ # puts foo
29
+ # end
30
+ #
31
+ # def do_something(foo)
32
+ # foo = foo + 42
33
+ # puts foo
34
+ # end
35
+ #
36
+ # def do_something(foo)
37
+ # puts foo
38
+ # end
39
+ #
40
+ # @example IgnoreImplicitReferences: false (default)
41
+ #
42
+ # # bad
43
+ # def do_something(foo)
44
+ # foo = 42
45
+ # super
46
+ # end
47
+ #
48
+ # def do_something(foo)
49
+ # foo = super
50
+ # bar
51
+ # end
52
+ #
53
+ # @example IgnoreImplicitReferences: true
54
+ #
55
+ # # good
56
+ # def do_something(foo)
57
+ # foo = 42
58
+ # super
59
+ # end
60
+ #
61
+ # def do_something(foo)
62
+ # foo = super
63
+ # bar
64
+ # end
65
+ #
66
+ class ShadowedArgument < Cop
67
+ MSG = 'Argument `%<argument>s` was shadowed by a local variable ' \
68
+ 'before it was used.'
69
+
70
+ def_node_search :uses_var?, '(lvar %)'
71
+
72
+ def join_force?(force_class)
73
+ force_class == VariableForce
74
+ end
75
+
76
+ def after_leaving_scope(scope, _variable_table)
77
+ scope.variables.each_value do |variable|
78
+ check_argument(variable)
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def check_argument(argument)
85
+ return unless argument.method_argument? || argument.block_argument?
86
+ # Block local variables, i.e., variables declared after ; inside
87
+ # |...| aren't really arguments.
88
+ return if argument.explicit_block_local_variable?
89
+
90
+ shadowing_assignment(argument) do |node|
91
+ message = format(MSG, argument: argument.name)
92
+
93
+ add_offense(node, message: message)
94
+ end
95
+ end
96
+
97
+ def shadowing_assignment(argument)
98
+ return unless argument.referenced?
99
+
100
+ assignment_without_argument_usage(argument) do |node, location_known|
101
+ assignment_without_usage_pos = node.source_range.begin_pos
102
+
103
+ references = argument_references(argument)
104
+
105
+ # If argument was referenced before it was reassigned
106
+ # then it's not shadowed
107
+ next if references.any? do |reference|
108
+ next true if !reference.explicit? && ignore_implicit_references?
109
+
110
+ reference_pos(reference.node) <= assignment_without_usage_pos
111
+ end
112
+
113
+ yield location_known ? node : argument.declaration_node
114
+ end
115
+ end
116
+
117
+ # Find the first argument assignment, which doesn't reference the
118
+ # argument at the rhs. If the assignment occurs inside a branch or
119
+ # block, it is impossible to tell whether it's executed, so precise
120
+ # shadowing location is not known.
121
+ #
122
+ def assignment_without_argument_usage(argument)
123
+ argument.assignments.reduce(true) do |location_known, assignment|
124
+ assignment_node = assignment.meta_assignment_node || assignment.node
125
+
126
+ # Shorthand assignments always use their arguments
127
+ next false if assignment_node.shorthand_asgn?
128
+
129
+ node_within_block_or_conditional =
130
+ node_within_block_or_conditional?(assignment_node.parent,
131
+ argument.scope.node)
132
+
133
+ unless uses_var?(assignment_node, argument.name)
134
+ # It's impossible to decide whether a branch or block is executed,
135
+ # so the precise reassignment location is undecidable.
136
+ next false if node_within_block_or_conditional
137
+
138
+ yield(assignment.node, location_known)
139
+ break
140
+ end
141
+
142
+ location_known
143
+ end
144
+ end
145
+
146
+ def reference_pos(node)
147
+ node = node.parent.masgn_type? ? node.parent : node
148
+
149
+ node.source_range.begin_pos
150
+ end
151
+
152
+ # Check whether the given node is nested into block or conditional.
153
+ #
154
+ def node_within_block_or_conditional?(node, stop_search_node)
155
+ return false if node == stop_search_node
156
+
157
+ node.conditional? || node.block_type? ||
158
+ node_within_block_or_conditional?(node.parent, stop_search_node)
159
+ end
160
+
161
+ # Get argument references without assignments' references
162
+ #
163
+ def argument_references(argument)
164
+ assignment_references = argument
165
+ .assignments
166
+ .flat_map(&:references)
167
+ .map(&:source_range)
168
+
169
+ argument.references.reject do |ref|
170
+ next false unless ref.explicit?
171
+
172
+ assignment_references.include?(ref.node.source_range)
173
+ end
174
+ end
175
+
176
+ def ignore_implicit_references?
177
+ cop_config['IgnoreImplicitReferences']
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end