From a40ced6ca2c51b31a62e22afc9e6bf35d6857490 Mon Sep 17 00:00:00 2001 From: Paul Aan Date: Wed, 17 Jun 2026 14:50:21 +0700 Subject: [PATCH] update-support-powershell --- CHANGELOG.md | 1 + README.md | 3 +- __tests__/extraction.test.ts | 102 +++++++ package-lock.json | 7 + package.json | 1 + src/extraction/grammars.ts | 7 +- src/extraction/languages/index.ts | 2 + src/extraction/languages/powershell.ts | 285 ++++++++++++++++++ src/extraction/tree-sitter.ts | 54 +++- .../wasm/tree-sitter-powershell.wasm | Bin 0 -> 1088467 bytes src/resolution/import-resolver.ts | 29 ++ src/resolution/index.ts | 23 +- src/resolution/name-matcher.ts | 13 +- src/types.ts | 1 + 14 files changed, 515 insertions(+), 13 deletions(-) create mode 100644 src/extraction/languages/powershell.ts create mode 100644 src/extraction/wasm/tree-sitter-powershell.wasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b1a325de..deb31ca94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Java `static final` constants, C# `const` / `static readonly` constants, Scala `object` vals, and Kotlin top-level / `object` / `companion object` `val`s are now classified as constants rather than generic fields, so they participate in the constant-reader impact analysis above — change a `public static final` table, a `const string`, a Scala `object Config { val Timeout = … }`, or a Kotlin `companion object { const val … }` and the methods that read it now show up as affected. (Per-object Java `final` / C# `readonly` / Scala & Kotlin `class` instance properties are unchanged.) Kotlin constants were previously not indexed as their own symbols at all, so they now also appear in `codegraph search`. - Swift top-level `let`s and `static let` constants (including those namespaced in an `enum`/`struct`, the common Swift pattern) are now indexed as constants and participate in the constant-reader impact analysis above — change a `static let defaultRetryLimit` or an `enum Constants { static let … }` and the same-file code that reads it shows up as affected. Computed properties and per-instance `let`s are not treated as constants. - Dart top-level `const`/`final` and class `static const`/`static final` constants are now indexed as constants and participate in the constant-reader impact analysis above. Instance fields, `var`s, and locals are not treated as constants. (Generated Dart code with the standard `.g.dart`/`.freezed.dart`/`.pb.dart` suffixes is already skipped.) +- CodeGraph now indexes PowerShell scripts and modules (`.ps1`, `.psm1`, and `.psd1`), including functions, classes, methods, properties, enums, module imports, dot-sourced scripts, and command calls, so agents can explore PowerShell automation without reading every script by hand. ### Fixes diff --git a/README.md b/README.md index 354af2463..ef9c9a1a1 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ CodeGraph cuts **tokens, tool calls, and wall-clock time on every repo** — acr | **Full-Text Search** | Find code by name instantly across your entire codebase, powered by FTS5 | | **Impact Analysis** | Trace callers, callees, and the full impact radius of any symbol before making changes | | **Always Fresh** | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync — the graph stays current as you code, zero config | -| **20+ Languages** | TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Objective-C, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Svelte, Vue, Astro, Liquid, Pascal/Delphi | +| **20+ Languages** | TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Objective-C, Swift, Kotlin, Scala, Dart, Lua, Luau, R, PowerShell, Svelte, Vue, Astro, Liquid, Pascal/Delphi | | **Framework-aware Routes** | Recognizes web-framework routing files and links URL patterns to their handlers across 17 frameworks | | **Mixed iOS / React Native / Expo** | Closes cross-language flows that static parsing misses: Swift ↔ ObjC bridging, React Native legacy bridge + TurboModules + Fabric view components, native → JS event emitters, Expo Modules | | **100% Local** | No data leaves your machine. No API keys. No external services. SQLite database only | @@ -679,6 +679,7 @@ is written): | Lua | `.lua` | Full support (functions, methods with receivers, local variables, `require` imports, call edges) | | R | `.R` `.r` | Full support (functions in every assignment form, S4/R5/R6 classes with methods, `library`/`require` imports, `source()` file references, call edges) | | Luau | `.luau` | Full support (everything in Lua, plus `type`/`export type` aliases, typed signatures, and Roblox instance-path `require`) | +| PowerShell | `.ps1`, `.psm1`, `.psd1` | Full support (functions, classes, methods, properties, enums, module/script imports, and command call edges) | ## Measured cross-file coverage diff --git a/__tests__/extraction.test.ts b/__tests__/extraction.test.ts index df825f529..6a73b826a 100644 --- a/__tests__/extraction.test.ts +++ b/__tests__/extraction.test.ts @@ -101,6 +101,13 @@ describe('Language Detection', () => { expect(detectLanguage('stdio.h', '#ifndef STDIO_H\nvoid printf();\n#endif\n')).toBe('c'); }); + it('should detect PowerShell files', () => { + expect(detectLanguage('install.ps1')).toBe('powershell'); + expect(detectLanguage('Modules/Widgets.psm1')).toBe('powershell'); + expect(detectLanguage('Widgets.psd1')).toBe('powershell'); + expect(isSourceFile('install.ps1')).toBe(true); + }); + it('should return unknown for unsupported extensions', () => { expect(detectLanguage('styles.css')).toBe('unknown'); expect(detectLanguage('data.json')).toBe('unknown'); @@ -129,6 +136,101 @@ describe('Language Support', () => { expect(languages).toContain('swift'); expect(languages).toContain('kotlin'); expect(languages).toContain('dart'); + expect(languages).toContain('powershell'); + }); +}); + +describe('PowerShell Extraction', () => { + it('extracts functions, classes, members, enums, imports, and command calls', () => { + const code = ` +using module ./Private/Helpers.psm1 + +$ModuleRoot = $PSScriptRoot + +function Get-Widget { + [CmdletBinding()] + param( + [string]$Name, + [int]$Limit = 10 + ) + + Import-Module ./Private/Helpers.psm1 + $items = Find-Widget -Name $Name | Where-Object { Test-Widget $_ } + foreach ($item in $items) { + Write-Output (Convert-Widget $item) + } +} + +class WidgetRunner : BaseRunner { + [string]$Name + + WidgetRunner([string]$name) { + $this.Name = $name + } + + [void] Run() { + Get-Widget -Name $this.Name + } +} + +enum WidgetState { + Ready = 1 + Disabled = 2 +} +`; + + const result = extractFromSource('Widgets.psm1', code); + expect(result.errors).toHaveLength(0); + + const symbol = (name: string, kind: string) => result.nodes.find((n) => n.name === name && n.kind === kind); + expect(symbol('Get-Widget', 'function')).toMatchObject({ kind: 'function', language: 'powershell' }); + expect(symbol('WidgetRunner', 'class')).toMatchObject({ kind: 'class', language: 'powershell' }); + expect(symbol('Run', 'method')).toMatchObject({ kind: 'method', language: 'powershell' }); + expect(symbol('Name', 'property')).toMatchObject({ kind: 'property', language: 'powershell' }); + expect(symbol('WidgetState', 'enum')).toMatchObject({ kind: 'enum', language: 'powershell' }); + expect(symbol('Ready', 'enum_member')).toMatchObject({ kind: 'enum_member', language: 'powershell' }); + expect(symbol('ModuleRoot', 'variable')).toMatchObject({ kind: 'variable', language: 'powershell' }); + + const refs = result.unresolvedReferences.map((r) => ({ name: r.referenceName, kind: r.referenceKind })); + expect(refs).toContainEqual({ name: './Private/Helpers.psm1', kind: 'imports' }); + expect(refs).toContainEqual({ name: 'Find-Widget', kind: 'calls' }); + expect(refs).toContainEqual({ name: 'Test-Widget', kind: 'calls' }); + expect(refs).toContainEqual({ name: 'Convert-Widget', kind: 'calls' }); + expect(refs).toContainEqual({ name: 'Get-Widget', kind: 'calls' }); + expect(refs).toContainEqual({ name: 'BaseRunner', kind: 'extends' }); + }); + + it('resolves PowerShell module imports and case-insensitive command calls', async () => { + const tempDir = createTempDir(); + let cg: CodeGraph | null = null; + try { + fs.mkdirSync(path.join(tempDir, 'Private'), { recursive: true }); + fs.writeFileSync( + path.join(tempDir, 'Private', 'Helpers.psm1'), + `function Find-Widget { param([string]$Name) Write-Output $Name }\n` + ); + fs.writeFileSync( + path.join(tempDir, 'Widgets.psm1'), + `using module ./Private/Helpers.psm1\nfunction Get-Widget { find-widget -Name "demo" }\n` + ); + + cg = CodeGraph.initSync(tempDir); + await cg.indexAll(); + cg.resolveReferences(); + + const findWidget = cg.getNodesByKind('function').find((n) => n.name === 'Find-Widget'); + expect(findWidget).toBeDefined(); + const callers = cg.getCallers(findWidget!.id).map((entry) => entry.node.name); + expect(callers).toContain('Get-Widget'); + + const helperFile = cg.getNodesByKind('file').find((n) => n.filePath.endsWith('Private/Helpers.psm1')); + expect(helperFile).toBeDefined(); + const helperDependents = cg.getImpactRadius(helperFile!.id, 2).nodes; + expect([...helperDependents.values()].some((n) => n.filePath.endsWith('Widgets.psm1'))).toBe(true); + } finally { + cg?.close(); + cleanupTempDir(tempDir); + } }); }); diff --git a/package-lock.json b/package-lock.json index 205fe9026..31bd47c03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.1", "license": "MIT", "dependencies": { + "22": "^0.0.0", "@clack/prompts": "^1.3.0", "commander": "^14.0.2", "fast-string-width": "^3.0.2", @@ -957,6 +958,12 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/22": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/22/-/22-0.0.0.tgz", + "integrity": "sha512-MdBPNDaCFY4fZVpp14n3Mt4isZ2yS1DrIiOig/iMLljr4zDa0g/583xf/lFXNPwhxCfGKYvyWJSrYyS8jNk2mQ==", + "license": "MIT" + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", diff --git a/package.json b/package.json index a802f7975..9e7658070 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "author": "", "license": "MIT", "dependencies": { + "22": "^0.0.0", "@clack/prompts": "^1.3.0", "commander": "^14.0.2", "fast-string-width": "^3.0.2", diff --git a/src/extraction/grammars.ts b/src/extraction/grammars.ts index ef6307a92..a69da23f6 100644 --- a/src/extraction/grammars.ts +++ b/src/extraction/grammars.ts @@ -39,6 +39,7 @@ const WASM_GRAMMAR_FILES: Record = { r: 'tree-sitter-r.wasm', luau: 'tree-sitter-luau.wasm', objc: 'tree-sitter-objc.wasm', + powershell: 'tree-sitter-powershell.wasm', }; /** @@ -108,6 +109,9 @@ export const EXTENSION_MAP: Record = { '.luau': 'luau', '.m': 'objc', '.mm': 'objc', + '.ps1': 'powershell', + '.psm1': 'powershell', + '.psd1': 'powershell', // XML: file-level tracking; the MyBatis extractor matches `` // shape and emits SQL-statement nodes (other XML returns empty). '.xml': 'xml', @@ -216,7 +220,7 @@ export async function loadGrammarsForLanguages(languages: Language[]): Promise> = { typescript: typescriptExtractor, @@ -51,4 +52,5 @@ export const EXTRACTORS: Partial> = { r: rExtractor, luau: luauExtractor, objc: objcExtractor, + powershell: powershellExtractor, }; diff --git a/src/extraction/languages/powershell.ts b/src/extraction/languages/powershell.ts new file mode 100644 index 000000000..6cef75199 --- /dev/null +++ b/src/extraction/languages/powershell.ts @@ -0,0 +1,285 @@ +import type { Node as SyntaxNode } from 'web-tree-sitter'; +import { getChildByField, getNodeText } from '../tree-sitter-helpers'; +import type { ExtractorContext, LanguageExtractor } from '../tree-sitter-types'; + +const PATH_LIKE_RE = /(?:^\.?\.?[\\/]|[\\/]|\.ps(?:m|d)?1$)/i; +const COMMAND_PATH_RE = /(?:^\.{1,2}[\\/]|^[\\/]|[/]|\.ps(?:m|d)?1$)/i; + +export const powershellExtractor: LanguageExtractor = { + functionTypes: ['function_statement'], + classTypes: ['class_statement'], + methodTypes: ['class_method_definition'], + interfaceTypes: [], + structTypes: [], + enumTypes: ['enum_statement'], + enumMemberTypes: ['enum_member'], + typeAliasTypes: [], + importTypes: [], + callTypes: [], + variableTypes: ['assignment_expression'], + propertyTypes: ['class_property_definition'], + nameField: 'name', + bodyField: 'script_block_body', + paramsField: 'parameter_list', + resolveName: (node, source) => { + if (node.type === 'function_statement') { + return childText(node, source, 'function_name'); + } + if (node.type === 'class_statement' || node.type === 'enum_statement') { + return childText(node, source, 'simple_name'); + } + if (node.type === 'class_method_definition') { + return childText(node, source, 'simple_name'); + } + if (node.type === 'class_property_definition') { + const variable = firstChildOfType(node, 'variable'); + return variable ? normalizeVariableName(getNodeText(variable, source)) : undefined; + } + if (node.type === 'enum_member') { + return childText(node, source, 'simple_name'); + } + return undefined; + }, + extractPropertyName: (node, source) => { + const variable = firstChildOfType(node, 'variable'); + return variable ? normalizeVariableName(getNodeText(variable, source)) : null; + }, + resolveBody: (node) => { + if (node.type === 'enum_statement') return node; + const scriptBlock = node.type === 'script_block' + ? node + : firstChildOfType(node, 'script_block'); + if (!scriptBlock) return null; + return getChildByField(scriptBlock, 'script_block_body') ?? scriptBlock; + }, + getSignature: (node, source) => { + if (node.type === 'function_statement') { + const inlineParams = firstChildOfType(node, 'function_parameter_declaration'); + const scriptBlock = firstChildOfType(node, 'script_block'); + const paramBlock = scriptBlock ? firstChildOfType(scriptBlock, 'param_block') : null; + const params = inlineParams ?? paramBlock; + return params ? getNodeText(params, source).trim() : undefined; + } + + if (node.type === 'class_method_definition') { + const returnType = firstChildOfType(node, 'type_literal'); + const name = childText(node, source, 'simple_name'); + const params = firstChildOfType(node, 'class_method_parameter_list'); + const returnText = returnType ? `${getNodeText(returnType, source).trim()} ` : ''; + const paramText = params ? getNodeText(params, source).trim() : ''; + return name ? `${returnText}${name}(${paramText})` : undefined; + } + + return undefined; + }, + getVisibility: (node) => { + return hasClassAttribute(node, 'hidden') ? 'private' : 'public'; + }, + isStatic: (node) => hasClassAttribute(node, 'static'), + visitNode: (node, ctx) => { + if (node.type === 'command') { + visitPowerShellCommand(node, ctx); + return true; + } + + if (node.type === 'invokation_expression') { + const callee = extractInvocationMethodName(node, ctx.source); + if (callee) { + addCallReference(ctx, node, callee); + } + return false; + } + + return false; + }, +}; + +function visitPowerShellCommand(node: SyntaxNode, ctx: ExtractorContext): void { + const importPath = extractImportPath(node, ctx.source); + if (importPath) { + ctx.createNode('import', importPath, node, { + signature: getNodeText(node, ctx.source).trim(), + }); + const parentId = ctx.nodeStack[ctx.nodeStack.length - 1]; + if (parentId) { + ctx.addUnresolvedReference({ + fromNodeId: parentId, + referenceName: importPath, + referenceKind: 'imports', + filePath: ctx.filePath, + line: node.startPosition.row + 1, + column: node.startPosition.column, + }); + } + } else { + const commandName = extractCommandName(node, ctx.source); + if (commandName) addCallReference(ctx, node, commandName); + } + + // Command arguments can contain script blocks (`Where-Object { Test-Thing }`) + // or nested expressions. The hook consumes the command node, so explicitly walk + // children that may hold more symbols/calls while skipping the command name + // token itself to avoid treating it as a nested reference. + for (let i = 0; i < node.namedChildCount; i++) { + const child = node.namedChild(i); + if (!child) continue; + if (child.type === 'command_name' || child.type === 'command_name_expr' || child.type === 'path_command_name') { + continue; + } + ctx.visitFunctionBody(child, ''); + } +} + +function addCallReference(ctx: ExtractorContext, node: SyntaxNode, calleeName: string): void { + const callerId = ctx.nodeStack[ctx.nodeStack.length - 1]; + if (!callerId) return; + ctx.addUnresolvedReference({ + fromNodeId: callerId, + referenceName: calleeName, + referenceKind: 'calls', + filePath: ctx.filePath, + line: node.startPosition.row + 1, + column: node.startPosition.column, + }); +} + +function extractCommandName(node: SyntaxNode, source: string): string | null { + const commandName = getChildByField(node, 'command_name') + ?? firstChildOfTypes(node, ['command_name', 'command_name_expr', 'path_command_name']); + if (!commandName) return null; + + // Dynamic invocation (`& $cmd`, `${module}\Name`) is intentionally left + // unresolved rather than guessed. + if (hasDescendantType(commandName, 'variable') || hasDescendantType(commandName, 'sub_expression')) { + return null; + } + + let raw = getNodeText(commandName, source).trim(); + raw = stripQuotes(raw); + if (!raw || raw.startsWith('$')) return null; + if (COMMAND_PATH_RE.test(raw)) return null; + + // Module-qualified command names (`Module\Get-Thing`) still call the command + // named by the final segment. The module dependency itself is represented by + // Import-Module / using module / dot-sourcing edges when statically present. + const slash = raw.lastIndexOf('\\'); + if (slash >= 0) raw = raw.slice(slash + 1); + return raw || null; +} + +function extractImportPath(node: SyntaxNode, source: string): string | null { + const text = getNodeText(node, source).trim(); + const words = splitPowerShellWords(text); + if (words.length === 0) return null; + + if (/^using$/i.test(words[0] ?? '') && /^module$/i.test(words[1] ?? '')) { + return normalizeImportPath(words[2]); + } + + if (/^Import-Module$/i.test(words[0] ?? '')) { + const nameFlag = words.findIndex((w) => /^-Name$/i.test(w)); + if (nameFlag >= 0) return normalizeImportPath(words[nameFlag + 1]); + const positional = words.slice(1).find((w) => !w.startsWith('-')); + return normalizeImportPath(positional); + } + + // Dot-sourcing: `. ./Private/Get-Widget.ps1` loads the target script into the + // current scope, so model it as an import edge to that file. + if (words[0] === '.') { + return normalizeImportPath(words[1]); + } + + return null; +} + +function normalizeImportPath(raw: string | undefined): string | null { + if (!raw) return null; + let value = stripQuotes(raw.trim().replace(/[;,]$/, '')); + if (!value || value.includes('*')) return null; + value = value.replace(/\\/g, '/'); + value = value.replace(/^\$PSScriptRoot(?=\/|$)/i, '.'); + value = value.replace(/^\$\{PSScriptRoot\}(?=\/|$)/i, '.'); + if (!PATH_LIKE_RE.test(value)) return null; + return value; +} + +function splitPowerShellWords(text: string): string[] { + const words: string[] = []; + const re = /"([^"]*)"|'([^']*)'|([^\s]+)/g; + let match: RegExpExecArray | null; + while ((match = re.exec(text)) !== null) { + words.push(match[1] ?? match[2] ?? match[3] ?? ''); + } + return words; +} + +function extractInvocationMethodName(node: SyntaxNode, source: string): string | null { + const member = findLastDescendantOfType(node, 'member_name'); + if (!member) return null; + const name = getNodeText(member, source).trim(); + if (!name || name.startsWith('$')) return null; + return name; +} + +function childText(node: SyntaxNode, source: string, type: string): string | undefined { + const child = firstChildOfType(node, type); + return child ? getNodeText(child, source) : undefined; +} + +function normalizeVariableName(text: string): string { + return text.trim().replace(/^\$\{?/, '').replace(/\}$/, ''); +} + +function stripQuotes(text: string): string { + if ((text.startsWith('"') && text.endsWith('"')) || (text.startsWith("'") && text.endsWith("'"))) { + return text.slice(1, -1); + } + return text; +} + +function hasClassAttribute(node: SyntaxNode, name: string): boolean { + for (let i = 0; i < node.namedChildCount; i++) { + const child = node.namedChild(i); + if (child?.type === 'class_attribute' && child.text.toLowerCase() === name) return true; + } + return false; +} + +function firstChildOfType(node: SyntaxNode, type: string): SyntaxNode | null { + for (let i = 0; i < node.namedChildCount; i++) { + const child = node.namedChild(i); + if (child?.type === type) return child; + } + return null; +} + +function firstChildOfTypes(node: SyntaxNode, types: string[]): SyntaxNode | null { + const set = new Set(types); + for (let i = 0; i < node.namedChildCount; i++) { + const child = node.namedChild(i); + if (child && set.has(child.type)) return child; + } + return null; +} + +function findLastDescendantOfType(node: SyntaxNode, type: string): SyntaxNode | null { + let found: SyntaxNode | null = null; + const visit = (n: SyntaxNode): void => { + if (n.type === type) found = n; + for (let i = 0; i < n.namedChildCount; i++) { + const child = n.namedChild(i); + if (child) visit(child); + } + }; + visit(node); + return found; +} + +function hasDescendantType(node: SyntaxNode, type: string): boolean { + if (node.type === type) return true; + for (let i = 0; i < node.namedChildCount; i++) { + const child = node.namedChild(i); + if (child && hasDescendantType(child, type)) return true; + } + return false; +} diff --git a/src/extraction/tree-sitter.ts b/src/extraction/tree-sitter.ts index 19648e10d..a11d9d004 100644 --- a/src/extraction/tree-sitter.ts +++ b/src/extraction/tree-sitter.ts @@ -1662,7 +1662,7 @@ export class TreeSitterExtractor { let found = false; for (let i = 0; i < node.namedChildCount; i++) { const child = node.namedChild(i); - if (child && (child.type === 'simple_identifier' || child.type === 'identifier' || child.type === 'property_identifier')) { + if (child && (child.type === 'simple_identifier' || child.type === 'simple_name' || child.type === 'identifier' || child.type === 'property_identifier')) { this.createNode('enum_member', getNodeText(child, this.source), child); found = true; } @@ -2142,6 +2142,31 @@ export class TreeSitterExtractor { const initSignature = initValue ? `= ${initValue}${initValue.length >= 100 ? '...' : ''}` : undefined; this.createNode(kind, name, nameNode, { docstring, signature: initSignature, isExported }); }); + } else if (this.language === 'powershell') { + // PowerShell assignment: left_assignment_expression wraps a variable node + // (`$Name = ...`). Track only top-level assignments (the dispatcher skips + // function/method locals) so module-scope state appears in search/impact. + const left = node.namedChildren.find((c) => c.type === 'left_assignment_expression'); + let variable: SyntaxNode | null = null; + const stack: SyntaxNode[] = left ? [left] : []; + while (stack.length > 0 && !variable) { + const current = stack.pop()!; + if (current.type === 'variable') { + variable = current; + break; + } + for (let i = 0; i < current.namedChildCount; i++) { + const child = current.namedChild(i); + if (child) stack.push(child); + } + } + if (variable) { + const name = getNodeText(variable, this.source).replace(/^\$\{?/, '').replace(/\}$/, ''); + const valueNode = getChildByField(node, 'value'); + const initValue = valueNode ? getNodeText(valueNode, this.source).slice(0, 100) : undefined; + const initSignature = initValue ? `= ${initValue}${initValue.length >= 100 ? '...' : ''}` : undefined; + this.createNode('variable', name, variable, { docstring, signature: initSignature, isExported }); + } } else if (this.language === 'c') { // C: a `declaration` node's name nests inside the `declarator` field — // `init_declarator` (with value) or bare/pointer/array declarators (no @@ -3717,6 +3742,15 @@ export class TreeSitterExtractor { const visitForCallsAndStructure = (node: SyntaxNode): void => { const nodeType = node.type; + // PowerShell commands are both the call syntax and the import syntax + // (`Import-Module`, dot-sourcing). Its extractor hook handles those nodes + // and walks any script-block arguments; the generic body walker normally + // bypasses language hooks, so opt PowerShell in here explicitly. + if (this.language === 'powershell' && this.extractor!.visitNode) { + const handled = this.extractor!.visitNode(node, this.makeExtractorContext()); + if (handled) return; + } + // Function-as-value capture (#756) — function bodies are walked here, // not in visitNode, so the capture hook must fire in both walkers. this.maybeCaptureFnRefs(node, nodeType); @@ -3832,6 +3866,24 @@ export class TreeSitterExtractor { * Extract inheritance relationships */ private extractInheritance(node: SyntaxNode, classId: string): void { + // PowerShell classes declare base types inline: `class Child : Parent, IFace`. + // The grammar exposes every name as a `simple_name`, with the first being the + // class itself. Treat remaining names as supertypes so changes to a base class + // surface dependents. + if (this.language === 'powershell' && node.type === 'class_statement') { + const supers = node.namedChildren.filter((c) => c.type === 'simple_name').slice(1); + for (const target of supers) { + this.unresolvedReferences.push({ + fromNodeId: classId, + referenceName: getNodeText(target, this.source), + referenceKind: 'extends', + line: target.startPosition.row + 1, + column: target.startPosition.column, + }); + } + return; + } + // Objective-C @interface MyClass : NSObject if (node.type === 'class_interface') { const superclass = getChildByField(node, 'superclass'); diff --git a/src/extraction/wasm/tree-sitter-powershell.wasm b/src/extraction/wasm/tree-sitter-powershell.wasm new file mode 100644 index 0000000000000000000000000000000000000000..2e3e443ac83d462f44d01f774883735acdc80cd9 GIT binary patch literal 1088467 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 literal 0 HcmV?d00001 diff --git a/src/resolution/import-resolver.ts b/src/resolution/import-resolver.ts index badbe4b02..af0c8cb3d 100644 --- a/src/resolution/import-resolver.ts +++ b/src/resolution/import-resolver.ts @@ -35,6 +35,7 @@ const EXTENSION_RESOLUTION: Record = { php: ['.php'], ruby: ['.rb'], objc: ['.h', '.m', '.mm'], + powershell: ['.ps1', '.psm1', '.psd1'], }; /** @@ -62,6 +63,14 @@ export function resolveImportPath( return resolveRelativeImport(importPath, fromDir, language, context); } + // PowerShell module/script paths are often written as `Private/Foo.ps1` or + // `Helpers.psm1` without a leading `./`. Treat path-shaped values as relative + // to the importing script; bare module names (e.g. `Pester`) still fall through + // and remain external/unresolved. + if (language === 'powershell' && (importPath.includes('/') || /\.ps(?:m|d)?1$/i.test(importPath))) { + return resolveRelativeImport(`./${importPath}`, fromDir, language, context); + } + // Handle absolute/aliased imports (like @/ or src/) const aliased = resolveAliasedImport(importPath, projectRoot, language, context); if (aliased) return aliased; @@ -1195,6 +1204,26 @@ export function resolveViaImport( return null; } + // PowerShell module/script loading (`using module`, `Import-Module`, and + // dot-sourcing) resolves directly to the referenced script/module file. + if (ref.language === 'powershell' && ref.referenceKind === 'imports') { + const resolvedPath = resolveImportPath(ref.referenceName, ref.filePath, ref.language, context); + if (!resolvedPath) return null; + const basename = resolvedPath.split('/').pop()!; + const fileNode = context + .getNodesByName(basename) + .find((n) => n.kind === 'file' && n.filePath === resolvedPath); + if (fileNode) { + return { + original: ref, + targetNodeId: fileNode.id, + confidence: 0.9, + resolvedBy: 'import', + }; + } + return null; + } + // Use cached import mappings (avoids re-reading and re-parsing per ref) const imports = context.getImportMappings(ref.filePath, ref.language); if (imports.length === 0 && !context.readFile(ref.filePath)) { diff --git a/src/resolution/index.ts b/src/resolution/index.ts index 0d7ec4309..11515b630 100644 --- a/src/resolution/index.ts +++ b/src/resolution/index.ts @@ -585,35 +585,40 @@ export class ReferenceResolver { * Uses the pre-built knownNames set to skip expensive resolution * for names that definitely don't exist as symbols. */ - private hasAnyPossibleMatch(name: string): boolean { + private hasAnyPossibleMatch(name: string, language?: string): boolean { if (!this.knownNames) return true; // no pre-filter available + const check = (candidate: string): boolean => { + if (this.knownNames!.has(candidate)) return true; + return language === 'powershell' && + this.context.getNodesByLowerName(candidate.toLowerCase()).some((n) => n.language === 'powershell'); + }; // Direct name match - if (this.knownNames.has(name)) return true; + if (check(name)) return true; // For qualified names like "obj.method" or "Class::method", check the parts const dotIdx = name.indexOf('.'); if (dotIdx > 0) { const receiver = name.substring(0, dotIdx); const member = name.substring(dotIdx + 1); - if (this.knownNames.has(receiver) || this.knownNames.has(member)) return true; + if (check(receiver) || check(member)) return true; // Also check capitalized receiver (instance-method resolution) const capitalized = receiver.charAt(0).toUpperCase() + receiver.slice(1); - if (this.knownNames.has(capitalized)) return true; + if (check(capitalized)) return true; // JVM FQN: `com.example.foo.Bar` — the only useful segment is the // last one (`Bar`); the earlier check finds `example.foo.Bar` which // never matches a node name. const lastDot = name.lastIndexOf('.'); if (lastDot > dotIdx) { const tail = name.substring(lastDot + 1); - if (tail && this.knownNames.has(tail)) return true; + if (tail && check(tail)) return true; } } const colonIdx = name.indexOf('::'); if (colonIdx > 0) { const receiver = name.substring(0, colonIdx); const member = name.substring(colonIdx + 2); - if (this.knownNames.has(receiver) || this.knownNames.has(member)) return true; + if (check(receiver) || check(member)) return true; // Multi-segment path `a::b::c` (a Rust/C++ module call like // `database::profiles::find`) — the only segment that names a symbol is // the last (`c`); `member` above is `b::c`, which never matches a node @@ -622,7 +627,7 @@ export class ReferenceResolver { const lastColon = name.lastIndexOf('::'); if (lastColon > colonIdx) { const tail = name.substring(lastColon + 2); - if (tail && this.knownNames.has(tail)) return true; + if (tail && check(tail)) return true; } } @@ -630,7 +635,7 @@ export class ReferenceResolver { const slashIdx = name.lastIndexOf('/'); if (slashIdx > 0) { const fileName = name.substring(slashIdx + 1); - if (this.knownNames.has(fileName)) return true; + if (check(fileName)) return true; } return false; @@ -671,7 +676,7 @@ export class ReferenceResolver { // from './auth'`) intentionally call a name that has no // declaration anywhere — only the renamed upstream symbol does. if ( - !this.hasAnyPossibleMatch(ref.referenceName) && + !this.hasAnyPossibleMatch(ref.referenceName, ref.language) && !this.matchesAnyImport(ref) && !this.frameworks.some((f) => f.claimsReference?.(ref.referenceName)) ) { diff --git a/src/resolution/name-matcher.ts b/src/resolution/name-matcher.ts index 9990d690d..6bc260d35 100644 --- a/src/resolution/name-matcher.ts +++ b/src/resolution/name-matcher.ts @@ -317,7 +317,18 @@ export function matchByExactName( ref: UnresolvedRef, context: ResolutionContext ): ResolvedRef | null { - const candidates = applyLanguageGate(context.getNodesByName(ref.referenceName), ref); + let candidates = applyLanguageGate(context.getNodesByName(ref.referenceName), ref); + + // PowerShell command and symbol names are case-insensitive. Keep the exact + // lookup first so normal languages stay unchanged, then fall back to the + // lower-name index for PowerShell only. + if (candidates.length === 0 && ref.language === 'powershell') { + candidates = applyLanguageGate( + context.getNodesByLowerName(ref.referenceName.toLowerCase()) + .filter((n) => n.language === 'powershell'), + ref + ); + } if (candidates.length === 0) { return null; diff --git a/src/types.ts b/src/types.ts index 656bb1090..21ed55831 100644 --- a/src/types.ts +++ b/src/types.ts @@ -95,6 +95,7 @@ export const LANGUAGES = [ 'twig', 'xml', 'properties', + 'powershell', 'unknown', ] as const;