@lzehrung/codegraph 2.3.23 → 2.3.25
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 +1 -1
- package/codegraph-skill/codegraph/SKILL.md +2 -2
- package/dist/bin/cli.js +3475 -1655
- package/dist/bin/query-index-worker.js +569 -229
- package/dist/cli/command-table.d.ts.map +1 -1
- package/dist/cli/command-table.js +1 -5
- package/dist/cli/command-table.js.map +1 -1
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +7 -4
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +8 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/invocation-context.d.ts +2 -1
- package/dist/cli/invocation-context.d.ts.map +1 -1
- package/dist/cli/invocation-context.js +13 -0
- package/dist/cli/invocation-context.js.map +1 -1
- package/dist/document-links/asciidoc.d.ts.map +1 -1
- package/dist/document-links/asciidoc.js +33 -0
- package/dist/document-links/asciidoc.js.map +1 -1
- package/dist/document-links/language-ids.d.ts +10 -0
- package/dist/document-links/language-ids.d.ts.map +1 -0
- package/dist/document-links/language-ids.js +15 -0
- package/dist/document-links/language-ids.js.map +1 -0
- package/dist/document-links/markdown.d.ts.map +1 -1
- package/dist/document-links/markdown.js +103 -21
- package/dist/document-links/markdown.js.map +1 -1
- package/dist/document-links/shared.d.ts.map +1 -1
- package/dist/document-links/shared.js +1 -0
- package/dist/document-links/shared.js.map +1 -1
- package/dist/document-links.d.ts +1 -3
- package/dist/document-links.d.ts.map +1 -1
- package/dist/document-links.js +1 -8
- package/dist/document-links.js.map +1 -1
- package/dist/duplicates/unit-cache.d.ts +4 -3
- package/dist/duplicates/unit-cache.d.ts.map +1 -1
- package/dist/duplicates/unit-cache.js +17 -7
- package/dist/duplicates/unit-cache.js.map +1 -1
- package/dist/duplicates/units.d.ts +2 -1
- package/dist/duplicates/units.d.ts.map +1 -1
- package/dist/duplicates/units.js +77 -16
- package/dist/duplicates/units.js.map +1 -1
- package/dist/graphs/edge-resolution.d.ts.map +1 -1
- package/dist/graphs/edge-resolution.js +3 -0
- package/dist/graphs/edge-resolution.js.map +1 -1
- package/dist/graphs/external/stdlib.d.ts.map +1 -1
- package/dist/graphs/external/stdlib.js +18 -11
- package/dist/graphs/external/stdlib.js.map +1 -1
- package/dist/graphs/specifiers.d.ts +3 -2
- package/dist/graphs/specifiers.d.ts.map +1 -1
- package/dist/graphs/specifiers.js +76 -39
- package/dist/graphs/specifiers.js.map +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js +1 -1
- package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
- package/dist/indexer/build-cache/options.d.ts +8 -2
- package/dist/indexer/build-cache/options.d.ts.map +1 -1
- package/dist/indexer/build-cache/options.js +10 -2
- package/dist/indexer/build-cache/options.js.map +1 -1
- package/dist/indexer/build-cache/reports.d.ts.map +1 -1
- package/dist/indexer/build-cache/reports.js +29 -21
- package/dist/indexer/build-cache/reports.js.map +1 -1
- package/dist/indexer/expand-star-imports.d.ts.map +1 -1
- package/dist/indexer/expand-star-imports.js +8 -3
- package/dist/indexer/expand-star-imports.js.map +1 -1
- package/dist/indexer/imports/language-specific.d.ts.map +1 -1
- package/dist/indexer/imports/language-specific.js +166 -32
- package/dist/indexer/imports/language-specific.js.map +1 -1
- package/dist/indexer/imports/native-captures.d.ts.map +1 -1
- package/dist/indexer/imports/native-captures.js +4 -3
- package/dist/indexer/imports/native-captures.js.map +1 -1
- package/dist/indexer/imports/python.d.ts +2 -0
- package/dist/indexer/imports/python.d.ts.map +1 -1
- package/dist/indexer/imports/python.js +113 -8
- package/dist/indexer/imports/python.js.map +1 -1
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +25 -12
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/locals-and-exports.d.ts.map +1 -1
- package/dist/indexer/locals-and-exports.js +153 -38
- package/dist/indexer/locals-and-exports.js.map +1 -1
- package/dist/indexer/navigation-goto.js +1 -1
- package/dist/indexer/navigation-goto.js.map +1 -1
- package/dist/indexer/scope-types.d.ts +1 -1
- package/dist/indexer/scope-types.d.ts.map +1 -1
- package/dist/indexer/scope.d.ts.map +1 -1
- package/dist/indexer/scope.js +43 -2
- package/dist/indexer/scope.js.map +1 -1
- package/dist/languages/definitions/c-family.d.ts +5 -0
- package/dist/languages/definitions/c-family.d.ts.map +1 -1
- package/dist/languages/definitions/c-family.js +27 -6
- package/dist/languages/definitions/c-family.js.map +1 -1
- package/dist/languages/definitions/c.d.ts.map +1 -1
- package/dist/languages/definitions/c.js +5 -0
- package/dist/languages/definitions/c.js.map +1 -1
- package/dist/languages/definitions/cpp.d.ts.map +1 -1
- package/dist/languages/definitions/cpp.js +41 -3
- package/dist/languages/definitions/cpp.js.map +1 -1
- package/dist/languages/definitions/csharp.d.ts.map +1 -1
- package/dist/languages/definitions/csharp.js +52 -21
- package/dist/languages/definitions/csharp.js.map +1 -1
- package/dist/languages/definitions/go.d.ts.map +1 -1
- package/dist/languages/definitions/go.js +10 -7
- package/dist/languages/definitions/go.js.map +1 -1
- package/dist/languages/definitions/html-stub.d.ts +6 -7
- package/dist/languages/definitions/html-stub.d.ts.map +1 -1
- package/dist/languages/definitions/html-stub.js +6 -7
- package/dist/languages/definitions/html-stub.js.map +1 -1
- package/dist/languages/definitions/html.js +13 -13
- package/dist/languages/definitions/html.js.map +1 -1
- package/dist/languages/definitions/java.d.ts.map +1 -1
- package/dist/languages/definitions/java.js +6 -0
- package/dist/languages/definitions/java.js.map +1 -1
- package/dist/languages/definitions/javascript.d.ts.map +1 -1
- package/dist/languages/definitions/javascript.js +48 -30
- package/dist/languages/definitions/javascript.js.map +1 -1
- package/dist/languages/definitions/kotlin.d.ts.map +1 -1
- package/dist/languages/definitions/kotlin.js +49 -61
- package/dist/languages/definitions/kotlin.js.map +1 -1
- package/dist/languages/definitions/php.js +1 -1
- package/dist/languages/definitions/php.js.map +1 -1
- package/dist/languages/definitions/python.d.ts.map +1 -1
- package/dist/languages/definitions/python.js +85 -20
- package/dist/languages/definitions/python.js.map +1 -1
- package/dist/languages/definitions/ruby.d.ts.map +1 -1
- package/dist/languages/definitions/ruby.js +13 -11
- package/dist/languages/definitions/ruby.js.map +1 -1
- package/dist/languages/definitions/rust.d.ts.map +1 -1
- package/dist/languages/definitions/rust.js +22 -5
- package/dist/languages/definitions/rust.js.map +1 -1
- package/dist/languages/definitions/scss.d.ts.map +1 -1
- package/dist/languages/definitions/scss.js +21 -17
- package/dist/languages/definitions/scss.js.map +1 -1
- package/dist/languages/definitions/sql.js +1 -1
- package/dist/languages/definitions/sql.js.map +1 -1
- package/dist/languages/definitions/swift.d.ts.map +1 -1
- package/dist/languages/definitions/swift.js +66 -16
- package/dist/languages/definitions/swift.js.map +1 -1
- package/dist/languages/definitions/typescript.d.ts.map +1 -1
- package/dist/languages/definitions/typescript.js +30 -9
- package/dist/languages/definitions/typescript.js.map +1 -1
- package/dist/languages/definitions/zig.d.ts.map +1 -1
- package/dist/languages/definitions/zig.js +26 -5
- package/dist/languages/definitions/zig.js.map +1 -1
- package/dist/languages/import-statement-parsers.d.ts +14 -1
- package/dist/languages/import-statement-parsers.d.ts.map +1 -1
- package/dist/languages/import-statement-parsers.js +473 -45
- package/dist/languages/import-statement-parsers.js.map +1 -1
- package/dist/languages/types.d.ts +11 -0
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages.d.ts +1 -0
- package/dist/languages.d.ts.map +1 -1
- package/dist/languages.js +9 -2
- package/dist/languages.js.map +1 -1
- package/dist/native/backend-report-format.d.ts +4 -0
- package/dist/native/backend-report-format.d.ts.map +1 -0
- package/dist/native/backend-report-format.js +14 -0
- package/dist/native/backend-report-format.js.map +1 -0
- package/dist/native/contracts.d.ts +2 -0
- package/dist/native/contracts.d.ts.map +1 -1
- package/dist/util/comments.js +1 -1
- package/dist/util/comments.js.map +1 -1
- package/dist/util/member-access.d.ts +1 -1
- package/dist/util/member-access.d.ts.map +1 -1
- package/dist/util/member-access.js +5 -2
- package/dist/util/member-access.js.map +1 -1
- package/dist/util/project-files.js +1 -1
- package/dist/util/project-files.js.map +1 -1
- package/dist/util/resolution/rust.d.ts +8 -1
- package/dist/util/resolution/rust.d.ts.map +1 -1
- package/dist/util/resolution/rust.js +521 -7
- package/dist/util/resolution/rust.js.map +1 -1
- package/dist/util/resolution-candidates.d.ts +1 -1
- package/dist/util/resolution-candidates.d.ts.map +1 -1
- package/dist/util/resolution-candidates.js +11 -8
- package/dist/util/resolution-candidates.js.map +1 -1
- package/dist/util/resolution.d.ts +5 -0
- package/dist/util/resolution.d.ts.map +1 -1
- package/dist/util/resolution.js +18 -7
- package/dist/util/resolution.js.map +1 -1
- package/dist/util/rust-test-modules.d.ts.map +1 -1
- package/dist/util/rust-test-modules.js +2 -5
- package/dist/util/rust-test-modules.js.map +1 -1
- package/dist/util/specifiers.d.ts +8 -0
- package/dist/util/specifiers.d.ts.map +1 -1
- package/dist/util/specifiers.js +33 -7
- package/dist/util/specifiers.js.map +1 -1
- package/package.json +3 -3
|
@@ -6,6 +6,7 @@ const ZIG_TYPE_INITIALIZER_TYPES = new Set([
|
|
|
6
6
|
"union_declaration",
|
|
7
7
|
"opaque_declaration",
|
|
8
8
|
"error_set_declaration",
|
|
9
|
+
"error_union_type",
|
|
9
10
|
]);
|
|
10
11
|
export const ZIG_DEF = {
|
|
11
12
|
id: "zig",
|
|
@@ -17,13 +18,16 @@ export const ZIG_DEF = {
|
|
|
17
18
|
{ type: "test_declaration", nameQuery: "(string) @chunk.name", captureId: "test" },
|
|
18
19
|
],
|
|
19
20
|
splitPoints: ["if_expression", "for_expression", "while_expression", "switch_expression"],
|
|
20
|
-
comments: ["
|
|
21
|
+
comments: ["comment"],
|
|
21
22
|
},
|
|
22
23
|
graph: {
|
|
23
|
-
imports:
|
|
24
|
+
imports: `
|
|
25
|
+
(builtin_function (builtin_identifier) @fn (arguments (string) @mod) (#eq? @fn "@import")) @stmt
|
|
26
|
+
(builtin_function (builtin_identifier) @mod (arguments) (#eq? @mod "@cImport")) @stmt
|
|
27
|
+
`,
|
|
24
28
|
exports: `
|
|
25
|
-
(function_declaration name: (identifier) @name)
|
|
26
|
-
(variable_declaration (identifier) @name)
|
|
29
|
+
(source_file (function_declaration name: (identifier) @name))
|
|
30
|
+
(source_file (variable_declaration (identifier) @name))
|
|
27
31
|
`,
|
|
28
32
|
locals: `
|
|
29
33
|
(function_declaration name: (identifier) @name)
|
|
@@ -35,6 +39,13 @@ export const ZIG_DEF = {
|
|
|
35
39
|
(identifier) @alias
|
|
36
40
|
(builtin_function (builtin_identifier) @fn (arguments (string) @from) (#eq? @fn "@import"))
|
|
37
41
|
) @stmt
|
|
42
|
+
(variable_declaration
|
|
43
|
+
(identifier) @alias
|
|
44
|
+
(builtin_function (builtin_identifier) @from (arguments) (#eq? @from "@cImport"))
|
|
45
|
+
) @stmt
|
|
46
|
+
(using_namespace_declaration
|
|
47
|
+
(builtin_function (builtin_identifier) @fn (arguments (string) @from) (#eq? @fn "@import"))
|
|
48
|
+
) @stmt @wild
|
|
38
49
|
`,
|
|
39
50
|
},
|
|
40
51
|
nodeTypes: {
|
|
@@ -53,7 +64,17 @@ export const ZIG_DEF = {
|
|
|
53
64
|
const declaredName = parent.namedChildren.find((child) => child.type === "identifier");
|
|
54
65
|
if (declaredName?.id !== node.id)
|
|
55
66
|
return "variable";
|
|
56
|
-
|
|
67
|
+
let equalsEndIndex = -1;
|
|
68
|
+
for (let index = 0;; index++) {
|
|
69
|
+
const child = parent.child(index);
|
|
70
|
+
if (!child)
|
|
71
|
+
break;
|
|
72
|
+
if (child.type === "=") {
|
|
73
|
+
equalsEndIndex = child.endIndex;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const initializer = parent.namedChildren.find((child) => child.startIndex >= equalsEndIndex);
|
|
57
78
|
if (initializer && ZIG_TYPE_INITIALIZER_TYPES.has(initializer.type))
|
|
58
79
|
return "type";
|
|
59
80
|
return "variable";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zig.js","sourceRoot":"","sources":["../../../src/languages/definitions/zig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACzC,cAAc;IACd,oBAAoB;IACpB,kBAAkB;IAClB,mBAAmB;IACnB,oBAAoB;IACpB,uBAAuB;
|
|
1
|
+
{"version":3,"file":"zig.js","sourceRoot":"","sources":["../../../src/languages/definitions/zig.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,24 @@ export type ParsedRustImportStatement = {
|
|
|
8
8
|
from: string;
|
|
9
9
|
local: string;
|
|
10
10
|
isExternCrate: boolean;
|
|
11
|
+
pathAttribute?: string;
|
|
11
12
|
} | {
|
|
12
13
|
kind: "star";
|
|
13
14
|
from: string;
|
|
14
15
|
};
|
|
15
|
-
export declare function
|
|
16
|
+
export declare function skipRustCommentOrLiteral(source: string, index: number): {
|
|
17
|
+
end: number;
|
|
18
|
+
kind: "comment" | "literal";
|
|
19
|
+
} | null;
|
|
20
|
+
export declare function skipRustBalancedDelimiters(source: string, index: number, closer: string): number;
|
|
21
|
+
export declare function isRustItemStartBoundary(source: string, index: number): boolean;
|
|
22
|
+
export declare function skipRustOuterAttribute(source: string, index: number): number | null;
|
|
23
|
+
export declare function skipRustAttribute(source: string, index: number): number | null;
|
|
24
|
+
export declare function skipRustMacroTokenTree(source: string, index: number): {
|
|
25
|
+
end: number;
|
|
26
|
+
} | null;
|
|
27
|
+
export declare function skipRustCommentsAndWhitespaceBackward(source: string, index: number): number;
|
|
28
|
+
export declare function parseRustImportStatements(stmtText: string): ParsedRustImportStatement[];
|
|
16
29
|
export type ParsedCsharpUsingDirective = {
|
|
17
30
|
from: string;
|
|
18
31
|
alias?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-statement-parsers.d.ts","sourceRoot":"","sources":["../../src/languages/import-statement-parsers.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"import-statement-parsers.d.ts","sourceRoot":"","sources":["../../src/languages/import-statement-parsers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,66 +1,494 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { CSHARP_IDENTIFIER_SOURCE, JAVA_IDENTIFIER_SOURCE, KOTLIN_IDENTIFIER_SOURCE, PHP_IDENTIFIER_SOURCE, XID_IDENTIFIER_SOURCE, } from "../util/identifiers.js";
|
|
3
3
|
import { isAbsoluteFilePath, normalizePath } from "../util/paths.js";
|
|
4
|
-
const RUST_MODULE_PATTERN = new RegExp(String.raw `^mod\s+(${XID_IDENTIFIER_SOURCE})\s*;?$`, "u");
|
|
4
|
+
const RUST_MODULE_PATTERN = new RegExp(String.raw `^(?:pub(?:\s*\([^)]*\))?\s+)?mod\s+(${XID_IDENTIFIER_SOURCE})\s*;?$`, "u");
|
|
5
5
|
const RUST_EXTERN_CRATE_PATTERN = new RegExp(String.raw `^extern\s+crate\s+(${XID_IDENTIFIER_SOURCE})(?:\s+as\s+(${XID_IDENTIFIER_SOURCE}))?\s*;?$`, "u");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const RUST_IDENTIFIER_PATTERN = new RegExp(String.raw `^${XID_IDENTIFIER_SOURCE}$`, "u");
|
|
7
|
+
const RUST_IDENTIFIER_PREFIX_PATTERN = new RegExp(String.raw `^${XID_IDENTIFIER_SOURCE}`, "u");
|
|
8
|
+
const RUST_PATH_ATTRIBUTE_PATTERN = /#\s*\[\s*path\s*=\s*(?:r(#*)"([\s\S]*?)"\1|"([^"]*)")\s*\]/gu;
|
|
9
|
+
const RUST_USE_PATTERN = /^(?:pub(?:\s*\([^)]*\))?\s+)?use\s+([\s\S]+?)\s*;?$/;
|
|
10
|
+
export function skipRustCommentOrLiteral(source, index) {
|
|
11
|
+
const ch = source[index];
|
|
12
|
+
const next = source[index + 1];
|
|
13
|
+
if (ch === "/" && next === "/") {
|
|
14
|
+
let end = index + 2;
|
|
15
|
+
while (end < source.length && source[end] !== "\n" && source[end] !== "\r")
|
|
16
|
+
end += 1;
|
|
17
|
+
return { end, kind: "comment" };
|
|
18
|
+
}
|
|
19
|
+
if (ch === "/" && next === "*") {
|
|
20
|
+
let end = index + 2;
|
|
21
|
+
let depth = 1;
|
|
22
|
+
while (end < source.length && depth > 0) {
|
|
23
|
+
const current = source[end];
|
|
24
|
+
const following = source[end + 1];
|
|
25
|
+
if (current === "/" && following === "*") {
|
|
26
|
+
depth += 1;
|
|
27
|
+
end += 2;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (current === "*" && following === "/") {
|
|
31
|
+
depth -= 1;
|
|
32
|
+
end += 2;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
end += 1;
|
|
36
|
+
}
|
|
37
|
+
return { end, kind: "comment" };
|
|
38
|
+
}
|
|
39
|
+
let rawIndex = index;
|
|
40
|
+
if (ch === "b" || ch === "c")
|
|
41
|
+
rawIndex += 1;
|
|
42
|
+
if (source[rawIndex] === "r") {
|
|
43
|
+
let hashes = 0;
|
|
44
|
+
let cursor = rawIndex + 1;
|
|
45
|
+
while (source[cursor] === "#") {
|
|
46
|
+
hashes += 1;
|
|
47
|
+
cursor += 1;
|
|
48
|
+
}
|
|
49
|
+
if (source[cursor] === '"') {
|
|
50
|
+
return { end: skipRustRawString(source, cursor, hashes), kind: "literal" };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (ch === "b" && next === '"') {
|
|
54
|
+
return { end: skipRustQuotedString(source, index + 1), kind: "literal" };
|
|
55
|
+
}
|
|
56
|
+
if (ch === '"') {
|
|
57
|
+
return { end: skipRustQuotedString(source, index), kind: "literal" };
|
|
58
|
+
}
|
|
59
|
+
if (ch === "'") {
|
|
60
|
+
const charEnd = skipRustCharLiteral(source, index);
|
|
61
|
+
if (charEnd !== null)
|
|
62
|
+
return { end: charEnd, kind: "literal" };
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
function takeRustIdentifierEnd(source, index) {
|
|
67
|
+
const match = source.slice(index).match(RUST_IDENTIFIER_PREFIX_PATTERN);
|
|
68
|
+
if (!match)
|
|
69
|
+
return null;
|
|
70
|
+
return index + match[0].length;
|
|
71
|
+
}
|
|
72
|
+
function takeRustMacroPathEnd(source, index) {
|
|
73
|
+
let cursor = takeRustIdentifierEnd(source, index);
|
|
74
|
+
if (cursor === null)
|
|
75
|
+
return null;
|
|
76
|
+
while (source.startsWith("::", cursor)) {
|
|
77
|
+
const next = takeRustIdentifierEnd(source, cursor + 2);
|
|
78
|
+
if (next === null)
|
|
79
|
+
return cursor;
|
|
80
|
+
cursor = next;
|
|
81
|
+
}
|
|
82
|
+
return cursor;
|
|
83
|
+
}
|
|
84
|
+
const RUST_DELIMITER_PAIRS = { "(": ")", "{": "}", "[": "]" };
|
|
85
|
+
export function skipRustBalancedDelimiters(source, index, closer) {
|
|
86
|
+
const stack = [closer];
|
|
87
|
+
let cursor = index;
|
|
88
|
+
while (cursor < source.length && stack.length) {
|
|
89
|
+
const skipped = skipRustCommentOrLiteral(source, cursor);
|
|
90
|
+
if (skipped) {
|
|
91
|
+
cursor = skipped.end;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const ch = source[cursor];
|
|
95
|
+
if (ch === "(") {
|
|
96
|
+
stack.push(")");
|
|
97
|
+
cursor += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (ch === "{") {
|
|
101
|
+
stack.push("}");
|
|
102
|
+
cursor += 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (ch === "[") {
|
|
106
|
+
stack.push("]");
|
|
107
|
+
cursor += 1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (ch === ")" || ch === "}" || ch === "]") {
|
|
111
|
+
if (ch === stack[stack.length - 1])
|
|
112
|
+
stack.pop();
|
|
113
|
+
cursor += 1;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
cursor += 1;
|
|
117
|
+
}
|
|
118
|
+
return cursor;
|
|
119
|
+
}
|
|
120
|
+
export function isRustItemStartBoundary(source, index) {
|
|
121
|
+
if (index <= 0)
|
|
122
|
+
return true;
|
|
123
|
+
return !/[_\p{XID_Continue}]/u.test(source[index - 1]);
|
|
124
|
+
}
|
|
125
|
+
export function skipRustOuterAttribute(source, index) {
|
|
126
|
+
return skipRustHashAttribute(source, index, false);
|
|
127
|
+
}
|
|
128
|
+
export function skipRustAttribute(source, index) {
|
|
129
|
+
return skipRustHashAttribute(source, index, true);
|
|
130
|
+
}
|
|
131
|
+
function skipRustHashAttribute(source, index, allowInner) {
|
|
132
|
+
if (source[index] !== "#")
|
|
133
|
+
return null;
|
|
134
|
+
let cursor = index + 1;
|
|
135
|
+
while (cursor < source.length && /\s/.test(source[cursor]))
|
|
136
|
+
cursor += 1;
|
|
137
|
+
if (source[cursor] === "!") {
|
|
138
|
+
if (!allowInner)
|
|
139
|
+
return null;
|
|
140
|
+
cursor += 1;
|
|
141
|
+
while (cursor < source.length && /\s/.test(source[cursor]))
|
|
142
|
+
cursor += 1;
|
|
143
|
+
}
|
|
144
|
+
if (source[cursor] !== "[")
|
|
145
|
+
return null;
|
|
146
|
+
cursor += 1;
|
|
147
|
+
let depth = 1;
|
|
148
|
+
while (cursor < source.length && depth > 0) {
|
|
149
|
+
const skipped = skipRustCommentOrLiteral(source, cursor);
|
|
150
|
+
if (skipped) {
|
|
151
|
+
cursor = skipped.end;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const ch = source[cursor];
|
|
155
|
+
if (ch === "[")
|
|
156
|
+
depth += 1;
|
|
157
|
+
else if (ch === "]")
|
|
158
|
+
depth -= 1;
|
|
159
|
+
cursor += 1;
|
|
160
|
+
}
|
|
161
|
+
return cursor;
|
|
162
|
+
}
|
|
163
|
+
export function skipRustMacroTokenTree(source, index) {
|
|
164
|
+
const pathEnd = takeRustMacroPathEnd(source, index);
|
|
165
|
+
if (pathEnd === null)
|
|
166
|
+
return null;
|
|
167
|
+
let cursor = pathEnd;
|
|
168
|
+
while (cursor < source.length && /\s/.test(source[cursor]))
|
|
169
|
+
cursor += 1;
|
|
170
|
+
if (source[cursor] !== "!")
|
|
171
|
+
return null;
|
|
172
|
+
cursor += 1;
|
|
173
|
+
while (cursor < source.length && /\s/.test(source[cursor]))
|
|
174
|
+
cursor += 1;
|
|
175
|
+
const nameEnd = takeRustIdentifierEnd(source, cursor);
|
|
176
|
+
if (nameEnd !== null) {
|
|
177
|
+
let afterName = nameEnd;
|
|
178
|
+
while (afterName < source.length && /\s/.test(source[afterName]))
|
|
179
|
+
afterName += 1;
|
|
180
|
+
const openAfterName = source[afterName];
|
|
181
|
+
if (openAfterName === "(" || openAfterName === "{" || openAfterName === "[") {
|
|
182
|
+
cursor = afterName;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const open = source[cursor];
|
|
186
|
+
if (open === undefined)
|
|
187
|
+
return null;
|
|
188
|
+
const closer = RUST_DELIMITER_PAIRS[open];
|
|
189
|
+
if (!closer)
|
|
190
|
+
return null;
|
|
191
|
+
return { end: skipRustBalancedDelimiters(source, cursor + 1, closer) };
|
|
192
|
+
}
|
|
193
|
+
function rustCommentStartEndingAt(source, end) {
|
|
194
|
+
if (end >= 2 && source[end - 2] === "*" && source[end - 1] === "/") {
|
|
195
|
+
for (let start = end - 2; start >= 0; start -= 1) {
|
|
196
|
+
if (source[start] !== "/" || source[start + 1] !== "*")
|
|
197
|
+
continue;
|
|
198
|
+
const skipped = skipRustCommentOrLiteral(source, start);
|
|
199
|
+
if (skipped?.kind === "comment" && skipped.end === end)
|
|
200
|
+
return start;
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
let lineStart = end;
|
|
205
|
+
while (lineStart > 0 && source[lineStart - 1] !== "\n" && source[lineStart - 1] !== "\r") {
|
|
206
|
+
lineStart -= 1;
|
|
207
|
+
}
|
|
208
|
+
let scan = lineStart;
|
|
209
|
+
while (scan < end) {
|
|
210
|
+
const skipped = skipRustCommentOrLiteral(source, scan);
|
|
211
|
+
if (!skipped) {
|
|
212
|
+
scan += 1;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (skipped.kind === "comment" && source[scan] === "/" && source[scan + 1] === "/" && skipped.end === end) {
|
|
216
|
+
return scan;
|
|
217
|
+
}
|
|
218
|
+
if (skipped.end > scan) {
|
|
219
|
+
scan = skipped.end;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
scan += 1;
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
export function skipRustCommentsAndWhitespaceBackward(source, index) {
|
|
227
|
+
let cursor = index;
|
|
228
|
+
while (cursor > 0) {
|
|
229
|
+
const previous = source[cursor - 1];
|
|
230
|
+
if (previous && /\s/.test(previous)) {
|
|
231
|
+
cursor -= 1;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const commentStart = rustCommentStartEndingAt(source, cursor);
|
|
235
|
+
if (commentStart === null || commentStart >= cursor)
|
|
236
|
+
break;
|
|
237
|
+
cursor = commentStart;
|
|
238
|
+
}
|
|
239
|
+
return cursor;
|
|
240
|
+
}
|
|
241
|
+
function skipRustQuotedString(source, quoteIndex) {
|
|
242
|
+
let index = quoteIndex + 1;
|
|
243
|
+
while (index < source.length) {
|
|
244
|
+
const ch = source[index];
|
|
245
|
+
if (ch === "\\") {
|
|
246
|
+
index += 2;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
if (ch === '"')
|
|
250
|
+
return index + 1;
|
|
251
|
+
index += 1;
|
|
252
|
+
}
|
|
253
|
+
return source.length;
|
|
254
|
+
}
|
|
255
|
+
function skipRustRawString(source, quoteIndex, hashes) {
|
|
256
|
+
let index = quoteIndex + 1;
|
|
257
|
+
while (index < source.length) {
|
|
258
|
+
if (source[index] !== '"') {
|
|
259
|
+
index += 1;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
let count = 0;
|
|
263
|
+
while (count < hashes && source[index + 1 + count] === "#")
|
|
264
|
+
count += 1;
|
|
265
|
+
if (count === hashes)
|
|
266
|
+
return index + 1 + hashes;
|
|
267
|
+
index += 1;
|
|
268
|
+
}
|
|
269
|
+
return source.length;
|
|
270
|
+
}
|
|
271
|
+
function skipRustCharLiteral(source, index) {
|
|
272
|
+
if (source[index] !== "'")
|
|
273
|
+
return null;
|
|
274
|
+
let cursor = index + 1;
|
|
275
|
+
if (cursor >= source.length)
|
|
276
|
+
return null;
|
|
277
|
+
if (source[cursor] === "\\") {
|
|
278
|
+
cursor += 1;
|
|
279
|
+
while (cursor < source.length && source[cursor] !== "'") {
|
|
280
|
+
if (source[cursor] === "\\")
|
|
281
|
+
cursor += 2;
|
|
282
|
+
else
|
|
283
|
+
cursor += 1;
|
|
284
|
+
}
|
|
285
|
+
if (cursor < source.length)
|
|
286
|
+
return cursor + 1;
|
|
287
|
+
return cursor;
|
|
288
|
+
}
|
|
289
|
+
if (source[cursor + 1] === "'")
|
|
290
|
+
return cursor + 2;
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
function stripRustComments(source) {
|
|
294
|
+
let out = "";
|
|
295
|
+
let index = 0;
|
|
296
|
+
while (index < source.length) {
|
|
297
|
+
const skipped = skipRustCommentOrLiteral(source, index);
|
|
298
|
+
if (skipped) {
|
|
299
|
+
if (skipped.kind === "comment") {
|
|
300
|
+
out += source.slice(index, skipped.end).replace(/[^\n\r]/g, " ");
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
out += source.slice(index, skipped.end);
|
|
304
|
+
}
|
|
305
|
+
index = skipped.end;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
out += source[index];
|
|
309
|
+
index += 1;
|
|
310
|
+
}
|
|
311
|
+
return out;
|
|
312
|
+
}
|
|
313
|
+
function takeLeadingRustOuterAttributes(text) {
|
|
314
|
+
let index = 0;
|
|
315
|
+
while (index < text.length) {
|
|
316
|
+
if (/\s/.test(text[index])) {
|
|
317
|
+
index += 1;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
const skipped = skipRustCommentOrLiteral(text, index);
|
|
321
|
+
if (skipped) {
|
|
322
|
+
index = skipped.end;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
const attrEnd = skipRustOuterAttribute(text, index);
|
|
326
|
+
if (attrEnd === null)
|
|
327
|
+
break;
|
|
328
|
+
index = attrEnd;
|
|
329
|
+
}
|
|
330
|
+
return { attributes: text.slice(0, index), rest: text.slice(index).trim() };
|
|
331
|
+
}
|
|
332
|
+
export function parseRustImportStatements(stmtText) {
|
|
333
|
+
const trimmed = stripRustComments(stmtText).trim();
|
|
334
|
+
if (!trimmed)
|
|
335
|
+
return [];
|
|
336
|
+
const { attributes, rest: statement } = takeLeadingRustOuterAttributes(trimmed);
|
|
337
|
+
const pathAttribute = rustPathAttributeFromText(attributes);
|
|
338
|
+
const modMatch = statement.match(RUST_MODULE_PATTERN);
|
|
11
339
|
if (modMatch?.[1]) {
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
340
|
+
return [
|
|
341
|
+
{
|
|
342
|
+
kind: "module",
|
|
343
|
+
from: modMatch[1],
|
|
344
|
+
local: modMatch[1],
|
|
345
|
+
isExternCrate: false,
|
|
346
|
+
...(pathAttribute ? { pathAttribute } : {}),
|
|
347
|
+
},
|
|
348
|
+
];
|
|
18
349
|
}
|
|
19
|
-
const externMatch =
|
|
350
|
+
const externMatch = statement.match(RUST_EXTERN_CRATE_PATTERN);
|
|
20
351
|
if (externMatch?.[1]) {
|
|
21
|
-
return
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
352
|
+
return [
|
|
353
|
+
{
|
|
354
|
+
kind: "module",
|
|
355
|
+
from: externMatch[1],
|
|
356
|
+
local: externMatch[2] ?? externMatch[1],
|
|
357
|
+
isExternCrate: true,
|
|
358
|
+
},
|
|
359
|
+
];
|
|
27
360
|
}
|
|
28
|
-
const useMatch =
|
|
361
|
+
const useMatch = statement.match(RUST_USE_PATTERN);
|
|
29
362
|
const useBody = useMatch?.[1]?.trim();
|
|
30
363
|
if (!useBody)
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
364
|
+
return [];
|
|
365
|
+
return flattenRustUseTree([], useBody);
|
|
366
|
+
}
|
|
367
|
+
function rustPathAttributeFromText(text) {
|
|
368
|
+
let last;
|
|
369
|
+
RUST_PATH_ATTRIBUTE_PATTERN.lastIndex = 0;
|
|
370
|
+
for (const match of text.matchAll(RUST_PATH_ATTRIBUTE_PATTERN)) {
|
|
371
|
+
last = match[2] ?? match[3];
|
|
39
372
|
}
|
|
40
|
-
|
|
373
|
+
return last;
|
|
374
|
+
}
|
|
375
|
+
function rustPathSegments(spec) {
|
|
376
|
+
return spec
|
|
377
|
+
.split("::")
|
|
378
|
+
.map((part) => part.trim())
|
|
379
|
+
.filter(Boolean);
|
|
380
|
+
}
|
|
381
|
+
function splitTopLevelRustAlias(input) {
|
|
382
|
+
let depth = 0;
|
|
383
|
+
let asIndex = -1;
|
|
384
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
385
|
+
const character = input[index];
|
|
386
|
+
if (character === "{")
|
|
387
|
+
depth += 1;
|
|
388
|
+
else if (character === "}")
|
|
389
|
+
depth = Math.max(0, depth - 1);
|
|
390
|
+
if (depth === 0 &&
|
|
391
|
+
input.startsWith("as", index) &&
|
|
392
|
+
/\s/.test(input[index - 1] ?? "") &&
|
|
393
|
+
/\s/.test(input[index + 2] ?? "")) {
|
|
394
|
+
asIndex = index;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (asIndex < 0)
|
|
398
|
+
return { path: input.trim() };
|
|
399
|
+
const path = input.slice(0, asIndex).trim();
|
|
400
|
+
const alias = input.slice(asIndex + 2).trim();
|
|
401
|
+
if (!path || !RUST_IDENTIFIER_PATTERN.test(alias))
|
|
402
|
+
return { path: input.trim() };
|
|
403
|
+
return { path, alias };
|
|
404
|
+
}
|
|
405
|
+
function splitRustUseGroup(item) {
|
|
406
|
+
let depth = 0;
|
|
407
|
+
let open = -1;
|
|
408
|
+
for (let index = 0; index < item.length; index += 1) {
|
|
409
|
+
const character = item[index];
|
|
410
|
+
if (character === "{") {
|
|
411
|
+
if (depth === 0)
|
|
412
|
+
open = index;
|
|
413
|
+
depth += 1;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
if (character !== "}")
|
|
417
|
+
continue;
|
|
418
|
+
depth -= 1;
|
|
419
|
+
if (depth !== 0 || open < 0)
|
|
420
|
+
continue;
|
|
421
|
+
if (item.slice(index + 1).trim())
|
|
422
|
+
return null;
|
|
423
|
+
return {
|
|
424
|
+
prefix: item.slice(0, open).replace(/::$/, "").trim(),
|
|
425
|
+
inner: item.slice(open + 1, index),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
function flattenRustUseTree(prefix, item) {
|
|
431
|
+
const trimmed = item.trim();
|
|
432
|
+
if (!trimmed)
|
|
433
|
+
return [];
|
|
434
|
+
const group = splitRustUseGroup(trimmed);
|
|
435
|
+
if (group) {
|
|
436
|
+
const nextPrefix = group.prefix ? [...prefix, ...rustPathSegments(group.prefix)] : [...prefix];
|
|
437
|
+
const nested = [];
|
|
438
|
+
for (const piece of splitTopLevelCommaList(group.inner)) {
|
|
439
|
+
nested.push(...flattenRustUseTree(nextPrefix, piece));
|
|
440
|
+
}
|
|
441
|
+
return nested;
|
|
442
|
+
}
|
|
443
|
+
const { path: rawPath, alias } = splitTopLevelRustAlias(trimmed);
|
|
444
|
+
if (!rawPath)
|
|
445
|
+
return [];
|
|
446
|
+
if (rawPath === "*" || rawPath.endsWith("::*")) {
|
|
447
|
+
const base = rawPath === "*"
|
|
448
|
+
? prefix.join("::")
|
|
449
|
+
: [...prefix, ...rustPathSegments(rawPath.slice(0, -"::*".length))].join("::");
|
|
450
|
+
if (!base)
|
|
451
|
+
return [];
|
|
452
|
+
return [{ kind: "star", from: `${base}::*` }];
|
|
453
|
+
}
|
|
454
|
+
if (rawPath === "self") {
|
|
455
|
+
const from = prefix.join("::");
|
|
456
|
+
if (!from)
|
|
457
|
+
return [];
|
|
458
|
+
const segments = rustPathSegments(from);
|
|
459
|
+
const local = alias ?? segments[segments.length - 1];
|
|
460
|
+
if (!local)
|
|
461
|
+
return [];
|
|
462
|
+
return [{ kind: "module", from, local, isExternCrate: false }];
|
|
463
|
+
}
|
|
464
|
+
const parts = [...prefix, ...rustPathSegments(rawPath)];
|
|
41
465
|
if (!parts.length)
|
|
42
|
-
return
|
|
466
|
+
return [];
|
|
43
467
|
if (parts.length === 1) {
|
|
44
468
|
const moduleName = parts[0];
|
|
45
469
|
if (!moduleName)
|
|
46
|
-
return
|
|
47
|
-
return
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
470
|
+
return [];
|
|
471
|
+
return [
|
|
472
|
+
{
|
|
473
|
+
kind: "module",
|
|
474
|
+
from: moduleName,
|
|
475
|
+
local: alias ?? moduleName,
|
|
476
|
+
isExternCrate: false,
|
|
477
|
+
},
|
|
478
|
+
];
|
|
53
479
|
}
|
|
54
480
|
const imported = parts[parts.length - 1];
|
|
55
481
|
const from = parts.slice(0, -1).join("::");
|
|
56
482
|
if (!imported || !from)
|
|
57
|
-
return
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
483
|
+
return [];
|
|
484
|
+
return [
|
|
485
|
+
{
|
|
486
|
+
kind: "member",
|
|
487
|
+
from,
|
|
488
|
+
imported,
|
|
489
|
+
local: alias ?? imported,
|
|
490
|
+
},
|
|
491
|
+
];
|
|
64
492
|
}
|
|
65
493
|
const PHP_USE_ALIAS_PATTERN = new RegExp(String.raw `^(.*?)\s+as\s+(${PHP_IDENTIFIER_SOURCE})$`, "iu");
|
|
66
494
|
function splitTopLevelCommaList(input) {
|
|
@@ -302,7 +730,7 @@ function resolvePhpIncludePath(expr, fromFile) {
|
|
|
302
730
|
return `./${relativePath}`;
|
|
303
731
|
}
|
|
304
732
|
export const KOTLIN_DOTTED_NAME_SOURCE = String.raw `${KOTLIN_IDENTIFIER_SOURCE}(?:\.${KOTLIN_IDENTIFIER_SOURCE})*`;
|
|
305
|
-
const KOTLIN_IMPORT_PATTERN = new RegExp(String.raw `^\s*import\s+(${KOTLIN_DOTTED_NAME_SOURCE}(?:\.\*)?)(?:\s+as\s+(${KOTLIN_IDENTIFIER_SOURCE}))?\s*$`, "mu");
|
|
733
|
+
const KOTLIN_IMPORT_PATTERN = new RegExp(String.raw `^\s*import\s+(${KOTLIN_DOTTED_NAME_SOURCE}(?:\.\*)?)(?:\s+as\s+(${KOTLIN_IDENTIFIER_SOURCE}))?\s*;?\s*$`, "mu");
|
|
306
734
|
export function parseKotlinImportStatement(stmtText) {
|
|
307
735
|
const match = stmtText.trim().match(KOTLIN_IMPORT_PATTERN);
|
|
308
736
|
const rawSpec = match?.[1];
|