@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.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/cache-key.test.d.ts +9 -0
- package/dist/__tests__/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/cache-key.test.js +49 -0
- package/dist/__tests__/cache-key.test.js.map +1 -0
- package/dist/__tests__/depends-on-emission.test.d.ts +15 -0
- package/dist/__tests__/depends-on-emission.test.d.ts.map +1 -0
- package/dist/__tests__/depends-on-emission.test.js +266 -0
- package/dist/__tests__/depends-on-emission.test.js.map +1 -0
- package/dist/__tests__/discover.test.d.ts +8 -0
- package/dist/__tests__/discover.test.d.ts.map +1 -0
- package/dist/__tests__/discover.test.js +65 -0
- package/dist/__tests__/discover.test.js.map +1 -0
- package/dist/__tests__/parse.test.d.ts +8 -0
- package/dist/__tests__/parse.test.d.ts.map +1 -0
- package/dist/__tests__/parse.test.js +64 -0
- package/dist/__tests__/parse.test.js.map +1 -0
- package/dist/__tests__/resolve-dependencies-branches.test.d.ts +18 -0
- package/dist/__tests__/resolve-dependencies-branches.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-dependencies-branches.test.js +194 -0
- package/dist/__tests__/resolve-dependencies-branches.test.js.map +1 -0
- package/dist/__tests__/resolve.test.d.ts +23 -0
- package/dist/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/__tests__/resolve.test.js +476 -0
- package/dist/__tests__/resolve.test.js.map +1 -0
- package/dist/__tests__/walk-branches.test.d.ts +13 -0
- package/dist/__tests__/walk-branches.test.d.ts.map +1 -0
- package/dist/__tests__/walk-branches.test.js +124 -0
- package/dist/__tests__/walk-branches.test.js.map +1 -0
- package/dist/__tests__/walk.test.d.ts +11 -0
- package/dist/__tests__/walk.test.d.ts.map +1 -0
- package/dist/__tests__/walk.test.js +324 -0
- package/dist/__tests__/walk.test.js.map +1 -0
- package/dist/body-digest.d.ts +31 -0
- package/dist/body-digest.d.ts.map +1 -0
- package/dist/body-digest.js +136 -0
- package/dist/body-digest.js.map +1 -0
- package/dist/cache-key.d.ts +19 -0
- package/dist/cache-key.d.ts.map +1 -0
- package/dist/cache-key.js +20 -0
- package/dist/cache-key.js.map +1 -0
- package/dist/discover.d.ts +22 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +33 -0
- package/dist/discover.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.d.ts +17 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +14 -0
- package/dist/parse.js.map +1 -0
- package/dist/resolve-dependencies.d.ts +13 -0
- package/dist/resolve-dependencies.d.ts.map +1 -0
- package/dist/resolve-dependencies.js +261 -0
- package/dist/resolve-dependencies.js.map +1 -0
- package/dist/resolve.d.ts +45 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +262 -0
- package/dist/resolve.js.map +1 -0
- package/dist/rule-hints.d.ts +16 -0
- package/dist/rule-hints.d.ts.map +1 -0
- package/dist/rule-hints.js +50 -0
- package/dist/rule-hints.js.map +1 -0
- package/dist/walk.d.ts +47 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +564 -0
- package/dist/walk.js.map +1 -0
- 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 @@
|
|
|
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"}
|