Skip to main content

fallow_engine/
trace_chain.rs

1//! Symbol trace types exposed through the engine boundary.
2
3use fallow_config::ResolvedConfig;
4
5use crate::{EngineError, EngineResult, core_backend, session::AnalysisSession};
6
7use fallow_types::trace_chain::{SymbolChainQuery, SymbolChainTrace};
8
9/// Run symbol-level call-chain tracing through the engine boundary.
10///
11/// # Errors
12///
13/// Returns an error if parsing, graph construction, or retained module
14/// analysis fails.
15pub fn trace_symbol_chain(
16    config: &ResolvedConfig,
17    query: SymbolChainQuery<'_>,
18) -> EngineResult<Option<SymbolChainTrace>> {
19    let session = AnalysisSession::from_resolved_config(config.clone());
20    trace_symbol_chain_with_session(&session, query)
21}
22
23/// Run symbol-level call-chain tracing through an existing analysis session.
24///
25/// # Errors
26///
27/// Returns an error if parsing, graph construction, or retained module
28/// analysis fails.
29pub fn trace_symbol_chain_with_session(
30    session: &AnalysisSession,
31    query: SymbolChainQuery<'_>,
32) -> EngineResult<Option<SymbolChainTrace>> {
33    let output = session.analyze_dead_code_with_artifacts(true, true)?;
34    let graph = output
35        .graph
36        .as_ref()
37        .ok_or_else(|| EngineError::new("trace requires a retained module graph"))?;
38    let modules = output.modules.as_deref().unwrap_or(&[]);
39    Ok(core_backend::trace_symbol_chain(
40        graph.as_graph(),
41        modules,
42        session.root(),
43        query,
44    ))
45}