@liendev/core 0.19.5
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 +336 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +46 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merge.d.ts +20 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +71 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/migration-manager.d.ts +46 -0
- package/dist/config/migration-manager.d.ts.map +1 -0
- package/dist/config/migration-manager.js +119 -0
- package/dist/config/migration-manager.js.map +1 -0
- package/dist/config/migration.d.ts +20 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +155 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/schema.d.ts +101 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +58 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/service.d.ts +122 -0
- package/dist/config/service.d.ts.map +1 -0
- package/dist/config/service.js +477 -0
- package/dist/config/service.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/embeddings/cache.d.ts +45 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +109 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/local.d.ts +10 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +63 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/types.d.ts +9 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +5 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/errors/codes.d.ts +18 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +25 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/index.d.ts +85 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +134 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/frameworks/detector-service.d.ts +59 -0
- package/dist/frameworks/detector-service.d.ts.map +1 -0
- package/dist/frameworks/detector-service.js +219 -0
- package/dist/frameworks/detector-service.js.map +1 -0
- package/dist/frameworks/laravel/config.d.ts +6 -0
- package/dist/frameworks/laravel/config.d.ts.map +1 -0
- package/dist/frameworks/laravel/config.js +68 -0
- package/dist/frameworks/laravel/config.js.map +1 -0
- package/dist/frameworks/laravel/detector.d.ts +6 -0
- package/dist/frameworks/laravel/detector.d.ts.map +1 -0
- package/dist/frameworks/laravel/detector.js +96 -0
- package/dist/frameworks/laravel/detector.js.map +1 -0
- package/dist/frameworks/nodejs/config.d.ts +6 -0
- package/dist/frameworks/nodejs/config.d.ts.map +1 -0
- package/dist/frameworks/nodejs/config.js +57 -0
- package/dist/frameworks/nodejs/config.js.map +1 -0
- package/dist/frameworks/nodejs/detector.d.ts +6 -0
- package/dist/frameworks/nodejs/detector.d.ts.map +1 -0
- package/dist/frameworks/nodejs/detector.js +77 -0
- package/dist/frameworks/nodejs/detector.js.map +1 -0
- package/dist/frameworks/php/config.d.ts +6 -0
- package/dist/frameworks/php/config.d.ts.map +1 -0
- package/dist/frameworks/php/config.js +53 -0
- package/dist/frameworks/php/config.js.map +1 -0
- package/dist/frameworks/php/detector.d.ts +7 -0
- package/dist/frameworks/php/detector.d.ts.map +1 -0
- package/dist/frameworks/php/detector.js +101 -0
- package/dist/frameworks/php/detector.js.map +1 -0
- package/dist/frameworks/registry.d.ts +20 -0
- package/dist/frameworks/registry.d.ts.map +1 -0
- package/dist/frameworks/registry.js +38 -0
- package/dist/frameworks/registry.js.map +1 -0
- package/dist/frameworks/shopify/config.d.ts +6 -0
- package/dist/frameworks/shopify/config.d.ts.map +1 -0
- package/dist/frameworks/shopify/config.js +50 -0
- package/dist/frameworks/shopify/config.js.map +1 -0
- package/dist/frameworks/shopify/detector.d.ts +6 -0
- package/dist/frameworks/shopify/detector.d.ts.map +1 -0
- package/dist/frameworks/shopify/detector.js +103 -0
- package/dist/frameworks/shopify/detector.js.map +1 -0
- package/dist/frameworks/types.d.ts +51 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +21 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/git/tracker.d.ts +56 -0
- package/dist/git/tracker.d.ts.map +1 -0
- package/dist/git/tracker.js +189 -0
- package/dist/git/tracker.js.map +1 -0
- package/dist/git/utils.d.ts +60 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +152 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/ast/chunker.d.ts +28 -0
- package/dist/indexer/ast/chunker.d.ts.map +1 -0
- package/dist/indexer/ast/chunker.js +268 -0
- package/dist/indexer/ast/chunker.js.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts +16 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.js +106 -0
- package/dist/indexer/ast/complexity/cognitive.js.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts +12 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.js +61 -0
- package/dist/indexer/ast/complexity/cyclomatic.js.map +1 -0
- package/dist/indexer/ast/complexity/halstead.d.ts +55 -0
- package/dist/indexer/ast/complexity/halstead.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/halstead.js +290 -0
- package/dist/indexer/ast/complexity/halstead.js.map +1 -0
- package/dist/indexer/ast/complexity/index.d.ts +13 -0
- package/dist/indexer/ast/complexity/index.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/index.js +12 -0
- package/dist/indexer/ast/complexity/index.js.map +1 -0
- package/dist/indexer/ast/parser.d.ts +27 -0
- package/dist/indexer/ast/parser.d.ts.map +1 -0
- package/dist/indexer/ast/parser.js +103 -0
- package/dist/indexer/ast/parser.js.map +1 -0
- package/dist/indexer/ast/symbols.d.ts +17 -0
- package/dist/indexer/ast/symbols.d.ts.map +1 -0
- package/dist/indexer/ast/symbols.js +265 -0
- package/dist/indexer/ast/symbols.js.map +1 -0
- package/dist/indexer/ast/traversers/index.d.ts +19 -0
- package/dist/indexer/ast/traversers/index.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/index.js +42 -0
- package/dist/indexer/ast/traversers/index.js.map +1 -0
- package/dist/indexer/ast/traversers/php.d.ts +21 -0
- package/dist/indexer/ast/traversers/php.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/php.js +67 -0
- package/dist/indexer/ast/traversers/php.js.map +1 -0
- package/dist/indexer/ast/traversers/python.d.ts +28 -0
- package/dist/indexer/ast/traversers/python.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/python.js +67 -0
- package/dist/indexer/ast/traversers/python.js.map +1 -0
- package/dist/indexer/ast/traversers/types.d.ts +98 -0
- package/dist/indexer/ast/traversers/types.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/types.js +2 -0
- package/dist/indexer/ast/traversers/types.js.map +1 -0
- package/dist/indexer/ast/traversers/typescript.d.ts +29 -0
- package/dist/indexer/ast/traversers/typescript.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/typescript.js +88 -0
- package/dist/indexer/ast/traversers/typescript.js.map +1 -0
- package/dist/indexer/ast/types.d.ts +59 -0
- package/dist/indexer/ast/types.d.ts.map +1 -0
- package/dist/indexer/ast/types.js +2 -0
- package/dist/indexer/ast/types.js.map +1 -0
- package/dist/indexer/change-detector.d.ts +17 -0
- package/dist/indexer/change-detector.d.ts.map +1 -0
- package/dist/indexer/change-detector.js +207 -0
- package/dist/indexer/change-detector.js.map +1 -0
- package/dist/indexer/chunk-batch-processor.d.ts +103 -0
- package/dist/indexer/chunk-batch-processor.d.ts.map +1 -0
- package/dist/indexer/chunk-batch-processor.js +179 -0
- package/dist/indexer/chunk-batch-processor.js.map +1 -0
- package/dist/indexer/chunker.d.ts +10 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +96 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/dependency-analyzer.d.ts +60 -0
- package/dist/indexer/dependency-analyzer.d.ts.map +1 -0
- package/dist/indexer/dependency-analyzer.js +261 -0
- package/dist/indexer/dependency-analyzer.js.map +1 -0
- package/dist/indexer/incremental.d.ts +47 -0
- package/dist/indexer/incremental.d.ts.map +1 -0
- package/dist/indexer/incremental.js +284 -0
- package/dist/indexer/incremental.js.map +1 -0
- package/dist/indexer/index.d.ts +80 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +364 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/json-template-chunker.d.ts +9 -0
- package/dist/indexer/json-template-chunker.d.ts.map +1 -0
- package/dist/indexer/json-template-chunker.js +83 -0
- package/dist/indexer/json-template-chunker.js.map +1 -0
- package/dist/indexer/liquid-chunker.d.ts +13 -0
- package/dist/indexer/liquid-chunker.d.ts.map +1 -0
- package/dist/indexer/liquid-chunker.js +272 -0
- package/dist/indexer/liquid-chunker.js.map +1 -0
- package/dist/indexer/manifest.d.ts +122 -0
- package/dist/indexer/manifest.d.ts.map +1 -0
- package/dist/indexer/manifest.js +262 -0
- package/dist/indexer/manifest.js.map +1 -0
- package/dist/indexer/progress-tracker.d.ts +35 -0
- package/dist/indexer/progress-tracker.d.ts.map +1 -0
- package/dist/indexer/progress-tracker.js +33 -0
- package/dist/indexer/progress-tracker.js.map +1 -0
- package/dist/indexer/scanner.d.ts +16 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +159 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/symbol-extractor.d.ts +18 -0
- package/dist/indexer/symbol-extractor.d.ts.map +1 -0
- package/dist/indexer/symbol-extractor.js +351 -0
- package/dist/indexer/symbol-extractor.js.map +1 -0
- package/dist/indexer/types.d.ts +34 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/insights/complexity-analyzer.d.ts +82 -0
- package/dist/insights/complexity-analyzer.d.ts.map +1 -0
- package/dist/insights/complexity-analyzer.js +356 -0
- package/dist/insights/complexity-analyzer.js.map +1 -0
- package/dist/insights/formatters/index.d.ts +11 -0
- package/dist/insights/formatters/index.d.ts.map +1 -0
- package/dist/insights/formatters/index.js +20 -0
- package/dist/insights/formatters/index.js.map +1 -0
- package/dist/insights/formatters/json.d.ts +7 -0
- package/dist/insights/formatters/json.d.ts.map +1 -0
- package/dist/insights/formatters/json.js +14 -0
- package/dist/insights/formatters/json.js.map +1 -0
- package/dist/insights/formatters/sarif.d.ts +6 -0
- package/dist/insights/formatters/sarif.d.ts.map +1 -0
- package/dist/insights/formatters/sarif.js +113 -0
- package/dist/insights/formatters/sarif.js.map +1 -0
- package/dist/insights/formatters/text.d.ts +6 -0
- package/dist/insights/formatters/text.d.ts.map +1 -0
- package/dist/insights/formatters/text.js +154 -0
- package/dist/insights/formatters/text.js.map +1 -0
- package/dist/insights/types.d.ts +73 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +9 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/path-matching.d.ts +69 -0
- package/dist/utils/path-matching.d.ts.map +1 -0
- package/dist/utils/path-matching.js +123 -0
- package/dist/utils/path-matching.js.map +1 -0
- package/dist/utils/result.d.ts +65 -0
- package/dist/utils/result.d.ts.map +1 -0
- package/dist/utils/result.js +67 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/version.d.ts +22 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +28 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/vectordb/batch-insert.d.ts +14 -0
- package/dist/vectordb/batch-insert.d.ts.map +1 -0
- package/dist/vectordb/batch-insert.js +185 -0
- package/dist/vectordb/batch-insert.js.map +1 -0
- package/dist/vectordb/boosting/composer.d.ts +51 -0
- package/dist/vectordb/boosting/composer.d.ts.map +1 -0
- package/dist/vectordb/boosting/composer.js +65 -0
- package/dist/vectordb/boosting/composer.js.map +1 -0
- package/dist/vectordb/boosting/index.d.ts +22 -0
- package/dist/vectordb/boosting/index.d.ts.map +1 -0
- package/dist/vectordb/boosting/index.js +22 -0
- package/dist/vectordb/boosting/index.js.map +1 -0
- package/dist/vectordb/boosting/strategies.d.ts +40 -0
- package/dist/vectordb/boosting/strategies.d.ts.map +1 -0
- package/dist/vectordb/boosting/strategies.js +174 -0
- package/dist/vectordb/boosting/strategies.js.map +1 -0
- package/dist/vectordb/boosting/types.d.ts +20 -0
- package/dist/vectordb/boosting/types.d.ts.map +1 -0
- package/dist/vectordb/boosting/types.js +2 -0
- package/dist/vectordb/boosting/types.js.map +1 -0
- package/dist/vectordb/intent-classifier.d.ts +99 -0
- package/dist/vectordb/intent-classifier.d.ts.map +1 -0
- package/dist/vectordb/intent-classifier.js +193 -0
- package/dist/vectordb/intent-classifier.js.map +1 -0
- package/dist/vectordb/lancedb.d.ts +45 -0
- package/dist/vectordb/lancedb.d.ts.map +1 -0
- package/dist/vectordb/lancedb.js +203 -0
- package/dist/vectordb/lancedb.js.map +1 -0
- package/dist/vectordb/maintenance.d.ts +18 -0
- package/dist/vectordb/maintenance.d.ts.map +1 -0
- package/dist/vectordb/maintenance.js +87 -0
- package/dist/vectordb/maintenance.js.map +1 -0
- package/dist/vectordb/query.d.ts +34 -0
- package/dist/vectordb/query.d.ts.map +1 -0
- package/dist/vectordb/query.js +303 -0
- package/dist/vectordb/query.js.map +1 -0
- package/dist/vectordb/relevance.d.ts +15 -0
- package/dist/vectordb/relevance.d.ts.map +1 -0
- package/dist/vectordb/relevance.js +19 -0
- package/dist/vectordb/relevance.js.map +1 -0
- package/dist/vectordb/types.d.ts +29 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +2 -0
- package/dist/vectordb/types.js.map +1 -0
- package/dist/vectordb/version.d.ts +16 -0
- package/dist/vectordb/version.d.ts.map +1 -0
- package/dist/vectordb/version.js +40 -0
- package/dist/vectordb/version.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language-specific operator symbols.
|
|
3
|
+
* These are the actual text values we match against.
|
|
4
|
+
*/
|
|
5
|
+
const OPERATOR_SYMBOLS = {
|
|
6
|
+
typescript: new Set([
|
|
7
|
+
// Arithmetic
|
|
8
|
+
'+', '-', '*', '/', '%', '**',
|
|
9
|
+
// Comparison
|
|
10
|
+
'==', '===', '!=', '!==', '<', '>', '<=', '>=',
|
|
11
|
+
// Logical
|
|
12
|
+
'&&', '||', '!', '??',
|
|
13
|
+
// Assignment
|
|
14
|
+
'=', '+=', '-=', '*=', '/=', '%=', '**=', '&&=', '||=', '??=',
|
|
15
|
+
// Bitwise
|
|
16
|
+
'&', '|', '^', '~', '<<', '>>', '>>>',
|
|
17
|
+
'&=', '|=', '^=', '<<=', '>>=', '>>>=',
|
|
18
|
+
// Other
|
|
19
|
+
'?', ':', '.', '?.', '++', '--', '...', '=>',
|
|
20
|
+
// Brackets/parens (counted as operators)
|
|
21
|
+
'(', ')', '[', ']', '{', '}',
|
|
22
|
+
]),
|
|
23
|
+
python: new Set([
|
|
24
|
+
// Arithmetic
|
|
25
|
+
'+', '-', '*', '/', '%', '**', '//',
|
|
26
|
+
// Comparison
|
|
27
|
+
'==', '!=', '<', '>', '<=', '>=',
|
|
28
|
+
// Logical (handled via keywords below)
|
|
29
|
+
// Assignment
|
|
30
|
+
'=', '+=', '-=', '*=', '/=', '%=', '**=', '//=',
|
|
31
|
+
'&=', '|=', '^=', '<<=', '>>=',
|
|
32
|
+
// Bitwise
|
|
33
|
+
'&', '|', '^', '~', '<<', '>>',
|
|
34
|
+
// Other
|
|
35
|
+
'.', ':', '->', '@',
|
|
36
|
+
'(', ')', '[', ']', '{', '}',
|
|
37
|
+
]),
|
|
38
|
+
php: new Set([
|
|
39
|
+
// Arithmetic
|
|
40
|
+
'+', '-', '*', '/', '%', '**',
|
|
41
|
+
// Comparison
|
|
42
|
+
'==', '===', '!=', '!==', '<>', '<', '>', '<=', '>=', '<=>',
|
|
43
|
+
// Logical
|
|
44
|
+
'&&', '||', '!', 'and', 'or', 'xor',
|
|
45
|
+
// Assignment
|
|
46
|
+
'=', '+=', '-=', '*=', '/=', '%=', '**=', '.=',
|
|
47
|
+
'&=', '|=', '^=', '<<=', '>>=', '??=',
|
|
48
|
+
// Bitwise
|
|
49
|
+
'&', '|', '^', '~', '<<', '>>',
|
|
50
|
+
// String
|
|
51
|
+
'.',
|
|
52
|
+
// Other
|
|
53
|
+
'?', ':', '::', '->', '=>', '??', '@',
|
|
54
|
+
'(', ')', '[', ']', '{', '}',
|
|
55
|
+
]),
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Language-specific operator keywords.
|
|
59
|
+
* These are keywords that act as operators.
|
|
60
|
+
*/
|
|
61
|
+
const OPERATOR_KEYWORDS = {
|
|
62
|
+
typescript: new Set([
|
|
63
|
+
'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'default',
|
|
64
|
+
'return', 'throw', 'try', 'catch', 'finally',
|
|
65
|
+
'new', 'delete', 'typeof', 'instanceof', 'in', 'of',
|
|
66
|
+
'await', 'yield', 'break', 'continue',
|
|
67
|
+
'const', 'let', 'var', 'function', 'class', 'extends', 'implements',
|
|
68
|
+
'import', 'export', 'from', 'as',
|
|
69
|
+
]),
|
|
70
|
+
python: new Set([
|
|
71
|
+
'if', 'elif', 'else', 'for', 'while', 'match', 'case',
|
|
72
|
+
'return', 'raise', 'try', 'except', 'finally',
|
|
73
|
+
'and', 'or', 'not', 'is', 'in',
|
|
74
|
+
'await', 'yield', 'break', 'continue', 'pass',
|
|
75
|
+
'def', 'class', 'lambda', 'async',
|
|
76
|
+
'import', 'from', 'as', 'with',
|
|
77
|
+
'global', 'nonlocal', 'del', 'assert',
|
|
78
|
+
]),
|
|
79
|
+
php: new Set([
|
|
80
|
+
'if', 'elseif', 'else', 'for', 'foreach', 'while', 'do', 'switch', 'case', 'default', 'match',
|
|
81
|
+
'return', 'throw', 'try', 'catch', 'finally',
|
|
82
|
+
'new', 'clone', 'instanceof',
|
|
83
|
+
'yield', 'break', 'continue',
|
|
84
|
+
'function', 'class', 'extends', 'implements', 'trait', 'interface',
|
|
85
|
+
'use', 'namespace', 'as',
|
|
86
|
+
'echo', 'print', 'include', 'require', 'include_once', 'require_once',
|
|
87
|
+
'global', 'static', 'const', 'public', 'private', 'protected', 'readonly',
|
|
88
|
+
]),
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* AST node types that represent operators (language-agnostic).
|
|
92
|
+
* These are the tree-sitter node types, not the text content.
|
|
93
|
+
*/
|
|
94
|
+
const OPERATOR_NODE_TYPES = new Set([
|
|
95
|
+
// Expression operators
|
|
96
|
+
'binary_expression',
|
|
97
|
+
'unary_expression',
|
|
98
|
+
'update_expression',
|
|
99
|
+
'assignment_expression',
|
|
100
|
+
'augmented_assignment_expression',
|
|
101
|
+
'ternary_expression',
|
|
102
|
+
'conditional_expression',
|
|
103
|
+
// Call/access operators
|
|
104
|
+
'call_expression',
|
|
105
|
+
'method_call',
|
|
106
|
+
'member_expression',
|
|
107
|
+
'subscript_expression',
|
|
108
|
+
'attribute',
|
|
109
|
+
// Object/array literals ([] and {} are operators)
|
|
110
|
+
'array',
|
|
111
|
+
'object',
|
|
112
|
+
'dictionary',
|
|
113
|
+
'list',
|
|
114
|
+
]);
|
|
115
|
+
/**
|
|
116
|
+
* AST node types that represent operands.
|
|
117
|
+
*/
|
|
118
|
+
const OPERAND_NODE_TYPES = new Set([
|
|
119
|
+
// Identifiers
|
|
120
|
+
'identifier',
|
|
121
|
+
'property_identifier',
|
|
122
|
+
'shorthand_property_identifier',
|
|
123
|
+
'variable_name',
|
|
124
|
+
'name',
|
|
125
|
+
// Literals
|
|
126
|
+
'number',
|
|
127
|
+
'integer',
|
|
128
|
+
'float',
|
|
129
|
+
'string',
|
|
130
|
+
'string_fragment',
|
|
131
|
+
'template_string',
|
|
132
|
+
'true',
|
|
133
|
+
'false',
|
|
134
|
+
'null',
|
|
135
|
+
'undefined',
|
|
136
|
+
'none',
|
|
137
|
+
// Special
|
|
138
|
+
'this',
|
|
139
|
+
'self',
|
|
140
|
+
'super',
|
|
141
|
+
]);
|
|
142
|
+
/**
|
|
143
|
+
* Get the operator set for a language (with fallback to typescript)
|
|
144
|
+
*/
|
|
145
|
+
function getOperatorSymbols(language) {
|
|
146
|
+
return OPERATOR_SYMBOLS[language] || OPERATOR_SYMBOLS.typescript;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get the keyword set for a language (with fallback to typescript)
|
|
150
|
+
*/
|
|
151
|
+
function getOperatorKeywords(language) {
|
|
152
|
+
return OPERATOR_KEYWORDS[language] || OPERATOR_KEYWORDS.typescript;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if a node represents an operator
|
|
156
|
+
*/
|
|
157
|
+
function isOperator(node, language) {
|
|
158
|
+
const nodeType = node.type;
|
|
159
|
+
const nodeText = node.text;
|
|
160
|
+
// Check if it's an operator node type
|
|
161
|
+
if (OPERATOR_NODE_TYPES.has(nodeType)) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Check if it's an operator symbol or keyword
|
|
165
|
+
const symbols = getOperatorSymbols(language);
|
|
166
|
+
const keywords = getOperatorKeywords(language);
|
|
167
|
+
return symbols.has(nodeText) || keywords.has(nodeText);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if a node represents an operand
|
|
171
|
+
*/
|
|
172
|
+
function isOperand(node) {
|
|
173
|
+
return OPERAND_NODE_TYPES.has(node.type);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get the canonical key for an operator (for counting distinct operators)
|
|
177
|
+
*/
|
|
178
|
+
function getOperatorKey(node) {
|
|
179
|
+
// For complex expressions, use the operator type
|
|
180
|
+
if (OPERATOR_NODE_TYPES.has(node.type)) {
|
|
181
|
+
// For binary/unary expressions, extract the actual operator
|
|
182
|
+
const operator = node.childForFieldName('operator');
|
|
183
|
+
if (operator) {
|
|
184
|
+
return operator.text;
|
|
185
|
+
}
|
|
186
|
+
return node.type;
|
|
187
|
+
}
|
|
188
|
+
return node.text;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get the canonical key for an operand (for counting distinct operands)
|
|
192
|
+
*/
|
|
193
|
+
function getOperandKey(node) {
|
|
194
|
+
return node.text;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Sum all values in a map
|
|
198
|
+
*/
|
|
199
|
+
function sumValues(map) {
|
|
200
|
+
let sum = 0;
|
|
201
|
+
for (const count of map.values()) {
|
|
202
|
+
sum += count;
|
|
203
|
+
}
|
|
204
|
+
return sum;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Count operators and operands in an AST node
|
|
208
|
+
*
|
|
209
|
+
* @param node - AST node to analyze (typically a function/method)
|
|
210
|
+
* @param language - Programming language for language-specific handling
|
|
211
|
+
* @returns HalsteadCounts with raw operator/operand counts
|
|
212
|
+
*/
|
|
213
|
+
export function countHalstead(node, language) {
|
|
214
|
+
const operators = new Map();
|
|
215
|
+
const operands = new Map();
|
|
216
|
+
function traverse(n) {
|
|
217
|
+
// Check if this is an operator
|
|
218
|
+
if (isOperator(n, language)) {
|
|
219
|
+
const key = getOperatorKey(n);
|
|
220
|
+
operators.set(key, (operators.get(key) || 0) + 1);
|
|
221
|
+
}
|
|
222
|
+
// Check if this is an operand
|
|
223
|
+
if (isOperand(n)) {
|
|
224
|
+
const key = getOperandKey(n);
|
|
225
|
+
operands.set(key, (operands.get(key) || 0) + 1);
|
|
226
|
+
}
|
|
227
|
+
// Recurse into children
|
|
228
|
+
for (const child of n.children) {
|
|
229
|
+
traverse(child);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
traverse(node);
|
|
233
|
+
return {
|
|
234
|
+
n1: operators.size,
|
|
235
|
+
n2: operands.size,
|
|
236
|
+
N1: sumValues(operators),
|
|
237
|
+
N2: sumValues(operands),
|
|
238
|
+
operators,
|
|
239
|
+
operands,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Calculate derived Halstead metrics from raw counts
|
|
244
|
+
*
|
|
245
|
+
* Formulas based on Maurice Halstead's "Elements of Software Science" (1977):
|
|
246
|
+
* - Vocabulary (n) = n1 + n2
|
|
247
|
+
* - Length (N) = N1 + N2
|
|
248
|
+
* - Volume (V) = N × log₂(n) - size of implementation
|
|
249
|
+
* - Difficulty (D) = (n1/2) × (N2/n2) - error-proneness
|
|
250
|
+
* - Effort (E) = D × V - mental effort required
|
|
251
|
+
* - Time (T) = E / 18 - seconds to understand (Stroud number)
|
|
252
|
+
* - Bugs (B) = V / 3000 - estimated delivered bugs
|
|
253
|
+
*
|
|
254
|
+
* @param counts - Raw Halstead counts from countHalstead()
|
|
255
|
+
* @returns Calculated HalsteadMetrics
|
|
256
|
+
*/
|
|
257
|
+
export function calculateHalsteadMetrics(counts) {
|
|
258
|
+
const { n1, n2, N1, N2 } = counts;
|
|
259
|
+
const vocabulary = n1 + n2;
|
|
260
|
+
const length = N1 + N2;
|
|
261
|
+
// Avoid log(0) and division by zero
|
|
262
|
+
const volume = vocabulary > 0 ? length * Math.log2(vocabulary) : 0;
|
|
263
|
+
const difficulty = n2 > 0 ? (n1 / 2) * (N2 / n2) : 0;
|
|
264
|
+
const effort = difficulty * volume;
|
|
265
|
+
const time = effort / 18; // Stroud number (18 mental discriminations per second)
|
|
266
|
+
const bugs = volume / 3000;
|
|
267
|
+
return {
|
|
268
|
+
vocabulary: Math.round(vocabulary),
|
|
269
|
+
length: Math.round(length),
|
|
270
|
+
volume: Math.round(volume * 100) / 100,
|
|
271
|
+
difficulty: Math.round(difficulty * 100) / 100,
|
|
272
|
+
effort: Math.round(effort),
|
|
273
|
+
time: Math.round(time),
|
|
274
|
+
bugs: Math.round(bugs * 1000) / 1000,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Calculate Halstead metrics for an AST node in one call
|
|
279
|
+
*
|
|
280
|
+
* Convenience function that combines countHalstead and calculateHalsteadMetrics.
|
|
281
|
+
*
|
|
282
|
+
* @param node - AST node to analyze
|
|
283
|
+
* @param language - Programming language
|
|
284
|
+
* @returns Calculated HalsteadMetrics
|
|
285
|
+
*/
|
|
286
|
+
export function calculateHalstead(node, language) {
|
|
287
|
+
const counts = countHalstead(node, language);
|
|
288
|
+
return calculateHalsteadMetrics(counts);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=halstead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"halstead.js","sourceRoot":"","sources":["../../../../src/indexer/ast/complexity/halstead.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity metrics module
|
|
3
|
+
*
|
|
4
|
+
* This module provides various code complexity metrics:
|
|
5
|
+
* - Cyclomatic complexity: Counts decision points (branches) in code
|
|
6
|
+
* - Cognitive complexity: Measures mental effort to understand code (SonarSource spec)
|
|
7
|
+
* - Halstead metrics: Measures complexity based on operators/operands
|
|
8
|
+
*/
|
|
9
|
+
export { calculateComplexity } from './cyclomatic.js';
|
|
10
|
+
export { calculateCognitiveComplexity } from './cognitive.js';
|
|
11
|
+
export { countHalstead, calculateHalsteadMetrics, calculateHalstead, } from './halstead.js';
|
|
12
|
+
export type { HalsteadCounts, HalsteadMetrics } from './halstead.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/indexer/ast/complexity/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity metrics module
|
|
3
|
+
*
|
|
4
|
+
* This module provides various code complexity metrics:
|
|
5
|
+
* - Cyclomatic complexity: Counts decision points (branches) in code
|
|
6
|
+
* - Cognitive complexity: Measures mental effort to understand code (SonarSource spec)
|
|
7
|
+
* - Halstead metrics: Measures complexity based on operators/operands
|
|
8
|
+
*/
|
|
9
|
+
export { calculateComplexity } from './cyclomatic.js';
|
|
10
|
+
export { calculateCognitiveComplexity } from './cognitive.js';
|
|
11
|
+
export { countHalstead, calculateHalsteadMetrics, calculateHalstead, } from './halstead.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/indexer/ast/complexity/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ASTParseResult, SupportedLanguage } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect language from file extension
|
|
4
|
+
* Uses path.extname() to handle edge cases like multiple dots in filenames
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectLanguage(filePath: string): SupportedLanguage | null;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a file is supported for AST parsing
|
|
9
|
+
*/
|
|
10
|
+
export declare function isASTSupported(filePath: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Parse source code into an AST using Tree-sitter
|
|
13
|
+
*
|
|
14
|
+
* **Known Limitation:** Tree-sitter may throw "Invalid argument" errors on very large files
|
|
15
|
+
* (1000+ lines). This is a limitation of Tree-sitter's internal buffer handling. When this
|
|
16
|
+
* occurs, callers should fall back to line-based chunking (handled automatically by chunker.ts).
|
|
17
|
+
*
|
|
18
|
+
* @param content - Source code to parse
|
|
19
|
+
* @param language - Programming language
|
|
20
|
+
* @returns Parse result with tree or error
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseAST(content: string, language: SupportedLanguage): ASTParseResult;
|
|
23
|
+
/**
|
|
24
|
+
* Clear parser cache (useful for testing)
|
|
25
|
+
*/
|
|
26
|
+
export declare function clearParserCache(): void;
|
|
27
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/indexer/ast/parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0CpE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAqBzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,cAAc,CAoBrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import Parser from 'tree-sitter';
|
|
2
|
+
import TypeScript from 'tree-sitter-typescript';
|
|
3
|
+
import JavaScript from 'tree-sitter-javascript';
|
|
4
|
+
import PHPParser from 'tree-sitter-php';
|
|
5
|
+
import Python from 'tree-sitter-python';
|
|
6
|
+
import { extname } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Cache for parser instances to avoid recreating them
|
|
9
|
+
*/
|
|
10
|
+
const parserCache = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Language configuration mapping
|
|
13
|
+
*/
|
|
14
|
+
const languageConfig = {
|
|
15
|
+
typescript: TypeScript.typescript,
|
|
16
|
+
javascript: JavaScript,
|
|
17
|
+
php: PHPParser.php, // Note: tree-sitter-php exports both 'php' (mixed HTML/PHP) and 'php_only'
|
|
18
|
+
python: Python,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Get or create a cached parser instance for a language
|
|
22
|
+
*/
|
|
23
|
+
function getParser(language) {
|
|
24
|
+
if (!parserCache.has(language)) {
|
|
25
|
+
const parser = new Parser();
|
|
26
|
+
const grammar = languageConfig[language];
|
|
27
|
+
if (!grammar) {
|
|
28
|
+
throw new Error(`No grammar available for language: ${language}`);
|
|
29
|
+
}
|
|
30
|
+
parser.setLanguage(grammar);
|
|
31
|
+
parserCache.set(language, parser);
|
|
32
|
+
}
|
|
33
|
+
return parserCache.get(language);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Detect language from file extension
|
|
37
|
+
* Uses path.extname() to handle edge cases like multiple dots in filenames
|
|
38
|
+
*/
|
|
39
|
+
export function detectLanguage(filePath) {
|
|
40
|
+
// extname returns extension with leading dot (e.g., '.ts')
|
|
41
|
+
// Remove the dot and convert to lowercase
|
|
42
|
+
const ext = extname(filePath).slice(1).toLowerCase();
|
|
43
|
+
switch (ext) {
|
|
44
|
+
case 'ts':
|
|
45
|
+
case 'tsx':
|
|
46
|
+
return 'typescript';
|
|
47
|
+
case 'js':
|
|
48
|
+
case 'jsx':
|
|
49
|
+
case 'mjs':
|
|
50
|
+
case 'cjs':
|
|
51
|
+
return 'javascript';
|
|
52
|
+
case 'php':
|
|
53
|
+
return 'php';
|
|
54
|
+
case 'py':
|
|
55
|
+
return 'python';
|
|
56
|
+
default:
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a file is supported for AST parsing
|
|
62
|
+
*/
|
|
63
|
+
export function isASTSupported(filePath) {
|
|
64
|
+
return detectLanguage(filePath) !== null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse source code into an AST using Tree-sitter
|
|
68
|
+
*
|
|
69
|
+
* **Known Limitation:** Tree-sitter may throw "Invalid argument" errors on very large files
|
|
70
|
+
* (1000+ lines). This is a limitation of Tree-sitter's internal buffer handling. When this
|
|
71
|
+
* occurs, callers should fall back to line-based chunking (handled automatically by chunker.ts).
|
|
72
|
+
*
|
|
73
|
+
* @param content - Source code to parse
|
|
74
|
+
* @param language - Programming language
|
|
75
|
+
* @returns Parse result with tree or error
|
|
76
|
+
*/
|
|
77
|
+
export function parseAST(content, language) {
|
|
78
|
+
try {
|
|
79
|
+
const parser = getParser(language);
|
|
80
|
+
const tree = parser.parse(content);
|
|
81
|
+
// Check for parse errors (hasError is a property, not a method)
|
|
82
|
+
if (tree.rootNode.hasError) {
|
|
83
|
+
return {
|
|
84
|
+
tree,
|
|
85
|
+
error: 'Parse completed with errors',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return { tree };
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
tree: null,
|
|
93
|
+
error: error instanceof Error ? error.message : 'Unknown parse error',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Clear parser cache (useful for testing)
|
|
99
|
+
*/
|
|
100
|
+
export function clearParserCache() {
|
|
101
|
+
parserCache.clear();
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/indexer/ast/parser.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;AAQzD;;GAEG;AACH,MAAM,cAAc,GAAkD;IACpE,UAAU,EAAE,UAAU,CAAC,UAAU;IACjC,UAAU,EAAE,UAAU;IACtB,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,2EAA2E;IAC/F,MAAM,EAAE,MAAM;CACf,CAAC;AAEF;;GAEG;AACH,SAAS,SAAS,CAAC,QAA2B;IAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,2DAA2D;IAC3D,0CAA0C;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAErD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,IAAI;YACP,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,QAA2B;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,gEAAgE;QAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI;gBACJ,KAAK,EAAE,6BAA6B;aACrC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;SACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type Parser from 'tree-sitter';
|
|
2
|
+
import type { SymbolInfo } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extract symbol information from an AST node using specialized extractors
|
|
5
|
+
*
|
|
6
|
+
* @param node - AST node to extract info from
|
|
7
|
+
* @param content - Source code content
|
|
8
|
+
* @param parentClass - Parent class name if this is a method
|
|
9
|
+
* @param language - Programming language (for disambiguating shared node types)
|
|
10
|
+
* @returns Symbol information or null
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractSymbolInfo(node: Parser.SyntaxNode, content: string, parentClass?: string, language?: string): SymbolInfo | null;
|
|
13
|
+
/**
|
|
14
|
+
* Extract import statements from a file
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractImports(rootNode: Parser.SyntaxNode): string[];
|
|
17
|
+
//# sourceMappingURL=symbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/indexer/ast/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2M7C;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CASnB;AAkED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAoCpE"}
|