编译器API:从typescript.d.ts中暴露更多内容,

cld4siwp  于 4个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(56)

TypeScript 版本: 2.9.0-dev.20180426

在遍历源文件的 TypeScript 抽象语法树(AST)时,通过扩展 ts.*typescript.d.ts 发现了许多有用的东西,我希望这些可以被暴露出来(或者不标记为 /* @internal */ )。

搜索词:

typescript.d.ts
Node.locals
Symbol.parent
getContainingFunction
isAssignmentTarget

代码

declare namespace ts {
    interface Node {
        /* @internal */ readonly locals?: SymbolTable; // Locals associated with node (initialized by binding)
    }

    interface Symbol {
        /* @internal */ readonly parent?: Symbol; // Parent symbol
    }

    function getContainingFunction(node: Node): SignatureDeclaration | undefined;

    function isAssignmentTarget(node: Node): boolean;
}

注意:

  • Node#localsSymbol#parent 添加了 readonly
  • 对于 Symbol#parent,目标是:给定一个方法的符号(例如,对于 methodSymbol 的方法),找到该方法的定义位置(例如,对于 Number#toString 的方法)...也许应该使用 Number 而不是 program.getTypeChecker().getSymbolAtLocation(methodSymbol.valueDeclaration.parent)?
  • 对于 ts.getContainingFunction(),似乎更合适的返回类型应该是 SignatureDeclaration | undefined 而不是 SignatureDeclaration
    相关问题:

#15841

xqnpmsa8

xqnpmsa81#

有一个包提供了声明,甚至包括内部内容:https://www.npmjs.com/package/byots
关于 isAssignmentTarget :你可能想要使用我库中的 isReassignmentTarget

0pizxfdo

0pizxfdo2#

我不认为我们想暴露symbol.parentlocals。这些是我们可以更改的内部实现细节,无需提前通知。
getContainingFunctionisAssignmentTarget没问题。我们会提交一个PR来公开它们。

eni9jsuy

eni9jsuy3#

@mhegazy 所以,symbol.parent 是我沿着右侧行动计划的第二个注意事项(获取符号的值声明、获取其父级、获取其符号)?我很快就需要深入了解为什么我需要 node.locals

3zwtqj6y

3zwtqj6y5#

有没有可靠的方法可以在不使用node.locals的情况下找到模块范围内可用的所有符号?这是我迫切希望做到的事情。

gdrx4gfi

gdrx4gfi6#

请查看TypeChecker#getSymbolsInScope(您可以从program获取其示例)。

gpnt7bae

gpnt7bae7#

我同意symbol.parent的观点!在符号树上操作非常困难,没有它就更难了。

相关问题