Class: RubyLsp::TypeGuessr::DebugGraphBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_lsp/type_guessr/debug_graph_builder.rb

Overview

Builds graph data from IR nodes for visualization Uses body_nodes structure with value/receiver/args edges

Constant Summary collapse

MAX_NODES =

Limit to MAX_NODES to prevent infinite/huge graphs

200

Instance Method Summary collapse

Constructor Details

#initialize(runtime_adapter) ⇒ DebugGraphBuilder

Returns a new instance of DebugGraphBuilder.



8
9
10
# File 'lib/ruby_lsp/type_guessr/debug_graph_builder.rb', line 8

def initialize(runtime_adapter)
  @runtime_adapter = runtime_adapter
end

Instance Method Details

#build(node_key) ⇒ Hash?

Build graph data starting from a node key

Parameters:

  • node_key (String)

    The starting node key (e.g., “User#save:def:save:10”)

Returns:

  • (Hash, nil)

    Graph data with nodes and edges, or nil if node not found



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ruby_lsp/type_guessr/debug_graph_builder.rb', line 15

def build(node_key)
  root_node = @runtime_adapter.find_node_by_key(node_key)
  return nil unless root_node

  @nodes = {}
  @edges = []
  @scope_id = extract_scope_id(node_key)

  if root_node.is_a?(::TypeGuessr::Core::IR::DefNode)
    build_def_node_graph(root_node, node_key)
  else
    # Fallback for non-DefNode: use BFS with dependencies
    traverse_dependencies(root_node, node_key)
  end

  result = {
    nodes: @nodes.values,
    edges: @edges,
    root_key: node_key
  }

  result[:def_node_inspect] = root_node.tree_inspect(root: true) if root_node.is_a?(::TypeGuessr::Core::IR::DefNode)

  result
end