mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-31 07:33:32 +08:00
The test-impact engine selects tests by walking the graph, so it can only be as right as the graph. Three gaps made it wrong: One identity for a definition's mutually exclusive variants - A definition written once per #if/#else branch, per #[cfg], per platform file (foo_linux.c / foo_win.c, platform directories) or per Go build tag is ONE node. The graph buffer keeps every variant's span in a `variants` node property (definition labels only), so a change in any variant maps to the definition. - Extraction now sees definitions inside conditional blocks where it skipped them: C++/C#/ObjC class members under #if (one cursor walk, conditional block types per language in lang_specs), Elixir defs under if/unless, Fortran .F90/.F95/.F03/.F08, Rust #[cfg] twins (no more `name#cfg(...)` QNs that lost every call), C platform files and directories (non-static file-scope functions). - Haskell: the vendored scanner reads only an #if group's first branch. The grammar stays upstream; every further branch is parsed as its own same-length view (cpp_branch_views.c) and adds what the raw parse missed. haskell/bytestring: no new partial parses, +27 functions, IMPORTS 322 -> 329, 131 definitions with variant spans. - Incremental closure repair re-parses every file of such a definition when one of them changes (variant partners through DEFINES), so a repair equals a full index. No cross-language name guesses - A name-only resolution (unique_name, suffix_match, qualified_suffix, field_type_hint, and same_module across files that only share a path stem) never binds a symbol another language defines. - Bash imports are the files a script sources: every top-level command was read as an import of its name (`set -e` imported "set", bound to a TSX method in 137 scripts here). - This repository: cross-language CALLS 5,916 -> 5,091; the remainder are C/C++ pairs, builtins and same-stem module collisions (recorded). SPAWNS edges (per language, like the HTTP client patterns) - A call that starts a program (subprocess.run, exec.Command, child_process.spawn, posix_spawn, system, Process.Start, Command::new, ... about 30 languages, through the file's own imports) gets a SPAWNS edge to a Process node named after the program (literal first word, or <dynamic>) instead of a CALLS guess. No target resolution. Both resolvers ask at the same point (parity test). The engine follows the graph - Seeds map changed lines through every variant span; a test written once per #if branch is one test; when a change reaches a non-test `main`, the tests that spawn processes are reached too (the process runs main, and main reaches everything). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
35 lines
1.3 KiB
C
35 lines
1.3 KiB
C
#ifndef CBM_CPP_BRANCH_VIEWS_H
|
|
#define CBM_CPP_BRANCH_VIEWS_H
|
|
|
|
#include "cbm.h"
|
|
|
|
/*
|
|
* Branch views of a source whose grammar parses only the first branch of an
|
|
* #if/#else group (the Haskell scanner swallows everything from #else to
|
|
* #endif as one token, so a definition written once per configuration is seen
|
|
* in its first variant only).
|
|
*
|
|
* A view keeps the source byte for byte and line for line: the branch it
|
|
* selects in every group stays, the other branches and all conditional lines
|
|
* (#if/#ifdef/#ifndef/#else/#elif.../#endif) become spaces, newlines stay. So
|
|
* every span extracted from a view is a raw-source span.
|
|
*
|
|
* View v (1-based) selects branch min(v, branches - 1) of a group with at
|
|
* least two branches, and the only branch of a group without one.
|
|
*/
|
|
|
|
#define CBM_CPP_BRANCH_VIEWS_MAX 3
|
|
|
|
// True when `lang`'s grammar parses only the first branch of a conditional.
|
|
bool cbm_lang_needs_cpp_branch_views(CBMLanguage lang);
|
|
|
|
// Number of views the source needs (0 when no group has a second branch),
|
|
// at most CBM_CPP_BRANCH_VIEWS_MAX.
|
|
int cbm_cpp_branch_view_count(CBMArena *a, const char *src, int len);
|
|
|
|
// View `view` (1..count) as an arena buffer of exactly `len` bytes plus a NUL,
|
|
// or NULL on allocation failure.
|
|
char *cbm_cpp_branch_view(CBMArena *a, const char *src, int len, int view);
|
|
|
|
#endif
|