Fix panic by restricting @overload to legal contexts in JSDoc
Panic when type-checking JavaScript files with JSDoc @overload annotations, caused by invalid AST structures created by the reparser.
Root Cause
The reparser was creating synthetic MethodDeclaration nodes for ALL @overload JSDoc tags, including those on object literal methods. This created invalid AST structures where a MethodDeclaration was a direct child of SourceFile (e.g., for methods in object literals), resulting in the panic:
KindStringKeyword -> KindParameter -> KindMethodDeclaration -> KindSourceFile
Changes
- Modified
reparseUnhosted()to only create synthetic overload declarations for legal contexts:- Function declarations (
KindFunctionDeclaration) - Class methods (
KindMethodDeclarationwhen not inPCObjectLiteralMembersparsing context) - Interface methods (
KindMethodSignature)
- Function declarations (
- Reports parsing error TS8110 for
@overloadtags on object literal methods - Added nil check in
getConditionalFlowTypeOfTypeto prevent panic when nodes have nil parents - Added new diagnostic message TS8110: "A JSDoc '@overload' tag is not allowed in this context."
- Added regression test case with JSDoc overloads that previously panicked
Example
The following JavaScript now reports a parsing error instead of panicking:
const foo = {
/**
* @overload
* @param {string} termCode
* @param {string[]} crnList
* @returns {Record<string, string>}
*/
/**
* @param {string} termCode
* @param {string | string[]} crnList
* @returns {string | Record<string, string>}
*/
getStatus(termCode, crnList) {},
};
Error: error TS8110: A JSDoc '@overload' tag is not allowed in this context.
Function declarations and class methods with @overload continue to work correctly with proper overload declarations generated in .d.ts files.
Impact
This fix properly addresses the panic while maintaining full support for legal @overload use cases in function and class/interface method declarations. Object literal methods with @overload tags now receive appropriate parsing errors.
Original prompt
This section details on the original issue you should resolve
<issue_title>Panic on initial attempt of existing JavaScript + JSDoc project</issue_title> <issue_description>## Stack trace
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x102a8783c]
goroutine 1 [running]:
github.com/microsoft/typescript-go/internal/ast.IsParameter(...)
github.com/microsoft/typescript-go/internal/ast/ast.go:3976
github.com/microsoft/typescript-go/internal/checker.(*Checker).getConditionalFlowTypeOfType(0x14003eb4c08, 0x140043b8410, 0x14006a85658?)
github.com/microsoft/typescript-go/internal/checker/checker.go:24330 +0xac
github.com/microsoft/typescript-go/internal/checker.(*Checker).getTypeFromTypeNode(0x14003eb4c08, 0x14002531fc8)
github.com/microsoft/typescript-go/internal/checker/checker.go:22257 +0x34
github.com/microsoft/typescript-go/internal/checker.(*Checker).tryGetTypeFromTypeNode(0x14003eb4c08, 0x102a634bc?)
github.com/microsoft/typescript-go/internal/checker/checker.go:22251 +0x34
github.com/microsoft/typescript-go/internal/checker.(*Checker).getTypeForVariableLikeDeclaration(0x14003eb4c08, 0x14002563468, 0x0?, 0x0)
github.com/microsoft/typescript-go/internal/checker/checker.go:16187 +0x17c
github.com/microsoft/typescript-go/internal/checker.(*Checker).getWidenedTypeForVariableLikeDeclaration(0x14003eb4c08, 0x14002563468, 0x1)
github.com/microsoft/typescript-go/internal/checker/checker.go:16158 +0x30
github.com/microsoft/typescript-go/internal/checker.(*Checker).getTypeOfVariableOrParameterOrPropertyWorker(0x14003eb4c08, 0x14003d68a18)
github.com/microsoft/typescript-go/internal/checker/checker.go:16118 +0x24c
github.com/microsoft/typescript-go/internal/checker.(*Checker).getTypeOfVariableOrParameterOrProperty(0x14003eb4c08, 0x14003d68a18)
github.com/microsoft/typescript-go/internal/checker/checker.go:16055 +0x50
github.com/microsoft/typescript-go/internal/checker.(*Checker).getTypeOfSymbol(0x14003eb4c08?, 0x14002563468?)
github.com/microsoft/typescript-go/internal/checker/checker.go:16015 +0xa8
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkVariableLikeDeclaration(0x14003eb4c08, 0x14002563468)
github.com/microsoft/typescript-go/internal/checker/checker.go:5703 +0x258
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkParameter(0x14003eb4c08, 0x14002563468)
github.com/microsoft/typescript-go/internal/checker/checker.go:2559 +0x30
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElementWorker(0x14003eb4c08, 0x14002563468)
github.com/microsoft/typescript-go/internal/checker/checker.go:2179 +0xa0
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElement(0x14003eb4c08, 0x102a1f250?)
github.com/microsoft/typescript-go/internal/checker/checker.go:2150 +0x58
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElements(0x14003eb4c08, {0x1400211ce40, 0x3, 0x0?})
github.com/microsoft/typescript-go/internal/checker/checker.go:2140 +0x34
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSignatureDeclaration(0x14003eb4c08, 0x140025126e0)
github.com/microsoft/typescript-go/internal/checker/checker.go:2631 +0x100
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkFunctionOrMethodDeclaration(0x14003eb4c08, 0x140025126e0)
github.com/microsoft/typescript-go/internal/checker/checker.go:3297 +0x30
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkMethodDeclaration(0x14003eb4c08, 0x140025126e0)
github.com/microsoft/typescript-go/internal/checker/checker.go:2694 +0x14c
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElementWorker(0x14003eb4c08, 0x140025126e0)
github.com/microsoft/typescript-go/internal/checker/checker.go:2187 +0xb8
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElement(0x14003eb4c08, 0x140046fb5f0?)
github.com/microsoft/typescript-go/internal/checker/checker.go:2150 +0x58
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceElements(0x14003eb4c08, {0x140017bcc58, 0x1c, 0x140019fedc0?})
github.com/microsoft/typescript-go/internal/checker/checker.go:2140 +0x34
github.com/microsoft/typescript-go/internal/checker.(*Checker).checkSourceFile(0x14003eb4c08, {0x1032a1600, 0x10391c860}, 0x14002521508)
github.com/microsoft/typescript-go/internal/checker/checker.go:2112 +0xf4
github.com/microsoft/typescript-go/internal/checker.(*Checker).CheckSourceFile(0x14003eb4c08, {0x1032a1600, 0x10391c860}, 0x14002521508)
github.com/microsoft/typescript-go/internal/checker/checker.go:2101 +0x64
github.com/microsoft/typescript-go/internal/checker.(*Checker).getDiagnostics(0x14003eb4c08, {0x1032a1600, 0x10391c860}, 0x14002521508, 0x14003eb4df0)
github.com/microsoft/typescript-go/internal/checker/checker.go:13516 +0xac
github.com/microsoft/typescript-go/internal/checker.(*Checker).GetDiagno...
</details>
- Fixes microsoft/typescript-go#2218
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more [Copilot coding agent tips](https://gh.io/copilot-coding-agent-tips) in the docs.