projscan 1.6.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/core/applyFix.js +5 -46
  2. package/dist/core/applyFix.js.map +1 -1
  3. package/dist/core/embeddings.d.ts +9 -0
  4. package/dist/core/embeddings.js +45 -5
  5. package/dist/core/embeddings.js.map +1 -1
  6. package/dist/core/languages/LanguageAdapter.d.ts +1 -1
  7. package/dist/core/languages/cppAdapter.d.ts +2 -0
  8. package/dist/core/languages/cppAdapter.js +145 -0
  9. package/dist/core/languages/cppAdapter.js.map +1 -0
  10. package/dist/core/languages/cppCallSites.d.ts +13 -0
  11. package/dist/core/languages/cppCallSites.js +62 -0
  12. package/dist/core/languages/cppCallSites.js.map +1 -0
  13. package/dist/core/languages/cppCyclomatic.d.ts +25 -0
  14. package/dist/core/languages/cppCyclomatic.js +82 -0
  15. package/dist/core/languages/cppCyclomatic.js.map +1 -0
  16. package/dist/core/languages/cppExports.d.ts +13 -0
  17. package/dist/core/languages/cppExports.js +120 -0
  18. package/dist/core/languages/cppExports.js.map +1 -0
  19. package/dist/core/languages/cppFunctions.d.ts +30 -0
  20. package/dist/core/languages/cppFunctions.js +281 -0
  21. package/dist/core/languages/cppFunctions.js.map +1 -0
  22. package/dist/core/languages/cppImports.d.ts +25 -0
  23. package/dist/core/languages/cppImports.js +77 -0
  24. package/dist/core/languages/cppImports.js.map +1 -0
  25. package/dist/core/languages/cppManifests.d.ts +18 -0
  26. package/dist/core/languages/cppManifests.js +41 -0
  27. package/dist/core/languages/cppManifests.js.map +1 -0
  28. package/dist/core/languages/kotlinAdapter.d.ts +2 -0
  29. package/dist/core/languages/kotlinAdapter.js +141 -0
  30. package/dist/core/languages/kotlinAdapter.js.map +1 -0
  31. package/dist/core/languages/kotlinCallSites.d.ts +15 -0
  32. package/dist/core/languages/kotlinCallSites.js +62 -0
  33. package/dist/core/languages/kotlinCallSites.js.map +1 -0
  34. package/dist/core/languages/kotlinCyclomatic.d.ts +24 -0
  35. package/dist/core/languages/kotlinCyclomatic.js +54 -0
  36. package/dist/core/languages/kotlinCyclomatic.js.map +1 -0
  37. package/dist/core/languages/kotlinExports.d.ts +13 -0
  38. package/dist/core/languages/kotlinExports.js +103 -0
  39. package/dist/core/languages/kotlinExports.js.map +1 -0
  40. package/dist/core/languages/kotlinFunctions.d.ts +27 -0
  41. package/dist/core/languages/kotlinFunctions.js +147 -0
  42. package/dist/core/languages/kotlinFunctions.js.map +1 -0
  43. package/dist/core/languages/kotlinImports.d.ts +25 -0
  44. package/dist/core/languages/kotlinImports.js +74 -0
  45. package/dist/core/languages/kotlinImports.js.map +1 -0
  46. package/dist/core/languages/kotlinManifests.d.ts +20 -0
  47. package/dist/core/languages/kotlinManifests.js +46 -0
  48. package/dist/core/languages/kotlinManifests.js.map +1 -0
  49. package/dist/core/languages/registry.js +16 -1
  50. package/dist/core/languages/registry.js.map +1 -1
  51. package/dist/core/languages/swiftAdapter.d.ts +2 -0
  52. package/dist/core/languages/swiftAdapter.js +130 -0
  53. package/dist/core/languages/swiftAdapter.js.map +1 -0
  54. package/dist/core/languages/swiftCallSites.d.ts +14 -0
  55. package/dist/core/languages/swiftCallSites.js +60 -0
  56. package/dist/core/languages/swiftCallSites.js.map +1 -0
  57. package/dist/core/languages/swiftCyclomatic.d.ts +24 -0
  58. package/dist/core/languages/swiftCyclomatic.js +54 -0
  59. package/dist/core/languages/swiftCyclomatic.js.map +1 -0
  60. package/dist/core/languages/swiftExports.d.ts +13 -0
  61. package/dist/core/languages/swiftExports.js +95 -0
  62. package/dist/core/languages/swiftExports.js.map +1 -0
  63. package/dist/core/languages/swiftFunctions.d.ts +28 -0
  64. package/dist/core/languages/swiftFunctions.js +162 -0
  65. package/dist/core/languages/swiftFunctions.js.map +1 -0
  66. package/dist/core/languages/swiftImports.d.ts +26 -0
  67. package/dist/core/languages/swiftImports.js +45 -0
  68. package/dist/core/languages/swiftImports.js.map +1 -0
  69. package/dist/core/languages/swiftManifests.d.ts +17 -0
  70. package/dist/core/languages/swiftManifests.js +49 -0
  71. package/dist/core/languages/swiftManifests.js.map +1 -0
  72. package/dist/core/languages/treeSitterLoader.js +21 -1
  73. package/dist/core/languages/treeSitterLoader.js.map +1 -1
  74. package/dist/core/memory.d.ts +30 -0
  75. package/dist/core/memory.js +42 -0
  76. package/dist/core/memory.js.map +1 -1
  77. package/dist/core/session.d.ts +23 -4
  78. package/dist/core/session.js +28 -8
  79. package/dist/core/session.js.map +1 -1
  80. package/dist/core/taint.d.ts +17 -0
  81. package/dist/core/taint.js +19 -1
  82. package/dist/core/taint.js.map +1 -1
  83. package/dist/grammars/tree-sitter-cpp.wasm +0 -0
  84. package/dist/grammars/tree-sitter-kotlin.wasm +0 -0
  85. package/dist/grammars/tree-sitter-swift.wasm +0 -0
  86. package/dist/mcp/server.js +107 -11
  87. package/dist/mcp/server.js.map +1 -1
  88. package/dist/mcp/sessionTouchScanner.js +8 -2
  89. package/dist/mcp/sessionTouchScanner.js.map +1 -1
  90. package/dist/mcp/tools/_shared.d.ts +25 -1
  91. package/dist/mcp/tools/_shared.js.map +1 -1
  92. package/dist/mcp/tools/costSummary.d.ts +26 -0
  93. package/dist/mcp/tools/costSummary.js +152 -0
  94. package/dist/mcp/tools/costSummary.js.map +1 -0
  95. package/dist/mcp/tools/fixSuggest.js +23 -2
  96. package/dist/mcp/tools/fixSuggest.js.map +1 -1
  97. package/dist/mcp/tools/memory.js +37 -4
  98. package/dist/mcp/tools/memory.js.map +1 -1
  99. package/dist/mcp/tools/reviewWatch.d.ts +7 -0
  100. package/dist/mcp/tools/reviewWatch.js +228 -0
  101. package/dist/mcp/tools/reviewWatch.js.map +1 -0
  102. package/dist/mcp/tools.js +4 -0
  103. package/dist/mcp/tools.js.map +1 -1
  104. package/dist/tool-manifest.json +52 -4
  105. package/dist/utils/atomicWrite.d.ts +26 -0
  106. package/dist/utils/atomicWrite.js +69 -0
  107. package/dist/utils/atomicWrite.js.map +1 -0
  108. package/package.json +6 -2
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Extract top-level C++ declarations as exports.
3
+ *
4
+ * C++ has no first-class export model the way Rust / Kotlin do; "exports"
5
+ * for graph purposes are top-level declarations that are visible to other
6
+ * translation units. We surface:
7
+ *
8
+ * function_definition → function (free functions and methods)
9
+ * class_specifier → class
10
+ * struct_specifier → class (structs are classes with default-public)
11
+ * union_specifier → class
12
+ * enum_specifier → enum
13
+ * alias_declaration → type (`using Foo = Bar;`)
14
+ * type_definition → type (`typedef ... Foo;`)
15
+ * declaration (var/const) → variable (top-level globals)
16
+ *
17
+ * `static` at file scope marks a translation-unit-internal symbol; we
18
+ * still surface it (the graph treats it as a local definition).
19
+ *
20
+ * Member declarations inside class bodies are NOT extracted (they're
21
+ * reachable via the class export). Anonymous namespaces are descended.
22
+ */
23
+ const EXPORT_NODE_TO_KIND = {
24
+ function_definition: 'function',
25
+ class_specifier: 'class',
26
+ struct_specifier: 'class',
27
+ union_specifier: 'class',
28
+ enum_specifier: 'enum',
29
+ alias_declaration: 'type',
30
+ type_definition: 'type',
31
+ };
32
+ export function extractCppExports(root) {
33
+ const exports = [];
34
+ visitTopLevel(root, exports);
35
+ return exports;
36
+ }
37
+ function visitTopLevel(node, out) {
38
+ // Descend through namespace and linkage_specification (`extern "C" { ... }`)
39
+ // wrappers — top-level declarations inside them are still file-scope.
40
+ if (node.type === 'translation_unit' ||
41
+ node.type === 'namespace_definition' ||
42
+ node.type === 'linkage_specification' ||
43
+ node.type === 'declaration_list') {
44
+ for (const c of node.namedChildren)
45
+ visitTopLevel(c, out);
46
+ return;
47
+ }
48
+ const kind = EXPORT_NODE_TO_KIND[node.type];
49
+ if (kind) {
50
+ const name = nameOf(node);
51
+ if (name)
52
+ out.push({ name, kind, typeOnly: false, line: node.startPosition.row + 1 });
53
+ return;
54
+ }
55
+ // Top-level variable / constant declarations: tree-sitter-cpp uses
56
+ // `declaration` for these. A declaration at translation-unit scope with
57
+ // a single declarator is a variable export.
58
+ if (node.type === 'declaration') {
59
+ const declarators = collectDeclarators(node);
60
+ for (const d of declarators) {
61
+ out.push({ name: d.name, kind: 'variable', typeOnly: false, line: node.startPosition.row + 1 });
62
+ }
63
+ return;
64
+ }
65
+ // Don't recurse into anything else — class bodies and function bodies
66
+ // hold non-top-level declarations.
67
+ }
68
+ function collectDeclarators(declaration) {
69
+ const out = [];
70
+ for (const c of declaration.namedChildren) {
71
+ // function_declarator / init_declarator / array_declarator are wrappers
72
+ // around an identifier. Drill through them.
73
+ const id = innerIdentifier(c);
74
+ if (id)
75
+ out.push({ name: id });
76
+ }
77
+ return out;
78
+ }
79
+ function innerIdentifier(node) {
80
+ if (node.type === 'identifier' ||
81
+ node.type === 'field_identifier' ||
82
+ node.type === 'type_identifier') {
83
+ return node.text;
84
+ }
85
+ if (node.type === 'init_declarator' ||
86
+ node.type === 'array_declarator' ||
87
+ node.type === 'pointer_declarator' ||
88
+ node.type === 'reference_declarator' ||
89
+ node.type === 'parenthesized_declarator' ||
90
+ node.type === 'function_declarator') {
91
+ if (node.childForFieldName) {
92
+ const dec = node.childForFieldName('declarator');
93
+ if (dec)
94
+ return innerIdentifier(dec);
95
+ }
96
+ for (const c of node.namedChildren) {
97
+ const r = innerIdentifier(c);
98
+ if (r)
99
+ return r;
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+ function nameOf(node) {
105
+ if (node.childForFieldName) {
106
+ const id = node.childForFieldName('name');
107
+ if (id && id.text)
108
+ return id.text;
109
+ const dec = node.childForFieldName('declarator');
110
+ if (dec)
111
+ return innerIdentifier(dec);
112
+ }
113
+ for (const c of node.namedChildren) {
114
+ if (c.type === 'identifier' || c.type === 'field_identifier' || c.type === 'type_identifier') {
115
+ return c.text;
116
+ }
117
+ }
118
+ return innerIdentifier(node);
119
+ }
120
+ //# sourceMappingURL=cppExports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cppExports.js","sourceRoot":"","sources":["../../../src/core/languages/cppExports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { FunctionInfo } from '../ast.js';
2
+ interface TsNode {
3
+ type: string;
4
+ text: string;
5
+ startPosition: {
6
+ row: number;
7
+ column: number;
8
+ };
9
+ endPosition: {
10
+ row: number;
11
+ column: number;
12
+ };
13
+ namedChildren: TsNode[];
14
+ childForFieldName?: (name: string) => TsNode | null;
15
+ }
16
+ /**
17
+ * Per-function McCabe CC for C++. Walks `function_definition` nodes
18
+ * (free functions, methods defined out-of-line, lambdas are NOT
19
+ * extracted as separate entries; their decisions fold into the
20
+ * enclosing function — matches the convention used elsewhere).
21
+ *
22
+ * Member functions defined inside a class body are named `Class.method`.
23
+ * Out-of-line definitions (`void Foo::bar() { ... }`) are also named
24
+ * `Foo.bar` based on the qualified declarator.
25
+ *
26
+ * `case` labels each contribute +1; `default:` does not. Ternaries (`?:`)
27
+ * count as +1. Logical `&&` and `||` each count.
28
+ */
29
+ export declare function extractCppFunctions(root: TsNode): FunctionInfo[];
30
+ export {};
@@ -0,0 +1,281 @@
1
+ const CPP_DECISION_NODES = new Set([
2
+ 'if_statement',
3
+ 'for_statement',
4
+ 'for_range_loop',
5
+ 'while_statement',
6
+ 'do_statement',
7
+ 'try_statement',
8
+ 'catch_clause',
9
+ ]);
10
+ const CPP_STATEMENT_NODES = new Set([
11
+ 'return_statement',
12
+ 'break_statement',
13
+ 'continue_statement',
14
+ 'expression_statement',
15
+ 'compound_statement',
16
+ 'if_statement',
17
+ 'for_statement',
18
+ 'while_statement',
19
+ 'do_statement',
20
+ 'switch_statement',
21
+ 'goto_statement',
22
+ 'declaration',
23
+ 'labeled_statement',
24
+ ]);
25
+ /**
26
+ * Per-function McCabe CC for C++. Walks `function_definition` nodes
27
+ * (free functions, methods defined out-of-line, lambdas are NOT
28
+ * extracted as separate entries; their decisions fold into the
29
+ * enclosing function — matches the convention used elsewhere).
30
+ *
31
+ * Member functions defined inside a class body are named `Class.method`.
32
+ * Out-of-line definitions (`void Foo::bar() { ... }`) are also named
33
+ * `Foo.bar` based on the qualified declarator.
34
+ *
35
+ * `case` labels each contribute +1; `default:` does not. Ternaries (`?:`)
36
+ * count as +1. Logical `&&` and `||` each count.
37
+ */
38
+ export function extractCppFunctions(root) {
39
+ const out = [];
40
+ walk(root, null, out);
41
+ return out;
42
+ }
43
+ function walk(node, ownerName, out) {
44
+ if (node.type === 'class_specifier' ||
45
+ node.type === 'struct_specifier' ||
46
+ node.type === 'union_specifier') {
47
+ const name = nameOfDecl(node) ?? ownerName;
48
+ const body = bodyOf(node);
49
+ if (body) {
50
+ for (const child of body.namedChildren)
51
+ walk(child, name, out);
52
+ }
53
+ return;
54
+ }
55
+ if (node.type === 'namespace_definition' || node.type === 'linkage_specification') {
56
+ const body = bodyOf(node);
57
+ if (body) {
58
+ for (const child of body.namedChildren)
59
+ walk(child, ownerName, out);
60
+ }
61
+ return;
62
+ }
63
+ if (node.type === 'function_definition') {
64
+ const baseName = functionName(node) ?? '<anonymous>';
65
+ // If the name already has `::` (out-of-line method), translate to dot form
66
+ // and use that as the qualified name. Otherwise prepend ownerName if any.
67
+ // 1.8+ — translate `::` ONLY when it appears outside angle-bracket
68
+ // depth, so a templated method declarator like `Foo<std::pair<int,int>>::bar`
69
+ // doesn't get its inner template's `::` rewritten.
70
+ let fnName;
71
+ if (baseName.includes('::')) {
72
+ fnName = translateScopeOperator(baseName);
73
+ }
74
+ else {
75
+ fnName = ownerName ? `${ownerName}.${baseName}` : baseName;
76
+ }
77
+ const line = node.startPosition.row + 1;
78
+ const endLine = node.endPosition.row + 1;
79
+ const { cc, callSites } = analyzeBody(node);
80
+ out.push({ name: fnName, line, endLine, cyclomaticComplexity: cc, callSites });
81
+ return;
82
+ }
83
+ for (const child of node.namedChildren)
84
+ walk(child, ownerName, out);
85
+ }
86
+ function functionName(fn) {
87
+ // Walk into the function_declarator to find the identifier / qualified_identifier.
88
+ if (fn.childForFieldName) {
89
+ const dec = fn.childForFieldName('declarator');
90
+ if (dec)
91
+ return declaratorName(dec);
92
+ }
93
+ for (const c of fn.namedChildren) {
94
+ if (c.type === 'function_declarator')
95
+ return declaratorName(c);
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Translate `::` → `.` only when it's at angle-bracket depth 0. Inside
101
+ * a template-argument list (e.g., `std::pair<int,int>`) the `::` belongs
102
+ * to a type qualifier, not to the method's enclosing scope, and must
103
+ * not be rewritten. Without this, `Foo<std::pair<int,int>>::bar` would
104
+ * become `Foo<std.pair<int,int>>.bar`, corrupting the type spelling.
105
+ */
106
+ function translateScopeOperator(s) {
107
+ let out = '';
108
+ let depth = 0;
109
+ let i = 0;
110
+ while (i < s.length) {
111
+ const ch = s[i];
112
+ if (ch === '<') {
113
+ depth += 1;
114
+ out += ch;
115
+ i += 1;
116
+ continue;
117
+ }
118
+ if (ch === '>') {
119
+ if (depth > 0)
120
+ depth -= 1;
121
+ out += ch;
122
+ i += 1;
123
+ continue;
124
+ }
125
+ if (depth === 0 && ch === ':' && s[i + 1] === ':') {
126
+ out += '.';
127
+ i += 2;
128
+ continue;
129
+ }
130
+ out += ch;
131
+ i += 1;
132
+ }
133
+ return out;
134
+ }
135
+ function declaratorName(node) {
136
+ if (node.type === 'identifier' ||
137
+ node.type === 'field_identifier' ||
138
+ node.type === 'type_identifier' ||
139
+ node.type === 'destructor_name') {
140
+ return node.text;
141
+ }
142
+ if (node.type === 'qualified_identifier') {
143
+ // e.g., `Foo::bar` — emit as-is; caller will translate `::` → `.`.
144
+ const text = node.text.replace(/\s+/g, '');
145
+ return text;
146
+ }
147
+ if (node.type === 'operator_name') {
148
+ return node.text.replace(/\s+/g, '');
149
+ }
150
+ if (node.childForFieldName) {
151
+ const inner = node.childForFieldName('declarator');
152
+ if (inner)
153
+ return declaratorName(inner);
154
+ }
155
+ for (const c of node.namedChildren) {
156
+ const r = declaratorName(c);
157
+ if (r)
158
+ return r;
159
+ }
160
+ return null;
161
+ }
162
+ function nameOfDecl(node) {
163
+ if (node.childForFieldName) {
164
+ const id = node.childForFieldName('name');
165
+ if (id && id.text)
166
+ return id.text;
167
+ }
168
+ for (const c of node.namedChildren) {
169
+ if (c.type === 'type_identifier' || c.type === 'identifier')
170
+ return c.text;
171
+ }
172
+ return null;
173
+ }
174
+ function bodyOf(node) {
175
+ if (node.childForFieldName) {
176
+ const b = node.childForFieldName('body');
177
+ if (b)
178
+ return b;
179
+ }
180
+ for (const c of node.namedChildren) {
181
+ if (c.type === 'compound_statement' ||
182
+ c.type === 'field_declaration_list' ||
183
+ c.type === 'declaration_list' ||
184
+ c.type === 'enumerator_list') {
185
+ return c;
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ function analyzeBody(fnNode) {
191
+ let count = 0;
192
+ const calls = new Set();
193
+ const body = bodyOf(fnNode);
194
+ if (!body)
195
+ return { cc: 1, callSites: [] };
196
+ walkSkipNested(body, (n) => {
197
+ if (CPP_DECISION_NODES.has(n.type)) {
198
+ count++;
199
+ return;
200
+ }
201
+ if (n.type === 'case_statement') {
202
+ // `case X:` has a `value` field; `default:` does not. Field-based
203
+ // detection avoids text-regex fragility around comments / whitespace.
204
+ const hasValue = n.childForFieldName ? !!n.childForFieldName('value') : false;
205
+ if (hasValue) {
206
+ count++;
207
+ }
208
+ else {
209
+ // Fallback for grammar versions without the field: the first named
210
+ // child of a `case X:` is the value node (literal / identifier);
211
+ // `default:` puts the statement first instead.
212
+ const first = n.namedChildren[0];
213
+ if (first && !CPP_STATEMENT_NODES.has(first.type))
214
+ count++;
215
+ }
216
+ return;
217
+ }
218
+ if (n.type === 'conditional_expression') {
219
+ count++;
220
+ return;
221
+ }
222
+ if (n.type === 'binary_expression') {
223
+ // tree-sitter-cpp exposes the operator via a child node typed
224
+ // `binary_expression`'s text. Look for `&&` / `||` directly.
225
+ if (/(\s|^)(\|\||&&)(\s|$)/.test(n.text))
226
+ count++;
227
+ return;
228
+ }
229
+ if (n.type === 'call_expression') {
230
+ const fn = n.childForFieldName ? n.childForFieldName('function') : n.namedChildren[0] ?? null;
231
+ const name = bareName(fn);
232
+ if (name)
233
+ calls.add(name);
234
+ }
235
+ });
236
+ return { cc: count + 1, callSites: [...calls] };
237
+ }
238
+ function bareName(node) {
239
+ if (!node)
240
+ return null;
241
+ switch (node.type) {
242
+ case 'identifier':
243
+ case 'field_identifier':
244
+ case 'type_identifier':
245
+ return node.text;
246
+ case 'qualified_identifier': {
247
+ // `Foo::bar` — take the last segment.
248
+ const named = node.namedChildren;
249
+ const last = named[named.length - 1];
250
+ return last ? bareName(last) : null;
251
+ }
252
+ case 'field_expression': {
253
+ const f = node.childForFieldName ? node.childForFieldName('field') : null;
254
+ if (f)
255
+ return bareName(f);
256
+ const named = node.namedChildren;
257
+ return named.length > 0 ? bareName(named[named.length - 1]) : null;
258
+ }
259
+ case 'template_function': {
260
+ const f = node.childForFieldName ? node.childForFieldName('name') : null;
261
+ if (f)
262
+ return bareName(f);
263
+ return null;
264
+ }
265
+ default:
266
+ return null;
267
+ }
268
+ }
269
+ function walkSkipNested(node, visit) {
270
+ visit(node);
271
+ for (const child of node.namedChildren) {
272
+ if (child.type === 'function_definition' ||
273
+ child.type === 'class_specifier' ||
274
+ child.type === 'struct_specifier' ||
275
+ child.type === 'lambda_expression') {
276
+ continue;
277
+ }
278
+ walkSkipNested(child, visit);
279
+ }
280
+ }
281
+ //# sourceMappingURL=cppFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cppFunctions.js","sourceRoot":"","sources":["../../../src/core/languages/cppFunctions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AstImport } 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 C++ `#include` directives from a tree-sitter-cpp AST.
14
+ *
15
+ * Handled forms:
16
+ * #include "foo.h" → source = "foo.h" (project-local convention)
17
+ * #include <vector> → source = "vector" (system / library header)
18
+ * #include "../bar/baz.hpp" → source = "../bar/baz.hpp"
19
+ *
20
+ * Modules (C++20 `import std;` / `import :foo;`) are also captured as
21
+ * static imports when the grammar recognises them. Specifiers are not
22
+ * extracted (C++ #include is whole-file inclusion, not symbol binding).
23
+ */
24
+ export declare function extractCppImports(root: TsNode): AstImport[];
25
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Extract C++ `#include` directives from a tree-sitter-cpp AST.
3
+ *
4
+ * Handled forms:
5
+ * #include "foo.h" → source = "foo.h" (project-local convention)
6
+ * #include <vector> → source = "vector" (system / library header)
7
+ * #include "../bar/baz.hpp" → source = "../bar/baz.hpp"
8
+ *
9
+ * Modules (C++20 `import std;` / `import :foo;`) are also captured as
10
+ * static imports when the grammar recognises them. Specifiers are not
11
+ * extracted (C++ #include is whole-file inclusion, not symbol binding).
12
+ */
13
+ export function extractCppImports(root) {
14
+ const imports = [];
15
+ walk(root, (n) => {
16
+ if (n.type === 'preproc_include') {
17
+ const path = readIncludePath(n);
18
+ if (!path)
19
+ return;
20
+ imports.push({
21
+ source: path.value,
22
+ kind: 'static',
23
+ specifiers: [],
24
+ typeOnly: false,
25
+ line: n.startPosition.row + 1,
26
+ });
27
+ return;
28
+ }
29
+ if (n.type === 'import_declaration' || n.type === 'module_import') {
30
+ const m = /^\s*(?:export\s+)?import\s+([^;]+);/.exec(n.text);
31
+ if (m) {
32
+ imports.push({
33
+ source: m[1].trim(),
34
+ kind: 'static',
35
+ specifiers: [],
36
+ typeOnly: false,
37
+ line: n.startPosition.row + 1,
38
+ });
39
+ }
40
+ }
41
+ });
42
+ return imports;
43
+ }
44
+ function readIncludePath(node) {
45
+ // tree-sitter-cpp typically exposes the included path as either a
46
+ // `string_literal` (quoted) or a `system_lib_string` (angle-bracketed)
47
+ // child. Some grammar versions use `path` field; we fall back to text.
48
+ if (node.childForFieldName) {
49
+ const p = node.childForFieldName('path');
50
+ if (p)
51
+ return classify(p.text);
52
+ }
53
+ for (const c of node.namedChildren) {
54
+ if (c.type === 'string_literal' || c.type === 'system_lib_string') {
55
+ return classify(c.text);
56
+ }
57
+ }
58
+ // Fallback: parse from the node's full text.
59
+ const m = /#\s*include\s*([<"][^>"]*[>"])/.exec(node.text);
60
+ return m ? classify(m[1]) : null;
61
+ }
62
+ function classify(raw) {
63
+ const text = raw.trim();
64
+ if (text.startsWith('"') && text.endsWith('"')) {
65
+ return { value: text.slice(1, -1), isQuoted: true };
66
+ }
67
+ if (text.startsWith('<') && text.endsWith('>')) {
68
+ return { value: text.slice(1, -1), isQuoted: false };
69
+ }
70
+ return null;
71
+ }
72
+ function walk(node, visit) {
73
+ visit(node);
74
+ for (const child of node.namedChildren)
75
+ walk(child, visit);
76
+ }
77
+ //# sourceMappingURL=cppImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cppImports.js","sourceRoot":"","sources":["../../../src/core/languages/cppImports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { FileEntry } from '../../types.js';
2
+ export interface CppProjectInfo {
3
+ /**
4
+ * Detected C++ source / include roots. We use these to resolve quoted
5
+ * `#include "foo.h"` directives — quoted includes start their search
6
+ * from the same directory as the including file, then fall back to
7
+ * project-wide include directories.
8
+ */
9
+ includeRoots: string[];
10
+ hasCMake: boolean;
11
+ hasMakefile: boolean;
12
+ }
13
+ /**
14
+ * Detect C++ source roots. We don't parse CMakeLists / Make files; we
15
+ * survey .cpp/.cc/.cxx/.h/.hpp file paths and pick whichever conventional
16
+ * roots actually contain sources.
17
+ */
18
+ export declare function detectCppProject(rootPath: string, files: FileEntry[]): Promise<CppProjectInfo | null>;
@@ -0,0 +1,41 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ const COMMON_CPP_ROOTS = ['include', 'src', 'lib', '.'];
4
+ /**
5
+ * Detect C++ source roots. We don't parse CMakeLists / Make files; we
6
+ * survey .cpp/.cc/.cxx/.h/.hpp file paths and pick whichever conventional
7
+ * roots actually contain sources.
8
+ */
9
+ export async function detectCppProject(rootPath, files) {
10
+ const cppFiles = files.filter((f) => isCppExtension(f.relativePath));
11
+ if (cppFiles.length === 0)
12
+ return null;
13
+ const hasCMake = await fileExists(path.join(rootPath, 'CMakeLists.txt'));
14
+ const hasMakefile = await fileExists(path.join(rootPath, 'Makefile'));
15
+ const includeRoots = [];
16
+ for (const candidate of COMMON_CPP_ROOTS) {
17
+ if (candidate === '.') {
18
+ if (cppFiles.some((f) => !f.relativePath.includes('/')))
19
+ includeRoots.push('.');
20
+ }
21
+ else if (cppFiles.some((f) => f.relativePath.startsWith(candidate + '/'))) {
22
+ includeRoots.push(candidate);
23
+ }
24
+ }
25
+ if (includeRoots.length === 0)
26
+ includeRoots.push('.');
27
+ return { includeRoots, hasCMake, hasMakefile };
28
+ }
29
+ async function fileExists(p) {
30
+ try {
31
+ await fs.access(p);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ function isCppExtension(p) {
39
+ return /\.(cpp|cc|cxx|c\+\+|c|h|hpp|hxx|h\+\+)$/.test(p);
40
+ }
41
+ //# sourceMappingURL=cppManifests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cppManifests.js","sourceRoot":"","sources":["../../../src/core/languages/cppManifests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAe7B,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClF,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5E,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { LanguageAdapter } from './LanguageAdapter.js';
2
+ export declare const kotlinAdapter: LanguageAdapter;