在VS Code扩展中如何识别文件中所有函数(包括赋值给变量的匿名函数)
我完全懂你遇到的痛点——调用vscode.executeDocumentSymbolProvider时,那些赋值给变量的匿名函数总会被标记成普通变量,没法直接区分它的函数本质。你当前靠子符号判断的思路确实存在漏洞,比如空函数根本没有子符号,而有些对象变量的子符号可能是方法,很容易误判。这里给你几个更靠谱的解决方案:
解析符号的
detail属性
TypeScript语言服务器返回的DocumentSymbol对象里,detail字段会携带变量的类型描述。比如你例子里的functionVariable,它的detail会是类似(req: Request, res: Response) => Promise<void>的函数类型签名。你可以通过简单的正则匹配(比如检查是否包含=>或者(开头的参数列表)来判断这个变量本质是函数。这个方法不需要额外发起请求,效率很高。使用
vscode.executeHoverProvider获取精准类型
如果需要更严谨的类型判断,可以针对目标符号的位置发起hover请求。hover返回的内容里会包含完整的类型信息,能明确标注这是一个函数类型。不过这个方法需要额外发起请求,频繁调用可能影响性能,适合对单个符号做精准验证的场景。借助TypeScript Compiler API遍历AST
如果你的扩展专门针对TypeScript文件,这是最可靠的方案。通过TS的Compiler API解析文件的抽象语法树(AST),可以直接识别出VariableDeclaration节点下的ArrowFunction或FunctionExpression,精准定位所有赋值给变量的函数。虽然需要引入TypeScript依赖、代码量稍大,但能完全避开语言服务器符号返回的局限性。
总结一下,优先推荐第一种方法,简单高效;如果对准确性要求极高,可以考虑第二种或第三种方案。
备注:内容来源于stack exchange,提问作者bdiloreto

