Shows, for an extern variable in a C project, which files write it and which files read it — as an arrow diagram plus a list of file:line rows you can click to jump to.
Built for embedded C projects (for example Renesas RL78). Parsing uses tree-sitter; no compiler or preprocessor is run.
What it does
Pick an extern variable: the panel draws writer files → variable → reader files.
Below the diagram, each access is listed as a file:line row. Click a row to open that line.
Press ↑ / ↓ in the panel to switch to the previous / next variable.
How to use
Open a C file (.c or .h).
Run Clang Extern RW Map: Open Extern Read/Write Map (command id clangExternRwMap.open) from the Command Palette, or press Ctrl+Alt+Shift+M.
Select a variable in the panel.
Scan scope
Files: **/*.c and **/*.h in the workspace.
Never scanned (fixed list, not configurable): folders named node_modules, .git, DefaultBuild, Debug, Release, build, out — at any depth, in any case. Files inside them are not counted in the panel status. The file iodefine.h (any case) is also skipped.
Your files.exclude and search.exclude settings also hide files: only keys set to true are used, and keys containing {, } or , are ignored.
Files larger than 500 KiB (512,000 bytes) are skipped; a file of exactly 512,000 bytes is still indexed.
At most 3000 files are indexed: the first 3000 in path order. The panel status shows how many files were skipped.
Unsaved editor changes are not used. Save the file to update the panel.
Known limitations
Macros: macro bodies are not scanned and no preprocessing is done. An access that only appears after macro expansion is not detected.
Conditional code: rows inside #if / #ifdef / #else arms get the note in #if. A whole-file include guard (#ifndef NAME followed by #define NAME) does not add the note.
Syntax errors: a file with syntax errors is still analyzed and shows a warning; declarations damaged by the error are skipped.
Inline assembly: text between #pragma asm and #pragma endasm is not analyzed. A #pragma asm inside a comment or string is ignored.
Encoding: a Shift-JIS file that VS Code decodes as UTF-8 may show a wrong line and gets no badge; the only notice is a line in the Output channel.
Duplicate files: a junction or symlink pointing back into the workspace, or two workspace roots with the same folder name, can list a file twice.
Large binary files: a large non-text file named .c (for example ~500 KB of random bytes) can take about 15 seconds to analyze, because the parser's error recovery is slow; the extension host is busy meanwhile.
Pointers: pointer aliases are not tracked, and there is no type inference. int *q = &g; *q = 1; does not count as a write to g. *p = v and p->x = v count as a read of p with the note pointee written; this also works through a cast (((struct S *)p)->x = v), but not through pointer arithmetic ((p + i)->x = v).
Compound updates: +=, ++, -- (and similar) count as read-write: one row with an RW badge, shown on the writer side.