@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,124 @@
1
+ /**
2
+ * Additional branch-coverage tests for lang-rust/walk.ts.
3
+ *
4
+ * Targets walker branches the main walk suite doesn't reach:
5
+ *
6
+ * - `extern crate foo;` declarations → dependency sites.
7
+ * - `pub use …;` — the visibility_modifier is skipped while picking
8
+ * the path-bearing child (pickUsePathNode reverse-walk).
9
+ * - `#[...]` inner/outer attribute extraction on a function_item.
10
+ * - trait-method declarations inside a `trait` block.
11
+ */
12
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
13
+ import { tmpdir } from 'node:os';
14
+ import { join } from 'node:path';
15
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
16
+ import { rustGraphAdapter } from '../index.js';
17
+ let dir;
18
+ beforeEach(() => {
19
+ dir = mkdtempSync(join(tmpdir(), 'graph-rust-walkbranch-'));
20
+ });
21
+ afterEach(() => {
22
+ rmSync(dir, { recursive: true, force: true });
23
+ });
24
+ function findModuleInit(catalog, filePath) {
25
+ for (const occs of Object.values(catalog.functions)) {
26
+ for (const o of occs) {
27
+ if (o.kind === 'module-init' && o.filePath === filePath)
28
+ return o;
29
+ }
30
+ }
31
+ return undefined;
32
+ }
33
+ function runAdapter() {
34
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
35
+ const parsed = rustGraphAdapter.parseProject({
36
+ projectDirAbs: discovery.projectDirAbs,
37
+ files: discovery.files,
38
+ compilerOptions: discovery.compilerOptions,
39
+ resolutionMode: 'exact',
40
+ });
41
+ const walk = rustGraphAdapter.walkProject({
42
+ project: parsed.project,
43
+ projectDirAbs: discovery.projectDirAbs,
44
+ files: discovery.files,
45
+ });
46
+ const catalog = {
47
+ version: '3.0',
48
+ tool: 'graph',
49
+ language: 'rust',
50
+ builtAt: new Date().toISOString(),
51
+ cacheKey: 'test',
52
+ functions: walk.occurrences,
53
+ };
54
+ const resolved = rustGraphAdapter.resolveCallSites({
55
+ project: parsed.project,
56
+ catalog,
57
+ callSites: walk.callSites,
58
+ dependencySites: walk.dependencySites,
59
+ projectDirAbs: discovery.projectDirAbs,
60
+ resolutionMode: 'exact',
61
+ });
62
+ return { catalog, walk, dependenciesByOwner: resolved.dependenciesByOwner };
63
+ }
64
+ describe('lang-rust walk.ts — extern crate + pub use branches', () => {
65
+ it('emits a dependency site for `extern crate foo;`', () => {
66
+ writeFileSync(join(dir, 'lib.rs'), `extern crate serde;\n\npub fn run() {}\n`, 'utf8');
67
+ const { catalog, dependenciesByOwner } = runAdapter();
68
+ const init = findModuleInit(catalog, 'lib.rs');
69
+ expect(init).toBeDefined();
70
+ const deps = dependenciesByOwner.get(init.bodyHash);
71
+ expect(deps).toHaveLength(1);
72
+ expect(deps[0].specifier).toBe('serde');
73
+ // External crate → unresolved.
74
+ expect(deps[0].to).toEqual([]);
75
+ });
76
+ it('emits a dependency site for `extern crate foo as bar;` using the crate name', () => {
77
+ writeFileSync(join(dir, 'lib.rs'), `extern crate serde as s;\n\npub fn run() {}\n`, 'utf8');
78
+ const { catalog, dependenciesByOwner } = runAdapter();
79
+ const init = findModuleInit(catalog, 'lib.rs');
80
+ expect(init).toBeDefined();
81
+ const deps = dependenciesByOwner.get(init.bodyHash);
82
+ expect(deps).toHaveLength(1);
83
+ // The crate name (first identifier), not the alias, is the specifier.
84
+ expect(deps[0].specifier).toBe('serde');
85
+ });
86
+ it('skips the visibility_modifier when picking the use path for `pub use …;`', () => {
87
+ mkdirSync(join(dir, 'src'), { recursive: true });
88
+ writeFileSync(join(dir, 'src/lib.rs'), `pub use std::collections::HashMap;\n\npub fn run() {}\n`, 'utf8');
89
+ const { catalog, dependenciesByOwner } = runAdapter();
90
+ const init = findModuleInit(catalog, 'src/lib.rs');
91
+ expect(init).toBeDefined();
92
+ const deps = dependenciesByOwner.get(init.bodyHash);
93
+ expect(deps).toHaveLength(1);
94
+ // The visibility_modifier (`pub`) must be skipped — the specifier is
95
+ // the underlying path only.
96
+ expect(deps[0].specifier).toBe('std::collections::HashMap');
97
+ });
98
+ });
99
+ describe('lang-rust walk.ts — attribute extraction', () => {
100
+ it('extracts `#[inline]` attribute text onto the function occurrence decorators', () => {
101
+ mkdirSync(join(dir, 'src'), { recursive: true });
102
+ writeFileSync(join(dir, 'src/lib.rs'), `#[inline]\npub fn fast() -> i32 { 1 }\n`, 'utf8');
103
+ const { walk } = runAdapter();
104
+ const fast = walk.occurrences.fast?.[0];
105
+ expect(fast).toBeDefined();
106
+ expect(fast?.decorators.some((d) => d.includes('#[inline]'))).toBe(true);
107
+ });
108
+ });
109
+ describe('lang-rust walk.ts — trait method declarations', () => {
110
+ it('records provided (default) methods declared inside a `trait` block', () => {
111
+ mkdirSync(join(dir, 'src'), { recursive: true });
112
+ // A trait with a default method body — the function_item lives inside
113
+ // a `trait_item` (not an `impl_item`), so enclosingImpl stays null and
114
+ // the method is recorded as a function-declaration owned by module-init.
115
+ writeFileSync(join(dir, 'src/lib.rs'), `pub trait Greeter {\n` + ` fn greet(&self) -> i32 { 7 }\n` + `}\n`, 'utf8');
116
+ const { walk } = runAdapter();
117
+ const greet = walk.occurrences.greet?.[0];
118
+ expect(greet).toBeDefined();
119
+ // Not inside an impl → enclosingClass null, function-declaration kind.
120
+ expect(greet?.enclosingClass).toBe(null);
121
+ expect(greet?.kind).toBe('function-declaration');
122
+ });
123
+ });
124
+ //# sourceMappingURL=walk-branches.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-branches.test.js","sourceRoot":"","sources":["../../src/__tests__/walk-branches.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/walk.ts.
3
+ *
4
+ * Drives the full Rust adapter (discover + parse + walk) over fixtures
5
+ * that include line comments, block comments, nested block comments,
6
+ * and string literals. These exercise the comment-stripping helpers
7
+ * (skipToEndOfLine, skipBlockComment, consumeStringLiteral) used by
8
+ * the body-hash normalizer.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=walk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/walk.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Branch-coverage tests for lang-rust/walk.ts.
3
+ *
4
+ * Drives the full Rust adapter (discover + parse + walk) over fixtures
5
+ * that include line comments, block comments, nested block comments,
6
+ * and string literals. These exercise the comment-stripping helpers
7
+ * (skipToEndOfLine, skipBlockComment, consumeStringLiteral) used by
8
+ * the body-hash normalizer.
9
+ */
10
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
11
+ import { tmpdir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
14
+ import { rustGraphAdapter } from '../index.js';
15
+ describe('lang-rust walk.ts — comment-stripping branches', () => {
16
+ let dir;
17
+ beforeEach(() => {
18
+ dir = mkdtempSync(join(tmpdir(), 'graph-rust-walk-'));
19
+ });
20
+ afterEach(() => {
21
+ rmSync(dir, { recursive: true, force: true });
22
+ });
23
+ it('walks a Rust file with line comments without error', () => {
24
+ mkdirSync(join(dir, 'src'), { recursive: true });
25
+ writeFileSync(join(dir, 'src/lib.rs'), `// hello\nfn with_line_comment() -> i32 {\n // inner comment\n 1\n}\n`, 'utf8');
26
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
27
+ const parsed = rustGraphAdapter.parseProject({
28
+ projectDirAbs: discovery.projectDirAbs,
29
+ files: discovery.files,
30
+ compilerOptions: discovery.compilerOptions,
31
+ resolutionMode: 'exact',
32
+ });
33
+ const walk = rustGraphAdapter.walkProject({
34
+ project: parsed.project,
35
+ projectDirAbs: discovery.projectDirAbs,
36
+ files: discovery.files,
37
+ });
38
+ expect(Object.keys(walk.occurrences).length).toBeGreaterThan(0);
39
+ expect(Object.keys(walk.occurrences)).toContain('with_line_comment');
40
+ });
41
+ it('walks impl blocks, closures, and attributed functions', () => {
42
+ // Exercises implTargetName (impl ... for <type>), closure bare-identifier
43
+ // params, and extractAttributes (#[...] on a function).
44
+ mkdirSync(join(dir, 'src'), { recursive: true });
45
+ writeFileSync(join(dir, 'src/lib.rs'), `trait Greet { fn hi(&self); }\n` +
46
+ `struct Thing;\n` +
47
+ `impl Greet for Thing {\n` +
48
+ ` fn hi(&self) {}\n` +
49
+ `}\n` +
50
+ `#[inline]\n` +
51
+ `fn outer() -> i32 {\n` +
52
+ ` let add = |x, y| x + y;\n` +
53
+ ` add(1, 2)\n` +
54
+ `}\n`, 'utf8');
55
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
56
+ const parsed = rustGraphAdapter.parseProject({
57
+ projectDirAbs: discovery.projectDirAbs,
58
+ files: discovery.files,
59
+ compilerOptions: discovery.compilerOptions,
60
+ resolutionMode: 'exact',
61
+ });
62
+ const walk = rustGraphAdapter.walkProject({
63
+ project: parsed.project,
64
+ projectDirAbs: discovery.projectDirAbs,
65
+ files: discovery.files,
66
+ });
67
+ const names = Object.keys(walk.occurrences);
68
+ expect(names).toContain('outer');
69
+ expect(names).toContain('hi');
70
+ });
71
+ it('walks a Rust file with block comments and nested block comments', () => {
72
+ mkdirSync(join(dir, 'src'), { recursive: true });
73
+ writeFileSync(join(dir, 'src/lib.rs'), `/* simple block */\n` +
74
+ `/* nested /* deeper */ outer */\n` +
75
+ `fn with_block_comment() -> i32 {\n` +
76
+ ` /* mid-body */\n` +
77
+ ` 1\n` +
78
+ `}\n`, 'utf8');
79
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
80
+ const parsed = rustGraphAdapter.parseProject({
81
+ projectDirAbs: discovery.projectDirAbs,
82
+ files: discovery.files,
83
+ compilerOptions: discovery.compilerOptions,
84
+ resolutionMode: 'exact',
85
+ });
86
+ const walk = rustGraphAdapter.walkProject({
87
+ project: parsed.project,
88
+ projectDirAbs: discovery.projectDirAbs,
89
+ files: discovery.files,
90
+ });
91
+ expect(Object.keys(walk.occurrences)).toContain('with_block_comment');
92
+ });
93
+ it('preserves string literals when stripping comments', () => {
94
+ mkdirSync(join(dir, 'src'), { recursive: true });
95
+ writeFileSync(join(dir, 'src/lib.rs'), `fn with_strings() -> &'static str {\n` +
96
+ ` let _ = "a /* fake comment */ inside string";\n` +
97
+ ` let _ = "another // not a comment";\n` +
98
+ ` "ok"\n` +
99
+ `}\n`, 'utf8');
100
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
101
+ const parsed = rustGraphAdapter.parseProject({
102
+ projectDirAbs: discovery.projectDirAbs,
103
+ files: discovery.files,
104
+ compilerOptions: discovery.compilerOptions,
105
+ resolutionMode: 'exact',
106
+ });
107
+ const walk = rustGraphAdapter.walkProject({
108
+ project: parsed.project,
109
+ projectDirAbs: discovery.projectDirAbs,
110
+ files: discovery.files,
111
+ });
112
+ expect(Object.keys(walk.occurrences)).toContain('with_strings');
113
+ });
114
+ });
115
+ /**
116
+ * Tests for the function/impl/closure shapes the walker emits. These
117
+ * cover visitImpl / visitFunction / visitClosure and the helpers
118
+ * (implTargetName, classifyVisibility, classifyRustFunctionKind,
119
+ * extractAttributes, extractParams).
120
+ */
121
+ describe('lang-rust walk.ts — function shapes and occurrences', () => {
122
+ let dir;
123
+ beforeEach(() => {
124
+ dir = mkdtempSync(join(tmpdir(), 'graph-rust-walk-shapes-'));
125
+ });
126
+ afterEach(() => {
127
+ rmSync(dir, { recursive: true, force: true });
128
+ });
129
+ function run() {
130
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
131
+ const parsed = rustGraphAdapter.parseProject({
132
+ projectDirAbs: discovery.projectDirAbs,
133
+ files: discovery.files,
134
+ compilerOptions: discovery.compilerOptions,
135
+ resolutionMode: 'exact',
136
+ });
137
+ return rustGraphAdapter.walkProject({
138
+ project: parsed.project,
139
+ projectDirAbs: discovery.projectDirAbs,
140
+ files: discovery.files,
141
+ });
142
+ }
143
+ it('emits methods inside `impl` blocks with enclosingClass set', () => {
144
+ mkdirSync(join(dir, 'src'), { recursive: true });
145
+ writeFileSync(join(dir, 'src/lib.rs'), `struct Foo;\n` +
146
+ `impl Foo {\n` +
147
+ ` pub fn new() -> Self { Foo }\n` +
148
+ ` pub fn run(&self) -> i32 { 1 }\n` +
149
+ `}\n`, 'utf8');
150
+ const walk = run();
151
+ const newFn = walk.occurrences.new?.[0];
152
+ const runFn = walk.occurrences.run?.[0];
153
+ expect(newFn).toBeDefined();
154
+ expect(runFn).toBeDefined();
155
+ expect(newFn?.enclosingClass).toBe('Foo');
156
+ expect(runFn?.enclosingClass).toBe('Foo');
157
+ // `new` is treated as a constructor.
158
+ expect(newFn?.kind).toBe('constructor');
159
+ expect(runFn?.kind).toBe('method');
160
+ // pub fn → exported.
161
+ expect(newFn?.visibility).toBe('exported');
162
+ // qualified name includes module path + impl type.
163
+ expect(newFn?.qualifiedName).toContain('Foo::new');
164
+ expect(runFn?.qualifiedName).toContain('Foo::run');
165
+ });
166
+ it('emits a `function-declaration` for free functions at module scope', () => {
167
+ mkdirSync(join(dir, 'src'), { recursive: true });
168
+ writeFileSync(join(dir, 'src/lib.rs'), `fn private_fn() -> i32 { 1 }\npub fn exported_fn() -> i32 { 2 }\n`, 'utf8');
169
+ const walk = run();
170
+ const priv = walk.occurrences.private_fn?.[0];
171
+ const exp = walk.occurrences.exported_fn?.[0];
172
+ expect(priv?.kind).toBe('function-declaration');
173
+ expect(priv?.visibility).toBe('module-local');
174
+ expect(priv?.enclosingClass).toBe(null);
175
+ expect(exp?.visibility).toBe('exported');
176
+ });
177
+ it('emits an arrow occurrence + creation edge for an inline closure', () => {
178
+ mkdirSync(join(dir, 'src'), { recursive: true });
179
+ writeFileSync(join(dir, 'src/lib.rs'), `fn make_adder() -> impl Fn(i32) -> i32 {\n` +
180
+ ` let inc = |n: i32| n + 1;\n` +
181
+ ` inc\n` +
182
+ `}\n`, 'utf8');
183
+ const walk = run();
184
+ // Closure simpleName is `<arrow:...>`. Find any matching key.
185
+ const closureKeys = Object.keys(walk.occurrences).filter((k) => k.startsWith('<arrow:'));
186
+ expect(closureKeys.length).toBe(1);
187
+ const closure = walk.occurrences[closureKeys[0]]?.[0];
188
+ expect(closure?.kind).toBe('arrow');
189
+ expect(closure?.enclosingClass).toBe(null);
190
+ expect(closure?.visibility).toBe('private');
191
+ // Closure params extracted from `|n: i32|`.
192
+ expect(closure?.params.length).toBeGreaterThan(0);
193
+ // The walker should have emitted a creation call-site for the closure.
194
+ const creation = walk.callSites.find((cs) => cs.kind === 'creation');
195
+ expect(creation).toBeDefined();
196
+ expect(creation?.childHash).toBe(closure?.bodyHash);
197
+ });
198
+ it('produces a `<module-init>` occurrence for each file', () => {
199
+ mkdirSync(join(dir, 'src'), { recursive: true });
200
+ writeFileSync(join(dir, 'src/lib.rs'), `use std::collections::HashMap;\nconst N: i32 = 5;\n`, 'utf8');
201
+ const walk = run();
202
+ const initKey = Object.keys(walk.occurrences).find((k) => k.startsWith('<module-init:'));
203
+ expect(initKey).toBeDefined();
204
+ const init = walk.occurrences[initKey]?.[0];
205
+ expect(init?.kind).toBe('module-init');
206
+ expect(init?.line).toBe(1);
207
+ expect(init?.column).toBe(0);
208
+ expect(init?.visibility).toBe('module-local');
209
+ });
210
+ it('tags `#[test]`-annotated functions as inTestFile even in a non-test file', () => {
211
+ mkdirSync(join(dir, 'src'), { recursive: true });
212
+ // Place helper BEFORE the test attribute + function so that
213
+ // attribute-sibling scanning (which walks `parent.children` up to
214
+ // the current function) doesn't also see the `#[test]` attribute.
215
+ writeFileSync(join(dir, 'src/lib.rs'), `fn helper() { }\n#[test]\nfn it_works() {\n assert_eq!(1, 1);\n}\n`, 'utf8');
216
+ const walk = run();
217
+ const testFn = walk.occurrences.it_works?.[0];
218
+ const helperFn = walk.occurrences.helper?.[0];
219
+ expect(testFn?.inTestFile).toBe(true);
220
+ // The decorators list should include the #[test] attribute text.
221
+ expect(testFn?.decorators.some((d) => d.includes('#[test]'))).toBe(true);
222
+ expect(helperFn?.inTestFile).toBe(false);
223
+ });
224
+ it('flags files under tests/ as test files (path-based detection)', () => {
225
+ mkdirSync(join(dir, 'tests'), { recursive: true });
226
+ writeFileSync(join(dir, 'tests/integration.rs'), `fn integ() { }\n`, 'utf8');
227
+ const walk = run();
228
+ const integ = walk.occurrences.integ?.[0];
229
+ expect(integ?.inTestFile).toBe(true);
230
+ });
231
+ it('flags `*_test.rs` files as test files (path-based detection)', () => {
232
+ mkdirSync(join(dir, 'src'), { recursive: true });
233
+ writeFileSync(join(dir, 'src/lib_test.rs'), `fn t() { }\n`, 'utf8');
234
+ const walk = run();
235
+ const t = walk.occurrences.t?.[0];
236
+ expect(t?.inTestFile).toBe(true);
237
+ });
238
+ it('flags files under target/ as definedInGenerated (when somehow walked)', () => {
239
+ mkdirSync(join(dir, 'src'), { recursive: true });
240
+ // We seed a file with `target/` in its rel-path. discoverFiles
241
+ // excludes `target/`, so we manually feed walkProject paths.
242
+ const f1 = join(dir, 'src/normal.rs');
243
+ writeFileSync(f1, `fn n() { }\n`, 'utf8');
244
+ const f2 = join(dir, 'src/foo.generated.rs');
245
+ writeFileSync(f2, `fn g() { }\n`, 'utf8');
246
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
247
+ const parsed = rustGraphAdapter.parseProject({
248
+ projectDirAbs: discovery.projectDirAbs,
249
+ files: [f1, f2],
250
+ compilerOptions: discovery.compilerOptions,
251
+ resolutionMode: 'exact',
252
+ });
253
+ const walk = rustGraphAdapter.walkProject({
254
+ project: parsed.project,
255
+ projectDirAbs: discovery.projectDirAbs,
256
+ files: [f1, f2],
257
+ });
258
+ const g = walk.occurrences.g?.[0];
259
+ const n = walk.occurrences.n?.[0];
260
+ expect(g?.definedInGenerated).toBe(true);
261
+ expect(n?.definedInGenerated).toBe(false);
262
+ });
263
+ it('extracts function parameters including `self_parameter`', () => {
264
+ mkdirSync(join(dir, 'src'), { recursive: true });
265
+ writeFileSync(join(dir, 'src/lib.rs'), `struct G;\n` +
266
+ `impl G {\n` +
267
+ ` fn method(&self, x: i32, y: String) -> i32 { x }\n` +
268
+ `}\n`, 'utf8');
269
+ const walk = run();
270
+ const m = walk.occurrences.method?.[0];
271
+ expect(m).toBeDefined();
272
+ const names = m?.params.map((p) => p.name);
273
+ expect(names).toContain('self');
274
+ // The other two parameters' patterns are identifiers x and y.
275
+ expect(names?.includes('x')).toBe(true);
276
+ expect(names?.includes('y')).toBe(true);
277
+ });
278
+ it('extracts closure parameters as identifiers', () => {
279
+ mkdirSync(join(dir, 'src'), { recursive: true });
280
+ writeFileSync(join(dir, 'src/lib.rs'), `fn outer() {\n` + ` let f = |a, b| a;\n` + ` let _ = f;\n` + `}\n`, 'utf8');
281
+ const walk = run();
282
+ const closureKeys = Object.keys(walk.occurrences).filter((k) => k.startsWith('<arrow:'));
283
+ expect(closureKeys.length).toBe(1);
284
+ const closure = walk.occurrences[closureKeys[0]]?.[0];
285
+ const paramNames = closure?.params.map((p) => p.name);
286
+ // identifier-typed bare closure params should be picked up.
287
+ expect(paramNames).toContain('a');
288
+ expect(paramNames).toContain('b');
289
+ });
290
+ it('resolves enclosingClass for generic `impl Foo<T>` blocks', () => {
291
+ mkdirSync(join(dir, 'src'), { recursive: true });
292
+ writeFileSync(join(dir, 'src/lib.rs'), `struct Box<T>(T);\n` +
293
+ `impl<T> Box<T> {\n` +
294
+ ` fn unwrap(self) -> T { self.0 }\n` +
295
+ `}\n`, 'utf8');
296
+ const walk = run();
297
+ const u = walk.occurrences.unwrap?.[0];
298
+ expect(u).toBeDefined();
299
+ expect(u?.enclosingClass).not.toBeNull();
300
+ // The `unwrap` method should be tagged as a method.
301
+ expect(u?.kind).toBe('method');
302
+ });
303
+ it('skips files in input.files that are not present in the parsed project', () => {
304
+ mkdirSync(join(dir, 'src'), { recursive: true });
305
+ const f = join(dir, 'src/lib.rs');
306
+ writeFileSync(f, `fn x() {}\n`, 'utf8');
307
+ const discovery = rustGraphAdapter.discoverFiles({ cwd: dir });
308
+ const parsed = rustGraphAdapter.parseProject({
309
+ projectDirAbs: discovery.projectDirAbs,
310
+ files: [], // parse no files
311
+ compilerOptions: discovery.compilerOptions,
312
+ resolutionMode: 'exact',
313
+ });
314
+ const walk = rustGraphAdapter.walkProject({
315
+ project: parsed.project,
316
+ projectDirAbs: discovery.projectDirAbs,
317
+ files: discovery.files,
318
+ });
319
+ // No parse output → no occurrences (other than nothing).
320
+ expect(walk.occurrences).toEqual({});
321
+ expect(walk.callSites).toEqual([]);
322
+ });
323
+ });
324
+ //# sourceMappingURL=walk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.test.js","sourceRoot":"","sources":["../../src/__tests__/walk.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Rust body-digest helpers — strip comments, normalize
3
+ * whitespace, hash. Extracted from `walk.ts` so the walker can focus on
4
+ * tree-sitter traversal while the digest pipeline (which carries Rust-
5
+ * specific token rules like nested block comments and the lifetime-vs-
6
+ * char-literal heuristic) lives in one focused module.
7
+ *
8
+ * Behavior — string literals are preserved (their content is part of
9
+ * the body), block comments may nest (Rust grammar permits this), and
10
+ * char literals are distinguished from lifetimes by a short look-ahead.
11
+ *
12
+ * Sibling adapters (Java, Python, Go) keep their stripper inline because
13
+ * their comment grammars are shorter; the Rust variant is large enough
14
+ * to warrant its own file.
15
+ */
16
+ import { type BodyDigest } from '@opensip-cli/graph';
17
+ /**
18
+ * Digest a Rust body text — strip comments, collapse whitespace, hash.
19
+ *
20
+ * Real bodies (functions, methods, closures) and synthetic bodies
21
+ * (module-init aggregations) share this implementation; an alias keeps
22
+ * the call site self-documenting without duplicating logic.
23
+ */
24
+ export declare function digestRustBody(text: string): BodyDigest;
25
+ /**
26
+ * Synthetic bodies (module-init) use the same normalization as real
27
+ * bodies; an alias keeps the name at the call site self-documenting
28
+ * without duplicating the implementation (sonarjs/no-identical-functions).
29
+ */
30
+ export declare const digestSyntheticBody: typeof digestRustBody;
31
+ //# sourceMappingURL=body-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-digest.d.ts","sourceRoot":"","sources":["../src/body-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGpF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEvD;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,uBAAiB,CAAC"}