rubocop 0.91.0 → 1.0.0

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 (131) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +100 -54
  4. data/lib/rubocop.rb +10 -6
  5. data/lib/rubocop/cached_data.rb +2 -1
  6. data/lib/rubocop/cli/command/version.rb +1 -1
  7. data/lib/rubocop/comment_config.rb +9 -5
  8. data/lib/rubocop/config.rb +4 -0
  9. data/lib/rubocop/config_loader.rb +19 -2
  10. data/lib/rubocop/config_loader_resolver.rb +7 -5
  11. data/lib/rubocop/config_regeneration.rb +33 -0
  12. data/lib/rubocop/config_validator.rb +7 -6
  13. data/lib/rubocop/cop/badge.rb +9 -24
  14. data/lib/rubocop/cop/base.rb +16 -1
  15. data/lib/rubocop/cop/commissioner.rb +34 -20
  16. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  17. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  18. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
  19. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  20. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  21. data/lib/rubocop/cop/layout/class_structure.rb +8 -1
  22. data/lib/rubocop/cop/layout/dot_position.rb +6 -9
  23. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  24. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +4 -13
  25. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +13 -8
  26. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -2
  27. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -2
  28. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +10 -1
  29. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +4 -13
  30. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -1
  31. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -7
  32. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +0 -4
  33. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -18
  34. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -2
  35. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -2
  36. data/lib/rubocop/cop/layout/trailing_whitespace.rb +37 -13
  37. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
  38. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +18 -1
  39. data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
  40. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +23 -3
  41. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -4
  42. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
  43. data/lib/rubocop/cop/lint/identity_comparison.rb +5 -3
  44. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  45. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  46. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  47. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
  48. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  49. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +78 -0
  50. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  51. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  52. data/lib/rubocop/cop/lint/to_json.rb +1 -1
  53. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -5
  54. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  55. data/lib/rubocop/cop/lint/useless_times.rb +11 -2
  56. data/lib/rubocop/cop/metrics/block_length.rb +3 -1
  57. data/lib/rubocop/cop/metrics/class_length.rb +14 -6
  58. data/lib/rubocop/cop/metrics/parameter_lists.rb +4 -1
  59. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +25 -16
  60. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  61. data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
  62. data/lib/rubocop/cop/mixin/rescue_node.rb +1 -0
  63. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -3
  64. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  65. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  66. data/lib/rubocop/cop/offense.rb +15 -2
  67. data/lib/rubocop/cop/security/open.rb +12 -10
  68. data/lib/rubocop/cop/style/access_modifier_declarations.rb +6 -2
  69. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
  70. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  71. data/lib/rubocop/cop/style/case_like_if.rb +20 -4
  72. data/lib/rubocop/cop/style/class_equality_comparison.rb +64 -0
  73. data/lib/rubocop/cop/style/combinable_loops.rb +13 -11
  74. data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
  75. data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
  76. data/lib/rubocop/cop/style/date_time.rb +12 -1
  77. data/lib/rubocop/cop/style/explicit_block_argument.rb +6 -2
  78. data/lib/rubocop/cop/style/for.rb +0 -4
  79. data/lib/rubocop/cop/style/format_string_token.rb +48 -3
  80. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +15 -6
  81. data/lib/rubocop/cop/style/if_unless_modifier.rb +0 -4
  82. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -6
  83. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +10 -13
  84. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -11
  85. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +7 -11
  86. data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
  87. data/lib/rubocop/cop/style/mixin_usage.rb +7 -27
  88. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  89. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -0
  90. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -0
  91. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -1
  92. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  93. data/lib/rubocop/cop/style/raise_args.rb +0 -3
  94. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  95. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -9
  96. data/lib/rubocop/cop/style/redundant_begin.rb +36 -8
  97. data/lib/rubocop/cop/style/redundant_condition.rb +5 -1
  98. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  99. data/lib/rubocop/cop/style/redundant_interpolation.rb +6 -1
  100. data/lib/rubocop/cop/style/redundant_parentheses.rb +6 -3
  101. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  102. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +39 -24
  103. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -15
  104. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  105. data/lib/rubocop/cop/style/redundant_self.rb +10 -9
  106. data/lib/rubocop/cop/style/redundant_sort.rb +13 -24
  107. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  108. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  109. data/lib/rubocop/cop/style/safe_navigation.rb +16 -4
  110. data/lib/rubocop/cop/style/string_concatenation.rb +14 -2
  111. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  112. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +4 -3
  113. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +3 -1
  114. data/lib/rubocop/cop/util.rb +0 -1
  115. data/lib/rubocop/cop/variable_force/branch.rb +0 -4
  116. data/lib/rubocop/directive_comment.rb +32 -0
  117. data/lib/rubocop/ext/regexp_node.rb +20 -4
  118. data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
  119. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  120. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  121. data/lib/rubocop/options.rb +22 -17
  122. data/lib/rubocop/result_cache.rb +8 -2
  123. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  124. data/lib/rubocop/rspec/expect_offense.rb +5 -5
  125. data/lib/rubocop/runner.rb +9 -5
  126. data/lib/rubocop/target_finder.rb +27 -26
  127. data/lib/rubocop/target_ruby.rb +1 -1
  128. data/lib/rubocop/version.rb +61 -6
  129. metadata +14 -17
  130. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
  131. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -52,8 +52,8 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def semicolon(node)
55
- @semicolon ||= {}
56
- @semicolon[node.object_id] ||= tokens(node).find(&:semicolon?)
55
+ @semicolon ||= {}.compare_by_identity
56
+ @semicolon[node] ||= processed_source.tokens_within(node).find(&:semicolon?)
57
57
  end
58
58
  end
59
59
  end
@@ -89,7 +89,7 @@ module RuboCop
89
89
  begin_line_num = previous_line_num - base_line_num + 1
90
90
  end_line_num = node.first_line - base_line_num + 1
91
91
  lines = source_in_lines[begin_line_num...end_line_num]
92
- "\n#{(lines.join("\n").split(node.source).first || '')}"
92
+ "\n#{lines.join("\n").split(node.source).first || ''}"
93
93
  end
94
94
 
95
95
  def fix_escaped_content(word_node, escape, delimiters)
@@ -58,24 +58,22 @@ module RuboCop
58
58
  (send _ :required_ruby_version= $_)
59
59
  PATTERN
60
60
 
61
- def_node_matcher :string_version?, <<~PATTERN
62
- {(str _) (array (str _))}
61
+ def_node_matcher :defined_ruby_version, <<~PATTERN
62
+ {$(str _) $(array (str _) (str _))
63
+ (send (const (const nil? :Gem) :Requirement) :new $(str _))}
63
64
  PATTERN
64
65
 
65
66
  # rubocop:disable Metrics/AbcSize
66
67
  def investigate(processed_source)
67
- version = required_ruby_version(processed_source.ast).first
68
+ version_def = required_ruby_version(processed_source.ast).first
68
69
 
69
- if version
70
- return unless string_version?(version)
71
-
72
- ruby_version = extract_ruby_version(version)
73
-
74
- return if ruby_version == target_ruby_version.to_s
70
+ if version_def
71
+ ruby_version = extract_ruby_version(defined_ruby_version(version_def))
72
+ return if !ruby_version || ruby_version == target_ruby_version.to_s
75
73
 
76
74
  add_offense(
77
75
  processed_source.ast,
78
- location: version.loc.expression,
76
+ location: version_def.loc.expression,
79
77
  message: not_equal_message(ruby_version, target_ruby_version)
80
78
  )
81
79
  else
@@ -88,6 +86,8 @@ module RuboCop
88
86
  private
89
87
 
90
88
  def extract_ruby_version(required_ruby_version)
89
+ return unless required_ruby_version
90
+
91
91
  if required_ruby_version.array_type?
92
92
  required_ruby_version = required_ruby_version.children.detect do |v|
93
93
  /[>=]/.match?(v.str_content)
@@ -44,6 +44,7 @@ module RuboCop
44
44
 
45
45
  def on_array(node)
46
46
  return if node.children.size < 2
47
+ return if node.parent&.masgn_type?
47
48
 
48
49
  check_alignment(node.children, base_column(node, node.children))
49
50
  end
@@ -105,7 +105,10 @@ module RuboCop
105
105
  end
106
106
 
107
107
  def incorrect_style(when_node)
108
- add_offense(when_node.loc.keyword) do |corrector|
108
+ depth = indent_one_step? ? 'one step more than' : 'as deep as'
109
+ message = format(MSG, depth: depth, base: style)
110
+
111
+ add_offense(when_node.loc.keyword, message: message) do |corrector|
109
112
  detect_incorrect_style(when_node)
110
113
 
111
114
  whitespace = whitespace_range(when_node)
@@ -125,12 +128,6 @@ module RuboCop
125
128
  end
126
129
  end
127
130
 
128
- def find_message(*)
129
- depth = indent_one_step? ? 'one step more than' : 'as deep as'
130
-
131
- format(MSG, depth: depth, base: style)
132
- end
133
-
134
131
  def base_column(case_node, base)
135
132
  case base
136
133
  when :case then case_node.location.keyword.column
@@ -169,7 +169,7 @@ module RuboCop
169
169
  # Autocorrect by swapping between two nodes autocorrecting them
170
170
  def autocorrect(corrector, node)
171
171
  node_classification = classify(node)
172
- previous = left_siblings_of(node).find do |sibling|
172
+ previous = node.left_siblings.find do |sibling|
173
173
  classification = classify(sibling)
174
174
  !ignore?(classification) && node_classification != classification
175
175
  end
@@ -265,6 +265,9 @@ module RuboCop
265
265
  end
266
266
 
267
267
  def end_position_for(node)
268
+ heredoc = find_heredoc(node)
269
+ return heredoc.location.heredoc_end.end_pos + 1 if heredoc
270
+
268
271
  end_line = buffer.line_for_position(node.loc.expression.end_pos)
269
272
  buffer.line_range(end_line).end_pos
270
273
  end
@@ -284,6 +287,10 @@ module RuboCop
284
287
  buffer.line_range(node.loc.line).begin_pos - 1
285
288
  end
286
289
 
290
+ def find_heredoc(node)
291
+ node.each_node(:str, :dstr, :xstr).find(&:heredoc?)
292
+ end
293
+
287
294
  def buffer
288
295
  processed_source.buffer
289
296
  end
@@ -29,17 +29,14 @@ module RuboCop
29
29
  def on_send(node)
30
30
  return unless node.dot? || ampersand_dot?(node)
31
31
 
32
- if proper_dot_position?(node)
33
- correct_style_detected
34
- else
35
- return unless opposite_style_detected
32
+ return correct_style_detected if proper_dot_position?(node)
36
33
 
37
- dot = node.loc.dot
38
- message = message(dot)
34
+ opposite_style_detected
35
+ dot = node.loc.dot
36
+ message = message(dot)
39
37
 
40
- add_offense(dot, message: message) do |corrector|
41
- autocorrect(corrector, dot, node)
42
- end
38
+ add_offense(dot, message: message) do |corrector|
39
+ autocorrect(corrector, dot, node)
43
40
  end
44
41
  end
45
42
  alias on_csend on_send
@@ -95,7 +95,7 @@ module RuboCop
95
95
  end
96
96
 
97
97
  def next_sibling_parent_empty_or_else?(node)
98
- next_sibling = node.parent.children[node.sibling_index + 1]
98
+ next_sibling = node.right_sibling
99
99
  return true if next_sibling.nil?
100
100
 
101
101
  parent = next_sibling.parent
@@ -104,7 +104,7 @@ module RuboCop
104
104
  end
105
105
 
106
106
  def next_sibling_empty_or_guard_clause?(node)
107
- next_sibling = node.parent.children[node.sibling_index + 1]
107
+ next_sibling = node.right_sibling
108
108
  return true if next_sibling.nil?
109
109
 
110
110
  next_sibling.if_type? && contains_guard_clause?(next_sibling)
@@ -53,7 +53,6 @@ module RuboCop
53
53
  #
54
54
  class EmptyLineAfterMultilineCondition < Base
55
55
  include RangeHelp
56
- include RescueNode
57
56
  extend AutoCorrector
58
57
 
59
58
  MSG = 'Use empty line after multiline condition.'
@@ -62,7 +61,7 @@ module RuboCop
62
61
  return if node.ternary?
63
62
 
64
63
  if node.modifier_form?
65
- check_condition(node.condition) if right_sibling(node)
64
+ check_condition(node.condition) if node.right_sibling
66
65
  else
67
66
  check_condition(node.condition)
68
67
  end
@@ -74,7 +73,7 @@ module RuboCop
74
73
  alias on_until on_while
75
74
 
76
75
  def on_while_post(node)
77
- return unless right_sibling(node)
76
+ return unless node.right_sibling
78
77
 
79
78
  check_condition(node.condition)
80
79
  end
@@ -92,10 +91,8 @@ module RuboCop
92
91
  end
93
92
 
94
93
  def on_rescue(node)
95
- _body, *resbodies, _else = *node
96
-
97
- resbodies.each do |resbody|
98
- rescued_exceptions = rescued_exceptions(resbody)
94
+ node.resbody_branches.each do |resbody|
95
+ rescued_exceptions = resbody.exceptions
99
96
  next if !multiline_rescue_exceptions?(rescued_exceptions) ||
100
97
  next_line_empty?(rescued_exceptions.last.last_line)
101
98
 
@@ -116,12 +113,6 @@ module RuboCop
116
113
  processed_source[line].blank?
117
114
  end
118
115
 
119
- def right_sibling(node)
120
- return unless node.parent
121
-
122
- node.parent.children[node.sibling_index + 1]
123
- end
124
-
125
116
  def multiline_when_condition?(when_node)
126
117
  when_node.conditions.first.first_line != when_node.conditions.last.last_line
127
118
  end
@@ -84,14 +84,8 @@ module RuboCop
84
84
  end
85
85
 
86
86
  def on_send(node)
87
- return unless node.bare_access_modifier?
88
-
89
- case style
90
- when :around
91
- return if empty_lines_around?(node)
92
- when :only_before
93
- return if allowed_only_before_style?(node)
94
- end
87
+ return unless node.bare_access_modifier? && !node.parent&.block_type?
88
+ return if expected_empty_lines?(node)
95
89
 
96
90
  message = message(node)
97
91
  add_offense(node, message: message) do |corrector|
@@ -105,6 +99,17 @@ module RuboCop
105
99
 
106
100
  private
107
101
 
102
+ def expected_empty_lines?(node)
103
+ case style
104
+ when :around
105
+ return true if empty_lines_around?(node)
106
+ when :only_before
107
+ return true if allowed_only_before_style?(node)
108
+ end
109
+
110
+ false
111
+ end
112
+
108
113
  def allowed_only_before_style?(node)
109
114
  if node.special_modifier?
110
115
  return true if processed_source[node.last_line] == 'end'
@@ -88,7 +88,7 @@ module RuboCop
88
88
  end
89
89
 
90
90
  def require_empty_line?(node)
91
- return false unless node&.respond_to?(:type)
91
+ return false unless node.respond_to?(:type)
92
92
 
93
93
  !allow_alias?(node) && !attribute_or_allowed_method?(node)
94
94
  end
@@ -96,7 +96,7 @@ module RuboCop
96
96
  def next_line_node(node)
97
97
  return if node.parent.if_type?
98
98
 
99
- node.parent.children[node.sibling_index + 1]
99
+ node.right_sibling
100
100
  end
101
101
 
102
102
  def allow_alias?(node)
@@ -113,10 +113,9 @@ module RuboCop
113
113
  end
114
114
 
115
115
  def keyword_locations_in_rescue(node)
116
- _begin_body, *resbodies, _else_body = *node
117
116
  [
118
117
  node.loc.else,
119
- *resbodies.map { |body| body.loc.keyword }
118
+ *node.resbody_branches.map { |body| body.loc.keyword }
120
119
  ].compact
121
120
  end
122
121
 
@@ -191,7 +191,16 @@ module RuboCop
191
191
  end
192
192
 
193
193
  def begin_end_alignment_style
194
- config.for_cop('Layout/BeginEndAlignment')['EnforcedStyleAlignWith']
194
+ # FIXME: Workaround for pending status for `Layout/BeginEndAlignment` cop
195
+ # When RuboCop 1.0 is released, please replace it with the following condition.
196
+ #
197
+ # config.for_cop('Layout/BeginEndAlignment')['Enabled'] &&
198
+ # config.for_cop('Layout/BeginEndAlignment')['EnforcedStyleAlignWith']
199
+ if config.for_all_cops['NewCops'] == 'enable' ||
200
+ config.for_cop('Layout/BeginEndAlignment')['Enabled'] &&
201
+ config.for_cop('Layout/BeginEndAlignment')['Enabled'] != 'pending'
202
+ config.for_cop('Layout/BeginEndAlignment')['EnforcedStyleAlignWith']
203
+ end
195
204
  end
196
205
  end
197
206
  end
@@ -36,8 +36,8 @@ module RuboCop
36
36
  MSG = 'Surrounding space %<type>s in default value assignment.'
37
37
 
38
38
  def on_optarg(node)
39
- index = index_of_first_token(node)
40
- arg, equals, value = processed_source.tokens[index, 3]
39
+ tokens = processed_source.tokens_within(node)
40
+ arg, equals, value = tokens.take(3)
41
41
  check_optarg(arg, equals, value)
42
42
  end
43
43
 
@@ -51,22 +51,13 @@ module RuboCop
51
51
  style == :no_space && no_surrounding_space
52
52
  correct_style_detected
53
53
  else
54
- incorrect_style_detected(arg, value, space_on_both_sides,
55
- no_surrounding_space)
54
+ incorrect_style_detected(arg, value)
56
55
  end
57
56
  end
58
57
 
59
- def incorrect_style_detected(arg, value, space_on_both_sides,
60
- no_surrounding_space)
58
+ def incorrect_style_detected(arg, value)
61
59
  range = range_between(arg.end_pos, value.begin_pos)
62
60
 
63
- if style == :space && no_surrounding_space ||
64
- style == :no_space && space_on_both_sides
65
- return unless opposite_style_detected
66
- else
67
- return unless unrecognized_style_detected
68
- end
69
-
70
61
  add_offense(range) do |corrector|
71
62
  autocorrect(corrector, range)
72
63
  end
@@ -5,6 +5,8 @@ module RuboCop
5
5
  module Layout
6
6
  # Checks that operators have space around them, except for ** which
7
7
  # should or shouldn't have surrounding space depending on configuration.
8
+ # It allows vertical alignment consisting of one or more whitespace
9
+ # around operators.
8
10
  #
9
11
  # This cop has `AllowForAlignment` option. When `true`, allows most
10
12
  # uses of extra spacing if the intent is to align with an operator on
@@ -207,7 +209,8 @@ module RuboCop
207
209
  token = Token.new(operator, nil, operator.source)
208
210
  align_preceding = aligned_with_preceding_assignment(token)
209
211
 
210
- return align_preceding == :no unless align_preceding == :none
212
+ return false if align_preceding == :yes ||
213
+ aligned_with_subsequent_assignment(token) == :none
211
214
 
212
215
  aligned_with_subsequent_assignment(token) != :yes
213
216
  end
@@ -108,11 +108,11 @@ module RuboCop
108
108
  end
109
109
 
110
110
  def left_array_bracket(node)
111
- tokens(node).find(&:left_array_bracket?)
111
+ processed_source.tokens_within(node).find(&:left_array_bracket?)
112
112
  end
113
113
 
114
114
  def right_array_bracket(node)
115
- tokens(node).reverse.find(&:right_bracket?)
115
+ processed_source.tokens_within(node).reverse.find(&:right_bracket?)
116
116
  end
117
117
 
118
118
  def empty_config
@@ -120,7 +120,7 @@ module RuboCop
120
120
  end
121
121
 
122
122
  def next_to_newline?(node, token)
123
- tokens(node)[index_for(node, token) + 1].line != token.line
123
+ processed_source.tokens_within(node)[index_for(node, token) + 1].line != token.line
124
124
  end
125
125
 
126
126
  def end_has_own_line?(token)
@@ -131,7 +131,7 @@ module RuboCop
131
131
  end
132
132
 
133
133
  def index_for(node, token)
134
- tokens(node).index(token)
134
+ processed_source.tokens_within(node).index(token)
135
135
  end
136
136
 
137
137
  def line_and_column_for(token)
@@ -153,7 +153,7 @@ module RuboCop
153
153
  end
154
154
 
155
155
  def next_to_comment?(node, token)
156
- tokens(node)[index_for(node, token) + 1].comment?
156
+ processed_source.tokens_within(node)[index_for(node, token) + 1].comment?
157
157
  end
158
158
 
159
159
  def compact_offenses(node, left, right, start_ok, end_ok)
@@ -184,9 +184,9 @@ module RuboCop
184
184
  def multi_dimensional_array?(node, token, side: :right)
185
185
  i = index_for(node, token)
186
186
  if side == :right
187
- tokens(node)[i - 1].right_bracket?
187
+ processed_source.tokens_within(node)[i - 1].right_bracket?
188
188
  else
189
- tokens(node)[i + 1].left_array_bracket?
189
+ processed_source.tokens_within(node)[i + 1].left_array_bracket?
190
190
  end
191
191
  end
192
192
 
@@ -206,8 +206,6 @@ module RuboCop
206
206
 
207
207
  def no_space(begin_pos, end_pos, msg)
208
208
  if style == :space
209
- return unless opposite_style_detected
210
-
211
209
  offense(begin_pos, end_pos, msg)
212
210
  else
213
211
  correct_style_detected
@@ -216,8 +214,6 @@ module RuboCop
216
214
 
217
215
  def space(begin_pos, end_pos, msg)
218
216
  if style == :no_space
219
- return unless opposite_style_detected
220
-
221
217
  offense(begin_pos, end_pos, msg)
222
218
  else
223
219
  correct_style_detected
@@ -72,29 +72,15 @@ module RuboCop
72
72
  MSG = 'Space inside %<problem>s.'
73
73
 
74
74
  def on_hash(node)
75
- tokens = processed_source.tokens
75
+ tokens = processed_source.tokens_within(node)
76
+ return unless tokens.first.left_brace? && tokens.last.right_curly_brace?
76
77
 
77
- hash_literal_with_braces(node) do |begin_index, end_index|
78
- check(tokens[begin_index], tokens[begin_index + 1])
79
- return if begin_index == end_index - 1
80
-
81
- check(tokens[end_index - 1], tokens[end_index])
82
- end
78
+ check(tokens[0], tokens[1])
79
+ check(tokens[-2], tokens[-1]) if tokens.size > 2
83
80
  end
84
81
 
85
82
  private
86
83
 
87
- def hash_literal_with_braces(node)
88
- tokens = processed_source.tokens
89
- begin_index = index_of_first_token(node)
90
- return unless tokens[begin_index].left_brace?
91
-
92
- end_index = index_of_last_token(node)
93
- return unless tokens[end_index].right_curly_brace?
94
-
95
- yield begin_index, end_index
96
- end
97
-
98
84
  def check(token1, token2)
99
85
  # No offense if line break inside.
100
86
  return if token1.line < token2.line