gitnexus 1.4.7 → 1.4.8
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 +22 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +1 -1
- package/dist/cli/analyze.d.ts +2 -0
- package/dist/cli/analyze.js +54 -21
- package/dist/cli/index.js +2 -1
- package/dist/cli/setup.js +78 -1
- package/dist/config/supported-languages.d.ts +30 -0
- package/dist/config/supported-languages.js +30 -0
- package/dist/core/embeddings/embedder.d.ts +6 -1
- package/dist/core/embeddings/embedder.js +65 -5
- package/dist/core/embeddings/embedding-pipeline.js +11 -9
- package/dist/core/embeddings/http-client.d.ts +31 -0
- package/dist/core/embeddings/http-client.js +179 -0
- package/dist/core/embeddings/index.d.ts +1 -0
- package/dist/core/embeddings/index.js +1 -0
- package/dist/core/embeddings/types.d.ts +1 -1
- package/dist/core/graph/types.d.ts +2 -1
- package/dist/core/ingestion/ast-helpers.d.ts +80 -0
- package/dist/core/ingestion/ast-helpers.js +738 -0
- package/dist/core/ingestion/call-analysis.d.ts +73 -0
- package/dist/core/ingestion/call-analysis.js +490 -0
- package/dist/core/ingestion/call-processor.d.ts +48 -1
- package/dist/core/ingestion/call-processor.js +368 -7
- package/dist/core/ingestion/call-routing.d.ts +6 -0
- package/dist/core/ingestion/entry-point-scoring.js +36 -26
- package/dist/core/ingestion/framework-detection.d.ts +10 -2
- package/dist/core/ingestion/framework-detection.js +49 -12
- package/dist/core/ingestion/heritage-processor.js +47 -49
- package/dist/core/ingestion/import-processor.d.ts +1 -1
- package/dist/core/ingestion/import-processor.js +103 -194
- package/dist/core/ingestion/import-resolution.d.ts +101 -0
- package/dist/core/ingestion/import-resolution.js +251 -0
- package/dist/core/ingestion/language-config.d.ts +3 -0
- package/dist/core/ingestion/language-config.js +13 -0
- package/dist/core/ingestion/markdown-processor.d.ts +17 -0
- package/dist/core/ingestion/markdown-processor.js +124 -0
- package/dist/core/ingestion/mro-processor.js +8 -3
- package/dist/core/ingestion/named-binding-extraction.d.ts +9 -43
- package/dist/core/ingestion/named-binding-extraction.js +89 -79
- package/dist/core/ingestion/parsing-processor.d.ts +2 -2
- package/dist/core/ingestion/parsing-processor.js +14 -73
- package/dist/core/ingestion/pipeline.d.ts +10 -0
- package/dist/core/ingestion/pipeline.js +421 -4
- package/dist/core/ingestion/resolution-context.d.ts +5 -0
- package/dist/core/ingestion/resolution-context.js +7 -4
- package/dist/core/ingestion/resolvers/index.d.ts +1 -1
- package/dist/core/ingestion/resolvers/index.js +1 -1
- package/dist/core/ingestion/resolvers/jvm.d.ts +2 -1
- package/dist/core/ingestion/resolvers/jvm.js +25 -9
- package/dist/core/ingestion/resolvers/php.d.ts +14 -0
- package/dist/core/ingestion/resolvers/php.js +43 -3
- package/dist/core/ingestion/resolvers/utils.d.ts +5 -0
- package/dist/core/ingestion/resolvers/utils.js +16 -0
- package/dist/core/ingestion/symbol-table.d.ts +16 -0
- package/dist/core/ingestion/symbol-table.js +20 -6
- package/dist/core/ingestion/tree-sitter-queries.d.ts +4 -4
- package/dist/core/ingestion/tree-sitter-queries.js +43 -2
- package/dist/core/ingestion/type-env.d.ts +28 -1
- package/dist/core/ingestion/type-env.js +419 -96
- package/dist/core/ingestion/type-extractors/c-cpp.d.ts +5 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +119 -0
- package/dist/core/ingestion/type-extractors/csharp.js +149 -16
- package/dist/core/ingestion/type-extractors/index.d.ts +1 -1
- package/dist/core/ingestion/type-extractors/index.js +1 -1
- package/dist/core/ingestion/type-extractors/jvm.js +169 -66
- package/dist/core/ingestion/type-extractors/rust.js +35 -1
- package/dist/core/ingestion/type-extractors/shared.d.ts +0 -2
- package/dist/core/ingestion/type-extractors/shared.js +5 -10
- package/dist/core/ingestion/type-extractors/swift.js +7 -6
- package/dist/core/ingestion/type-extractors/types.d.ts +37 -7
- package/dist/core/ingestion/type-extractors/typescript.js +141 -9
- package/dist/core/ingestion/utils.d.ts +2 -120
- package/dist/core/ingestion/utils.js +3 -1051
- package/dist/core/ingestion/workers/parse-worker.d.ts +13 -4
- package/dist/core/ingestion/workers/parse-worker.js +66 -87
- package/dist/core/lbug/csv-generator.js +18 -1
- package/dist/core/lbug/lbug-adapter.d.ts +10 -0
- package/dist/core/lbug/lbug-adapter.js +69 -4
- package/dist/core/lbug/schema.d.ts +5 -3
- package/dist/core/lbug/schema.js +26 -2
- package/dist/mcp/core/embedder.js +11 -3
- package/dist/mcp/core/lbug-adapter.js +12 -1
- package/dist/mcp/local/local-backend.d.ts +22 -0
- package/dist/mcp/local/local-backend.js +133 -29
- package/dist/mcp/resources.js +2 -0
- package/dist/mcp/tools.js +2 -2
- package/dist/server/api.d.ts +19 -1
- package/dist/server/api.js +66 -6
- package/dist/storage/git.d.ts +12 -0
- package/dist/storage/git.js +21 -0
- package/package.json +10 -2
|
@@ -7,9 +7,23 @@ import type { SuffixIndex } from './utils.js';
|
|
|
7
7
|
export interface ComposerConfig {
|
|
8
8
|
/** Map of namespace prefix -> directory (e.g., "App\\" -> "app/") */
|
|
9
9
|
psr4: Map<string, string>;
|
|
10
|
+
/** PSR-4 entries sorted by namespace length descending (longest match wins).
|
|
11
|
+
* Cached once at config load time to avoid re-sorting on every import. */
|
|
12
|
+
psr4Sorted?: readonly [string, string][];
|
|
10
13
|
}
|
|
11
14
|
/**
|
|
12
15
|
* Resolve a PHP use-statement import path using PSR-4 mappings.
|
|
13
16
|
* e.g. "App\Http\Controllers\UserController" -> "app/Http/Controllers/UserController.php"
|
|
17
|
+
*
|
|
18
|
+
* For function/constant imports (use function App\Models\getUser), the last
|
|
19
|
+
* segment is the symbol name, not a class name, so it may not map directly to
|
|
20
|
+
* a file. When PSR-4 class-style resolution fails, we fall back to scanning
|
|
21
|
+
* .php files in the namespace directory.
|
|
22
|
+
*
|
|
23
|
+
* NOTE: The function-import fallback returns the first matching .php file in the
|
|
24
|
+
* namespace directory. When multiple files exist in the same namespace directory,
|
|
25
|
+
* resolution is non-deterministic (depends on Set/index iteration order). This is
|
|
26
|
+
* a known limitation — PHP function imports cannot be resolved to a specific file
|
|
27
|
+
* without parsing all candidate files.
|
|
14
28
|
*/
|
|
15
29
|
export declare function resolvePhpImport(importPath: string, composerConfig: ComposerConfig | null, allFiles: Set<string>, normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
|
|
@@ -3,21 +3,42 @@
|
|
|
3
3
|
* Handles use-statement resolution via composer.json autoload mappings.
|
|
4
4
|
*/
|
|
5
5
|
import { suffixResolve } from './utils.js';
|
|
6
|
+
/** Get or compute the sorted PSR-4 entries (cached after first call). */
|
|
7
|
+
function getSortedPsr4(config) {
|
|
8
|
+
if (!config.psr4Sorted) {
|
|
9
|
+
const sorted = [...config.psr4.entries()].sort((a, b) => b[0].length - a[0].length);
|
|
10
|
+
config.psr4Sorted = sorted;
|
|
11
|
+
}
|
|
12
|
+
return config.psr4Sorted;
|
|
13
|
+
}
|
|
6
14
|
/**
|
|
7
15
|
* Resolve a PHP use-statement import path using PSR-4 mappings.
|
|
8
16
|
* e.g. "App\Http\Controllers\UserController" -> "app/Http/Controllers/UserController.php"
|
|
17
|
+
*
|
|
18
|
+
* For function/constant imports (use function App\Models\getUser), the last
|
|
19
|
+
* segment is the symbol name, not a class name, so it may not map directly to
|
|
20
|
+
* a file. When PSR-4 class-style resolution fails, we fall back to scanning
|
|
21
|
+
* .php files in the namespace directory.
|
|
22
|
+
*
|
|
23
|
+
* NOTE: The function-import fallback returns the first matching .php file in the
|
|
24
|
+
* namespace directory. When multiple files exist in the same namespace directory,
|
|
25
|
+
* resolution is non-deterministic (depends on Set/index iteration order). This is
|
|
26
|
+
* a known limitation — PHP function imports cannot be resolved to a specific file
|
|
27
|
+
* without parsing all candidate files.
|
|
9
28
|
*/
|
|
10
29
|
export function resolvePhpImport(importPath, composerConfig, allFiles, normalizedFileList, allFileList, index) {
|
|
11
30
|
// Normalize: replace backslashes with forward slashes
|
|
12
31
|
const normalized = importPath.replace(/\\/g, '/');
|
|
13
|
-
//
|
|
32
|
+
// Reject path traversal attempts (defense-in-depth — walker whitelist also prevents this)
|
|
33
|
+
if (normalized.includes('..'))
|
|
34
|
+
return null;
|
|
14
35
|
if (composerConfig) {
|
|
15
|
-
|
|
16
|
-
const sorted = [...composerConfig.psr4.entries()].sort((a, b) => b[0].length - a[0].length);
|
|
36
|
+
const sorted = getSortedPsr4(composerConfig);
|
|
17
37
|
for (const [nsPrefix, dirPrefix] of sorted) {
|
|
18
38
|
const nsPrefixSlash = nsPrefix.replace(/\\/g, '/');
|
|
19
39
|
if (normalized.startsWith(nsPrefixSlash + '/') || normalized === nsPrefixSlash) {
|
|
20
40
|
const remainder = normalized.slice(nsPrefixSlash.length).replace(/^\//, '');
|
|
41
|
+
// 1. Try class-style PSR-4: full path → file (e.g. App\Models\User → app/Models/User.php)
|
|
21
42
|
const filePath = dirPrefix + (remainder ? '/' + remainder : '') + '.php';
|
|
22
43
|
if (allFiles.has(filePath))
|
|
23
44
|
return filePath;
|
|
@@ -26,6 +47,25 @@ export function resolvePhpImport(importPath, composerConfig, allFiles, normalize
|
|
|
26
47
|
if (result)
|
|
27
48
|
return result;
|
|
28
49
|
}
|
|
50
|
+
// 2. Function/constant fallback: strip last segment (symbol name), scan namespace directory.
|
|
51
|
+
// e.g. App\Models\getUser → directory app/Models/, find first .php file in that dir.
|
|
52
|
+
const lastSlash = remainder.lastIndexOf('/');
|
|
53
|
+
const nsDir = lastSlash >= 0
|
|
54
|
+
? dirPrefix + '/' + remainder.slice(0, lastSlash)
|
|
55
|
+
: dirPrefix;
|
|
56
|
+
// Prefer SuffixIndex directory lookup (O(log n + matches)) over linear scan
|
|
57
|
+
if (index) {
|
|
58
|
+
const candidates = index.getFilesInDir(nsDir, '.php');
|
|
59
|
+
if (candidates.length > 0)
|
|
60
|
+
return candidates[0];
|
|
61
|
+
}
|
|
62
|
+
// Fallback: linear scan (only when SuffixIndex unavailable)
|
|
63
|
+
const nsDirPrefix = nsDir.endsWith('/') ? nsDir : nsDir + '/';
|
|
64
|
+
for (const f of allFiles) {
|
|
65
|
+
if (f.startsWith(nsDirPrefix) && f.endsWith('.php') && !f.slice(nsDirPrefix.length).includes('/')) {
|
|
66
|
+
return f;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
29
69
|
}
|
|
30
70
|
}
|
|
31
71
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Shared utilities for import resolution.
|
|
3
3
|
* Extracted from import-processor.ts to reduce file size.
|
|
4
4
|
*/
|
|
5
|
+
import type { SyntaxNode } from '../utils.js';
|
|
5
6
|
/** All file extensions to try during resolution */
|
|
6
7
|
export declare const EXTENSIONS: string[];
|
|
7
8
|
/**
|
|
@@ -26,8 +27,12 @@ export interface SuffixIndex {
|
|
|
26
27
|
/** Get all files in a directory suffix */
|
|
27
28
|
getFilesInDir(dirSuffix: string, extension: string): string[];
|
|
28
29
|
}
|
|
30
|
+
/** Sentinel index that returns no results. Used to release memory after import resolution. */
|
|
31
|
+
export declare const EMPTY_INDEX: SuffixIndex;
|
|
29
32
|
export declare function buildSuffixIndex(normalizedFileList: string[], allFileList: string[]): SuffixIndex;
|
|
30
33
|
/**
|
|
31
34
|
* Suffix-based resolution using index. O(1) per lookup instead of O(files).
|
|
32
35
|
*/
|
|
33
36
|
export declare function suffixResolve(pathParts: string[], normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
|
|
37
|
+
/** Find the first direct named child of a tree-sitter node matching the given type. */
|
|
38
|
+
export declare function findChild(node: SyntaxNode, type: string): SyntaxNode | null;
|
|
@@ -40,6 +40,13 @@ export function tryResolveWithExtensions(basePath, allFiles) {
|
|
|
40
40
|
}
|
|
41
41
|
return null;
|
|
42
42
|
}
|
|
43
|
+
const FROZEN_EMPTY_ARRAY = Object.freeze([]);
|
|
44
|
+
/** Sentinel index that returns no results. Used to release memory after import resolution. */
|
|
45
|
+
export const EMPTY_INDEX = Object.freeze({
|
|
46
|
+
get: () => undefined,
|
|
47
|
+
getInsensitive: () => undefined,
|
|
48
|
+
getFilesInDir: () => FROZEN_EMPTY_ARRAY,
|
|
49
|
+
});
|
|
43
50
|
export function buildSuffixIndex(normalizedFileList, allFileList) {
|
|
44
51
|
// Map: normalized suffix -> original file path
|
|
45
52
|
const exactMap = new Map();
|
|
@@ -120,3 +127,12 @@ export function suffixResolve(pathParts, normalizedFileList, allFileList, index)
|
|
|
120
127
|
}
|
|
121
128
|
return null;
|
|
122
129
|
}
|
|
130
|
+
/** Find the first direct named child of a tree-sitter node matching the given type. */
|
|
131
|
+
export function findChild(node, type) {
|
|
132
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
133
|
+
const child = node.namedChild(i);
|
|
134
|
+
if (child?.type === type)
|
|
135
|
+
return child;
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
@@ -4,6 +4,13 @@ export interface SymbolDefinition {
|
|
|
4
4
|
filePath: string;
|
|
5
5
|
type: NodeLabel;
|
|
6
6
|
parameterCount?: number;
|
|
7
|
+
/** Number of required (non-optional, non-default) parameters.
|
|
8
|
+
* Enables range-based arity filtering: argCount >= requiredParameterCount && argCount <= parameterCount. */
|
|
9
|
+
requiredParameterCount?: number;
|
|
10
|
+
/** Per-parameter type names for overload disambiguation (e.g. ['int', 'String']).
|
|
11
|
+
* Populated when parameter types are resolvable from AST (any typed language).
|
|
12
|
+
* Used for disambiguation in overloading languages (Java, Kotlin, C#, C++). */
|
|
13
|
+
parameterTypes?: string[];
|
|
7
14
|
/** Raw return type text extracted from AST (e.g. 'User', 'Promise<User>') */
|
|
8
15
|
returnType?: string;
|
|
9
16
|
/** Declared type for non-callable symbols — fields/properties (e.g. 'Address', 'List<User>') */
|
|
@@ -17,6 +24,8 @@ export interface SymbolTable {
|
|
|
17
24
|
*/
|
|
18
25
|
add: (filePath: string, name: string, nodeId: string, type: NodeLabel, metadata?: {
|
|
19
26
|
parameterCount?: number;
|
|
27
|
+
requiredParameterCount?: number;
|
|
28
|
+
parameterTypes?: string[];
|
|
20
29
|
returnType?: string;
|
|
21
30
|
declaredType?: string;
|
|
22
31
|
ownerId?: string;
|
|
@@ -29,8 +38,15 @@ export interface SymbolTable {
|
|
|
29
38
|
/**
|
|
30
39
|
* High Confidence: Look for a symbol in a specific file, returning full definition.
|
|
31
40
|
* Includes type information needed for heritage resolution (Class vs Interface).
|
|
41
|
+
* Returns first matching definition — use lookupExactAll for overloaded methods.
|
|
32
42
|
*/
|
|
33
43
|
lookupExactFull: (filePath: string, name: string) => SymbolDefinition | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* High Confidence: Look for ALL symbols with this name in a specific file.
|
|
46
|
+
* Returns all definitions, including overloaded methods with the same name.
|
|
47
|
+
* Used by resolution-context to pass all same-file overloads to candidate filtering.
|
|
48
|
+
*/
|
|
49
|
+
lookupExactAll: (filePath: string, name: string) => SymbolDefinition[];
|
|
34
50
|
/**
|
|
35
51
|
* Low Confidence: Look for a symbol anywhere in the project
|
|
36
52
|
* Used when imports are missing or for framework magic
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const createSymbolTable = () => {
|
|
2
|
-
// 1. File-Specific Index — stores full SymbolDefinition for O(1)
|
|
3
|
-
// Structure: FilePath -> (SymbolName -> SymbolDefinition)
|
|
2
|
+
// 1. File-Specific Index — stores full SymbolDefinition(s) for O(1) lookup.
|
|
3
|
+
// Structure: FilePath -> (SymbolName -> SymbolDefinition[])
|
|
4
|
+
// Array allows overloaded methods (same name, different signatures) to coexist.
|
|
4
5
|
const fileIndex = new Map();
|
|
5
6
|
// 2. Global Reverse Index (The "Backup")
|
|
6
7
|
// Structure: SymbolName -> [List of Definitions]
|
|
@@ -19,6 +20,8 @@ export const createSymbolTable = () => {
|
|
|
19
20
|
filePath,
|
|
20
21
|
type,
|
|
21
22
|
...(metadata?.parameterCount !== undefined ? { parameterCount: metadata.parameterCount } : {}),
|
|
23
|
+
...(metadata?.requiredParameterCount !== undefined ? { requiredParameterCount: metadata.requiredParameterCount } : {}),
|
|
24
|
+
...(metadata?.parameterTypes !== undefined ? { parameterTypes: metadata.parameterTypes } : {}),
|
|
22
25
|
...(metadata?.returnType !== undefined ? { returnType: metadata.returnType } : {}),
|
|
23
26
|
...(metadata?.declaredType !== undefined ? { declaredType: metadata.declaredType } : {}),
|
|
24
27
|
...(metadata?.ownerId !== undefined ? { ownerId: metadata.ownerId } : {}),
|
|
@@ -27,7 +30,13 @@ export const createSymbolTable = () => {
|
|
|
27
30
|
if (!fileIndex.has(filePath)) {
|
|
28
31
|
fileIndex.set(filePath, new Map());
|
|
29
32
|
}
|
|
30
|
-
fileIndex.get(filePath)
|
|
33
|
+
const fileMap = fileIndex.get(filePath);
|
|
34
|
+
if (!fileMap.has(name)) {
|
|
35
|
+
fileMap.set(name, [def]);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
fileMap.get(name).push(def);
|
|
39
|
+
}
|
|
31
40
|
// B. Properties go to fieldByOwner index only — skip globalIndex to prevent
|
|
32
41
|
// namespace pollution for common names like 'id', 'name', 'type'.
|
|
33
42
|
// Index ALL properties (even without declaredType) so write-access tracking
|
|
@@ -48,10 +57,15 @@ export const createSymbolTable = () => {
|
|
|
48
57
|
}
|
|
49
58
|
};
|
|
50
59
|
const lookupExact = (filePath, name) => {
|
|
51
|
-
|
|
60
|
+
const defs = fileIndex.get(filePath)?.get(name);
|
|
61
|
+
return defs?.[0]?.nodeId;
|
|
52
62
|
};
|
|
53
63
|
const lookupExactFull = (filePath, name) => {
|
|
54
|
-
|
|
64
|
+
const defs = fileIndex.get(filePath)?.get(name);
|
|
65
|
+
return defs?.[0];
|
|
66
|
+
};
|
|
67
|
+
const lookupExactAll = (filePath, name) => {
|
|
68
|
+
return fileIndex.get(filePath)?.get(name) ?? [];
|
|
55
69
|
};
|
|
56
70
|
const lookupFuzzy = (name) => {
|
|
57
71
|
return globalIndex.get(name) || [];
|
|
@@ -81,5 +95,5 @@ export const createSymbolTable = () => {
|
|
|
81
95
|
callableIndex = null;
|
|
82
96
|
fieldByOwner.clear();
|
|
83
97
|
};
|
|
84
|
-
return { add, lookupExact, lookupExactFull, lookupFuzzy, lookupFuzzyCallable, lookupFieldByOwner, getStats, clear };
|
|
98
|
+
return { add, lookupExact, lookupExactFull, lookupExactAll, lookupFuzzy, lookupFuzzyCallable, lookupFieldByOwner, getStats, clear };
|
|
85
99
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { SupportedLanguages } from '../../config/supported-languages.js';
|
|
2
|
-
export declare const TYPESCRIPT_QUERIES = "\n(class_declaration\n name: (type_identifier) @name) @definition.class\n\n(interface_declaration\n name: (type_identifier) @name) @definition.interface\n\n(function_declaration\n name: (identifier) @name) @definition.function\n\n(method_definition\n name: (property_identifier) @name) @definition.method\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function))) @definition.function\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function)))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression)))) @definition.function\n\n(import_statement\n source: (string) @import.source) @import\n\n; Re-export statements: export { X } from './y'\n(export_statement\n source: (string) @import.source) @import\n\n(call_expression\n function: (identifier) @call.name) @call\n\n(call_expression\n function: (member_expression\n property: (property_identifier) @call.name)) @call\n\n; Constructor calls: new Foo()\n(new_expression\n constructor: (identifier) @call.name) @call\n\n; Class properties \u2014 public_field_definition covers most TS class fields\n(public_field_definition\n name: (property_identifier) @name) @definition.property\n\n; Private class fields: #address: Address\n(public_field_definition\n name: (private_property_identifier) @name) @definition.property\n\n; Constructor parameter properties: constructor(public address: Address)\n(required_parameter\n (accessibility_modifier)\n pattern: (identifier) @name) @definition.property\n\n; Heritage queries - class extends\n(class_declaration\n name: (type_identifier) @heritage.class\n (class_heritage\n (extends_clause\n value: (identifier) @heritage.extends))) @heritage\n\n; Heritage queries - class implements interface\n(class_declaration\n name: (type_identifier) @heritage.class\n (class_heritage\n (implements_clause\n (type_identifier) @heritage.implements))) @heritage.impl\n\n; Write access: obj.field = value\n(assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
2
|
+
export declare const TYPESCRIPT_QUERIES = "\n(class_declaration\n name: (type_identifier) @name) @definition.class\n\n(interface_declaration\n name: (type_identifier) @name) @definition.interface\n\n(function_declaration\n name: (identifier) @name) @definition.function\n\n; TypeScript overload signatures (function_signature is a separate node type from function_declaration)\n(function_signature\n name: (identifier) @name) @definition.function\n\n(method_definition\n name: (property_identifier) @name) @definition.method\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function))) @definition.function\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function)))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression)))) @definition.function\n\n(import_statement\n source: (string) @import.source) @import\n\n; Re-export statements: export { X } from './y'\n(export_statement\n source: (string) @import.source) @import\n\n(call_expression\n function: (identifier) @call.name) @call\n\n(call_expression\n function: (member_expression\n property: (property_identifier) @call.name)) @call\n\n; Constructor calls: new Foo()\n(new_expression\n constructor: (identifier) @call.name) @call\n\n; Class properties \u2014 public_field_definition covers most TS class fields\n(public_field_definition\n name: (property_identifier) @name) @definition.property\n\n; Private class fields: #address: Address\n(public_field_definition\n name: (private_property_identifier) @name) @definition.property\n\n; Constructor parameter properties: constructor(public address: Address)\n(required_parameter\n (accessibility_modifier)\n pattern: (identifier) @name) @definition.property\n\n; Heritage queries - class extends\n(class_declaration\n name: (type_identifier) @heritage.class\n (class_heritage\n (extends_clause\n value: (identifier) @heritage.extends))) @heritage\n\n; Heritage queries - class implements interface\n(class_declaration\n name: (type_identifier) @heritage.class\n (class_heritage\n (implements_clause\n (type_identifier) @heritage.implements))) @heritage.impl\n\n; Write access: obj.field = value\n(assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
3
3
|
export declare const JAVASCRIPT_QUERIES = "\n(class_declaration\n name: (identifier) @name) @definition.class\n\n(function_declaration\n name: (identifier) @name) @definition.function\n\n(method_definition\n name: (property_identifier) @name) @definition.method\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function))) @definition.function\n\n(lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (arrow_function)))) @definition.function\n\n(export_statement\n declaration: (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (function_expression)))) @definition.function\n\n(import_statement\n source: (string) @import.source) @import\n\n; Re-export statements: export { X } from './y'\n(export_statement\n source: (string) @import.source) @import\n\n(call_expression\n function: (identifier) @call.name) @call\n\n(call_expression\n function: (member_expression\n property: (property_identifier) @call.name)) @call\n\n; Constructor calls: new Foo()\n(new_expression\n constructor: (identifier) @call.name) @call\n\n; Class fields \u2014 field_definition captures JS class fields (class User { address = ... })\n(field_definition\n property: (property_identifier) @name) @definition.property\n\n; Heritage queries - class extends (JavaScript uses different AST than TypeScript)\n; In tree-sitter-javascript, class_heritage directly contains the parent identifier\n(class_declaration\n name: (identifier) @heritage.class\n (class_heritage\n (identifier) @heritage.extends)) @heritage\n\n; Write access: obj.field = value\n(assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment_expression\n left: (member_expression\n object: (_) @assignment.receiver\n property: (property_identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
4
|
-
export declare const PYTHON_QUERIES = "\n(class_definition\n name: (identifier) @name) @definition.class\n\n(function_definition\n name: (identifier) @name) @definition.function\n\n(import_statement\n name: (dotted_name) @import.source) @import\n\n(import_from_statement\n module_name: (dotted_name) @import.source) @import\n\n(import_from_statement\n module_name: (relative_import) @import.source) @import\n\n(call\n function: (identifier) @call.name) @call\n\n(call\n function: (attribute\n attribute: (identifier) @call.name)) @call\n\n; Class attribute type annotations \u2014 PEP 526: address: Address or address: Address = Address()\n; Both bare annotations (address: Address) and annotated assignments (name: str = \"test\")\n; are parsed as (assignment left: ... type: ...) in tree-sitter-python.\n(expression_statement\n (assignment\n left: (identifier) @name\n type: (type)) @definition.property)\n\n; Heritage queries - Python class inheritance\n(class_definition\n name: (identifier) @heritage.class\n superclasses: (argument_list\n (identifier) @heritage.extends)) @heritage\n\n; Write access: obj.field = value\n(assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
4
|
+
export declare const PYTHON_QUERIES = "\n(class_definition\n name: (identifier) @name) @definition.class\n\n(function_definition\n name: (identifier) @name) @definition.function\n\n(import_statement\n name: (dotted_name) @import.source) @import\n\n; import numpy as np \u2192 aliased_import captures the module name so the\n; import path is resolved and named-binding extraction stores \"np\" \u2192 \"numpy\".\n(import_statement\n name: (aliased_import\n name: (dotted_name) @import.source)) @import\n\n(import_from_statement\n module_name: (dotted_name) @import.source) @import\n\n(import_from_statement\n module_name: (relative_import) @import.source) @import\n\n(call\n function: (identifier) @call.name) @call\n\n(call\n function: (attribute\n attribute: (identifier) @call.name)) @call\n\n; Class attribute type annotations \u2014 PEP 526: address: Address or address: Address = Address()\n; Both bare annotations (address: Address) and annotated assignments (name: str = \"test\")\n; are parsed as (assignment left: ... type: ...) in tree-sitter-python.\n(expression_statement\n (assignment\n left: (identifier) @name\n type: (type)) @definition.property)\n\n; Heritage queries - Python class inheritance\n(class_definition\n name: (identifier) @heritage.class\n superclasses: (argument_list\n (identifier) @heritage.extends)) @heritage\n\n; Write access: obj.field = value\n(assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
5
5
|
export declare const JAVA_QUERIES = "\n; Classes, Interfaces, Enums, Annotations\n(class_declaration name: (identifier) @name) @definition.class\n(interface_declaration name: (identifier) @name) @definition.interface\n(enum_declaration name: (identifier) @name) @definition.enum\n(annotation_type_declaration name: (identifier) @name) @definition.annotation\n\n; Methods & Constructors\n(method_declaration name: (identifier) @name) @definition.method\n(constructor_declaration name: (identifier) @name) @definition.constructor\n\n; Fields \u2014 typed field declarations inside class bodies\n(field_declaration\n declarator: (variable_declarator\n name: (identifier) @name)) @definition.property\n\n; Imports - capture any import declaration child as source\n(import_declaration (_) @import.source) @import\n\n; Calls\n(method_invocation name: (identifier) @call.name) @call\n(method_invocation object: (_) name: (identifier) @call.name) @call\n\n; Constructor calls: new Foo()\n(object_creation_expression type: (type_identifier) @call.name) @call\n\n; Heritage - extends class\n(class_declaration name: (identifier) @heritage.class\n (superclass (type_identifier) @heritage.extends)) @heritage\n\n; Heritage - implements interfaces\n(class_declaration name: (identifier) @heritage.class\n (super_interfaces (type_list (type_identifier) @heritage.implements))) @heritage.impl\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_access\n object: (_) @assignment.receiver\n field: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
6
6
|
export declare const C_QUERIES = "\n; Functions (direct declarator)\n(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n\n; Functions returning pointers (pointer_declarator wraps function_declarator)\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(declaration declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n\n; Functions returning double pointers (nested pointer_declarator)\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)))) @definition.function\n\n; Structs, Unions, Enums, Typedefs\n(struct_specifier name: (type_identifier) @name) @definition.struct\n(union_specifier name: (type_identifier) @name) @definition.union\n(enum_specifier name: (type_identifier) @name) @definition.enum\n(type_definition declarator: (type_identifier) @name) @definition.typedef\n\n; Macros\n(preproc_function_def name: (identifier) @name) @definition.macro\n(preproc_def name: (identifier) @name) @definition.macro\n\n; Includes\n(preproc_include path: (_) @import.source) @import\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (field_expression field: (field_identifier) @call.name)) @call\n";
|
|
7
|
-
export declare const GO_QUERIES = "\n; Functions & Methods\n(function_declaration name: (identifier) @name) @definition.function\n(method_declaration name: (field_identifier) @name) @definition.method\n\n; Types\n(type_declaration (type_spec name: (type_identifier) @name type: (struct_type))) @definition.struct\n(type_declaration (type_spec name: (type_identifier) @name type: (interface_type))) @definition.interface\n\n; Imports\n(import_declaration (import_spec path: (interpreted_string_literal) @import.source)) @import\n(import_declaration (import_spec_list (import_spec path: (interpreted_string_literal) @import.source))) @import\n\n; Struct fields \u2014 named field declarations inside struct types\n(field_declaration_list\n (field_declaration\n name: (field_identifier) @name) @definition.property)\n\n; Struct embedding (anonymous fields = inheritance)\n(type_declaration\n (type_spec\n name: (type_identifier) @heritage.class\n type: (struct_type\n (field_declaration_list\n (field_declaration\n type: (type_identifier) @heritage.extends))))) @definition.struct\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (selector_expression field: (field_identifier) @call.name)) @call\n\n; Struct literal construction: User{Name: \"Alice\"}\n(composite_literal type: (type_identifier) @call.name) @call\n\n; Write access: obj.field = value\n(assignment_statement\n left: (expression_list\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property))\n right: (_)) @assignment\n";
|
|
8
|
-
export declare const CPP_QUERIES = "\n; Classes, Structs, Namespaces\n(class_specifier name: (type_identifier) @name) @definition.class\n(struct_specifier name: (type_identifier) @name) @definition.struct\n(namespace_definition name: (namespace_identifier) @name) @definition.namespace\n(enum_specifier name: (type_identifier) @name) @definition.enum\n\n; Typedefs and unions (common in C-style headers and mixed C/C++ code)\n(type_definition declarator: (type_identifier) @name) @definition.typedef\n(union_specifier name: (type_identifier) @name) @definition.union\n\n; Macros\n(preproc_function_def name: (identifier) @name) @definition.macro\n(preproc_def name: (identifier) @name) @definition.macro\n\n; Functions & Methods (direct declarator)\n(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))) @definition.method\n\n; Functions/methods returning pointers (pointer_declarator wraps function_declarator)\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n\n; Functions/methods returning double pointers (nested pointer_declarator)\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))))) @definition.method\n\n; Functions/methods returning references (reference_declarator wraps function_declarator)\n(function_definition declarator: (reference_declarator (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (reference_declarator (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n\n; Destructors (destructor_name is distinct from identifier in tree-sitter-cpp)\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (destructor_name) @name))) @definition.method\n\n; Function declarations / prototypes (common in headers)\n(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(declaration declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n\n; Class/struct data member fields (Address address; int count;)\n; Uses field_identifier to exclude method declarations (which use function_declarator)\n(field_declaration\n declarator: (field_identifier) @name) @definition.property\n\n; Pointer member fields (Address* address;)\n(field_declaration\n declarator: (pointer_declarator\n declarator: (field_identifier) @name)) @definition.property\n\n; Reference member fields (Address& address;)\n(field_declaration\n declarator: (reference_declarator\n (field_identifier) @name)) @definition.property\n\n; Inline class method declarations (inside class body, no body: void
|
|
7
|
+
export declare const GO_QUERIES = "\n; Functions & Methods\n(function_declaration name: (identifier) @name) @definition.function\n(method_declaration name: (field_identifier) @name) @definition.method\n\n; Types\n(type_declaration (type_spec name: (type_identifier) @name type: (struct_type))) @definition.struct\n(type_declaration (type_spec name: (type_identifier) @name type: (interface_type))) @definition.interface\n\n; Imports\n(import_declaration (import_spec path: (interpreted_string_literal) @import.source)) @import\n(import_declaration (import_spec_list (import_spec path: (interpreted_string_literal) @import.source))) @import\n\n; Struct fields \u2014 named field declarations inside struct types\n(field_declaration_list\n (field_declaration\n name: (field_identifier) @name) @definition.property)\n\n; Struct embedding (anonymous fields = inheritance)\n(type_declaration\n (type_spec\n name: (type_identifier) @heritage.class\n type: (struct_type\n (field_declaration_list\n (field_declaration\n type: (type_identifier) @heritage.extends))))) @definition.struct\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (selector_expression field: (field_identifier) @call.name)) @call\n\n; Struct literal construction: User{Name: \"Alice\"}\n(composite_literal type: (type_identifier) @call.name) @call\n\n; Write access: obj.field = value\n(assignment_statement\n left: (expression_list\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property))\n right: (_)) @assignment\n\n; Write access: obj.field++ / obj.field--\n(inc_statement\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)) @assignment\n(dec_statement\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)) @assignment\n";
|
|
8
|
+
export declare const CPP_QUERIES = "\n; Classes, Structs, Namespaces\n(class_specifier name: (type_identifier) @name) @definition.class\n(struct_specifier name: (type_identifier) @name) @definition.struct\n(namespace_definition name: (namespace_identifier) @name) @definition.namespace\n(enum_specifier name: (type_identifier) @name) @definition.enum\n\n; Typedefs and unions (common in C-style headers and mixed C/C++ code)\n(type_definition declarator: (type_identifier) @name) @definition.typedef\n(union_specifier name: (type_identifier) @name) @definition.union\n\n; Macros\n(preproc_function_def name: (identifier) @name) @definition.macro\n(preproc_def name: (identifier) @name) @definition.macro\n\n; Functions & Methods (direct declarator)\n(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))) @definition.method\n\n; Functions/methods returning pointers (pointer_declarator wraps function_declarator)\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n\n; Functions/methods returning double pointers (nested pointer_declarator)\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))))) @definition.method\n\n; Functions/methods returning references (reference_declarator wraps function_declarator)\n(function_definition declarator: (reference_declarator (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (reference_declarator (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n\n; Destructors (destructor_name is distinct from identifier in tree-sitter-cpp)\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (destructor_name) @name))) @definition.method\n\n; Function declarations / prototypes (common in headers)\n(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(declaration declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n\n; Class/struct data member fields (Address address; int count;)\n; Uses field_identifier to exclude method declarations (which use function_declarator)\n(field_declaration\n declarator: (field_identifier) @name) @definition.property\n\n; Pointer member fields (Address* address;)\n(field_declaration\n declarator: (pointer_declarator\n declarator: (field_identifier) @name)) @definition.property\n\n; Reference member fields (Address& address;)\n(field_declaration\n declarator: (reference_declarator\n (field_identifier) @name)) @definition.property\n\n; Inline class method declarations (inside class body, no body: void save();)\n; tree-sitter-cpp uses field_identifier (not identifier) for names inside class bodies\n(field_declaration declarator: (function_declarator declarator: [(field_identifier) (identifier)] @name)) @definition.method\n\n; Inline class method declarations returning a pointer (User* lookup();)\n(field_declaration declarator: (pointer_declarator declarator: (function_declarator declarator: [(field_identifier) (identifier)] @name))) @definition.method\n\n; Inline class method declarations returning a reference (User& lookup();)\n(field_declaration declarator: (reference_declarator (function_declarator declarator: [(field_identifier) (identifier)] @name))) @definition.method\n\n; Inline class method definitions (inside class body, with body: void Foo() { ... })\n(field_declaration_list\n (function_definition\n declarator: (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name) (destructor_name)] @name)) @definition.method)\n\n; Inline class methods returning a pointer type (User* lookup(int id) { ... })\n(field_declaration_list\n (function_definition\n declarator: (pointer_declarator\n declarator: (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)\n\n; Inline class methods returning a reference type (User& lookup(int id) { ... })\n(field_declaration_list\n (function_definition\n declarator: (reference_declarator\n (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)\n\n; Templates\n(template_declaration (class_specifier name: (type_identifier) @name)) @definition.template\n(template_declaration (function_definition declarator: (function_declarator declarator: (identifier) @name))) @definition.template\n\n; Includes\n(preproc_include path: (_) @import.source) @import\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (field_expression field: (field_identifier) @call.name)) @call\n(call_expression function: (qualified_identifier name: (identifier) @call.name)) @call\n(call_expression function: (template_function name: (identifier) @call.name)) @call\n\n; Constructor calls: new User()\n(new_expression type: (type_identifier) @call.name) @call\n\n; Heritage\n(class_specifier name: (type_identifier) @heritage.class\n (base_class_clause (type_identifier) @heritage.extends)) @heritage\n(class_specifier name: (type_identifier) @heritage.class\n (base_class_clause (access_specifier) (type_identifier) @heritage.extends)) @heritage\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_expression\n argument: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)\n right: (_)) @assignment\n\n";
|
|
9
9
|
export declare const CSHARP_QUERIES = "\n; Types\n(class_declaration name: (identifier) @name) @definition.class\n(interface_declaration name: (identifier) @name) @definition.interface\n(struct_declaration name: (identifier) @name) @definition.struct\n(enum_declaration name: (identifier) @name) @definition.enum\n(record_declaration name: (identifier) @name) @definition.record\n(delegate_declaration name: (identifier) @name) @definition.delegate\n\n; Namespaces (block form and C# 10+ file-scoped form)\n(namespace_declaration name: (identifier) @name) @definition.namespace\n(namespace_declaration name: (qualified_name) @name) @definition.namespace\n(file_scoped_namespace_declaration name: (identifier) @name) @definition.namespace\n(file_scoped_namespace_declaration name: (qualified_name) @name) @definition.namespace\n\n; Methods & Properties\n(method_declaration name: (identifier) @name) @definition.method\n(local_function_statement name: (identifier) @name) @definition.function\n(constructor_declaration name: (identifier) @name) @definition.constructor\n(property_declaration name: (identifier) @name) @definition.property\n\n; Primary constructors (C# 12): class User(string name, int age) { }\n(class_declaration name: (identifier) @name (parameter_list) @definition.constructor)\n(record_declaration name: (identifier) @name (parameter_list) @definition.constructor)\n\n; Using\n(using_directive (qualified_name) @import.source) @import\n(using_directive (identifier) @import.source) @import\n\n; Calls\n(invocation_expression function: (identifier) @call.name) @call\n(invocation_expression function: (member_access_expression name: (identifier) @call.name)) @call\n\n; Null-conditional method calls: user?.Save()\n; Parses as: invocation_expression \u2192 conditional_access_expression \u2192 member_binding_expression \u2192 identifier\n(invocation_expression\n function: (conditional_access_expression\n (member_binding_expression\n (identifier) @call.name))) @call\n\n; Constructor calls: new Foo() and new Foo { Props }\n(object_creation_expression type: (identifier) @call.name) @call\n\n; Target-typed new (C# 9): User u = new(\"x\", 5)\n(variable_declaration type: (identifier) @call.name (variable_declarator (implicit_object_creation_expression) @call))\n\n; Heritage\n(class_declaration name: (identifier) @heritage.class\n (base_list (identifier) @heritage.extends)) @heritage\n(class_declaration name: (identifier) @heritage.class\n (base_list (generic_name (identifier) @heritage.extends))) @heritage\n\n; Write access: obj.field = value\n(assignment_expression\n left: (member_access_expression\n expression: (_) @assignment.receiver\n name: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
10
10
|
export declare const RUST_QUERIES = "\n; Functions & Items\n(function_item name: (identifier) @name) @definition.function\n(struct_item name: (type_identifier) @name) @definition.struct\n(enum_item name: (type_identifier) @name) @definition.enum\n(trait_item name: (type_identifier) @name) @definition.trait\n(impl_item type: (type_identifier) @name !trait) @definition.impl\n(impl_item type: (generic_type type: (type_identifier) @name) !trait) @definition.impl\n(mod_item name: (identifier) @name) @definition.module\n\n; Type aliases, const, static, macros\n(type_item name: (type_identifier) @name) @definition.type\n(const_item name: (identifier) @name) @definition.const\n(static_item name: (identifier) @name) @definition.static\n(macro_definition name: (identifier) @name) @definition.macro\n\n; Use statements\n(use_declaration argument: (_) @import.source) @import\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (field_expression field: (field_identifier) @call.name)) @call\n(call_expression function: (scoped_identifier name: (identifier) @call.name)) @call\n(call_expression function: (generic_function function: (identifier) @call.name)) @call\n\n; Struct literal construction: User { name: value }\n(struct_expression name: (type_identifier) @call.name) @call\n\n; Struct fields \u2014 named field declarations inside struct bodies\n(field_declaration_list\n (field_declaration\n name: (field_identifier) @name) @definition.property)\n\n; Heritage (trait implementation) \u2014 all combinations of concrete/generic trait \u00D7 concrete/generic type\n(impl_item trait: (type_identifier) @heritage.trait type: (type_identifier) @heritage.class) @heritage\n(impl_item trait: (generic_type type: (type_identifier) @heritage.trait) type: (type_identifier) @heritage.class) @heritage\n(impl_item trait: (type_identifier) @heritage.trait type: (generic_type type: (type_identifier) @heritage.class)) @heritage\n(impl_item trait: (generic_type type: (type_identifier) @heritage.trait) type: (generic_type type: (type_identifier) @heritage.class)) @heritage\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_expression\n value: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(compound_assignment_expr\n left: (field_expression\n value: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
11
11
|
export declare const PHP_QUERIES = "\n; \u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(namespace_definition\n name: (namespace_name) @name) @definition.namespace\n\n; \u2500\u2500 Classes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(class_declaration\n name: (name) @name) @definition.class\n\n; \u2500\u2500 Interfaces \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(interface_declaration\n name: (name) @name) @definition.interface\n\n; \u2500\u2500 Traits \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(trait_declaration\n name: (name) @name) @definition.trait\n\n; \u2500\u2500 Enums (PHP 8.1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(enum_declaration\n name: (name) @name) @definition.enum\n\n; \u2500\u2500 Top-level functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(function_definition\n name: (name) @name) @definition.function\n\n; \u2500\u2500 Methods (including constructors) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(method_declaration\n name: (name) @name) @definition.method\n\n; \u2500\u2500 Class properties (including Eloquent $fillable, $casts, etc.) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(property_declaration\n (property_element\n (variable_name\n (name) @name))) @definition.property\n\n; Constructor property promotion (PHP 8.0+: public Address $address in __construct)\n(method_declaration\n parameters: (formal_parameters\n (property_promotion_parameter\n name: (variable_name\n (name) @name)))) @definition.property\n\n; \u2500\u2500 Imports: use statements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n; Simple: use App\\Models\\User;\n(namespace_use_declaration\n (namespace_use_clause\n (qualified_name) @import.source)) @import\n\n; \u2500\u2500 Function/method calls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n; Regular function call: foo()\n(function_call_expression\n function: (name) @call.name) @call\n\n; Method call: $obj->method()\n(member_call_expression\n name: (name) @call.name) @call\n\n; Nullsafe method call: $obj?->method()\n(nullsafe_member_call_expression\n name: (name) @call.name) @call\n\n; Static call: Foo::bar() (php_only uses scoped_call_expression)\n(scoped_call_expression\n name: (name) @call.name) @call\n\n; Constructor call: new User()\n(object_creation_expression (name) @call.name) @call\n\n; \u2500\u2500 Heritage: extends \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(class_declaration\n name: (name) @heritage.class\n (base_clause\n [(name) (qualified_name)] @heritage.extends)) @heritage\n\n; \u2500\u2500 Heritage: implements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(class_declaration\n name: (name) @heritage.class\n (class_interface_clause\n [(name) (qualified_name)] @heritage.implements)) @heritage.impl\n\n; \u2500\u2500 Heritage: use trait (must capture enclosing class name) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(class_declaration\n name: (name) @heritage.class\n body: (declaration_list\n (use_declaration\n [(name) (qualified_name)] @heritage.trait))) @heritage\n\n; Write access: $obj->field = value\n(assignment_expression\n left: (member_access_expression\n object: (_) @assignment.receiver\n name: (name) @assignment.property)\n right: (_)) @assignment\n\n; Write access: ClassName::$field = value (static property)\n(assignment_expression\n left: (scoped_property_access_expression\n scope: (_) @assignment.receiver\n name: (variable_name (name) @assignment.property))\n right: (_)) @assignment\n";
|
|
@@ -17,6 +17,10 @@ export const TYPESCRIPT_QUERIES = `
|
|
|
17
17
|
(function_declaration
|
|
18
18
|
name: (identifier) @name) @definition.function
|
|
19
19
|
|
|
20
|
+
; TypeScript overload signatures (function_signature is a separate node type from function_declaration)
|
|
21
|
+
(function_signature
|
|
22
|
+
name: (identifier) @name) @definition.function
|
|
23
|
+
|
|
20
24
|
(method_definition
|
|
21
25
|
name: (property_identifier) @name) @definition.method
|
|
22
26
|
|
|
@@ -188,6 +192,12 @@ export const PYTHON_QUERIES = `
|
|
|
188
192
|
(import_statement
|
|
189
193
|
name: (dotted_name) @import.source) @import
|
|
190
194
|
|
|
195
|
+
; import numpy as np → aliased_import captures the module name so the
|
|
196
|
+
; import path is resolved and named-binding extraction stores "np" → "numpy".
|
|
197
|
+
(import_statement
|
|
198
|
+
name: (aliased_import
|
|
199
|
+
name: (dotted_name) @import.source)) @import
|
|
200
|
+
|
|
191
201
|
(import_from_statement
|
|
192
202
|
module_name: (dotted_name) @import.source) @import
|
|
193
203
|
|
|
@@ -343,6 +353,16 @@ export const GO_QUERIES = `
|
|
|
343
353
|
operand: (_) @assignment.receiver
|
|
344
354
|
field: (field_identifier) @assignment.property))
|
|
345
355
|
right: (_)) @assignment
|
|
356
|
+
|
|
357
|
+
; Write access: obj.field++ / obj.field--
|
|
358
|
+
(inc_statement
|
|
359
|
+
(selector_expression
|
|
360
|
+
operand: (_) @assignment.receiver
|
|
361
|
+
field: (field_identifier) @assignment.property)) @assignment
|
|
362
|
+
(dec_statement
|
|
363
|
+
(selector_expression
|
|
364
|
+
operand: (_) @assignment.receiver
|
|
365
|
+
field: (field_identifier) @assignment.property)) @assignment
|
|
346
366
|
`;
|
|
347
367
|
// C++ queries - works with tree-sitter-cpp
|
|
348
368
|
export const CPP_QUERIES = `
|
|
@@ -398,8 +418,15 @@ export const CPP_QUERIES = `
|
|
|
398
418
|
declarator: (reference_declarator
|
|
399
419
|
(field_identifier) @name)) @definition.property
|
|
400
420
|
|
|
401
|
-
; Inline class method declarations (inside class body, no body: void
|
|
402
|
-
|
|
421
|
+
; Inline class method declarations (inside class body, no body: void save();)
|
|
422
|
+
; tree-sitter-cpp uses field_identifier (not identifier) for names inside class bodies
|
|
423
|
+
(field_declaration declarator: (function_declarator declarator: [(field_identifier) (identifier)] @name)) @definition.method
|
|
424
|
+
|
|
425
|
+
; Inline class method declarations returning a pointer (User* lookup();)
|
|
426
|
+
(field_declaration declarator: (pointer_declarator declarator: (function_declarator declarator: [(field_identifier) (identifier)] @name))) @definition.method
|
|
427
|
+
|
|
428
|
+
; Inline class method declarations returning a reference (User& lookup();)
|
|
429
|
+
(field_declaration declarator: (reference_declarator (function_declarator declarator: [(field_identifier) (identifier)] @name))) @definition.method
|
|
403
430
|
|
|
404
431
|
; Inline class method definitions (inside class body, with body: void Foo() { ... })
|
|
405
432
|
(field_declaration_list
|
|
@@ -407,6 +434,20 @@ export const CPP_QUERIES = `
|
|
|
407
434
|
declarator: (function_declarator
|
|
408
435
|
declarator: [(field_identifier) (identifier) (operator_name) (destructor_name)] @name)) @definition.method)
|
|
409
436
|
|
|
437
|
+
; Inline class methods returning a pointer type (User* lookup(int id) { ... })
|
|
438
|
+
(field_declaration_list
|
|
439
|
+
(function_definition
|
|
440
|
+
declarator: (pointer_declarator
|
|
441
|
+
declarator: (function_declarator
|
|
442
|
+
declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)
|
|
443
|
+
|
|
444
|
+
; Inline class methods returning a reference type (User& lookup(int id) { ... })
|
|
445
|
+
(field_declaration_list
|
|
446
|
+
(function_definition
|
|
447
|
+
declarator: (reference_declarator
|
|
448
|
+
(function_declarator
|
|
449
|
+
declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)
|
|
450
|
+
|
|
410
451
|
; Templates
|
|
411
452
|
(template_declaration (class_specifier name: (type_identifier) @name)) @definition.template
|
|
412
453
|
(template_declaration (function_definition declarator: (function_declarator declarator: (identifier) @name))) @definition.template
|
|
@@ -28,10 +28,37 @@ export interface TypeEnvironment {
|
|
|
28
28
|
readonly constructorBindings: readonly ConstructorBinding[];
|
|
29
29
|
/** Raw per-scope type bindings — for testing and debugging. */
|
|
30
30
|
readonly env: TypeEnv;
|
|
31
|
+
/** Maps `scope\0varName` → constructor type for virtual dispatch override.
|
|
32
|
+
* Populated when a variable has BOTH a declared base type AND a more specific
|
|
33
|
+
* constructor type (e.g., `Animal a = new Dog()` → key maps to 'Dog'). */
|
|
34
|
+
readonly constructorTypeMap: ReadonlyMap<string, string>;
|
|
35
|
+
}
|
|
36
|
+
/** Check if `child` is a subclass of `parent` using the parentMap.
|
|
37
|
+
* BFS up from child, depth-limited (5), cycle-safe. */
|
|
38
|
+
export declare const isSubclassOf: (child: string, parent: string, parentMap: ReadonlyMap<string, readonly string[]> | undefined) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Options for buildTypeEnv.
|
|
41
|
+
* Uses an options object to allow future extensions without positional parameter sprawl.
|
|
42
|
+
*/
|
|
43
|
+
export interface BuildTypeEnvOptions {
|
|
44
|
+
symbolTable?: SymbolTable;
|
|
45
|
+
parentMap?: ReadonlyMap<string, readonly string[]>;
|
|
46
|
+
/** Pre-resolved bindings from upstream files (Phase 14).
|
|
47
|
+
* Seeded into FILE_SCOPE after walk() for names with no local binding.
|
|
48
|
+
* Local declarations always take precedence (first-writer-wins). */
|
|
49
|
+
importedBindings?: ReadonlyMap<string, string>;
|
|
50
|
+
/** Cross-file return type fallback for imported callables (Phase 14 E3).
|
|
51
|
+
* Consulted ONLY when SymbolTable has no unambiguous match.
|
|
52
|
+
* Local definitions always take precedence (local-first principle). */
|
|
53
|
+
importedReturnTypes?: ReadonlyMap<string, string>;
|
|
54
|
+
/** Cross-file RAW return types for imported callables (Phase 14 E3).
|
|
55
|
+
* Stores raw declared return type strings (e.g., 'User[]', 'List<User>').
|
|
56
|
+
* Used by lookupRawReturnType for for-loop element extraction. */
|
|
57
|
+
importedRawReturnTypes?: ReadonlyMap<string, string>;
|
|
31
58
|
}
|
|
32
59
|
export declare const buildTypeEnv: (tree: {
|
|
33
60
|
rootNode: SyntaxNode;
|
|
34
|
-
}, language: SupportedLanguages,
|
|
61
|
+
}, language: SupportedLanguages, options?: BuildTypeEnvOptions) => TypeEnvironment;
|
|
35
62
|
/**
|
|
36
63
|
* Unverified constructor binding: a `val x = Callee()` pattern where we
|
|
37
64
|
* couldn't confirm the callee is a class (because it's defined in another file).
|