Files
wehub-resource-sync 41cb1c0170
OpenSSF Scorecard / scorecard (push) Failing after 0s
DCO / dco (push) Failing after 0s
CodeQL SAST / analyze (push) Failing after 1s
Deploy Pages / deploy (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:28:05 +08:00

65 lines
2.4 KiB
C

/* rust_cargo.h — Cargo.toml parser for the Rust LSP.
*
* Per RUST_LSP_FOLLOWUP §A3: we don't run Cargo or build, but we CAN
* parse `Cargo.toml` and `[workspace] members` to learn:
* - the crate name (`[package].name`)
* - declared dependencies (`[dependencies]` + `[dev-dependencies]`)
* - workspace members + their relative paths
*
* The pipeline uses this to map `other_member::foo` → that member's
* module QN, and to mark calls into known external deps as "external,
* not local" rather than fully unresolved.
*
* The parser is a tiny hand-written TOML subset: handles `[section]`
* headers, `key = "value"`, `key = { path = "...", … }` (the relevant
* subset for our needs), arrays `members = ["a", "b"]`. It IGNORES
* everything it doesn't understand — that's safe because Cargo.toml
* is much richer than what we use. */
#ifndef CBM_LSP_RUST_CARGO_H
#define CBM_LSP_RUST_CARGO_H
#include "../arena.h"
#include <stdbool.h>
#define CBM_CARGO_MAX_DEPS 256
#define CBM_CARGO_MAX_MEMBERS 64
typedef struct {
const char* name; /* declared dependency name */
const char* path; /* path = "../foo" if local, else NULL */
} CBMCargoDep;
typedef struct {
const char* member_name; /* directory name */
const char* member_path; /* relative path inside workspace root */
} CBMCargoMember;
typedef struct CBMCargoManifest {
const char* package_name; /* [package].name, NULL if missing */
const char* package_version; /* [package].version, NULL if missing */
bool is_workspace_root; /* [workspace] section seen */
CBMCargoDep deps[CBM_CARGO_MAX_DEPS];
int dep_count;
CBMCargoMember members[CBM_CARGO_MAX_MEMBERS];
int member_count;
} CBMCargoManifest;
/* Parse a Cargo.toml-formatted string. The output strings are
* arena-allocated (so the caller doesn't need to keep `src` alive). */
void cbm_cargo_parse(CBMArena* arena, const char* src, int src_len,
CBMCargoManifest* out);
/* Convenience: does a given path-prefix look like one of the listed
* dependency names? Used by the resolver to recognise external crate
* paths. */
bool cbm_cargo_is_known_dep(const CBMCargoManifest* m, const char* head);
/* Find a workspace member by crate name. Returns NULL if absent. */
const CBMCargoMember* cbm_cargo_find_member(const CBMCargoManifest* m,
const char* name);
#endif /* CBM_LSP_RUST_CARGO_H */