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