rubocop 0.73.0 → 0.77.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/bin/console +1 -0
  4. data/config/default.yml +332 -295
  5. data/lib/rubocop.rb +46 -30
  6. data/lib/rubocop/ast/builder.rb +1 -0
  7. data/lib/rubocop/ast/node.rb +6 -8
  8. data/lib/rubocop/ast/node/block_node.rb +2 -0
  9. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
  10. data/lib/rubocop/ast/node/return_node.rb +24 -0
  11. data/lib/rubocop/cli.rb +11 -227
  12. data/lib/rubocop/cli/command.rb +21 -0
  13. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  14. data/lib/rubocop/cli/command/base.rb +33 -0
  15. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  16. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  17. data/lib/rubocop/cli/command/show_cops.rb +73 -0
  18. data/lib/rubocop/cli/command/version.rb +17 -0
  19. data/lib/rubocop/cli/environment.rb +21 -0
  20. data/lib/rubocop/comment_config.rb +5 -4
  21. data/lib/rubocop/config.rb +28 -537
  22. data/lib/rubocop/config_loader.rb +21 -3
  23. data/lib/rubocop/config_loader_resolver.rb +4 -3
  24. data/lib/rubocop/config_obsoletion.rb +275 -0
  25. data/lib/rubocop/config_validator.rb +246 -0
  26. data/lib/rubocop/cop/autocorrect_logic.rb +2 -2
  27. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  28. data/lib/rubocop/cop/commissioner.rb +15 -7
  29. data/lib/rubocop/cop/cop.rb +33 -9
  30. data/lib/rubocop/cop/corrector.rb +8 -7
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  35. data/lib/rubocop/cop/generator.rb +3 -3
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  40. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  41. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  42. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  46. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +15 -60
  52. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +12 -10
  53. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  54. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  55. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  56. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
  57. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +2 -2
  58. data/lib/rubocop/cop/layout/indentation_width.rb +19 -5
  59. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  60. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  67. data/lib/rubocop/cop/layout/space_around_operators.rb +43 -24
  68. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  69. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
  70. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
  71. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  72. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  73. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  74. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  75. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  76. data/lib/rubocop/cop/lint/debugger.rb +1 -3
  77. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  78. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  79. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  80. data/lib/rubocop/cop/lint/erb_new_arguments.rb +61 -4
  81. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
  82. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  83. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  84. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  85. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  86. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  87. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +24 -24
  88. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
  89. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  90. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +12 -7
  91. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +7 -7
  92. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  93. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  94. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  95. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  96. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  97. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  98. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  99. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  100. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  101. data/lib/rubocop/cop/lint/void.rb +7 -26
  102. data/lib/rubocop/cop/message_annotator.rb +16 -7
  103. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  104. data/lib/rubocop/cop/metrics/line_length.rb +48 -42
  105. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  106. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  107. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  108. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  109. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  110. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  111. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  112. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  113. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  114. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  115. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  116. data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
  117. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  118. data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
  119. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  120. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  121. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  122. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  123. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
  124. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  125. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  126. data/lib/rubocop/cop/offense.rb +18 -7
  127. data/lib/rubocop/cop/registry.rb +22 -1
  128. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  129. data/lib/rubocop/cop/style/alias.rb +1 -1
  130. data/lib/rubocop/cop/style/array_join.rb +1 -1
  131. data/lib/rubocop/cop/style/attr.rb +2 -2
  132. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  133. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
  134. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  135. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  136. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +5 -7
  138. data/lib/rubocop/cop/style/constant_visibility.rb +13 -2
  139. data/lib/rubocop/cop/style/copyright.rb +11 -7
  140. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  141. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
  142. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  143. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  144. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  145. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  146. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  147. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  148. data/lib/rubocop/cop/style/format_string.rb +10 -7
  149. data/lib/rubocop/cop/style/format_string_token.rb +19 -68
  150. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
  151. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  152. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  153. data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -15
  154. data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
  155. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  156. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  157. data/lib/rubocop/cop/style/lambda.rb +0 -2
  158. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  159. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
  160. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  161. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  162. data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
  163. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  164. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  165. data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
  166. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  167. data/lib/rubocop/cop/style/next.rb +5 -5
  168. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  169. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  170. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  171. data/lib/rubocop/cop/style/or_assignment.rb +6 -1
  172. data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
  173. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  174. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  175. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  176. data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
  177. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  178. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  179. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  180. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  181. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  182. data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
  183. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  184. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  185. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  186. data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
  187. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  188. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  189. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  190. data/lib/rubocop/cop/team.rb +5 -0
  191. data/lib/rubocop/cop/util.rb +1 -1
  192. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  193. data/lib/rubocop/cop/variable_force.rb +7 -5
  194. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  195. data/lib/rubocop/core_ext/string.rb +0 -24
  196. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  197. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  198. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  199. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  200. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  201. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  202. data/lib/rubocop/formatter/tap_formatter.rb +18 -7
  203. data/lib/rubocop/magic_comment.rb +4 -0
  204. data/lib/rubocop/node_pattern.rb +3 -1
  205. data/lib/rubocop/options.rb +17 -22
  206. data/lib/rubocop/path_util.rb +1 -1
  207. data/lib/rubocop/processed_source.rb +5 -1
  208. data/lib/rubocop/rake_task.rb +1 -0
  209. data/lib/rubocop/result_cache.rb +22 -8
  210. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  211. data/lib/rubocop/runner.rb +55 -32
  212. data/lib/rubocop/target_finder.rb +12 -6
  213. data/lib/rubocop/version.rb +1 -1
  214. metadata +47 -32
  215. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  216. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -37,7 +37,7 @@ module RuboCop
37
37
  #
38
38
  # foo :bar,
39
39
  # :baz
40
- class AlignArguments < Cop
40
+ class ArgumentAlignment < Cop
41
41
  include Alignment
42
42
 
43
43
  ALIGN_PARAMS_MSG = 'Align the arguments of a method call if ' \
@@ -20,7 +20,7 @@ module RuboCop
20
20
  # a = ['run',
21
21
  # 'forrest',
22
22
  # 'run']
23
- class AlignArray < Cop
23
+ class ArrayAlignment < Cop
24
24
  include Alignment
25
25
 
26
26
  MSG = 'Align the elements of an array literal if they span more ' \
@@ -21,7 +21,7 @@ module RuboCop
21
21
  #
22
22
  # The indentation of the remaining lines can be corrected with
23
23
  # other cops such as `IndentationConsistency` and `EndAlignment`.
24
- class IndentAssignment < Cop
24
+ class AssignmentIndentation < Cop
25
25
  include CheckAssignment
26
26
  include Alignment
27
27
 
@@ -33,13 +33,22 @@ module RuboCop
33
33
  return unless node.loc.operator
34
34
  return if node.loc.operator.line == rhs.first_line
35
35
 
36
- base = display_column(node.source_range)
36
+ base = display_column(leftmost_multiple_assignment(node).source_range)
37
37
  check_alignment([rhs], base + configured_indentation_width)
38
38
  end
39
39
 
40
40
  def autocorrect(node)
41
41
  AlignmentCorrector.correct(processed_source, node, column_delta)
42
42
  end
43
+
44
+ def leftmost_multiple_assignment(node)
45
+ return node unless same_line?(node, node.parent) &&
46
+ node.parent.assignment?
47
+
48
+ leftmost_multiple_assignment(node.parent)
49
+
50
+ node.parent
51
+ end
43
52
  end
44
53
  end
45
54
  end
@@ -44,8 +44,8 @@ module RuboCop
44
44
  #
45
45
  # foo.bar
46
46
  # .each do
47
- # baz
48
- # end
47
+ # baz
48
+ # end
49
49
  #
50
50
  # @example EnforcedStyleAlignWith: start_of_line
51
51
  # # bad
@@ -191,7 +191,7 @@ module RuboCop
191
191
  end
192
192
 
193
193
  def indentation_width
194
- @config.for_cop('IndentationWidth')['Width'] || 2
194
+ @config.for_cop('Layout/IndentationWidth')['Width'] || 2
195
195
  end
196
196
 
197
197
  def line_break_after_left_paren?(left_paren, elements)
@@ -55,23 +55,20 @@ module RuboCop
55
55
  # of correcting, saving the file, parsing and inspecting again, and
56
56
  # then correcting one more line, and so on.
57
57
  def autocorrect_preceding_comments(comment)
58
- corrections = []
59
- line_no = comment.loc.line
60
- column = comment.loc.column
61
58
  comments = processed_source.comments
62
- (comments.index(comment) - 1).downto(0) do |ix|
63
- previous_comment = comments[ix]
64
- break unless should_correct?(previous_comment, column, line_no - 1)
59
+ index = comments.index(comment)
65
60
 
66
- corrections << autocorrect_one(previous_comment)
67
- line_no -= 1
68
- end
69
- corrections
61
+ comments[0..index]
62
+ .reverse_each
63
+ .each_cons(2)
64
+ .take_while { |below, above| should_correct?(above, below) }
65
+ .map { |_, above| autocorrect_one(above) }
70
66
  end
71
67
 
72
- def should_correct?(comment, column, line_no)
73
- loc = comment.loc
74
- loc.line == line_no && loc.column == column
68
+ def should_correct?(preceding_comment, reference_comment)
69
+ loc = preceding_comment.loc
70
+ ref_loc = reference_comment.loc
71
+ loc.line == ref_loc.line - 1 && loc.column == ref_loc.column
75
72
  end
76
73
 
77
74
  def autocorrect_one(comment)
@@ -103,19 +103,12 @@ module RuboCop
103
103
  private
104
104
 
105
105
  def concat_consecutive_comments(comments)
106
- prev_line = nil
106
+ consecutive_comments =
107
+ comments.chunk_while { |i, j| i.loc.line.succ == j.loc.line }
107
108
 
108
- comments.each_with_object([]) do |comment, concatenated_comments|
109
- if prev_line && comment.loc.line == prev_line.next
110
- last_concatenated_comment = concatenated_comments.last
111
-
112
- last_concatenated_comment[0] << comment_text(comment)
113
- last_concatenated_comment[1] << comment
114
- else
115
- concatenated_comments << [comment_text(comment).dup, [comment]]
116
- end
117
-
118
- prev_line = comment.loc.line
109
+ consecutive_comments.map do |chunk|
110
+ joined_text = chunk.map { |c| comment_text(c) }.join
111
+ [joined_text, chunk]
119
112
  end
120
113
  end
121
114
 
@@ -141,11 +134,9 @@ module RuboCop
141
134
  cop_config['AllowMarginComment']
142
135
  end
143
136
 
144
- def current_token(node)
137
+ def current_token(comment)
145
138
  processed_source.find_token do |token|
146
- token.pos.column == node.loc.column &&
147
- token.pos.last_column == node.loc.last_column &&
148
- token.line == node.loc.line
139
+ token.pos == comment.loc.expression
149
140
  end
150
141
  end
151
142
 
@@ -45,7 +45,7 @@ module RuboCop
45
45
  return if correct_style?(node)
46
46
 
47
47
  if node.modifier_form? && last_argument_is_heredoc?(node)
48
- heredoc_node = last_argument(node)
48
+ heredoc_node = last_heredoc_argument(node)
49
49
 
50
50
  return if next_line_empty?(heredoc_line(node, heredoc_node))
51
51
 
@@ -109,16 +109,27 @@ module RuboCop
109
109
 
110
110
  def last_argument_is_heredoc?(node)
111
111
  last_children = node.if_branch
112
-
113
112
  return false unless last_children&.send_type?
114
113
 
115
- last_argument = last_argument(node)
116
-
117
- last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
114
+ heredoc?(last_heredoc_argument(node))
118
115
  end
119
116
 
120
- def last_argument(node)
121
- node.if_branch.children.last
117
+ def last_heredoc_argument(node)
118
+ n = if node.respond_to?(:if_branch)
119
+ node.if_branch.children.last
120
+ else
121
+ node
122
+ end
123
+
124
+ return n if heredoc?(n)
125
+ return unless n.respond_to?(:arguments)
126
+
127
+ n.arguments.each do |argument|
128
+ node = last_heredoc_argument(argument)
129
+ return node if node
130
+ end
131
+
132
+ return last_heredoc_argument(n.receiver) if n.respond_to?(:receiver)
122
133
  end
123
134
 
124
135
  def heredoc_line(node, heredoc_node)
@@ -129,6 +140,10 @@ module RuboCop
129
140
  node.last_line + num_of_heredoc_lines + END_OF_HEREDOC_LINE
130
141
  end
131
142
 
143
+ def heredoc?(node)
144
+ node.respond_to?(:heredoc?) && node.heredoc?
145
+ end
146
+
132
147
  def offense_location(node)
133
148
  if node.loc.respond_to?(:end) && node.loc.end
134
149
  :end
@@ -55,8 +55,8 @@ module RuboCop
55
55
  source
56
56
  .comments
57
57
  .take_while { |comment| comment.loc.line < source.ast.loc.line }
58
- .select { |comment| MagicComment.parse(comment.text).any? }
59
- .last
58
+ .reverse
59
+ .find { |comment| MagicComment.parse(comment.text).any? }
60
60
  end
61
61
  end
62
62
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  #
37
37
  # end
38
38
  #
39
- # @example Enforcedstyle: beginning_only
39
+ # @example EnforcedStyle: beginning_only
40
40
  # # good
41
41
  #
42
42
  # class Foo
@@ -46,7 +46,7 @@ module RuboCop
46
46
  # end
47
47
  # end
48
48
  #
49
- # @example Enforcedstyle: ending_only
49
+ # @example EnforcedStyle: ending_only
50
50
  # # good
51
51
  #
52
52
  # class Foo
@@ -45,9 +45,7 @@ module RuboCop
45
45
  MSG_MISSING = 'Carriage return character missing.'
46
46
 
47
47
  def investigate(processed_source)
48
- last_token = processed_source.tokens.last
49
- last_line =
50
- last_token ? last_token.line : processed_source.lines.length
48
+ last_line = last_line(processed_source)
51
49
 
52
50
  processed_source.raw_source.each_line.with_index do |line, index|
53
51
  break if index >= last_line
@@ -81,6 +79,13 @@ module RuboCop
81
79
  else MSG_MISSING if line !~ /\r$/
82
80
  end
83
81
  end
82
+
83
+ private
84
+
85
+ def last_line(processed_source)
86
+ last_token = processed_source.tokens.last
87
+ last_token ? last_token.line : processed_source.lines.length
88
+ end
84
89
  end
85
90
  end
86
91
  end
@@ -41,12 +41,7 @@ module RuboCop
41
41
  def investigate(processed_source)
42
42
  return if processed_source.blank?
43
43
 
44
- if force_equal_sign_alignment?
45
- @asgn_tokens = assignment_tokens
46
- @asgn_lines = @asgn_tokens.map(&:line)
47
- # Don't attempt to correct the same = more than once
48
- @corrected = Set.new
49
- end
44
+ @corrected = Set.new if force_equal_sign_alignment?
50
45
 
51
46
  processed_source.tokens.each_cons(2) do |token1, token2|
52
47
  check_tokens(processed_source.ast, token1, token2)
@@ -65,24 +60,10 @@ module RuboCop
65
60
 
66
61
  private
67
62
 
68
- def assignment_tokens
69
- tokens = processed_source.tokens.select(&:equal_sign?)
70
- # we don't want to operate on equals signs which are part of an
71
- # optarg in a method definition
72
- # e.g.: def method(optarg = default_val); end
73
- tokens = remove_optarg_equals(tokens, processed_source)
74
-
75
- # Only attempt to align the first = on each line
76
- Set.new(tokens.uniq(&:line))
77
- end
78
-
79
63
  def check_tokens(ast, token1, token2)
80
64
  return if token2.type == :tNL
81
65
 
82
- if force_equal_sign_alignment? &&
83
- @asgn_tokens.include?(token2) &&
84
- (@asgn_lines.include?(token2.line - 1) ||
85
- @asgn_lines.include?(token2.line + 1))
66
+ if force_equal_sign_alignment? && assignment_tokens.include?(token2)
86
67
  check_assignment(token2)
87
68
  else
88
69
  check_other(token1, token2, ast)
@@ -90,32 +71,18 @@ module RuboCop
90
71
  end
91
72
 
92
73
  def check_assignment(token)
93
- assignment_line = ''
94
- message = ''
95
- if should_aligned_with_preceding_line?(token)
96
- assignment_line = processed_source.preceding_line(token)
97
- message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
98
- else
99
- assignment_line = processed_source.following_line(token)
100
- message = format(MSG_UNALIGNED_ASGN, location: 'following')
101
- end
102
- return if aligned_assignment?(token.pos, assignment_line)
74
+ return unless aligned_with_preceding_assignment(token) == :no
103
75
 
76
+ message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
104
77
  add_offense(token.pos, location: token.pos, message: message)
105
78
  end
106
79
 
107
- def should_aligned_with_preceding_line?(token)
108
- @asgn_lines.include?(token.line - 1)
109
- end
110
-
111
80
  def check_other(token1, token2, ast)
112
81
  return false if allow_for_trailing_comments? &&
113
82
  token2.text.start_with?('#')
114
83
 
115
84
  extra_space_range(token1, token2) do |range|
116
- # Unary + doesn't appear as a token and needs special handling.
117
85
  next if ignored_range?(ast, range.begin_pos)
118
- next if unary_plus_non_offense?(range)
119
86
 
120
87
  add_offense(range, location: range, message: MSG_UNNECESSARY)
121
88
  end
@@ -145,13 +112,9 @@ module RuboCop
145
112
  ignored_ranges(ast).any? { |r| r.include?(start_pos) }
146
113
  end
147
114
 
148
- def unary_plus_non_offense?(range)
149
- range.resize(range.size + 1).source =~ /^ ?\+$/
150
- end
151
-
152
115
  # Returns an array of ranges that should not be reported. It's the
153
116
  # extra spaces between the keys and values in a multiline hash,
154
- # since those are handled by the Style/AlignHash cop.
117
+ # since those are handled by the Layout/HashAlignment cop.
155
118
  def ignored_ranges(ast)
156
119
  return [] unless ast
157
120
 
@@ -188,8 +151,8 @@ module RuboCop
188
151
  end
189
152
 
190
153
  def align_equal_signs(range, corrector)
191
- lines = contiguous_assignment_lines(range)
192
- tokens = @asgn_tokens.select { |t| lines.include?(t.line) }
154
+ lines = all_relevant_assignment_lines(range.line)
155
+ tokens = assignment_tokens.select { |t| lines.include?(t.line) }
193
156
 
194
157
  columns = tokens.map { |t| align_column(t) }
195
158
  align_to = columns.max
@@ -209,17 +172,15 @@ module RuboCop
209
172
  end
210
173
  end
211
174
 
212
- def contiguous_assignment_lines(range)
213
- result = [range.line]
175
+ def all_relevant_assignment_lines(line_number)
176
+ last_line_number = processed_source.lines.size
214
177
 
215
- range.line.downto(1) do |lineno|
216
- @asgn_lines.include?(lineno) ? result << lineno : break
217
- end
218
- range.line.upto(processed_source.lines.size) do |lineno|
219
- @asgn_lines.include?(lineno) ? result << lineno : break
220
- end
221
-
222
- result.sort!
178
+ (
179
+ relevant_assignment_lines(line_number.downto(1)) +
180
+ relevant_assignment_lines(line_number.upto(last_line_number))
181
+ )
182
+ .uniq
183
+ .sort
223
184
  end
224
185
 
225
186
  def align_column(asgn_token)
@@ -231,12 +192,6 @@ module RuboCop
231
192
  asgn_token.pos.last_column - spaces + 1
232
193
  end
233
194
 
234
- def remove_optarg_equals(asgn_tokens, processed_source)
235
- optargs = processed_source.ast.each_node(:optarg)
236
- optarg_eql = optargs.map { |o| o.loc.operator.begin_pos }.to_set
237
- asgn_tokens.reject { |t| optarg_eql.include?(t.begin_pos) }
238
- end
239
-
240
195
  def allow_for_trailing_comments?
241
196
  cop_config['AllowBeforeTrailingComments']
242
197
  end
@@ -5,11 +5,11 @@ module RuboCop
5
5
  # rubocop:disable Metrics/LineLength
6
6
  module Layout
7
7
  # This cop checks the indentation of the first argument in a method call.
8
- # Arguments after the first one are checked by Layout/AlignArguments,
8
+ # Arguments after the first one are checked by Layout/ArgumentAlignment,
9
9
  # not by this cop.
10
10
  #
11
11
  # For indenting the first parameter of method *definitions*, check out
12
- # Layout/IndentFirstParameter.
12
+ # Layout/FirstParameterIndentation.
13
13
  #
14
14
  # @example
15
15
  #
@@ -142,7 +142,7 @@ module RuboCop
142
142
  # nested_first_param),
143
143
  # second_param
144
144
  #
145
- class IndentFirstArgument < Cop
145
+ class FirstArgumentIndentation < Cop
146
146
  # rubocop:enable Metrics/LineLength
147
147
  include Alignment
148
148
  include ConfigurableEnforcedStyle
@@ -228,19 +228,21 @@ module RuboCop
228
228
  # containing the previous line that's not a comment line or a blank
229
229
  # line.
230
230
  def previous_code_line(line_number)
231
- @comment_lines ||=
232
- processed_source
233
- .comments
234
- .select { |c| begins_its_line?(c.loc.expression) }
235
- .map { |c| c.loc.line }
236
-
237
231
  line = ''
238
- while line.blank? || @comment_lines.include?(line_number)
232
+ while line.blank? || comment_lines.include?(line_number)
239
233
  line_number -= 1
240
234
  line = processed_source.lines[line_number - 1]
241
235
  end
242
236
  line
243
237
  end
238
+
239
+ def comment_lines
240
+ @comment_lines ||=
241
+ processed_source
242
+ .comments
243
+ .select { |c| begins_its_line?(c.loc.expression) }
244
+ .map { |c| c.loc.line }
245
+ end
244
246
  end
245
247
  end
246
248
  end
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Layout
6
6
  # This cop checks the indentation of the first element in an array literal
7
7
  # where the opening bracket and the first element are on separate lines.
8
- # The other elements' indentations are handled by the AlignArray cop.
8
+ # The other elements' indentations are handled by the ArrayAlignment cop.
9
9
  #
10
10
  # By default, array literals that are arguments in a method call with
11
11
  # parentheses, and where the opening square bracket of the array is on the
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # @example EnforcedStyle: special_inside_parentheses (default)
23
23
  # # The `special_inside_parentheses` style enforces that the first
24
24
  # # element in an array literal where the opening bracket and first
25
- # # element are on seprate lines is indented one step (two spaces) more
25
+ # # element are on separate lines is indented one step (two spaces) more
26
26
  # # than the position inside the opening parenthesis.
27
27
  #
28
28
  # #bad
@@ -44,7 +44,7 @@ module RuboCop
44
44
  # @example EnforcedStyle: consistent
45
45
  # # The `consistent` style enforces that the first element in an array
46
46
  # # literal where the opening bracket and the first element are on
47
- # # seprate lines is indented the same as an array literal which is not
47
+ # # separate lines is indented the same as an array literal which is not
48
48
  # # defined inside a method call.
49
49
  #
50
50
  # #bad
@@ -79,7 +79,7 @@ module RuboCop
79
79
  # and_now_for_something = [
80
80
  # :completely_different
81
81
  # ]
82
- class IndentFirstArrayElement < Cop
82
+ class FirstArrayElementIndentation < Cop
83
83
  include Alignment
84
84
  include ConfigurableEnforcedStyle
85
85
  include MultilineElementIndentation