@opensip-cli/graph-rust 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/cache-key.test.d.ts +9 -0
  5. package/dist/__tests__/cache-key.test.d.ts.map +1 -0
  6. package/dist/__tests__/cache-key.test.js +49 -0
  7. package/dist/__tests__/cache-key.test.js.map +1 -0
  8. package/dist/__tests__/depends-on-emission.test.d.ts +15 -0
  9. package/dist/__tests__/depends-on-emission.test.d.ts.map +1 -0
  10. package/dist/__tests__/depends-on-emission.test.js +266 -0
  11. package/dist/__tests__/depends-on-emission.test.js.map +1 -0
  12. package/dist/__tests__/discover.test.d.ts +8 -0
  13. package/dist/__tests__/discover.test.d.ts.map +1 -0
  14. package/dist/__tests__/discover.test.js +65 -0
  15. package/dist/__tests__/discover.test.js.map +1 -0
  16. package/dist/__tests__/parse.test.d.ts +8 -0
  17. package/dist/__tests__/parse.test.d.ts.map +1 -0
  18. package/dist/__tests__/parse.test.js +64 -0
  19. package/dist/__tests__/parse.test.js.map +1 -0
  20. package/dist/__tests__/resolve-dependencies-branches.test.d.ts +18 -0
  21. package/dist/__tests__/resolve-dependencies-branches.test.d.ts.map +1 -0
  22. package/dist/__tests__/resolve-dependencies-branches.test.js +194 -0
  23. package/dist/__tests__/resolve-dependencies-branches.test.js.map +1 -0
  24. package/dist/__tests__/resolve.test.d.ts +23 -0
  25. package/dist/__tests__/resolve.test.d.ts.map +1 -0
  26. package/dist/__tests__/resolve.test.js +476 -0
  27. package/dist/__tests__/resolve.test.js.map +1 -0
  28. package/dist/__tests__/walk-branches.test.d.ts +13 -0
  29. package/dist/__tests__/walk-branches.test.d.ts.map +1 -0
  30. package/dist/__tests__/walk-branches.test.js +124 -0
  31. package/dist/__tests__/walk-branches.test.js.map +1 -0
  32. package/dist/__tests__/walk.test.d.ts +11 -0
  33. package/dist/__tests__/walk.test.d.ts.map +1 -0
  34. package/dist/__tests__/walk.test.js +324 -0
  35. package/dist/__tests__/walk.test.js.map +1 -0
  36. package/dist/body-digest.d.ts +31 -0
  37. package/dist/body-digest.d.ts.map +1 -0
  38. package/dist/body-digest.js +136 -0
  39. package/dist/body-digest.js.map +1 -0
  40. package/dist/cache-key.d.ts +19 -0
  41. package/dist/cache-key.d.ts.map +1 -0
  42. package/dist/cache-key.js +20 -0
  43. package/dist/cache-key.js.map +1 -0
  44. package/dist/discover.d.ts +22 -0
  45. package/dist/discover.d.ts.map +1 -0
  46. package/dist/discover.js +33 -0
  47. package/dist/discover.js.map +1 -0
  48. package/dist/index.d.ts +53 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +56 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/parse.d.ts +17 -0
  53. package/dist/parse.d.ts.map +1 -0
  54. package/dist/parse.js +14 -0
  55. package/dist/parse.js.map +1 -0
  56. package/dist/resolve-dependencies.d.ts +13 -0
  57. package/dist/resolve-dependencies.d.ts.map +1 -0
  58. package/dist/resolve-dependencies.js +261 -0
  59. package/dist/resolve-dependencies.js.map +1 -0
  60. package/dist/resolve.d.ts +45 -0
  61. package/dist/resolve.d.ts.map +1 -0
  62. package/dist/resolve.js +262 -0
  63. package/dist/resolve.js.map +1 -0
  64. package/dist/rule-hints.d.ts +16 -0
  65. package/dist/rule-hints.d.ts.map +1 -0
  66. package/dist/rule-hints.js +50 -0
  67. package/dist/rule-hints.js.map +1 -0
  68. package/dist/walk.d.ts +47 -0
  69. package/dist/walk.d.ts.map +1 -0
  70. package/dist/walk.js +564 -0
  71. package/dist/walk.js.map +1 -0
  72. package/package.json +54 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/discover.ts.
3
+ *
4
+ * Exercises the configPath resolution branches (override, Cargo.lock,
5
+ * Cargo.toml, none) and the file-collection logic.
6
+ */
7
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
11
+ import { discoverFiles } from '../discover.js';
12
+ describe('lang-rust discover.ts — branches', () => {
13
+ let dir;
14
+ beforeEach(() => {
15
+ dir = mkdtempSync(join(tmpdir(), 'graph-rust-discover-'));
16
+ });
17
+ afterEach(() => {
18
+ rmSync(dir, { recursive: true, force: true });
19
+ });
20
+ it('returns undefined configPathAbs when no Cargo.toml or Cargo.lock exists', () => {
21
+ const out = discoverFiles({ cwd: dir });
22
+ expect(out.configPathAbs).toBeUndefined();
23
+ expect(out.files).toEqual([]);
24
+ });
25
+ it('uses Cargo.lock when present (preferred over Cargo.toml)', () => {
26
+ writeFileSync(join(dir, 'Cargo.lock'), '# lock\n', 'utf8');
27
+ writeFileSync(join(dir, 'Cargo.toml'), '[package]\n', 'utf8');
28
+ const out = discoverFiles({ cwd: dir });
29
+ expect(out.configPathAbs).toBeDefined();
30
+ expect(out.configPathAbs).toContain('Cargo.lock');
31
+ });
32
+ it('falls back to Cargo.toml when Cargo.lock absent', () => {
33
+ writeFileSync(join(dir, 'Cargo.toml'), '[package]\n', 'utf8');
34
+ const out = discoverFiles({ cwd: dir });
35
+ expect(out.configPathAbs).toBeDefined();
36
+ expect(out.configPathAbs).toContain('Cargo.toml');
37
+ });
38
+ it('honors a configPathOverride that exists', () => {
39
+ const override = join(dir, 'custom.toml');
40
+ writeFileSync(override, '[package]\n', 'utf8');
41
+ const out = discoverFiles({ cwd: dir, configPathOverride: 'custom.toml' });
42
+ expect(out.configPathAbs).toBeDefined();
43
+ expect(out.configPathAbs).toContain('custom.toml');
44
+ });
45
+ it('returns the override path verbatim when the override does not exist', () => {
46
+ const out = discoverFiles({ cwd: dir, configPathOverride: 'nonexistent.toml' });
47
+ // Existing behavior: when override is supplied but file is missing,
48
+ // the absolute path is still returned (cacheKey emits "missing:..").
49
+ expect(out.configPathAbs).toBeDefined();
50
+ expect(out.configPathAbs).toContain('nonexistent.toml');
51
+ });
52
+ it('collects .rs files (sorted, dedup) and excludes target/', () => {
53
+ mkdirSync(join(dir, 'src'), { recursive: true });
54
+ writeFileSync(join(dir, 'src/lib.rs'), 'fn x() {}\n', 'utf8');
55
+ writeFileSync(join(dir, 'src/main.rs'), 'fn main() {}\n', 'utf8');
56
+ mkdirSync(join(dir, 'target'), { recursive: true });
57
+ writeFileSync(join(dir, 'target/cached.rs'), 'fn excluded() {}\n', 'utf8');
58
+ const out = discoverFiles({ cwd: dir });
59
+ expect(out.files.length).toBe(2);
60
+ expect(out.files.every((f) => !f.includes('/target/'))).toBe(true);
61
+ // Sorted
62
+ expect([...out.files]).toEqual([...out.files].sort());
63
+ });
64
+ });
65
+ //# sourceMappingURL=discover.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.test.js","sourceRoot":"","sources":["../../src/__tests__/discover.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/parse.ts.
3
+ *
4
+ * Exercises the rootNode.hasError branch by feeding intentionally
5
+ * broken Rust source.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/parse.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/parse.ts.
3
+ *
4
+ * Exercises the rootNode.hasError branch by feeding intentionally
5
+ * broken Rust source.
6
+ */
7
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
11
+ import { parseProject } from '../parse.js';
12
+ describe('lang-rust parse.ts — branches', () => {
13
+ let dir;
14
+ beforeEach(() => {
15
+ dir = mkdtempSync(join(tmpdir(), 'graph-rust-parse-'));
16
+ });
17
+ afterEach(() => {
18
+ rmSync(dir, { recursive: true, force: true });
19
+ });
20
+ it('returns no parseErrors for a syntactically valid file', () => {
21
+ const file = join(dir, 'main.rs');
22
+ writeFileSync(file, 'fn main() { let x = 1; }\n', 'utf8');
23
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
24
+ expect(out.parseErrors).toEqual([]);
25
+ expect(out.project.files.size).toBe(1);
26
+ });
27
+ it('records a parseError when tree-sitter reports rootNode.hasError', () => {
28
+ const file = join(dir, 'broken.rs');
29
+ // Unterminated function body: tree-sitter will mark hasError but
30
+ // still produce a partial tree.
31
+ writeFileSync(file, 'fn broken() { let x =\n', 'utf8');
32
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
33
+ expect(out.parseErrors.length).toBeGreaterThan(0);
34
+ expect(out.parseErrors[0]?.message).toContain('tree-sitter');
35
+ // The partial tree is still retained for the walk stage.
36
+ expect(out.project.files.size).toBe(1);
37
+ });
38
+ it('processes multiple files independently — one bad does not block others', () => {
39
+ const a = join(dir, 'a.rs');
40
+ const b = join(dir, 'b.rs');
41
+ writeFileSync(a, 'fn ok() { }\n', 'utf8');
42
+ writeFileSync(b, 'fn broken() { let x =\n', 'utf8');
43
+ const out = parseProject({ projectDirAbs: dir, files: [a, b], resolutionMode: 'exact' });
44
+ expect(out.project.files.size).toBe(2);
45
+ expect(out.parseErrors.length).toBeGreaterThan(0);
46
+ });
47
+ it('parses Rust source with line comments, block comments, and string literals', () => {
48
+ // Exercises the comment-stripping helpers in walk.ts indirectly:
49
+ // tree-sitter parses fine, the walk later strips comments and
50
+ // preserves strings. This drives the // and /* */ branches.
51
+ const file = join(dir, 'comments.rs');
52
+ writeFileSync(file, `// line comment\n` +
53
+ `/* block comment */\n` +
54
+ `/* nested /* depth */ stays */\n` +
55
+ `fn with_comments() -> &'static str {\n` +
56
+ ` // more comments\n` +
57
+ ` let s = "a string with /* fake comment */ inside";\n` +
58
+ ` s\n` +
59
+ `}\n`, 'utf8');
60
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
61
+ expect(out.parseErrors).toEqual([]);
62
+ });
63
+ });
64
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/__tests__/parse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/resolve-dependencies.ts.
3
+ *
4
+ * Targets the module-path resolution edge cases that the main
5
+ * depends-on-emission suite doesn't reach:
6
+ *
7
+ * - importer files OUTSIDE `src/` (tests/, examples/) whose module
8
+ * path is `null` — `self::` / `super::` rewriting becomes impossible.
9
+ * - module-init occurrences whose filePath isn't a recognizable crate
10
+ * module (skipped during index build).
11
+ * - Cargo.toml manifests with comment lines, blank lines, and a stray
12
+ * `name = …` that appears OUTSIDE the `[package]` table.
13
+ * - `super::` from the crate root (`src/lib.rs`) — walk-up clamps at
14
+ * `crate`.
15
+ * - `src/mod.rs` and bare `src/<name>/mod.rs` module-path mapping.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=resolve-dependencies-branches.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-dependencies-branches.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resolve-dependencies-branches.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/resolve-dependencies.ts.
3
+ *
4
+ * Targets the module-path resolution edge cases that the main
5
+ * depends-on-emission suite doesn't reach:
6
+ *
7
+ * - importer files OUTSIDE `src/` (tests/, examples/) whose module
8
+ * path is `null` — `self::` / `super::` rewriting becomes impossible.
9
+ * - module-init occurrences whose filePath isn't a recognizable crate
10
+ * module (skipped during index build).
11
+ * - Cargo.toml manifests with comment lines, blank lines, and a stray
12
+ * `name = …` that appears OUTSIDE the `[package]` table.
13
+ * - `super::` from the crate root (`src/lib.rs`) — walk-up clamps at
14
+ * `crate`.
15
+ * - `src/mod.rs` and bare `src/<name>/mod.rs` module-path mapping.
16
+ */
17
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
18
+ import { tmpdir } from 'node:os';
19
+ import { join } from 'node:path';
20
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
21
+ import { rustGraphAdapter } from '../index.js';
22
+ let fixtureRoot;
23
+ beforeEach(() => {
24
+ fixtureRoot = mkdtempSync(join(tmpdir(), 'graph-rust-depbranch-'));
25
+ });
26
+ afterEach(() => {
27
+ rmSync(fixtureRoot, { recursive: true, force: true });
28
+ });
29
+ function writeFile(rel, content) {
30
+ const abs = join(fixtureRoot, rel);
31
+ mkdirSync(join(abs, '..'), { recursive: true });
32
+ writeFileSync(abs, content, 'utf8');
33
+ }
34
+ function findModuleInit(catalog, filePath) {
35
+ for (const occs of Object.values(catalog.functions)) {
36
+ for (const o of occs) {
37
+ if (o.kind === 'module-init' && o.filePath === filePath)
38
+ return o;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ function runAdapter() {
44
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: fixtureRoot });
45
+ const parsed = rustGraphAdapter.parseProject({
46
+ projectDirAbs: discovery.projectDirAbs,
47
+ files: discovery.files,
48
+ compilerOptions: discovery.compilerOptions,
49
+ resolutionMode: 'exact',
50
+ });
51
+ const walked = rustGraphAdapter.walkProject({
52
+ project: parsed.project,
53
+ projectDirAbs: discovery.projectDirAbs,
54
+ files: discovery.files,
55
+ });
56
+ const catalog = {
57
+ version: '3.0',
58
+ tool: 'graph',
59
+ language: 'rust',
60
+ builtAt: new Date().toISOString(),
61
+ cacheKey: 'test',
62
+ functions: walked.occurrences,
63
+ };
64
+ const resolved = rustGraphAdapter.resolveCallSites({
65
+ project: parsed.project,
66
+ catalog,
67
+ callSites: walked.callSites,
68
+ dependencySites: walked.dependencySites,
69
+ projectDirAbs: discovery.projectDirAbs,
70
+ resolutionMode: 'exact',
71
+ });
72
+ return { catalog, dependenciesByOwner: resolved.dependenciesByOwner };
73
+ }
74
+ const CARGO_TOML = `[package]\nname = "myproj"\nversion = "0.1.0"\nedition = "2021"\n`;
75
+ describe('Rust depends-on — importer module path is null (file outside src/)', () => {
76
+ it('leaves `self::x` unresolved when imported from a tests/ file (no module path)', () => {
77
+ writeFile('Cargo.toml', CARGO_TOML);
78
+ writeFile('src/lib.rs', `pub fn run() {}\n`);
79
+ // tests/ files are separate compilation units → module path null.
80
+ writeFile('tests/it.rs', `use self::helper::Thing;\n\nfn _u(_: Thing) {}\n`);
81
+ const { catalog, dependenciesByOwner } = runAdapter();
82
+ const testInit = findModuleInit(catalog, 'tests/it.rs');
83
+ expect(testInit).toBeDefined();
84
+ const deps = dependenciesByOwner.get(testInit.bodyHash);
85
+ expect(deps).toHaveLength(1);
86
+ expect(deps[0].specifier).toBe('self::helper::Thing');
87
+ // importerModulePath is null → `self::` cannot anchor → unresolved.
88
+ expect(deps[0].to).toEqual([]);
89
+ });
90
+ it('leaves `super::x` unresolved when imported from a tests/ file (no module path)', () => {
91
+ writeFile('Cargo.toml', CARGO_TOML);
92
+ writeFile('src/lib.rs', `pub fn run() {}\n`);
93
+ writeFile('tests/it.rs', `use super::sibling::Thing;\n\nfn _u(_: Thing) {}\n`);
94
+ const { catalog, dependenciesByOwner } = runAdapter();
95
+ const testInit = findModuleInit(catalog, 'tests/it.rs');
96
+ expect(testInit).toBeDefined();
97
+ const deps = dependenciesByOwner.get(testInit.bodyHash);
98
+ expect(deps).toHaveLength(1);
99
+ expect(deps[0].specifier).toBe('super::sibling::Thing');
100
+ expect(deps[0].to).toEqual([]);
101
+ });
102
+ });
103
+ describe('Rust depends-on — `super::` from the crate root clamps at `crate`', () => {
104
+ it('walks up no further than `crate` when `super::` is used in src/lib.rs', () => {
105
+ writeFile('Cargo.toml', CARGO_TOML);
106
+ // `super` from the crate root has nowhere to go; the walk-up clamps
107
+ // to `crate`, so `super::foo` resolves as `crate::foo`.
108
+ writeFile('src/lib.rs', `pub mod foo;\n\nuse super::foo::Bar;\n\nfn _u(_: Bar) {}\n`);
109
+ writeFile('src/foo.rs', `pub struct Bar;\n`);
110
+ const { catalog, dependenciesByOwner } = runAdapter();
111
+ const libInit = findModuleInit(catalog, 'src/lib.rs');
112
+ const fooInit = findModuleInit(catalog, 'src/foo.rs');
113
+ expect(libInit).toBeDefined();
114
+ expect(fooInit).toBeDefined();
115
+ const deps = dependenciesByOwner.get(libInit.bodyHash);
116
+ expect(deps).toHaveLength(1);
117
+ expect(deps[0].specifier).toBe('super::foo::Bar');
118
+ expect(deps[0].to).toEqual([fooInit.bodyHash]);
119
+ });
120
+ });
121
+ describe('Rust depends-on — Cargo.toml parsing edge cases', () => {
122
+ it('ignores comment lines, blank lines, and a `name` outside [package]', () => {
123
+ // The leading `name = "decoy"` sits OUTSIDE any `[package]` table
124
+ // and must be ignored; the real name comes from inside [package].
125
+ writeFile('Cargo.toml', `# a comment\n` +
126
+ `name = "decoy"\n` +
127
+ `\n` +
128
+ `[dependencies]\n` +
129
+ `serde = "1"\n` +
130
+ `\n` +
131
+ `[package]\n` +
132
+ `# inner comment\n` +
133
+ `name = "realname"\n` +
134
+ `version = "0.1.0"\n`);
135
+ writeFile('src/lib.rs', `pub mod foo;\n\nuse realname::foo::Bar;\n\nfn _u(_: Bar) {}\n`);
136
+ writeFile('src/foo.rs', `pub struct Bar;\n`);
137
+ const { catalog, dependenciesByOwner } = runAdapter();
138
+ const libInit = findModuleInit(catalog, 'src/lib.rs');
139
+ const fooInit = findModuleInit(catalog, 'src/foo.rs');
140
+ expect(libInit).toBeDefined();
141
+ expect(fooInit).toBeDefined();
142
+ const deps = dependenciesByOwner.get(libInit.bodyHash);
143
+ expect(deps).toHaveLength(1);
144
+ // `realname::foo::Bar` resolves because the package name parsed from
145
+ // INSIDE [package] is `realname` (the decoy outside is ignored).
146
+ expect(deps[0].to).toEqual([fooInit.bodyHash]);
147
+ });
148
+ it('returns no package-name match when [package] has no name (decoy outside only)', () => {
149
+ writeFile('Cargo.toml', `name = "decoy"\n[package]\nversion = "0.1.0"\n`);
150
+ writeFile('src/lib.rs', `pub mod foo;\n\nuse decoy::foo::Bar;\n\nfn _u(_: Bar) {}\n`);
151
+ writeFile('src/foo.rs', `pub struct Bar;\n`);
152
+ const { catalog, dependenciesByOwner } = runAdapter();
153
+ const libInit = findModuleInit(catalog, 'src/lib.rs');
154
+ expect(libInit).toBeDefined();
155
+ const deps = dependenciesByOwner.get(libInit.bodyHash);
156
+ expect(deps).toHaveLength(1);
157
+ // package name never resolved (decoy is outside [package]); the
158
+ // `decoy::` alias therefore cannot anchor → unresolved.
159
+ expect(deps[0].to).toEqual([]);
160
+ });
161
+ });
162
+ describe('Rust depends-on — module-path mapping via mod.rs layout', () => {
163
+ it('maps a top-level `src/mod.rs` to `crate` (segments empty after popping `mod`)', () => {
164
+ writeFile('Cargo.toml', CARGO_TOML);
165
+ // `src/mod.rs` is an unusual layout: filePathToRustModulePath strips
166
+ // the trailing `mod` segment leaving an empty list → `crate`. The
167
+ // importer here references `crate::run`, which walks back to the
168
+ // `src/mod.rs` module-init (mapped to `crate`).
169
+ writeFile('src/mod.rs', `pub fn run() {}\n\nuse crate::run;\n`);
170
+ const { catalog, dependenciesByOwner } = runAdapter();
171
+ const modInit = findModuleInit(catalog, 'src/mod.rs');
172
+ expect(modInit).toBeDefined();
173
+ const deps = dependenciesByOwner.get(modInit.bodyHash);
174
+ expect(deps).toHaveLength(1);
175
+ expect(deps[0].specifier).toBe('crate::run');
176
+ // `crate::run` → `run` is an item, resolution walks back to `crate`,
177
+ // which maps to the `src/mod.rs` module-init itself.
178
+ expect(deps[0].to).toEqual([modInit.bodyHash]);
179
+ });
180
+ it('maps `src/<dir>/mod.rs` to `crate::<dir>` and resolves an import to it', () => {
181
+ writeFile('Cargo.toml', CARGO_TOML);
182
+ writeFile('src/lib.rs', `pub mod widgets;\n\nuse crate::widgets::Gizmo;\n\nfn _u(_: Gizmo) {}\n`);
183
+ writeFile('src/widgets/mod.rs', `pub struct Gizmo;\n`);
184
+ const { catalog, dependenciesByOwner } = runAdapter();
185
+ const libInit = findModuleInit(catalog, 'src/lib.rs');
186
+ const widgetsInit = findModuleInit(catalog, 'src/widgets/mod.rs');
187
+ expect(libInit).toBeDefined();
188
+ expect(widgetsInit).toBeDefined();
189
+ const deps = dependenciesByOwner.get(libInit.bodyHash);
190
+ expect(deps).toHaveLength(1);
191
+ expect(deps[0].to).toEqual([widgetsInit.bodyHash]);
192
+ });
193
+ });
194
+ //# sourceMappingURL=resolve-dependencies-branches.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-dependencies-branches.test.js","sourceRoot":"","sources":["../../src/__tests__/resolve-dependencies-branches.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/resolve.ts.
3
+ *
4
+ * Drives the full Rust adapter (discover + parse + walk + resolve)
5
+ * over fixtures that exercise every documented call-target shape:
6
+ *
7
+ * - bare `foo()` call (`identifier`)
8
+ * - `obj.method()` (`field_expression`)
9
+ * - `Type::method()` (`scoped_identifier` with receiver narrowing)
10
+ * - `mod::Type::method()` (nested `scoped_identifier`)
11
+ * - `name!(...)` macro_invocation
12
+ * - creation edges through closures
13
+ * - expression_statement vs parenthesized return-value discard logic
14
+ *
15
+ * Resolver confidence ladders for each lookup outcome:
16
+ * - 0 catalog matches → resolution 'unknown', confidence 'low'
17
+ * - 1 catalog match → resolution 'static', confidence 'medium'
18
+ * - N catalog matches → resolution 'method-dispatch', confidence 'low'
19
+ * - receiver-narrowed → resolution 'static'/'method-dispatch',
20
+ * confidence 'medium'
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=resolve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resolve.test.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}