class Mudguard::Domain::SourceProcessor

Processes the interesting parts of the Ast and forwards selected nodes to the visitors

Public Class Methods

new(location:) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 7
def initialize(location:)
  @location = location
end

Public Instance Methods

process(node, visitor) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 11
def process(node, visitor)
  process_node(node, visitor, "")
end

Private Instance Methods

describe_location(node) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 48
def describe_location(node)
  "#{@location}:#{node.location.line}"
end
find_const_name(children) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 70
def find_const_name(children)
  return [false, nil] if children.nil? || children.empty?

  first_child = children[0]
  is_explicit, is_static = find_const_type(first_child)
  first_child_children = first_child.respond_to?(:children) ? first_child.children : nil
  _, __, module_name = find_const_name(first_child_children)
  const_name = children[1].to_s
  [is_explicit, is_static, "#{module_name}::#{const_name}"]
end
find_const_type(first_child) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 81
def find_const_type(first_child)
  is_explicit = type?(:cbase).call(first_child)
  is_static = is_explicit || first_child.nil? || type?(:const).call(first_child)
  [is_explicit, is_static]
end
ignore_and_continue(node, visitor, module_name) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 52
def ignore_and_continue(node, visitor, module_name)
  return unless node.respond_to?(:children)

  node.children.flat_map { |c| process_node(c, visitor, module_name) }
end
process_const(node, visitor, module_name) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 40
def process_const(node, visitor, module_name)
  is_explicit, is_static, const_name = find_const_name(node.children)
  return unless is_static

  visitor.visit_dependency(describe_location(node), const_name,
                           is_explicit ? "" : module_name)
end
process_const_assignment(node, visitor, module_name) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 32
def process_const_assignment(node, visitor, module_name)
  is_explicit, is_static, const_name = find_const_name(node.children)
  return unless is_static

  visitor.visit_const_declaration(describe_location(node), const_name,
                                  is_explicit ? "" : module_name)
end
process_module(node, visitor, module_name) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 58
def process_module(node, visitor, module_name)
  is_explicit, is_static, const_name = find_const_name(node.children[0].children)
  return unless is_static

  visitor.visit_const_declaration(describe_location(node), const_name, module_name)

  module_name = "#{is_explicit ? '' : module_name}#{const_name}"
  node.children.drop(1).reject(&:nil?).each do |child_node|
    process_node(child_node, visitor, module_name)
  end
end
process_node(node, visitor, module_name) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 17
def process_node(node, visitor, module_name) # rubocop:disable Metrics/MethodLength
  case node
  when type?(:module)
    process_module(node, visitor, module_name)
  when type?(:class)
    process_module(node, visitor, module_name)
  when type?(:const)
    process_const(node, visitor, module_name)
  when type?(:casgn)
    process_const_assignment(node, visitor, module_name)
  else
    ignore_and_continue(node, visitor, module_name)
  end
end
type?(type) click to toggle source
# File lib/mudguard/domain/source_processor.rb, line 87
def type?(type)
  ->(n) { n.respond_to?(:type) && n.type == type }
end