class RuboCop::Cop::Layout::LineContinuationLeadingSpace
Checks that strings broken over multiple lines (by a backslash) contain trailing spaces instead of leading spaces (default) or leading spaces instead of trailing spaces.
@example EnforcedStyle: trailing (default)
# bad 'this text contains a lot of' \ ' spaces' # good 'this text contains a lot of ' \ 'spaces' # bad 'this text is too' \ ' long' # good 'this text is too ' \ 'long'
@example EnforcedStyle: leading
# bad 'this text contains a lot of ' \ 'spaces' # good 'this text contains a lot of' \ ' spaces' # bad 'this text is too ' \ 'long' # good 'this text is too' \ ' long'
Constants
- LEADING_STYLE_OFFENSE
- LINE_1_ENDING
- LINE_2_BEGINNING
- TRAILING_STYLE_OFFENSE
Public Class Methods
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 59 def self.autocorrect_incompatible_with [Style::StringLiterals] end
When both cops are activated and run in the same iteration of the correction loop, ‘Style/StringLiterals` undoes the moving of spaces that `Layout/LineContinuationLeadingSpace` performs. This is because `Style/StringLiterals` takes the original string content and transforms it, rather than just modifying the delimiters, in order to handle escaping for quotes within the string.
Public Instance Methods
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 63 def on_dstr(node) # Quick check if we possibly have line continuations. return unless node.source.include?('\\') end_of_first_line = node.source_range.begin_pos - node.source_range.column lines = raw_lines(node) lines.each_cons(2).with_index(node.first_line) do |(raw_line_one, raw_line_two), line_num| end_of_first_line += raw_line_one.length next unless continuation?(raw_line_one, line_num, node) investigate(raw_line_one, raw_line_two, end_of_first_line) end end
Private Instance Methods
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 122 def autocorrect(corrector, offense_range, insert_pos, spaces) corrector.remove(offense_range) corrector.replace(range_between(insert_pos, insert_pos), spaces) end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 115 def continuation?(line, line_num, node) return false unless line.end_with?("\\\n") # Ensure backslash isn't part of a token spanning to the next line. node.children.none? { |c| (c.first_line...c.last_line).cover?(line_num) && c.multiline? } end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 147 def enforced_style_leading? cop_config['EnforcedStyle'] == 'leading' end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 85 def investigate(first_line, second_line, end_of_first_line) if enforced_style_leading? investigate_leading_style(first_line, second_line, end_of_first_line) else investigate_trailing_style(first_line, second_line, end_of_first_line) end end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 93 def investigate_leading_style(first_line, second_line, end_of_first_line) matches = first_line.match(LEADING_STYLE_OFFENSE) return if matches.nil? offense_range = leading_offense_range(end_of_first_line, matches) add_offense(offense_range) do |corrector| insert_pos = end_of_first_line + second_line[LINE_2_BEGINNING].length autocorrect(corrector, offense_range, insert_pos, matches[:trailing_spaces]) end end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 104 def investigate_trailing_style(first_line, second_line, end_of_first_line) matches = second_line.match(TRAILING_STYLE_OFFENSE) return if matches.nil? offense_range = trailing_offense_range(end_of_first_line, matches) add_offense(offense_range) do |corrector| insert_pos = end_of_first_line - first_line[LINE_1_ENDING].length autocorrect(corrector, offense_range, insert_pos, matches[:leading_spaces]) end end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 127 def leading_offense_range(end_of_first_line, matches) end_pos = end_of_first_line - matches[:ending].length begin_pos = end_pos - matches[:trailing_spaces].length range_between(begin_pos, end_pos) end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 139 def message(_range) if enforced_style_leading? 'Move trailing spaces to the start of the next line.' else 'Move leading spaces to the end of the previous line.' end end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 81 def raw_lines(node) processed_source.raw_source.lines[node.first_line - 1, line_range(node).size] end
Source
# File lib/rubocop/cop/layout/line_continuation_leading_space.rb, line 133 def trailing_offense_range(end_of_first_line, matches) begin_pos = end_of_first_line + matches[:beginning].length end_pos = begin_pos + matches[:leading_spaces].length range_between(begin_pos, end_pos) end