Module: RuboCop::Cop::PrecedingFollowingAlignment

Included in:
Style::ExtraSpacing, Style::SpaceAroundOperators, Style::SpaceBeforeFirstArg
Defined in:
lib/rubocop/cop/mixin/preceding_following_alignment.rb

Overview

Common functionality for checking whether an AST node/token is aligned with something on a preceding or following line

Instance Method Summary collapse

Instance Method Details

#aligned_assignment?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 81

def aligned_assignment?(range, line)
  range.source[-1] == '=' && line[range.last_column - 1] == '='
end

#aligned_char?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 77

def aligned_char?(range, line)
  line[range.column] == range.source[0]
end

#aligned_identical?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 85

def aligned_identical?(range, line)
  range.source == line[range.column, range.size]
end

#aligned_operator?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 69

def aligned_operator?(range, line)
  (aligned_identical?(range, line) || aligned_assignment?(range, line))
end

#aligned_token?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 63

def aligned_token?(range, line)
  aligned_words?(range, line) ||
    aligned_char?(range, line) ||
    aligned_assignment?(range, line)
end

#aligned_with_adjacent_line?(range, predicate) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
24
25
26
27
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 21

def aligned_with_adjacent_line?(range, predicate)
  # minus 2 because node.loc.line is zero-based
  pre  = (range.line - 2).downto(0)
  post = range.line.upto(processed_source.lines.size - 1)

  aligned_with_any_line_range?([pre, post], range, &predicate)
end

#aligned_with_any_line?(line_ranges, range, indent = nil, &predicate) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 39

def aligned_with_any_line?(line_ranges, range, indent = nil, &predicate)
  line_ranges.any? do |line_nos|
    aligned_with_line?(line_nos, range, indent, &predicate)
  end
end

#aligned_with_any_line_range?(line_ranges, range, &predicate) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
34
35
36
37
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 29

def aligned_with_any_line_range?(line_ranges, range, &predicate)
  return true if aligned_with_any_line?(line_ranges, range, &predicate)

  # If no aligned token was found, search for an aligned token on the
  # nearest line with the same indentation as the checked line.
  base_indentation = processed_source.lines[range.line - 1] =~ /\S/

  aligned_with_any_line?(line_ranges, range, base_indentation, &predicate)
end

#aligned_with_line?(line_nos, range, indent = nil) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 45

def aligned_with_line?(line_nos, range, indent = nil)
  line_nos.each do |lineno|
    next if comment_lines.include?(lineno + 1)
    line = processed_source.lines[lineno]
    index = line =~ /\S/
    next unless index
    next if indent && indent != index
    return yield(range, line)
  end
  false
end

#aligned_with_operator?(range) ⇒ Boolean

Returns:

  • (Boolean)


17
18
19
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 17

def aligned_with_operator?(range)
  aligned_with_adjacent_line?(range, method(:aligned_operator?))
end

#aligned_with_something?(range) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 13

def aligned_with_something?(range)
  aligned_with_adjacent_line?(range, method(:aligned_token?))
end

#aligned_words?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 73

def aligned_words?(range, line)
  line[range.column - 1, 2] =~ /\s\S/
end

#allow_for_alignment?Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 9

def allow_for_alignment?
  cop_config['AllowForAlignment']
end

#comment_linesObject



57
58
59
60
61
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 57

def comment_lines
  @comment_lines ||= processed_source.comments.map(&:loc).select do |r|
    begins_its_line?(r.expression)
  end.map(&:line)
end