class SCSSLint::Linter::EmptyLineBetweenBlocks

Reports the lack of empty lines between block defintions.

Constants

MESSAGE_FORMAT

Public Instance Methods

visit_atroot(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 8
def visit_atroot(node)
  check(node, '@at-root')
  yield
end
visit_function(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 13
def visit_function(node)
  check(node, '@function')
  yield
end
visit_media(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 18
def visit_media(node)
  check(node, '@media')
  yield
end
visit_mixin(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 23
def visit_mixin(node)
  # Ignore @includes which don't have any block content
  check(node, '@include') if node.children
                                 .any? { |child| child.is_a?(Sass::Tree::Node) }
  yield
end
visit_mixindef(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 30
def visit_mixindef(node)
  check(node, '@mixin')
  yield
end
visit_rule(node) { || ... } click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 35
def visit_rule(node)
  check(node, 'Rule')
  yield
end

Private Instance Methods

check(node, type) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 44
def check(node, type)
  return if config['ignore_single_line_blocks'] && node_on_single_line?(node)
  check_preceding_node(node, type)
  check_following_node(node, type)
end
check_following_node(node, type) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 50
def check_following_node(node, type)
  return unless (following_node = next_node(node)) &&
                (next_start_line = following_node.line)

  # Special case: ignore comments immediately after a closing brace
  return if comment_after_closing_brace?(following_node, next_start_line)

  # Special case: ignore `@else` nodes which are children of the parent `@if`
  return if else_node?(following_node)

  # Otherwise check if line before the next node's starting line is blank
  return if next_line_blank?(next_start_line)

  add_lint(next_start_line - 1, MESSAGE_FORMAT % [type, 'followed'])
end
check_preceding_node(node, type) click to toggle source

In cases where the previous node is not a block declaration, we won't have run any checks against it, so we need to check here if the previous line is an empty line

# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 80
def check_preceding_node(node, type)
  case prev_node(node)
  when
    nil,
    Sass::Tree::FunctionNode,
    Sass::Tree::MixinNode,
    Sass::Tree::MixinDefNode,
    Sass::Tree::RuleNode,
    Sass::Tree::CommentNode
    # Ignore
    nil
  else
    unless engine.lines[node.line - 2].strip.empty?
      add_lint(node.line, MESSAGE_FORMAT % [type, 'preceded'])
    end
  end
end
comment_after_closing_brace?(node, next_start_line) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 66
def comment_after_closing_brace?(node, next_start_line)
  line = engine.lines[next_start_line - 1].strip

  node.is_a?(Sass::Tree::CommentNode) &&
    line =~ %r{\s*\}?\s*/(/|\*)}
end
next_line_blank?(next_start_line) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 73
def next_line_blank?(next_start_line)
  engine.lines[next_start_line - 2].strip.empty?
end
next_node(node) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 98
def next_node(node)
  return unless siblings = node_siblings(node)
  siblings[siblings.index(node) + 1] if siblings.count > 1
end
prev_node(node) click to toggle source
# File lib/scss_lint/linter/empty_line_between_blocks.rb, line 103
def prev_node(node)
  return unless siblings = node_siblings(node)
  index = siblings.index(node)
  siblings[index - 1] if index > 0 && siblings.count > 1
end