rbhint 0.8.5.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (583) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +107 -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 +4133 -0
  9. data/exe/rbhint +17 -0
  10. data/lib/rbhint.rb +6 -0
  11. data/lib/rbhint/version.rb +7 -0
  12. data/lib/rubocop.rb +588 -0
  13. data/lib/rubocop/ast_aliases.rb +8 -0
  14. data/lib/rubocop/cached_data.rb +58 -0
  15. data/lib/rubocop/cli.rb +133 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  18. data/lib/rubocop/cli/command/base.rb +33 -0
  19. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  20. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  21. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  22. data/lib/rubocop/cli/command/version.rb +17 -0
  23. data/lib/rubocop/cli/environment.rb +21 -0
  24. data/lib/rubocop/comment_config.rb +206 -0
  25. data/lib/rubocop/config.rb +281 -0
  26. data/lib/rubocop/config_loader.rb +277 -0
  27. data/lib/rubocop/config_loader_resolver.rb +234 -0
  28. data/lib/rubocop/config_obsoletion.rb +278 -0
  29. data/lib/rubocop/config_store.rb +58 -0
  30. data/lib/rubocop/config_validator.rb +223 -0
  31. data/lib/rubocop/cop/autocorrect_logic.rb +105 -0
  32. data/lib/rubocop/cop/badge.rb +73 -0
  33. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  34. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  35. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +69 -0
  36. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  37. data/lib/rubocop/cop/commissioner.rb +124 -0
  38. data/lib/rubocop/cop/cop.rb +311 -0
  39. data/lib/rubocop/cop/corrector.rb +196 -0
  40. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  41. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  42. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  43. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  44. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  45. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  46. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  47. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  48. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  49. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  50. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  51. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  52. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  53. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  54. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  55. data/lib/rubocop/cop/force.rb +42 -0
  56. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  57. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
  58. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  59. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  60. data/lib/rubocop/cop/generator.rb +223 -0
  61. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  62. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  63. data/lib/rubocop/cop/ignored_node.rb +36 -0
  64. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  65. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  66. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  67. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  68. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  69. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  70. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  71. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  72. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  73. data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
  74. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  75. data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
  76. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  77. data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
  78. data/lib/rubocop/cop/layout/case_indentation.rb +161 -0
  79. data/lib/rubocop/cop/layout/class_structure.rb +343 -0
  80. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  81. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  82. data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
  83. data/lib/rubocop/cop/layout/condition_position.rb +66 -0
  84. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  85. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  86. data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
  87. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  88. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  89. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  90. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
  91. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  92. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
  93. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  94. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  95. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  96. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  97. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  98. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  99. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  100. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  101. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  102. data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
  103. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  104. data/lib/rubocop/cop/layout/first_argument_indentation.rb +247 -0
  105. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  106. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  107. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
  108. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  109. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
  110. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  111. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
  112. data/lib/rubocop/cop/layout/hash_alignment.rb +366 -0
  113. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  114. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  115. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  116. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  117. data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
  118. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  119. data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
  120. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  121. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  122. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  123. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  124. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  125. data/lib/rubocop/cop/layout/multiline_block_layout.rb +155 -0
  126. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
  127. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  128. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  129. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  130. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  131. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  132. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
  133. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  134. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
  135. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  136. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  137. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  138. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  139. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  140. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +169 -0
  141. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  142. data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
  143. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  144. data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
  145. data/lib/rubocop/cop/layout/space_before_block_braces.rb +136 -0
  146. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  147. data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
  148. data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
  149. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  150. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
  151. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  152. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  153. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  154. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
  155. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  156. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  157. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  158. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  159. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  160. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
  161. data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
  162. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  163. data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
  164. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
  165. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  166. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  167. data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
  168. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  169. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  170. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  171. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  172. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  173. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  174. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
  175. data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
  176. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  177. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  178. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  179. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  180. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  181. data/lib/rubocop/cop/lint/empty_when.rb +61 -0
  182. data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
  183. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  184. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  185. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  186. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +159 -0
  187. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  188. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  189. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  190. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  191. data/lib/rubocop/cop/lint/interpolation_check.rb +40 -0
  192. data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
  193. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  194. data/lib/rubocop/cop/lint/loop.rb +65 -0
  195. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  196. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  197. data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
  198. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  199. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  200. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  201. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  202. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  203. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  204. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  205. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +86 -0
  206. data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
  207. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  208. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  209. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  210. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +258 -0
  211. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  212. data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
  213. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
  214. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
  215. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  216. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  217. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  218. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  219. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  220. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  221. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  222. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
  223. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  224. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +38 -0
  225. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  226. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  227. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  228. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  229. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  230. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  231. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  232. data/lib/rubocop/cop/lint/syntax.rb +57 -0
  233. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  234. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  235. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  236. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  237. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  238. data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
  239. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  240. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  241. data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
  242. data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
  243. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  244. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
  245. data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
  246. data/lib/rubocop/cop/lint/void.rb +151 -0
  247. data/lib/rubocop/cop/message_annotator.rb +129 -0
  248. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  249. data/lib/rubocop/cop/metrics/block_length.rb +50 -0
  250. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  251. data/lib/rubocop/cop/metrics/class_length.rb +36 -0
  252. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +32 -0
  253. data/lib/rubocop/cop/metrics/method_length.rb +36 -0
  254. data/lib/rubocop/cop/metrics/module_length.rb +36 -0
  255. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  256. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  257. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  258. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  259. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  260. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  261. data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
  262. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  263. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  264. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  265. data/lib/rubocop/cop/mixin/classish_length.rb +37 -0
  266. data/lib/rubocop/cop/mixin/code_length.rb +38 -0
  267. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
  268. data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
  269. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  270. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  271. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  272. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  273. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  274. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  275. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  276. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  277. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
  278. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  279. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  280. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
  281. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
  282. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  283. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  284. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  285. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  286. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  287. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  288. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  289. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  290. data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
  291. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  292. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  293. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  294. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  295. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  296. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  297. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  298. data/lib/rubocop/cop/mixin/nil_methods.rb +25 -0
  299. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  300. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +56 -0
  301. data/lib/rubocop/cop/mixin/parentheses.rb +17 -0
  302. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  303. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  304. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  305. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  306. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  307. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  308. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  309. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  310. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  311. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  312. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  313. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  314. data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
  315. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  316. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  317. data/lib/rubocop/cop/mixin/surrounding_space.rb +146 -0
  318. data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
  319. data/lib/rubocop/cop/mixin/too_many_lines.rb +35 -0
  320. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  321. data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
  322. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +111 -0
  323. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  324. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  325. data/lib/rubocop/cop/naming/ascii_identifiers.rb +72 -0
  326. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  327. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  328. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
  329. data/lib/rubocop/cop/naming/constant_name.rb +82 -0
  330. data/lib/rubocop/cop/naming/file_name.rb +225 -0
  331. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  332. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  333. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  334. data/lib/rubocop/cop/naming/method_name.rb +79 -0
  335. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  336. data/lib/rubocop/cop/naming/predicate_name.rb +108 -0
  337. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  338. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  339. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  340. data/lib/rubocop/cop/offense.rb +216 -0
  341. data/lib/rubocop/cop/registry.rb +276 -0
  342. data/lib/rubocop/cop/security/eval.rb +31 -0
  343. data/lib/rubocop/cop/security/json_load.rb +46 -0
  344. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  345. data/lib/rubocop/cop/security/open.rb +71 -0
  346. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  347. data/lib/rubocop/cop/severity.rb +75 -0
  348. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  349. data/lib/rubocop/cop/style/alias.rb +147 -0
  350. data/lib/rubocop/cop/style/and_or.rb +145 -0
  351. data/lib/rubocop/cop/style/array_join.rb +39 -0
  352. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  353. data/lib/rubocop/cop/style/attr.rb +68 -0
  354. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  355. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  356. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  357. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  358. data/lib/rubocop/cop/style/block_delimiters.rb +384 -0
  359. data/lib/rubocop/cop/style/case_equality.rb +53 -0
  360. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  361. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  362. data/lib/rubocop/cop/style/class_check.rb +59 -0
  363. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  364. data/lib/rubocop/cop/style/class_vars.rb +48 -0
  365. data/lib/rubocop/cop/style/collection_methods.rb +79 -0
  366. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  367. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  368. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  369. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  370. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  371. data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
  372. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  373. data/lib/rubocop/cop/style/copyright.rb +99 -0
  374. data/lib/rubocop/cop/style/date_time.rb +77 -0
  375. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  376. data/lib/rubocop/cop/style/dir.rb +48 -0
  377. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  378. data/lib/rubocop/cop/style/documentation.rb +135 -0
  379. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  380. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  381. data/lib/rubocop/cop/style/double_negation.rb +72 -0
  382. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  383. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  384. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  385. data/lib/rubocop/cop/style/empty_case_condition.rb +107 -0
  386. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  387. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  388. data/lib/rubocop/cop/style/empty_literal.rb +121 -0
  389. data/lib/rubocop/cop/style/empty_method.rb +111 -0
  390. data/lib/rubocop/cop/style/encoding.rb +56 -0
  391. data/lib/rubocop/cop/style/end_block.rb +31 -0
  392. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  393. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  394. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  395. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  396. data/lib/rubocop/cop/style/float_division.rb +94 -0
  397. data/lib/rubocop/cop/style/for.rb +88 -0
  398. data/lib/rubocop/cop/style/format_string.rb +127 -0
  399. data/lib/rubocop/cop/style/format_string_token.rb +120 -0
  400. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
  401. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  402. data/lib/rubocop/cop/style/guard_clause.rb +145 -0
  403. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  404. data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
  405. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  406. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  407. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  408. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  409. data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
  410. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +39 -0
  411. data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
  412. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  413. data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
  414. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  415. data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
  416. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  417. data/lib/rubocop/cop/style/lambda.rb +132 -0
  418. data/lib/rubocop/cop/style/lambda_call.rb +73 -0
  419. data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
  420. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
  421. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  422. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  423. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
  424. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  425. data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
  426. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  427. data/lib/rubocop/cop/style/min_max.rb +68 -0
  428. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  429. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  430. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  431. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  432. data/lib/rubocop/cop/style/module_function.rb +150 -0
  433. data/lib/rubocop/cop/style/multiline_block_chain.rb +40 -0
  434. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  435. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  436. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  437. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  438. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +38 -0
  439. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  440. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  441. data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
  442. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  443. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  444. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  445. data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
  446. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +67 -0
  447. data/lib/rubocop/cop/style/nested_ternary_operator.rb +32 -0
  448. data/lib/rubocop/cop/style/next.rb +244 -0
  449. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  450. data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
  451. data/lib/rubocop/cop/style/not.rb +82 -0
  452. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  453. data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
  454. data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
  455. data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
  456. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  457. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  458. data/lib/rubocop/cop/style/or_assignment.rb +96 -0
  459. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  460. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  461. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  462. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  463. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  464. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  465. data/lib/rubocop/cop/style/proc.rb +34 -0
  466. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  467. data/lib/rubocop/cop/style/random_with_offset.rb +158 -0
  468. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  469. data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
  470. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  471. data/lib/rubocop/cop/style/redundant_conditional.rb +97 -0
  472. data/lib/rubocop/cop/style/redundant_exception.rb +60 -0
  473. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  474. data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
  475. data/lib/rubocop/cop/style/redundant_parentheses.rb +227 -0
  476. data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
  477. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  478. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  479. data/lib/rubocop/cop/style/redundant_return.rb +169 -0
  480. data/lib/rubocop/cop/style/redundant_self.rb +171 -0
  481. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  482. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  483. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  484. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  485. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  486. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  487. data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
  488. data/lib/rubocop/cop/style/sample.rb +144 -0
  489. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  490. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  491. data/lib/rubocop/cop/style/send.rb +31 -0
  492. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  493. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  494. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  495. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  496. data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
  497. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
  498. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  499. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  500. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  501. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  502. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  503. data/lib/rubocop/cop/style/strip.rb +46 -0
  504. data/lib/rubocop/cop/style/struct_inheritance.rb +39 -0
  505. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  506. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  507. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  508. data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
  509. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  510. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  511. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  512. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
  513. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  514. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  515. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  516. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  517. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
  518. data/lib/rubocop/cop/style/trivial_accessors.rb +191 -0
  519. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  520. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  521. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  522. data/lib/rubocop/cop/style/when_then.rb +37 -0
  523. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  524. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  525. data/lib/rubocop/cop/style/word_array.rb +102 -0
  526. data/lib/rubocop/cop/style/yoda_condition.rb +156 -0
  527. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  528. data/lib/rubocop/cop/team.rb +240 -0
  529. data/lib/rubocop/cop/util.rb +151 -0
  530. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  531. data/lib/rubocop/cop/variable_force.rb +463 -0
  532. data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
  533. data/lib/rubocop/cop/variable_force/branch.rb +320 -0
  534. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  535. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  536. data/lib/rubocop/cop/variable_force/scope.rb +110 -0
  537. data/lib/rubocop/cop/variable_force/variable.rb +114 -0
  538. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  539. data/lib/rubocop/core_ext/string.rb +23 -0
  540. data/lib/rubocop/error.rb +34 -0
  541. data/lib/rubocop/ext/processed_source.rb +18 -0
  542. data/lib/rubocop/file_finder.rb +42 -0
  543. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  544. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
  546. data/lib/rubocop/formatter/colorizable.rb +41 -0
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
  548. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  549. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  550. data/lib/rubocop/formatter/formatter_set.rb +104 -0
  551. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  552. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  553. data/lib/rubocop/formatter/json_formatter.rb +81 -0
  554. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  556. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  557. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  558. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  559. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  560. data/lib/rubocop/formatter/tap_formatter.rb +82 -0
  561. data/lib/rubocop/formatter/text_util.rb +20 -0
  562. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  563. data/lib/rubocop/magic_comment.rb +214 -0
  564. data/lib/rubocop/name_similarity.rb +24 -0
  565. data/lib/rubocop/options.rb +481 -0
  566. data/lib/rubocop/path_util.rb +85 -0
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/rake_task.rb +80 -0
  569. data/lib/rubocop/remote_config.rb +104 -0
  570. data/lib/rubocop/result_cache.rb +205 -0
  571. data/lib/rubocop/rspec/cop_helper.rb +71 -0
  572. data/lib/rubocop/rspec/expect_offense.rb +273 -0
  573. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  574. data/lib/rubocop/rspec/shared_contexts.rb +129 -0
  575. data/lib/rubocop/rspec/support.rb +13 -0
  576. data/lib/rubocop/runner.rb +386 -0
  577. data/lib/rubocop/string_interpreter.rb +57 -0
  578. data/lib/rubocop/target_finder.rb +196 -0
  579. data/lib/rubocop/target_ruby.rb +154 -0
  580. data/lib/rubocop/version.rb +23 -0
  581. data/lib/rubocop/warning.rb +11 -0
  582. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  583. metadata +780 -0
@@ -0,0 +1,202 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # This cop checks for inconsistent indentation.
7
+ #
8
+ # The difference between `indented_internal_methods` and `normal` is
9
+ # that the `indented_internal_methods` style prescribes that in
10
+ # classes and modules the `protected` and `private` modifier keywords
11
+ # shall be indented the same as public methods and that protected and
12
+ # private members shall be indented one step more than the modifiers.
13
+ # Other than that, both styles mean that entities on the same logical
14
+ # depth shall have the same indentation.
15
+ #
16
+ # @example EnforcedStyle: normal (default)
17
+ # # bad
18
+ # class A
19
+ # def test
20
+ # puts 'hello'
21
+ # puts 'world'
22
+ # end
23
+ # end
24
+ #
25
+ # # bad
26
+ # class A
27
+ # def test
28
+ # puts 'hello'
29
+ # puts 'world'
30
+ # end
31
+ #
32
+ # protected
33
+ #
34
+ # def foo
35
+ # end
36
+ #
37
+ # private
38
+ #
39
+ # def bar
40
+ # end
41
+ # end
42
+ #
43
+ # # good
44
+ # class A
45
+ # def test
46
+ # puts 'hello'
47
+ # puts 'world'
48
+ # end
49
+ # end
50
+ #
51
+ # # good
52
+ # class A
53
+ # def test
54
+ # puts 'hello'
55
+ # puts 'world'
56
+ # end
57
+ #
58
+ # protected
59
+ #
60
+ # def foo
61
+ # end
62
+ #
63
+ # private
64
+ #
65
+ # def bar
66
+ # end
67
+ # end
68
+ #
69
+ # @example EnforcedStyle: indented_internal_methods
70
+ # # bad
71
+ # class A
72
+ # def test
73
+ # puts 'hello'
74
+ # puts 'world'
75
+ # end
76
+ # end
77
+ #
78
+ # # bad
79
+ # class A
80
+ # def test
81
+ # puts 'hello'
82
+ # puts 'world'
83
+ # end
84
+ #
85
+ # protected
86
+ #
87
+ # def foo
88
+ # end
89
+ #
90
+ # private
91
+ #
92
+ # def bar
93
+ # end
94
+ # end
95
+ #
96
+ # # good
97
+ # class A
98
+ # def test
99
+ # puts 'hello'
100
+ # puts 'world'
101
+ # end
102
+ # end
103
+ #
104
+ # # good
105
+ # class A
106
+ # def test
107
+ # puts 'hello'
108
+ # puts 'world'
109
+ # end
110
+ #
111
+ # protected
112
+ #
113
+ # def foo
114
+ # end
115
+ #
116
+ # private
117
+ #
118
+ # def bar
119
+ # end
120
+ # end
121
+ class IndentationConsistency < Cop
122
+ include Alignment
123
+ include ConfigurableEnforcedStyle
124
+
125
+ MSG = 'Inconsistent indentation detected.'
126
+
127
+ def on_begin(node)
128
+ check(node)
129
+ end
130
+
131
+ def on_kwbegin(node)
132
+ check(node)
133
+ end
134
+
135
+ def autocorrect(node)
136
+ AlignmentCorrector.correct(processed_source, node, column_delta)
137
+ end
138
+
139
+ private
140
+
141
+ # Not all nodes define `bare_access_modifier?` (for example,
142
+ # `RuboCop::AST::DefNode` does not), so we must check `send_type?` first
143
+ # to avoid a NoMethodError.
144
+ def bare_access_modifier?(node)
145
+ node.send_type? && node.bare_access_modifier?
146
+ end
147
+
148
+ # Returns an integer representing the correct indentation, or nil to
149
+ # indicate that the correct indentation is that of the first child that
150
+ # is not an access modifier.
151
+ def base_column_for_normal_style(node)
152
+ first_child = node.children.first
153
+ return unless first_child && bare_access_modifier?(first_child)
154
+
155
+ # If, as is most common, the access modifier is indented deeper than
156
+ # the module (`access_modifier_indent > module_indent`) then the
157
+ # indentation of the access modifier determines the correct
158
+ # indentation.
159
+ #
160
+ # Otherwise, in the rare event that the access modifier is outdented
161
+ # to the level of the module (see `AccessModifierIndentation` cop) we
162
+ # return nil so that `check_alignment` will derive the correct
163
+ # indentation from the first child that is not an access modifier.
164
+ module_indent = display_column(node.parent.source_range)
165
+ access_modifier_indent = display_column(first_child.source_range)
166
+ access_modifier_indent if access_modifier_indent > module_indent
167
+ end
168
+
169
+ def check(node)
170
+ if style == :indented_internal_methods
171
+ check_indented_internal_methods_style(node)
172
+ else
173
+ check_normal_style(node)
174
+ end
175
+ end
176
+
177
+ def check_normal_style(node)
178
+ check_alignment(
179
+ node.children.reject { |child| bare_access_modifier?(child) },
180
+ base_column_for_normal_style(node)
181
+ )
182
+ end
183
+
184
+ def check_indented_internal_methods_style(node)
185
+ children_to_check = [[]]
186
+ node.children.each do |child|
187
+ # Modifier nodes have special indentation and will be checked by
188
+ # the AccessModifierIndentation cop. This cop uses them as dividers
189
+ # in indented_internal_methods mode. Then consistency is checked
190
+ # only within each section delimited by a modifier node.
191
+ if bare_access_modifier?(child)
192
+ children_to_check << []
193
+ else
194
+ children_to_check.last << child
195
+ end
196
+ end
197
+ children_to_check.each { |group| check_alignment(group) }
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Layout
8
+ # This cop checks that the indentation method is consistent.
9
+ # Either tabs only or spaces only are used for indentation.
10
+ #
11
+ # @example EnforcedStyle: spaces (default)
12
+ # # bad
13
+ # # This example uses a tab to indent bar.
14
+ # def foo
15
+ # bar
16
+ # end
17
+ #
18
+ # # good
19
+ # # This example uses spaces to indent bar.
20
+ # def foo
21
+ # bar
22
+ # end
23
+ #
24
+ # @example EnforcedStyle: tabs
25
+ # # bad
26
+ # # This example uses spaces to indent bar.
27
+ # def foo
28
+ # bar
29
+ # end
30
+ #
31
+ # # good
32
+ # # This example uses a tab to indent bar.
33
+ # def foo
34
+ # bar
35
+ # end
36
+ class IndentationStyle < Cop
37
+ include Alignment
38
+ include ConfigurableEnforcedStyle
39
+ include RangeHelp
40
+
41
+ MSG = '%<type>s detected in indentation.'
42
+
43
+ def investigate(processed_source)
44
+ str_ranges = string_literal_ranges(processed_source.ast)
45
+
46
+ processed_source.lines.each.with_index(1) do |line, lineno|
47
+ match = find_offence(line)
48
+ next unless match
49
+
50
+ range = source_range(processed_source.buffer,
51
+ lineno,
52
+ match.begin(0)...match.end(0))
53
+ next if in_string_literal?(str_ranges, range)
54
+
55
+ add_offense(range, location: range)
56
+ end
57
+ end
58
+
59
+ def autocorrect(range)
60
+ if range.source.include?("\t")
61
+ autocorrect_lambda_for_tabs(range)
62
+ else
63
+ autocorrect_lambda_for_spaces(range)
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def find_offence(line)
70
+ if style == :spaces
71
+ line.match(/\A\s*\t+/)
72
+ else
73
+ line.match(/\A\s* +/)
74
+ end
75
+ end
76
+
77
+ def autocorrect_lambda_for_tabs(range)
78
+ lambda do |corrector|
79
+ spaces = ' ' * configured_indentation_width
80
+ corrector.replace(range, range.source.gsub(/\t/, spaces))
81
+ end
82
+ end
83
+
84
+ def autocorrect_lambda_for_spaces(range)
85
+ lambda do |corrector|
86
+ corrector.replace(range, range.source.gsub(/\A\s+/) do |match|
87
+ "\t" * (match.size / configured_indentation_width)
88
+ end)
89
+ end
90
+ end
91
+
92
+ def in_string_literal?(ranges, tabs_range)
93
+ ranges.any? { |range| range.contains?(tabs_range) }
94
+ end
95
+
96
+ def string_literal_ranges(ast)
97
+ # which lines start inside a string literal?
98
+ return [] if ast.nil?
99
+
100
+ ast.each_node(:str, :dstr).each_with_object(Set.new) do |str, ranges|
101
+ loc = str.location
102
+
103
+ if str.heredoc?
104
+ ranges << loc.heredoc_body
105
+ elsif loc.respond_to?(:begin) && loc.begin
106
+ ranges << loc.expression
107
+ end
108
+ end
109
+ end
110
+
111
+ def message(_node)
112
+ format(MSG, type: style == :spaces ? 'Tab' : 'Space')
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,362 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # This cop checks for indentation that doesn't use the specified number
7
+ # of spaces.
8
+ #
9
+ # See also the IndentationConsistency cop which is the companion to this
10
+ # one.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # class A
15
+ # def test
16
+ # puts 'hello'
17
+ # end
18
+ # end
19
+ #
20
+ # # good
21
+ # class A
22
+ # def test
23
+ # puts 'hello'
24
+ # end
25
+ # end
26
+ #
27
+ # @example IgnoredPatterns: ['^\s*module']
28
+ # # bad
29
+ # module A
30
+ # class B
31
+ # def test
32
+ # puts 'hello'
33
+ # end
34
+ # end
35
+ # end
36
+ #
37
+ # # good
38
+ # module A
39
+ # class B
40
+ # def test
41
+ # puts 'hello'
42
+ # end
43
+ # end
44
+ # end
45
+ class IndentationWidth < Cop # rubocop:disable Metrics/ClassLength
46
+ include EndKeywordAlignment
47
+ include Alignment
48
+ include CheckAssignment
49
+ include IgnoredPattern
50
+ include RangeHelp
51
+
52
+ MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
53
+ 'spaces for%<name>s indentation.'
54
+
55
+ def_node_matcher :access_modifier?, <<~PATTERN
56
+ [(send ...) access_modifier?]
57
+ PATTERN
58
+
59
+ def on_rescue(node)
60
+ _begin_node, *_rescue_nodes, else_node = *node
61
+ check_indentation(node.loc.else, else_node)
62
+ end
63
+
64
+ def on_ensure(node)
65
+ check_indentation(node.loc.keyword, node.body)
66
+ end
67
+
68
+ alias on_resbody on_ensure
69
+ alias on_for on_ensure
70
+
71
+ def on_kwbegin(node)
72
+ # Check indentation against end keyword but only if it's first on its
73
+ # line.
74
+ return unless begins_its_line?(node.loc.end)
75
+
76
+ check_indentation(node.loc.end, node.children.first)
77
+ end
78
+
79
+ def on_block(node)
80
+ end_loc = node.loc.end
81
+
82
+ return unless begins_its_line?(end_loc)
83
+
84
+ check_indentation(end_loc, node.body)
85
+
86
+ return unless indented_internal_methods_style?
87
+
88
+ check_members(end_loc, [node.body])
89
+ end
90
+
91
+ def on_class(node)
92
+ check_members(node.loc.keyword, [node.body])
93
+ end
94
+ alias on_sclass on_class
95
+ alias on_module on_class
96
+
97
+ def on_send(node)
98
+ super
99
+ return unless node.adjacent_def_modifier?
100
+
101
+ def_end_config = config.for_cop('Layout/DefEndAlignment')
102
+ style = def_end_config['EnforcedStyleAlignWith'] || 'start_of_line'
103
+ base = if style == 'def'
104
+ node.first_argument
105
+ else
106
+ leftmost_modifier_of(node) || node
107
+ end
108
+
109
+ check_indentation(base.source_range, node.first_argument.body)
110
+ ignore_node(node.first_argument)
111
+ end
112
+ alias on_csend on_send
113
+
114
+ def on_def(node)
115
+ return if ignored_node?(node)
116
+
117
+ check_indentation(node.loc.keyword, node.body)
118
+ end
119
+ alias on_defs on_def
120
+
121
+ def on_while(node, base = node)
122
+ return if ignored_node?(node)
123
+
124
+ return unless node.single_line_condition?
125
+
126
+ check_indentation(base.loc, node.body)
127
+ end
128
+
129
+ alias on_until on_while
130
+
131
+ def on_case(case_node)
132
+ case_node.each_when do |when_node|
133
+ check_indentation(when_node.loc.keyword, when_node.body)
134
+ end
135
+
136
+ check_indentation(case_node.when_branches.last.loc.keyword,
137
+ case_node.else_branch)
138
+ end
139
+
140
+ def on_if(node, base = node)
141
+ return if ignored_node?(node)
142
+ return if node.ternary? || node.modifier_form?
143
+
144
+ check_if(node, node.body, node.else_branch, base.loc)
145
+ end
146
+
147
+ def autocorrect(node)
148
+ AlignmentCorrector.correct(processed_source, node, @column_delta)
149
+ end
150
+
151
+ private
152
+
153
+ def check_members(base, members)
154
+ check_indentation(base, select_check_member(members.first))
155
+
156
+ return unless members.any? && members.first.begin_type?
157
+
158
+ if indentation_consistency_style == 'indented_internal_methods'
159
+ check_members_for_indented_internal_methods_style(members)
160
+ else
161
+ check_members_for_normal_style(base, members)
162
+ end
163
+ end
164
+
165
+ def select_check_member(member)
166
+ return unless member
167
+
168
+ if access_modifier?(member.children.first)
169
+ return if access_modifier_indentation_style == 'outdent'
170
+
171
+ member.children.first
172
+ else
173
+ member
174
+ end
175
+ end
176
+
177
+ def check_members_for_indented_internal_methods_style(members)
178
+ each_member(members) do |member, previous_modifier|
179
+ check_indentation(previous_modifier, member,
180
+ indentation_consistency_style)
181
+ end
182
+ end
183
+
184
+ def check_members_for_normal_style(base, members)
185
+ members.first.children.each do |member|
186
+ next if member.send_type? && member.access_modifier?
187
+
188
+ check_indentation(base, member)
189
+ end
190
+ end
191
+
192
+ def each_member(members)
193
+ previous_modifier = nil
194
+ members.first.children.each do |member|
195
+ if member.send_type? && member.special_modifier?
196
+ previous_modifier = member
197
+ elsif previous_modifier
198
+ yield member, previous_modifier.source_range
199
+ previous_modifier = nil
200
+ end
201
+ end
202
+ end
203
+
204
+ def indented_internal_methods_style?
205
+ indentation_consistency_style == 'indented_internal_methods'
206
+ end
207
+
208
+ def special_modifier?(node)
209
+ node.bare_access_modifier? && SPECIAL_MODIFIERS.include?(node.source)
210
+ end
211
+
212
+ def access_modifier_indentation_style
213
+ config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle']
214
+ end
215
+
216
+ def indentation_consistency_style
217
+ config.for_cop('Layout/IndentationConsistency')['EnforcedStyle']
218
+ end
219
+
220
+ def check_assignment(node, rhs)
221
+ # If there are method calls chained to the right hand side of the
222
+ # assignment, we let rhs be the receiver of those method calls before
223
+ # we check its indentation.
224
+ rhs = first_part_of_call_chain(rhs)
225
+ return unless rhs
226
+
227
+ end_config = config.for_cop('Layout/EndAlignment')
228
+ style = end_config['EnforcedStyleAlignWith'] || 'keyword'
229
+ base = variable_alignment?(node.loc, rhs, style.to_sym) ? node : rhs
230
+
231
+ case rhs.type
232
+ when :if then on_if(rhs, base)
233
+ when :while, :until then on_while(rhs, base)
234
+ else return
235
+ end
236
+
237
+ ignore_node(rhs)
238
+ end
239
+
240
+ def check_if(node, body, else_clause, base_loc)
241
+ return if node.ternary?
242
+
243
+ check_indentation(base_loc, body)
244
+ return unless else_clause
245
+
246
+ # If the else clause is an elsif, it will get its own on_if call so
247
+ # we don't need to process it here.
248
+ return if else_clause.if_type? && else_clause.elsif?
249
+
250
+ check_indentation(node.loc.else, else_clause)
251
+ end
252
+
253
+ def check_indentation(base_loc, body_node, style = 'normal')
254
+ return unless indentation_to_check?(base_loc, body_node)
255
+
256
+ indentation = column_offset_between(body_node.loc, base_loc)
257
+ @column_delta = configured_indentation_width - indentation
258
+ return if @column_delta.zero?
259
+
260
+ offense(body_node, indentation, style)
261
+ end
262
+
263
+ def offense(body_node, indentation, style)
264
+ # This cop only auto-corrects the first statement in a def body, for
265
+ # example.
266
+ body_node = body_node.children.first if body_node.begin_type? && !parentheses?(body_node)
267
+
268
+ # Since autocorrect changes a number of lines, and not only the line
269
+ # where the reported offending range is, we avoid auto-correction if
270
+ # this cop has already found other offenses is the same
271
+ # range. Otherwise, two corrections can interfere with each other,
272
+ # resulting in corrupted code.
273
+ node = if autocorrect? && other_offense_in_same_range?(body_node)
274
+ nil
275
+ else
276
+ body_node
277
+ end
278
+
279
+ name = style == 'normal' ? '' : " #{style}"
280
+ message = message(configured_indentation_width, indentation, name)
281
+
282
+ add_offense(node, location: offending_range(body_node, indentation),
283
+ message: message)
284
+ end
285
+
286
+ def message(configured_indentation_width, indentation, name)
287
+ format(
288
+ MSG,
289
+ configured_indentation_width: configured_indentation_width,
290
+ indentation: indentation,
291
+ name: name
292
+ )
293
+ end
294
+
295
+ # Returns true if the given node is within another node that has
296
+ # already been marked for auto-correction by this cop.
297
+ def other_offense_in_same_range?(node)
298
+ expr = node.source_range
299
+ @offense_ranges ||= []
300
+
301
+ return true if @offense_ranges.any? { |r| within?(expr, r) }
302
+
303
+ @offense_ranges << expr
304
+ false
305
+ end
306
+
307
+ def indentation_to_check?(base_loc, body_node)
308
+ return false if skip_check?(base_loc, body_node)
309
+
310
+ if %i[rescue ensure].include?(body_node.type)
311
+ block_body, = *body_node
312
+ return unless block_body
313
+ end
314
+
315
+ true
316
+ end
317
+
318
+ def skip_check?(base_loc, body_node)
319
+ return true if ignored_line?(base_loc)
320
+ return true unless body_node
321
+
322
+ # Don't check if expression is on same line as "then" keyword, etc.
323
+ return true if body_node.loc.line == base_loc.line
324
+
325
+ return true if starts_with_access_modifier?(body_node)
326
+
327
+ # Don't check indentation if the line doesn't start with the body.
328
+ # For example, lines like "else do_something".
329
+ first_char_pos_on_line = body_node.source_range.source_line =~ /\S/
330
+ return true unless body_node.loc.column == first_char_pos_on_line
331
+ end
332
+
333
+ def offending_range(body_node, indentation)
334
+ expr = body_node.source_range
335
+ begin_pos = expr.begin_pos
336
+ ind = expr.begin_pos - indentation
337
+ pos = indentation >= 0 ? ind..begin_pos : begin_pos..ind
338
+ range_between(pos.begin, pos.end)
339
+ end
340
+
341
+ def starts_with_access_modifier?(body_node)
342
+ return unless body_node.begin_type?
343
+
344
+ starting_node = body_node.children.first
345
+ return unless starting_node
346
+
347
+ starting_node.send_type? && starting_node.bare_access_modifier?
348
+ end
349
+
350
+ def configured_indentation_width
351
+ cop_config['Width']
352
+ end
353
+
354
+ def leftmost_modifier_of(node)
355
+ return node unless node.parent&.send_type?
356
+
357
+ leftmost_modifier_of(node.parent)
358
+ end
359
+ end
360
+ end
361
+ end
362
+ end