home / skills / zhanghandong / rust-skills / rust-call-graph

rust-call-graph skill

/skills/rust-call-graph

This skill visualizes Rust function call graphs using LSP, helping you quickly understand callers and callees with depth control.

npx playbooks add skill zhanghandong/rust-skills --skill rust-call-graph

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.5 KB
---
name: rust-call-graph
description: "Visualize Rust function call graphs using LSP. Triggers on: /call-graph, call hierarchy, who calls, what calls, 调用图, 调用关系, 谁调用了, 调用了谁"
argument-hint: "<function_name> [--depth N] [--direction in|out|both]"
allowed-tools: ["LSP", "Read", "Glob"]
---

# Rust Call Graph

Visualize function call relationships using LSP call hierarchy.

## Usage

```
/rust-call-graph <function_name> [--depth N] [--direction in|out|both]
```

**Options:**
- `--depth N`: How many levels to traverse (default: 3)
- `--direction`: `in` (callers), `out` (callees), `both`

**Examples:**
- `/rust-call-graph process_request` - Show both callers and callees
- `/rust-call-graph handle_error --direction in` - Show only callers
- `/rust-call-graph main --direction out --depth 5` - Deep callee analysis

## LSP Operations

### 1. Prepare Call Hierarchy

Get the call hierarchy item for a function.

```
LSP(
  operation: "prepareCallHierarchy",
  filePath: "src/handler.rs",
  line: 45,
  character: 8
)
```

### 2. Incoming Calls (Who calls this?)

```
LSP(
  operation: "incomingCalls",
  filePath: "src/handler.rs",
  line: 45,
  character: 8
)
```

### 3. Outgoing Calls (What does this call?)

```
LSP(
  operation: "outgoingCalls",
  filePath: "src/handler.rs",
  line: 45,
  character: 8
)
```

## Workflow

```
User: "Show call graph for process_request"
    │
    ▼
[1] Find function location
    LSP(workspaceSymbol) or Grep
    │
    ▼
[2] Prepare call hierarchy
    LSP(prepareCallHierarchy)
    │
    ▼
[3] Get incoming calls (callers)
    LSP(incomingCalls)
    │
    ▼
[4] Get outgoing calls (callees)
    LSP(outgoingCalls)
    │
    ▼
[5] Recursively expand to depth N
    │
    ▼
[6] Generate ASCII visualization
```

## Output Format

### Incoming Calls (Who calls this?)

```
## Callers of `process_request`

main
└── run_server
    └── handle_connection
        └── process_request  ◄── YOU ARE HERE
```

### Outgoing Calls (What does this call?)

```
## Callees of `process_request`

process_request  ◄── YOU ARE HERE
├── parse_headers
│   └── validate_header
├── authenticate
│   ├── check_token
│   └── load_user
├── execute_handler
│   └── [dynamic dispatch]
└── send_response
    └── serialize_body
```

### Bidirectional (Both)

```
## Call Graph for `process_request`

                    ┌─────────────────┐
                    │      main       │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │   run_server    │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │handle_connection│
                    └────────┬────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
┌───────▼───────┐   ┌───────▼───────┐   ┌───────▼───────┐
│ parse_headers │   │ authenticate  │   │send_response  │
└───────────────┘   └───────┬───────┘   └───────────────┘
                            │
                    ┌───────┴───────┐
                    │               │
             ┌──────▼──────┐ ┌──────▼──────┐
             │ check_token │ │  load_user  │
             └─────────────┘ └─────────────┘
```

## Analysis Insights

After generating the call graph, provide insights:

```
## Analysis

**Entry Points:** main, test_process_request
**Leaf Functions:** validate_header, serialize_body
**Hot Path:** main → run_server → handle_connection → process_request
**Complexity:** 12 functions, 3 levels deep

**Potential Issues:**
- `authenticate` has high fan-out (4 callees)
- `process_request` is called from 3 places (consider if this is intentional)
```

## Common Patterns

| User Says | Direction | Use Case |
|-----------|-----------|----------|
| "Who calls X?" | incoming | Impact analysis |
| "What does X call?" | outgoing | Understanding implementation |
| "Show call graph" | both | Full picture |
| "Trace from main to X" | outgoing | Execution path |

## Visualization Options

| Style | Best For |
|-------|----------|
| Tree (default) | Simple hierarchies |
| Box diagram | Complex relationships |
| Flat list | Many connections |
| Mermaid | Export to docs |

### Mermaid Export

```mermaid
graph TD
    main --> run_server
    run_server --> handle_connection
    handle_connection --> process_request
    process_request --> parse_headers
    process_request --> authenticate
    process_request --> send_response
```

## Related Skills

| When | See |
|------|-----|
| Find definition | rust-code-navigator |
| Project structure | rust-symbol-analyzer |
| Trait implementations | rust-trait-explorer |
| Safe refactoring | rust-refactor-helper |

Overview

This skill visualizes Rust function call graphs using the language server call hierarchy. It generates caller, callee, or bidirectional graphs and produces readable ASCII or mermaid outputs to support impact analysis and code exploration. Use it to trace execution paths, find hot paths, and surface high fan-out or frequently-called functions.

How this skill works

The skill locates a function symbol, then calls the LSP prepareCallHierarchy to get the base item. It expands incomingCalls and outgoingCalls via LSP, recursively up to a configured depth, and aggregates results. Finally it renders an ASCII tree, optional box diagram, or Mermaid graph and computes simple analysis like entry points, leaf functions, and hot paths.

When to use it

  • Perform impact analysis before changing a function (who calls this?).
  • Understand what a function invokes to inspect dependencies and side effects.
  • Trace execution paths from main or tests into a target function.
  • Document call relationships for code reviews or architecture notes.
  • Identify hot paths, high fan-out functions, or potential refactor targets.

Best practices

  • Start with depth 2–3 to get a manageable overview, increase for deeper investigation.
  • Prefer bidirectional view when you need full context; use incoming or outgoing for focused queries.
  • Combine LSP results with grep or workspace symbols if the server misses a location.
  • Annotate dynamic dispatch or external crate calls explicitly in the output.
  • Export complex graphs to Mermaid for inclusion in docs or deeper visualization tools.

Example use cases

  • Show callers and callees for process_request to reveal hot paths and dependencies.
  • Run incoming-only analysis on handle_error to see all impact sites before a change.
  • Trace from main out to a module with --depth 5 to map a long execution chain.
  • Export a service handler graph to Mermaid for architecture documentation.
  • Detect functions with unusually high fan-out (many callees) for targeted refactoring.

FAQ

What options control the traversal?

Use --depth N to limit levels and --direction in|out|both to pick callers, callees, or both.

How does it find the function location?

It uses LSP workspaceSymbol or a fallback grep to locate the function and its file/position.

Can it show dynamic dispatch or external crate calls?

Yes—those are included but annotated (for example, [dynamic dispatch] or external crate names) to signal that resolution is incomplete.