Class: SimpleCov::StaticCoverageExtractor::Visitor

Inherits:
Prism::Visitor
  • Object
show all
Includes:
MethodCollector
Defined in:
lib/simplecov/static_coverage_extractor/visitor.rb

Overview

Prism visitor that accumulates branch and method tuples in the shape Ruby’s ‘Coverage` reports. Tuple ids are sequential across the file — `Coverage` uses sequential ids too, so this matches the conventional shape. Only defined when Prism is loadable; `StaticCoverageExtractor.available?` is the runtime gate.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MethodCollector

#visit_class_node, #visit_def_node, #visit_module_node

Constructor Details

#initializeVisitor

Returns a new instance of Visitor.



35
36
37
38
39
40
41
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 35

def initialize
  super
  @branches = {}
  @methods = {}
  @next_id = 0
  @class_stack = []
end

Instance Attribute Details

#branchesObject (readonly)

Returns the value of attribute branches.



33
34
35
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 33

def branches
  @branches
end

#methodsObject (readonly)

Returns the value of attribute methods.



33
34
35
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 33

def methods
  @methods
end

Instance Method Details

#visit_call_node(node) ⇒ Object



59
60
61
62
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 59

def visit_call_node(node)
  emit_safe_navigation(node) if node.respond_to?(:safe_navigation?) && node.safe_navigation?
  super
end

#visit_case_match_node(node) ⇒ Object



72
73
74
75
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 72

def visit_case_match_node(node)
  emit_case_like(node, :in)
  super
end

#visit_case_node(node) ⇒ Object

‘case`/`when` and `case`/`in` (pattern matching) parse as CaseNode and CaseMatchNode respectively. When there’s no explicit ‘else`, Coverage synthesizes one at the case’s range.



67
68
69
70
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 67

def visit_case_node(node)
  emit_case_like(node, :when)
  super
end

#visit_if_node(node) ⇒ Object

‘if` / `unless` / postfix-if / postfix-unless / ternary all parse as IfNode (or UnlessNode). Both carry a `then` arm (the statements body) and an optional `subsequent` (an ElseNode for `else`, another IfNode for `elsif`). When the subsequent is missing, Coverage synthesizes a `:else` arm attributed to the whole condition’s range — we do the same.



49
50
51
52
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 49

def visit_if_node(node)
  emit_if_like(node, :if)
  super
end

#visit_unless_node(node) ⇒ Object



54
55
56
57
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 54

def visit_unless_node(node)
  emit_if_like(node, :unless)
  super
end

#visit_until_node(node) ⇒ Object



84
85
86
87
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 84

def visit_until_node(node)
  emit_loop(node, :until)
  super
end

#visit_while_node(node) ⇒ Object

‘while` / `until` loops get a single `:body` arm. No synthetic else (the loop either runs the body or doesn’t).



79
80
81
82
# File 'lib/simplecov/static_coverage_extractor/visitor.rb', line 79

def visit_while_node(node)
  emit_loop(node, :while)
  super
end