@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.
Files changed (188) hide show
  1. package/README.md +1 -1
  2. package/codegraph-skill/codegraph/SKILL.md +2 -2
  3. package/dist/bin/cli.js +3475 -1655
  4. package/dist/bin/query-index-worker.js +569 -229
  5. package/dist/cli/command-table.d.ts.map +1 -1
  6. package/dist/cli/command-table.js +1 -5
  7. package/dist/cli/command-table.js.map +1 -1
  8. package/dist/cli/context.d.ts.map +1 -1
  9. package/dist/cli/context.js +7 -4
  10. package/dist/cli/context.js.map +1 -1
  11. package/dist/cli/doctor.d.ts +1 -0
  12. package/dist/cli/doctor.d.ts.map +1 -1
  13. package/dist/cli/doctor.js +8 -1
  14. package/dist/cli/doctor.js.map +1 -1
  15. package/dist/cli/invocation-context.d.ts +2 -1
  16. package/dist/cli/invocation-context.d.ts.map +1 -1
  17. package/dist/cli/invocation-context.js +13 -0
  18. package/dist/cli/invocation-context.js.map +1 -1
  19. package/dist/document-links/asciidoc.d.ts.map +1 -1
  20. package/dist/document-links/asciidoc.js +33 -0
  21. package/dist/document-links/asciidoc.js.map +1 -1
  22. package/dist/document-links/language-ids.d.ts +10 -0
  23. package/dist/document-links/language-ids.d.ts.map +1 -0
  24. package/dist/document-links/language-ids.js +15 -0
  25. package/dist/document-links/language-ids.js.map +1 -0
  26. package/dist/document-links/markdown.d.ts.map +1 -1
  27. package/dist/document-links/markdown.js +103 -21
  28. package/dist/document-links/markdown.js.map +1 -1
  29. package/dist/document-links/shared.d.ts.map +1 -1
  30. package/dist/document-links/shared.js +1 -0
  31. package/dist/document-links/shared.js.map +1 -1
  32. package/dist/document-links.d.ts +1 -3
  33. package/dist/document-links.d.ts.map +1 -1
  34. package/dist/document-links.js +1 -8
  35. package/dist/document-links.js.map +1 -1
  36. package/dist/duplicates/unit-cache.d.ts +4 -3
  37. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  38. package/dist/duplicates/unit-cache.js +17 -7
  39. package/dist/duplicates/unit-cache.js.map +1 -1
  40. package/dist/duplicates/units.d.ts +2 -1
  41. package/dist/duplicates/units.d.ts.map +1 -1
  42. package/dist/duplicates/units.js +77 -16
  43. package/dist/duplicates/units.js.map +1 -1
  44. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  45. package/dist/graphs/edge-resolution.js +3 -0
  46. package/dist/graphs/edge-resolution.js.map +1 -1
  47. package/dist/graphs/external/stdlib.d.ts.map +1 -1
  48. package/dist/graphs/external/stdlib.js +18 -11
  49. package/dist/graphs/external/stdlib.js.map +1 -1
  50. package/dist/graphs/specifiers.d.ts +3 -2
  51. package/dist/graphs/specifiers.d.ts.map +1 -1
  52. package/dist/graphs/specifiers.js +76 -39
  53. package/dist/graphs/specifiers.js.map +1 -1
  54. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +1 -1
  55. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  56. package/dist/indexer/build-cache/options.d.ts +8 -2
  57. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  58. package/dist/indexer/build-cache/options.js +10 -2
  59. package/dist/indexer/build-cache/options.js.map +1 -1
  60. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  61. package/dist/indexer/build-cache/reports.js +29 -21
  62. package/dist/indexer/build-cache/reports.js.map +1 -1
  63. package/dist/indexer/expand-star-imports.d.ts.map +1 -1
  64. package/dist/indexer/expand-star-imports.js +8 -3
  65. package/dist/indexer/expand-star-imports.js.map +1 -1
  66. package/dist/indexer/imports/language-specific.d.ts.map +1 -1
  67. package/dist/indexer/imports/language-specific.js +166 -32
  68. package/dist/indexer/imports/language-specific.js.map +1 -1
  69. package/dist/indexer/imports/native-captures.d.ts.map +1 -1
  70. package/dist/indexer/imports/native-captures.js +4 -3
  71. package/dist/indexer/imports/native-captures.js.map +1 -1
  72. package/dist/indexer/imports/python.d.ts +2 -0
  73. package/dist/indexer/imports/python.d.ts.map +1 -1
  74. package/dist/indexer/imports/python.js +113 -8
  75. package/dist/indexer/imports/python.js.map +1 -1
  76. package/dist/indexer/imports.d.ts.map +1 -1
  77. package/dist/indexer/imports.js +25 -12
  78. package/dist/indexer/imports.js.map +1 -1
  79. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  80. package/dist/indexer/locals-and-exports.js +153 -38
  81. package/dist/indexer/locals-and-exports.js.map +1 -1
  82. package/dist/indexer/navigation-goto.js +1 -1
  83. package/dist/indexer/navigation-goto.js.map +1 -1
  84. package/dist/indexer/scope-types.d.ts +1 -1
  85. package/dist/indexer/scope-types.d.ts.map +1 -1
  86. package/dist/indexer/scope.d.ts.map +1 -1
  87. package/dist/indexer/scope.js +43 -2
  88. package/dist/indexer/scope.js.map +1 -1
  89. package/dist/languages/definitions/c-family.d.ts +5 -0
  90. package/dist/languages/definitions/c-family.d.ts.map +1 -1
  91. package/dist/languages/definitions/c-family.js +27 -6
  92. package/dist/languages/definitions/c-family.js.map +1 -1
  93. package/dist/languages/definitions/c.d.ts.map +1 -1
  94. package/dist/languages/definitions/c.js +5 -0
  95. package/dist/languages/definitions/c.js.map +1 -1
  96. package/dist/languages/definitions/cpp.d.ts.map +1 -1
  97. package/dist/languages/definitions/cpp.js +41 -3
  98. package/dist/languages/definitions/cpp.js.map +1 -1
  99. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  100. package/dist/languages/definitions/csharp.js +52 -21
  101. package/dist/languages/definitions/csharp.js.map +1 -1
  102. package/dist/languages/definitions/go.d.ts.map +1 -1
  103. package/dist/languages/definitions/go.js +10 -7
  104. package/dist/languages/definitions/go.js.map +1 -1
  105. package/dist/languages/definitions/html-stub.d.ts +6 -7
  106. package/dist/languages/definitions/html-stub.d.ts.map +1 -1
  107. package/dist/languages/definitions/html-stub.js +6 -7
  108. package/dist/languages/definitions/html-stub.js.map +1 -1
  109. package/dist/languages/definitions/html.js +13 -13
  110. package/dist/languages/definitions/html.js.map +1 -1
  111. package/dist/languages/definitions/java.d.ts.map +1 -1
  112. package/dist/languages/definitions/java.js +6 -0
  113. package/dist/languages/definitions/java.js.map +1 -1
  114. package/dist/languages/definitions/javascript.d.ts.map +1 -1
  115. package/dist/languages/definitions/javascript.js +48 -30
  116. package/dist/languages/definitions/javascript.js.map +1 -1
  117. package/dist/languages/definitions/kotlin.d.ts.map +1 -1
  118. package/dist/languages/definitions/kotlin.js +49 -61
  119. package/dist/languages/definitions/kotlin.js.map +1 -1
  120. package/dist/languages/definitions/php.js +1 -1
  121. package/dist/languages/definitions/php.js.map +1 -1
  122. package/dist/languages/definitions/python.d.ts.map +1 -1
  123. package/dist/languages/definitions/python.js +85 -20
  124. package/dist/languages/definitions/python.js.map +1 -1
  125. package/dist/languages/definitions/ruby.d.ts.map +1 -1
  126. package/dist/languages/definitions/ruby.js +13 -11
  127. package/dist/languages/definitions/ruby.js.map +1 -1
  128. package/dist/languages/definitions/rust.d.ts.map +1 -1
  129. package/dist/languages/definitions/rust.js +22 -5
  130. package/dist/languages/definitions/rust.js.map +1 -1
  131. package/dist/languages/definitions/scss.d.ts.map +1 -1
  132. package/dist/languages/definitions/scss.js +21 -17
  133. package/dist/languages/definitions/scss.js.map +1 -1
  134. package/dist/languages/definitions/sql.js +1 -1
  135. package/dist/languages/definitions/sql.js.map +1 -1
  136. package/dist/languages/definitions/swift.d.ts.map +1 -1
  137. package/dist/languages/definitions/swift.js +66 -16
  138. package/dist/languages/definitions/swift.js.map +1 -1
  139. package/dist/languages/definitions/typescript.d.ts.map +1 -1
  140. package/dist/languages/definitions/typescript.js +30 -9
  141. package/dist/languages/definitions/typescript.js.map +1 -1
  142. package/dist/languages/definitions/zig.d.ts.map +1 -1
  143. package/dist/languages/definitions/zig.js +26 -5
  144. package/dist/languages/definitions/zig.js.map +1 -1
  145. package/dist/languages/import-statement-parsers.d.ts +14 -1
  146. package/dist/languages/import-statement-parsers.d.ts.map +1 -1
  147. package/dist/languages/import-statement-parsers.js +473 -45
  148. package/dist/languages/import-statement-parsers.js.map +1 -1
  149. package/dist/languages/types.d.ts +11 -0
  150. package/dist/languages/types.d.ts.map +1 -1
  151. package/dist/languages.d.ts +1 -0
  152. package/dist/languages.d.ts.map +1 -1
  153. package/dist/languages.js +9 -2
  154. package/dist/languages.js.map +1 -1
  155. package/dist/native/backend-report-format.d.ts +4 -0
  156. package/dist/native/backend-report-format.d.ts.map +1 -0
  157. package/dist/native/backend-report-format.js +14 -0
  158. package/dist/native/backend-report-format.js.map +1 -0
  159. package/dist/native/contracts.d.ts +2 -0
  160. package/dist/native/contracts.d.ts.map +1 -1
  161. package/dist/util/comments.js +1 -1
  162. package/dist/util/comments.js.map +1 -1
  163. package/dist/util/member-access.d.ts +1 -1
  164. package/dist/util/member-access.d.ts.map +1 -1
  165. package/dist/util/member-access.js +5 -2
  166. package/dist/util/member-access.js.map +1 -1
  167. package/dist/util/project-files.js +1 -1
  168. package/dist/util/project-files.js.map +1 -1
  169. package/dist/util/resolution/rust.d.ts +8 -1
  170. package/dist/util/resolution/rust.d.ts.map +1 -1
  171. package/dist/util/resolution/rust.js +521 -7
  172. package/dist/util/resolution/rust.js.map +1 -1
  173. package/dist/util/resolution-candidates.d.ts +1 -1
  174. package/dist/util/resolution-candidates.d.ts.map +1 -1
  175. package/dist/util/resolution-candidates.js +11 -8
  176. package/dist/util/resolution-candidates.js.map +1 -1
  177. package/dist/util/resolution.d.ts +5 -0
  178. package/dist/util/resolution.d.ts.map +1 -1
  179. package/dist/util/resolution.js +18 -7
  180. package/dist/util/resolution.js.map +1 -1
  181. package/dist/util/rust-test-modules.d.ts.map +1 -1
  182. package/dist/util/rust-test-modules.js +2 -5
  183. package/dist/util/rust-test-modules.js.map +1 -1
  184. package/dist/util/specifiers.d.ts +8 -0
  185. package/dist/util/specifiers.d.ts.map +1 -1
  186. package/dist/util/specifiers.js +33 -7
  187. package/dist/util/specifiers.js.map +1 -1
  188. 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: ["line_comment", "doc_comment"],
21
+ comments: ["comment"],
21
22
  },
22
23
  graph: {
23
- imports: '(builtin_function (builtin_identifier) @fn (arguments (string) @mod) (#eq? @fn "@import")) @stmt',
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
- const initializer = parent.namedChildren.find((child) => child.id !== node.id);
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;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAuB;IACzC,EAAE,EAAE,KAAK;IACT,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,qBAAqB,EAAE,IAAI;IAC3B,SAAS,EAAE;QACT,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,gCAAgC,EAAE,SAAS,EAAE,UAAU,EAAE;YACpG,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,EAAE;SACnF;QACD,WAAW,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;QACzF,QAAQ,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC;KAC1C;IACD,KAAK,EAAE;QACL,OAAO,EAAE,kGAAkG;QAC3G,OAAO,EAAE;;;KAGR;QACD,MAAM,EAAE;;;;KAIP;QACD,cAAc,EAAE;;;;;KAKf;KACF;IACD,SAAS,EAAE;QACT,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1B,gBAAgB,EAAE,kBAAkB;KACrC;IACD,0BAA0B,EAAE,IAAI;IAChC,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB;YAAE,OAAO,UAAU,CAAC;QAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB;YAAE,OAAO,UAAU,CAAC;QAE9D,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACvF,IAAI,YAAY,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;YAAE,OAAO,UAAU,CAAC;QAEpD,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,WAAW,IAAI,0BAA0B,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QACnF,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB;IACpE,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC5G,OAAO,MAAM,CAAC,IAAI,KAAK,sBAAsB,CAAC;IAChD,CAAC;CACF,CAAC;AAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC"}
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 parseRustImportStatement(stmtText: string): ParsedRustImportStatement | null;
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;AASN,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI,CA2D3F;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AA8E3D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE,CA+BvG;AAgJD,eAAO,MAAM,yBAAyB,QAA4E,CAAC;AAKnH,MAAM,MAAM,2BAA2B,GACnC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,2BAA2B,GAAG,IAAI,CAoB/F;AAED,eAAO,MAAM,uBAAuB,QAAwE,CAAC;AAmB7G,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEN,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI,CAsB3F;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,0BAA0B,GAAG,IAAI,CA0B7F"}
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 RUST_USE_ALIAS_PATTERN = new RegExp(String.raw `^(.*?)\s+as\s+(${XID_IDENTIFIER_SOURCE})$`, "u");
7
- export function parseRustImportStatement(stmtText) {
8
- const trimmed = stmtText.trim();
9
- // Rust identifiers permit Unicode XID_Start/XID_Continue, not just ASCII.
10
- const modMatch = trimmed.match(RUST_MODULE_PATTERN);
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
- kind: "module",
14
- from: modMatch[1],
15
- local: modMatch[1],
16
- isExternCrate: false,
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 = trimmed.match(RUST_EXTERN_CRATE_PATTERN);
350
+ const externMatch = statement.match(RUST_EXTERN_CRATE_PATTERN);
20
351
  if (externMatch?.[1]) {
21
- return {
22
- kind: "module",
23
- from: externMatch[1],
24
- local: externMatch[2] ?? externMatch[1],
25
- isExternCrate: true,
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 = trimmed.match(/^(?:pub(?:\s*\([^)]*\))?\s+)?use\s+(.+?)\s*;?$/);
361
+ const useMatch = statement.match(RUST_USE_PATTERN);
29
362
  const useBody = useMatch?.[1]?.trim();
30
363
  if (!useBody)
31
- return null;
32
- if (useBody.includes("{") || useBody.includes(","))
33
- return null;
34
- const aliasMatch = useBody.match(RUST_USE_ALIAS_PATTERN);
35
- const rawPath = aliasMatch?.[1]?.trim() ?? useBody;
36
- const alias = aliasMatch?.[2];
37
- if (rawPath.endsWith("::*")) {
38
- return { kind: "star", from: rawPath };
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
- const parts = rawPath.split("::").filter(Boolean);
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 null;
466
+ return [];
43
467
  if (parts.length === 1) {
44
468
  const moduleName = parts[0];
45
469
  if (!moduleName)
46
- return null;
47
- return {
48
- kind: "module",
49
- from: moduleName,
50
- local: alias ?? moduleName,
51
- isExternCrate: false,
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 null;
58
- return {
59
- kind: "member",
60
- from,
61
- imported,
62
- local: alias ?? imported,
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];