projscan 0.17.0 → 1.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/README.md +19 -4
- package/dist/core/fixSuggest.js +50 -0
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/languages/LanguageAdapter.d.ts +1 -1
- package/dist/core/languages/registry.js +2 -1
- package/dist/core/languages/registry.js.map +1 -1
- package/dist/core/languages/rustAdapter.d.ts +2 -0
- package/dist/core/languages/rustAdapter.js +165 -0
- package/dist/core/languages/rustAdapter.js.map +1 -0
- package/dist/core/languages/rustCallSites.d.ts +17 -0
- package/dist/core/languages/rustCallSites.js +60 -0
- package/dist/core/languages/rustCallSites.js.map +1 -0
- package/dist/core/languages/rustCyclomatic.d.ts +24 -0
- package/dist/core/languages/rustCyclomatic.js +67 -0
- package/dist/core/languages/rustCyclomatic.js.map +1 -0
- package/dist/core/languages/rustExports.d.ts +25 -0
- package/dist/core/languages/rustExports.js +74 -0
- package/dist/core/languages/rustExports.js.map +1 -0
- package/dist/core/languages/rustFunctions.d.ts +27 -0
- package/dist/core/languages/rustFunctions.js +131 -0
- package/dist/core/languages/rustFunctions.js.map +1 -0
- package/dist/core/languages/rustImports.d.ts +31 -0
- package/dist/core/languages/rustImports.js +196 -0
- package/dist/core/languages/rustImports.js.map +1 -0
- package/dist/core/languages/rustManifests.d.ts +26 -0
- package/dist/core/languages/rustManifests.js +99 -0
- package/dist/core/languages/rustManifests.js.map +1 -0
- package/dist/core/languages/treeSitterLoader.js +2 -1
- package/dist/core/languages/treeSitterLoader.js.map +1 -1
- package/dist/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/tool-manifest.json +2 -2
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -231,7 +231,7 @@ Cache version bumped 2 → 3 in 0.11 (CC stored per file). Existing v2 caches ar
|
|
|
231
231
|
|
|
232
232
|
## Performance
|
|
233
233
|
|
|
234
|
-
Reference numbers from `npm run bench` on an Apple M3 Pro running Node 25 (cold / warm cache, milliseconds). These are the
|
|
234
|
+
Reference numbers from `npm run bench` on an Apple M3 Pro running Node 25 (cold / warm cache, milliseconds). These are the 1.0 reference numbers:
|
|
235
235
|
|
|
236
236
|
| Repo | Files | analyze | doctor | hotspots | coupling | search |
|
|
237
237
|
|------|-------|---------|--------|----------|----------|--------|
|
|
@@ -242,8 +242,20 @@ For real-world numbers against larger codebases, `npm run bench:references` shal
|
|
|
242
242
|
|
|
243
243
|
Run `npm run bench` against your own machine to recalibrate.
|
|
244
244
|
|
|
245
|
-
- **Zero network requests**
|
|
246
|
-
- **
|
|
245
|
+
- **Zero network requests** — everything runs locally
|
|
246
|
+
- **12 runtime dependencies** — still minimal
|
|
247
|
+
- **~4.5 MB of vendored tree-sitter grammars**, broken down:
|
|
248
|
+
|
|
249
|
+
| Grammar | Size | Languages |
|
|
250
|
+
|---|---:|---|
|
|
251
|
+
| `web-tree-sitter` | ~190 KB | runtime, all tree-sitter languages |
|
|
252
|
+
| `tree-sitter-python` | ~450 KB | Python |
|
|
253
|
+
| `tree-sitter-go` | ~210 KB | Go |
|
|
254
|
+
| `tree-sitter-java` | ~405 KB | Java |
|
|
255
|
+
| `tree-sitter-ruby` | ~2.0 MB | Ruby |
|
|
256
|
+
| `tree-sitter-rust` | ~1.1 MB | Rust |
|
|
257
|
+
|
|
258
|
+
JavaScript and TypeScript use the bundled `@babel/parser` instead of a tree-sitter grammar, so they don't appear in this table.
|
|
247
259
|
|
|
248
260
|
## Optional features
|
|
249
261
|
|
|
@@ -332,7 +344,7 @@ jobs:
|
|
|
332
344
|
with: { fetch-depth: 0 } # needed for --changed-only
|
|
333
345
|
- uses: actions/setup-node@v4
|
|
334
346
|
with: { node-version: 20 }
|
|
335
|
-
- uses: abhiyoheswaran1/projscan@
|
|
347
|
+
- uses: abhiyoheswaran1/projscan@v1
|
|
336
348
|
with:
|
|
337
349
|
min-score: '70'
|
|
338
350
|
changed-only: 'true'
|
|
@@ -374,6 +386,9 @@ Fields:
|
|
|
374
386
|
- `disableRules` - silence rules by id; supports wildcard `prefix-*`
|
|
375
387
|
- `severityOverrides` - remap a rule's severity (`info` / `warning` / `error`)
|
|
376
388
|
- `hotspots.limit` / `hotspots.since` - defaults for the `hotspots` command
|
|
389
|
+
- `monorepo.importPolicy` - cross-package import allow/deny rules in monorepos *(0.14+)*
|
|
390
|
+
|
|
391
|
+
See [`docs/GUIDE.md` → Configuration](docs/GUIDE.md#configuration-projscanrc) for the full reference (field types, validation behavior, embedding config in `package.json`, monorepo `importPolicy` semantics).
|
|
377
392
|
|
|
378
393
|
## Tracking Health Over Time
|
|
379
394
|
|
package/dist/core/fixSuggest.js
CHANGED
|
@@ -187,6 +187,50 @@ const TEMPLATES = [
|
|
|
187
187
|
'(c) widen the .projscanrc importPolicy `allow` list if this edge is intentional. Prefer (a) or (b) - the policy exists to keep refactoring options open.',
|
|
188
188
|
}),
|
|
189
189
|
},
|
|
190
|
+
// ── ESLint rule failures (1.1.0) ─────────────────────────
|
|
191
|
+
{
|
|
192
|
+
match: (i) => i.id.startsWith('eslint-'),
|
|
193
|
+
render: (i) => {
|
|
194
|
+
const ruleName = i.id.slice('eslint-'.length);
|
|
195
|
+
return {
|
|
196
|
+
issueId: i.id,
|
|
197
|
+
severity: i.severity,
|
|
198
|
+
category: i.category,
|
|
199
|
+
headline: `ESLint rule failed: \`${ruleName}\``,
|
|
200
|
+
why: 'ESLint rules represent codified team agreement about how the codebase should look and behave. A failing rule means either the code is wrong by the team\'s own standard, or the rule itself is wrong for this project — both deserve resolution rather than silencing.',
|
|
201
|
+
where: i.locations ?? [],
|
|
202
|
+
instruction: `Three valid moves, in order of preference: ` +
|
|
203
|
+
`(a) fix the violation per the rule's documented intent — start at the docs link below; ` +
|
|
204
|
+
`(b) if this specific occurrence is justified, add \`// eslint-disable-next-line ${ruleName}\` ON the offending line with a one-sentence comment explaining why the local exception holds; ` +
|
|
205
|
+
`(c) if the rule itself is wrong for this project, propose a config change in \`eslint.config.js\` (or the legacy \`.eslintrc\`) and run \`npm run lint -- --fix\` to baseline. ` +
|
|
206
|
+
`Don't reach for (b) or (c) without reading the docs first.`,
|
|
207
|
+
suggestedTest: `After: \`npm run lint\` should not flag this rule on this file.`,
|
|
208
|
+
references: [`https://eslint.org/docs/latest/rules/${ruleName}`],
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
// ── Python type errors (1.1.0) ────────────────────────────
|
|
213
|
+
{
|
|
214
|
+
match: (i) => i.id.startsWith('python-type-error-'),
|
|
215
|
+
render: (i) => ({
|
|
216
|
+
issueId: i.id,
|
|
217
|
+
severity: i.severity,
|
|
218
|
+
category: i.category,
|
|
219
|
+
headline: `Python type error: ${i.title}`,
|
|
220
|
+
why: 'Type errors flagged by mypy / pyright catch bugs the runtime would only catch later — `None` reaching code that expects a concrete value, mismatched return types, callers passing the wrong shape. Fixing the type usually fixes the latent bug.',
|
|
221
|
+
where: i.locations ?? [],
|
|
222
|
+
instruction: 'Three valid moves, in order of preference: ' +
|
|
223
|
+
'(a) add or refine the type annotation on the offending name so the checker sees what you mean (often the right move when the function signature was incomplete); ' +
|
|
224
|
+
'(b) narrow the type at the call site with an `assert isinstance(x, T)` / `if x is not None` guard so the checker can prove the case is safe; ' +
|
|
225
|
+
'(c) if the checker is genuinely wrong, add `# type: ignore[<error-code>]` on the line with a comment explaining why. ' +
|
|
226
|
+
'Avoid bare `# type: ignore` (no error code) — pinning the code keeps the ignore narrow.',
|
|
227
|
+
suggestedTest: 'After: `mypy <file>` (or `pyright <file>`) should not flag this line.',
|
|
228
|
+
references: [
|
|
229
|
+
'https://mypy.readthedocs.io/en/stable/error_code_list.html',
|
|
230
|
+
'https://microsoft.github.io/pyright/#/configuration',
|
|
231
|
+
],
|
|
232
|
+
}),
|
|
233
|
+
},
|
|
190
234
|
];
|
|
191
235
|
const FALLBACK = {
|
|
192
236
|
match: () => true,
|
|
@@ -270,6 +314,12 @@ function staticHeadlineFor(issue) {
|
|
|
270
314
|
return issue.id.includes('python') ? 'Add ruff and run `ruff check . --fix` once.' : 'Add eslint + prettier; baseline with `--fix`.';
|
|
271
315
|
if (issue.id.startsWith('cross-package-violation-'))
|
|
272
316
|
return 'Use the package\'s public entry, or widen the importPolicy.';
|
|
317
|
+
if (issue.id.startsWith('eslint-')) {
|
|
318
|
+
const ruleName = issue.id.slice('eslint-'.length);
|
|
319
|
+
return `Fix per docs, or scope a disable to the line with a reason: \`${ruleName}\`.`;
|
|
320
|
+
}
|
|
321
|
+
if (issue.id.startsWith('python-type-error-'))
|
|
322
|
+
return 'Refine the annotation, narrow at the call site, or pin a `# type: ignore[code]`.';
|
|
273
323
|
return null;
|
|
274
324
|
}
|
|
275
325
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixSuggest.js","sourceRoot":"","sources":["../../src/core/fixSuggest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fixSuggest.js","sourceRoot":"","sources":["../../src/core/fixSuggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FileEntry } from '../../types.js';
|
|
2
2
|
import type { AstResult } from '../ast.js';
|
|
3
|
-
export type LanguageId = 'javascript' | 'python' | 'go' | 'java' | 'ruby';
|
|
3
|
+
export type LanguageId = 'javascript' | 'python' | 'go' | 'java' | 'ruby' | 'rust';
|
|
4
4
|
export interface LanguageResolveContext {
|
|
5
5
|
/** Language-specific root dirs used during import resolution. */
|
|
6
6
|
packageRoots?: string[];
|
|
@@ -4,7 +4,8 @@ import { pythonAdapter } from './pythonAdapter.js';
|
|
|
4
4
|
import { goAdapter } from './goAdapter.js';
|
|
5
5
|
import { javaAdapter } from './javaAdapter.js';
|
|
6
6
|
import { rubyAdapter } from './rubyAdapter.js';
|
|
7
|
-
|
|
7
|
+
import { rustAdapter } from './rustAdapter.js';
|
|
8
|
+
const adapters = [javascriptAdapter, pythonAdapter, goAdapter, javaAdapter, rubyAdapter, rustAdapter];
|
|
8
9
|
const byExtension = new Map();
|
|
9
10
|
function rebuildIndex() {
|
|
10
11
|
byExtension.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/languages/registry.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,QAAQ,GAAsB,CAAC,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/languages/registry.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,QAAQ,GAAsB,CAAC,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACzH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;AAEvD,SAAS,YAAY;IACnB,WAAW,CAAC,KAAK,EAAE,CAAC;IACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AACD,YAAY,EAAE,CAAC;AAEf,MAAM,UAAU,eAAe,CAAC,OAAwB;IACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,YAAY,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { createParserFor } from './treeSitterLoader.js';
|
|
3
|
+
import { extractRustImports } from './rustImports.js';
|
|
4
|
+
import { extractRustExports } from './rustExports.js';
|
|
5
|
+
import { extractRustCyclomatic } from './rustCyclomatic.js';
|
|
6
|
+
import { extractRustFunctions } from './rustFunctions.js';
|
|
7
|
+
import { extractRustCallSites } from './rustCallSites.js';
|
|
8
|
+
import { detectRustProject } from './rustManifests.js';
|
|
9
|
+
const RUST_EXTENSIONS = new Set(['.rs']);
|
|
10
|
+
const MAX_RUST_FILE = 1024 * 1024;
|
|
11
|
+
let parserPromise = null;
|
|
12
|
+
async function getParser() {
|
|
13
|
+
if (!parserPromise)
|
|
14
|
+
parserPromise = createParserFor('tree-sitter-rust.wasm');
|
|
15
|
+
return parserPromise;
|
|
16
|
+
}
|
|
17
|
+
export const rustAdapter = {
|
|
18
|
+
id: 'rust',
|
|
19
|
+
extensions: RUST_EXTENSIONS,
|
|
20
|
+
sourceExtensions: RUST_EXTENSIONS,
|
|
21
|
+
// Rust has no barrel-file convention. mod.rs is closest but it's a module
|
|
22
|
+
// root, not a re-export hub in the JS sense.
|
|
23
|
+
barrelBasenames: new Set(),
|
|
24
|
+
maxFileSize: MAX_RUST_FILE,
|
|
25
|
+
async parse(_filePath, content) {
|
|
26
|
+
try {
|
|
27
|
+
const parser = await getParser();
|
|
28
|
+
const tree = parser.parse(content);
|
|
29
|
+
if (!tree || !tree.rootNode) {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
reason: 'tree-sitter returned null tree',
|
|
33
|
+
imports: [],
|
|
34
|
+
exports: [],
|
|
35
|
+
callSites: [],
|
|
36
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
37
|
+
cyclomaticComplexity: 0,
|
|
38
|
+
functions: [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const root = tree.rootNode;
|
|
42
|
+
const imports = extractRustImports(root);
|
|
43
|
+
const exports = extractRustExports(root);
|
|
44
|
+
const cyclomaticComplexity = extractRustCyclomatic(root);
|
|
45
|
+
const callSites = extractRustCallSites(root);
|
|
46
|
+
const functions = extractRustFunctions(root);
|
|
47
|
+
return {
|
|
48
|
+
ok: true,
|
|
49
|
+
imports,
|
|
50
|
+
exports,
|
|
51
|
+
callSites,
|
|
52
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
53
|
+
cyclomaticComplexity,
|
|
54
|
+
functions,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
reason: `rust parse failure: ${msg.slice(0, 120)}`,
|
|
62
|
+
imports: [],
|
|
63
|
+
exports: [],
|
|
64
|
+
callSites: [],
|
|
65
|
+
lineCount: content ? content.split('\n').length : 0,
|
|
66
|
+
cyclomaticComplexity: 0,
|
|
67
|
+
functions: [],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
resolveImport(importingFile, source, graphFiles, context) {
|
|
72
|
+
return resolveRustImport(importingFile, source, graphFiles, context);
|
|
73
|
+
},
|
|
74
|
+
toPackageName(source) {
|
|
75
|
+
if (!source)
|
|
76
|
+
return null;
|
|
77
|
+
if (source.startsWith('crate::') || source === 'crate')
|
|
78
|
+
return null;
|
|
79
|
+
if (source.startsWith('self::') || source === 'self')
|
|
80
|
+
return null;
|
|
81
|
+
if (source.startsWith('super::') || source === 'super')
|
|
82
|
+
return null;
|
|
83
|
+
return source.split('::')[0];
|
|
84
|
+
},
|
|
85
|
+
async preparePackageRoots(rootPath, files) {
|
|
86
|
+
const info = await detectRustProject(rootPath, files);
|
|
87
|
+
return {
|
|
88
|
+
packageRoots: info ? [path.relative(rootPath, info.crateRoot) || '.'] : [],
|
|
89
|
+
meta: info ? { rustProject: info } : undefined,
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Resolve a Rust `use` path to a repo-local file, or null if the import
|
|
95
|
+
* targets the standard library / a third-party crate.
|
|
96
|
+
*
|
|
97
|
+
* crate::foo::bar → resolve against the crate's `src/` root.
|
|
98
|
+
* self::foo → resolve against the importing file's directory.
|
|
99
|
+
* super::foo → resolve against the importing file's parent.
|
|
100
|
+
* <crateName>::… → same as crate:: for the project's own crate.
|
|
101
|
+
* anything else → null (external).
|
|
102
|
+
*
|
|
103
|
+
* Probes are file-flavoured: `foo` resolves to `foo.rs` or `foo/mod.rs`.
|
|
104
|
+
*/
|
|
105
|
+
function resolveRustImport(importingFile, source, graphFiles, context) {
|
|
106
|
+
if (!source)
|
|
107
|
+
return null;
|
|
108
|
+
const segments = source.split('::').filter(Boolean);
|
|
109
|
+
if (segments.length === 0)
|
|
110
|
+
return null;
|
|
111
|
+
const project = context.meta?.rustProject;
|
|
112
|
+
// self:: / super::… - relative to the importing file.
|
|
113
|
+
if (segments[0] === 'self' || segments[0] === 'super') {
|
|
114
|
+
const importingDir = path.posix.dirname(importingFile);
|
|
115
|
+
let dir = importingDir;
|
|
116
|
+
let i = 0;
|
|
117
|
+
while (i < segments.length && segments[i] === 'super') {
|
|
118
|
+
dir = path.posix.dirname(dir);
|
|
119
|
+
if (dir === '.' || dir === '/' || dir === '') {
|
|
120
|
+
dir = '';
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
i++;
|
|
124
|
+
}
|
|
125
|
+
if (segments[i] === 'self')
|
|
126
|
+
i++;
|
|
127
|
+
const tail = segments.slice(i, segments.length - 1); // drop final symbol
|
|
128
|
+
const moduleName = tail[tail.length - 1] ?? '';
|
|
129
|
+
if (!moduleName)
|
|
130
|
+
return null;
|
|
131
|
+
const base = [dir, ...tail.slice(0, -1)].filter(Boolean).join('/');
|
|
132
|
+
return probeRustModule(base, moduleName, graphFiles);
|
|
133
|
+
}
|
|
134
|
+
// crate:: or <crateName>::…
|
|
135
|
+
const isCrate = segments[0] === 'crate' || (project && segments[0] === project.crateName);
|
|
136
|
+
if (isCrate && project) {
|
|
137
|
+
const tail = segments.slice(1, segments.length - 1); // drop final symbol
|
|
138
|
+
const moduleName = tail[tail.length - 1] ?? '';
|
|
139
|
+
if (!moduleName)
|
|
140
|
+
return null;
|
|
141
|
+
const packageRoots = context.packageRoots ?? ['.'];
|
|
142
|
+
for (const root of packageRoots) {
|
|
143
|
+
const rootSegs = root === '.' || root === '' ? [] : root.split('/').filter(Boolean);
|
|
144
|
+
const base = [...rootSegs, 'src', ...tail.slice(0, -1)].filter(Boolean).join('/');
|
|
145
|
+
const hit = probeRustModule(base, moduleName, graphFiles);
|
|
146
|
+
if (hit)
|
|
147
|
+
return hit;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
function probeRustModule(baseDir, moduleName, graphFiles) {
|
|
154
|
+
if (!moduleName)
|
|
155
|
+
return null;
|
|
156
|
+
const stem = baseDir ? `${baseDir}/${moduleName}` : moduleName;
|
|
157
|
+
const asFile = `${stem}.rs`;
|
|
158
|
+
if (graphFiles.has(asFile))
|
|
159
|
+
return asFile;
|
|
160
|
+
const asMod = `${stem}/mod.rs`;
|
|
161
|
+
if (graphFiles.has(asMod))
|
|
162
|
+
return asMod;
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=rustAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rustAdapter.js","sourceRoot":"","sources":["../../../src/core/languages/rustAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface TsNode {
|
|
2
|
+
type: string;
|
|
3
|
+
text: string;
|
|
4
|
+
namedChildren: TsNode[];
|
|
5
|
+
childForFieldName?: (name: string) => TsNode | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract the called identifier from each `call_expression` in a
|
|
9
|
+
* tree-sitter-rust AST. Mirrors the existing JS/TS, Python, Go, Java, Ruby
|
|
10
|
+
* adapter behaviour: we deduplicate names and strip qualification so that
|
|
11
|
+
* `foo::bar()` and `obj.bar()` both produce `bar`. Macro invocations
|
|
12
|
+
* (`println!`, `vec!`) are NOT call expressions in Rust's grammar — they're
|
|
13
|
+
* `macro_invocation` nodes; we currently don't include them as callSites
|
|
14
|
+
* to avoid false positives across the macro-expansion boundary.
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractRustCallSites(root: TsNode): string[];
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract the called identifier from each `call_expression` in a
|
|
3
|
+
* tree-sitter-rust AST. Mirrors the existing JS/TS, Python, Go, Java, Ruby
|
|
4
|
+
* adapter behaviour: we deduplicate names and strip qualification so that
|
|
5
|
+
* `foo::bar()` and `obj.bar()` both produce `bar`. Macro invocations
|
|
6
|
+
* (`println!`, `vec!`) are NOT call expressions in Rust's grammar — they're
|
|
7
|
+
* `macro_invocation` nodes; we currently don't include them as callSites
|
|
8
|
+
* to avoid false positives across the macro-expansion boundary.
|
|
9
|
+
*/
|
|
10
|
+
export function extractRustCallSites(root) {
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
walk(root, (n) => {
|
|
13
|
+
if (n.type !== 'call_expression')
|
|
14
|
+
return;
|
|
15
|
+
const fn = n.childForFieldName ? n.childForFieldName('function') : null;
|
|
16
|
+
if (!fn)
|
|
17
|
+
return;
|
|
18
|
+
const name = bareName(fn);
|
|
19
|
+
if (name)
|
|
20
|
+
seen.add(name);
|
|
21
|
+
});
|
|
22
|
+
return [...seen];
|
|
23
|
+
}
|
|
24
|
+
function bareName(node) {
|
|
25
|
+
switch (node.type) {
|
|
26
|
+
case 'identifier':
|
|
27
|
+
case 'type_identifier':
|
|
28
|
+
case 'field_identifier':
|
|
29
|
+
return node.text;
|
|
30
|
+
case 'scoped_identifier': {
|
|
31
|
+
// `foo::bar::baz` - take the last segment.
|
|
32
|
+
const name = node.childForFieldName ? node.childForFieldName('name') : null;
|
|
33
|
+
if (name)
|
|
34
|
+
return bareName(name);
|
|
35
|
+
const last = node.namedChildren[node.namedChildren.length - 1];
|
|
36
|
+
return last ? bareName(last) : null;
|
|
37
|
+
}
|
|
38
|
+
case 'field_expression': {
|
|
39
|
+
// `obj.foo` - take the field name.
|
|
40
|
+
const field = node.childForFieldName ? node.childForFieldName('field') : null;
|
|
41
|
+
if (field)
|
|
42
|
+
return bareName(field);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
case 'generic_function': {
|
|
46
|
+
// `foo::<T>` - drill down to the underlying function path.
|
|
47
|
+
const inner = node.namedChildren[0];
|
|
48
|
+
return inner ? bareName(inner) : null;
|
|
49
|
+
}
|
|
50
|
+
default:
|
|
51
|
+
// Closures, blocks, parenthesized expressions etc. - no useful name.
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function walk(node, visit) {
|
|
56
|
+
visit(node);
|
|
57
|
+
for (const child of node.namedChildren)
|
|
58
|
+
walk(child, visit);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=rustCallSites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rustCallSites.js","sourceRoot":"","sources":["../../../src/core/languages/rustCallSites.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO;QACzC,MAAM,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB,CAAC;QACvB,KAAK,kBAAkB;YACrB,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,2CAA2C;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,IAAI,IAAI;gBAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,mCAAmC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9E,IAAI,KAAK;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,2DAA2D;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,CAAC;QACD;YACE,qEAAqE;YACrE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAA0B;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface TsNode {
|
|
2
|
+
type: string;
|
|
3
|
+
text: string;
|
|
4
|
+
namedChildren: TsNode[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* File-level McCabe cyclomatic complexity for a tree-sitter-rust AST.
|
|
8
|
+
*
|
|
9
|
+
* Decision points in Rust:
|
|
10
|
+
* if_expression +1 (the `if` itself; `else` does not count)
|
|
11
|
+
* else_clause with `if` +1 (the chained `else if`)
|
|
12
|
+
* for_expression +1
|
|
13
|
+
* while_expression +1
|
|
14
|
+
* loop_expression +1 (an unconditional `loop` is still one branch with
|
|
15
|
+
* its `break` exits)
|
|
16
|
+
* match_arm +1 per non-wildcard arm; the `_` arm does NOT count
|
|
17
|
+
* try_expression +1 (the `?` operator: success vs error path)
|
|
18
|
+
* binary_expression with `&&` / `||` +1 each (short-circuit)
|
|
19
|
+
*
|
|
20
|
+
* The arrow `=>` between match arm patterns and bodies is the actual branch.
|
|
21
|
+
* Wildcard arms (`_ =>`) are the fall-through and don't add a path.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractRustCyclomatic(root: TsNode): number;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-level McCabe cyclomatic complexity for a tree-sitter-rust AST.
|
|
3
|
+
*
|
|
4
|
+
* Decision points in Rust:
|
|
5
|
+
* if_expression +1 (the `if` itself; `else` does not count)
|
|
6
|
+
* else_clause with `if` +1 (the chained `else if`)
|
|
7
|
+
* for_expression +1
|
|
8
|
+
* while_expression +1
|
|
9
|
+
* loop_expression +1 (an unconditional `loop` is still one branch with
|
|
10
|
+
* its `break` exits)
|
|
11
|
+
* match_arm +1 per non-wildcard arm; the `_` arm does NOT count
|
|
12
|
+
* try_expression +1 (the `?` operator: success vs error path)
|
|
13
|
+
* binary_expression with `&&` / `||` +1 each (short-circuit)
|
|
14
|
+
*
|
|
15
|
+
* The arrow `=>` between match arm patterns and bodies is the actual branch.
|
|
16
|
+
* Wildcard arms (`_ =>`) are the fall-through and don't add a path.
|
|
17
|
+
*/
|
|
18
|
+
export function extractRustCyclomatic(root) {
|
|
19
|
+
let decisions = 0;
|
|
20
|
+
walk(root, (n) => {
|
|
21
|
+
if (isDecisionPoint(n))
|
|
22
|
+
decisions++;
|
|
23
|
+
});
|
|
24
|
+
return decisions + 1;
|
|
25
|
+
}
|
|
26
|
+
function isDecisionPoint(n) {
|
|
27
|
+
switch (n.type) {
|
|
28
|
+
case 'if_expression':
|
|
29
|
+
case 'for_expression':
|
|
30
|
+
case 'while_expression':
|
|
31
|
+
case 'loop_expression':
|
|
32
|
+
case 'try_expression':
|
|
33
|
+
return true;
|
|
34
|
+
case 'match_arm': {
|
|
35
|
+
// Non-wildcard arms count. tree-sitter-rust wraps the pattern in a
|
|
36
|
+
// `match_pattern` node whose inner is the actual pattern; a bare `_`
|
|
37
|
+
// arm has no named children inside `match_pattern` (the `_` is an
|
|
38
|
+
// anonymous token), so we also fall back to the text-equality check.
|
|
39
|
+
const arm = n.namedChildren[0];
|
|
40
|
+
if (!arm)
|
|
41
|
+
return true;
|
|
42
|
+
if (arm.type === 'wildcard_pattern')
|
|
43
|
+
return false;
|
|
44
|
+
if (arm.type === 'match_pattern') {
|
|
45
|
+
const inner = arm.namedChildren[0];
|
|
46
|
+
if (!inner)
|
|
47
|
+
return arm.text.trim() !== '_';
|
|
48
|
+
if (inner.type === 'wildcard_pattern')
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
case 'binary_expression': {
|
|
54
|
+
// tree-sitter-rust exposes the operator as text within the binary_expression.
|
|
55
|
+
// Match `&&` / `||` with whitespace boundaries to avoid catching them inside strings.
|
|
56
|
+
return /(\s|^)(\|\||&&)(\s|$)/.test(n.text);
|
|
57
|
+
}
|
|
58
|
+
default:
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function walk(node, visit) {
|
|
63
|
+
visit(node);
|
|
64
|
+
for (const child of node.namedChildren)
|
|
65
|
+
walk(child, visit);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=rustCyclomatic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rustCyclomatic.js","sourceRoot":"","sources":["../../../src/core/languages/rustCyclomatic.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,eAAe,CAAC,CAAC,CAAC;YAAE,SAAS,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAChC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,eAAe,CAAC;QACrB,KAAK,gBAAgB,CAAC;QACtB,KAAK,kBAAkB,CAAC;QACxB,KAAK,iBAAiB,CAAC;QACvB,KAAK,gBAAgB;YACnB,OAAO,IAAI,CAAC;QACd,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,mEAAmE;YACnE,qEAAqE;YACrE,kEAAkE;YAClE,qEAAqE;YACrE,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC,KAAK;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;gBAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;oBAAE,OAAO,KAAK,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,8EAA8E;YAC9E,sFAAsF;YACtF,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAA0B;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AstExport } from '../ast.js';
|
|
2
|
+
interface TsNode {
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
startPosition: {
|
|
6
|
+
row: number;
|
|
7
|
+
column: number;
|
|
8
|
+
};
|
|
9
|
+
namedChildren: TsNode[];
|
|
10
|
+
childForFieldName?: (name: string) => TsNode | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extract public top-level items from a tree-sitter-rust AST. We descend
|
|
14
|
+
* into `mod foo { ... }` blocks because `pub fn` declared inside an inline
|
|
15
|
+
* module is still part of the crate's surface; the qualified name reported
|
|
16
|
+
* is the bare item name (the module is captured separately as its own
|
|
17
|
+
* export).
|
|
18
|
+
*
|
|
19
|
+
* Visibility detection: any direct child of type `visibility_modifier`
|
|
20
|
+
* (which includes `pub`, `pub(crate)`, `pub(super)`, `pub(in path::to)`)
|
|
21
|
+
* counts as exported. We do NOT distinguish between `pub` and `pub(crate)`
|
|
22
|
+
* here — both are public to the crate's consumers in the graph sense.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractRustExports(root: TsNode): AstExport[];
|
|
25
|
+
export {};
|