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)


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

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

#aligned_char?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 66

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

#aligned_identical?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#aligned_operator?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#aligned_token?(range, line) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
55
56
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 52

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
28
29
30
31
32
33
# 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)
  return true if aligned_with_line?(pre, range, &predicate) ||
                 aligned_with_line?(post, 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_line?(pre, range, base_indentation, &predicate) ||
    aligned_with_line?(post, range, base_indentation, &predicate)
end

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

Returns:

  • (Boolean)


35
36
37
38
39
40
41
42
43
44
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 35

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]
    next if line =~ /\A\s*\Z/
    next if indent && indent != (line =~ /\S/)
    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)


62
63
64
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 62

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



46
47
48
49
50
# File 'lib/rubocop/cop/mixin/preceding_following_alignment.rb', line 46

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