在 Atom 包中获取整个 tree-sitter 解析树

Getting the entire tree-sitter parse tree inside an Atom package

我正在尝试编写一个 Atom 程序包,它需要访问 tree-sitter 为 Atom 内部生成的解析树。我对 tree-sitter 不熟悉,对 Atom 包也不太熟悉。

在阅读一些关于 Atom 包的一般教程时,我遇到了一个看起来很有前途的页面,它讨论了获取 given position in buffer coordinates" and on the same page a way to get the current grammar 的“作用域描述符,但没有获取整个解析树的内容。这是否可能使用api 由 Atom 的环境提供?如果不是,我将如何去做?也许从包内部重新解析树(尽管这听起来既不值得又效率低下)?

对于将来可能需要这样做的任何其他人,Atom 公开了 atom.workspace,它可用于从活动环境中获取各种内容,例如文本编辑器、语法等。在跟踪 Atom 的源代码时,我发现在工作区 (atom.workspace.grammarRegistry) 中可访问的 GrammarRegistry 对象有一个名为 languageModeForGrammarAndBuffer 的方法,其中 returns 一个 TreeSitterLanguageMode 对象反过来树有一个 getter (.tree)。这个方法又需要一个语法和一个文本缓冲区,它们也可以从工作区中获得(缓冲区可以从 TextEditorRegistry 中获得)。综上所述,要从 Atom 包中获取树的根节点,您可以使用如下内容:

const grammarRegistry = atom.workspace.grammarRegistry;
const grammar = grammarRegistry.treeSitterGrammarsById["source.js"]; // where source.js is the name of the tree-sitter grammar you want
const buffer = atom.workspace.textEditorRegistry.editors.values().next().value.buffer; //assuming you want the first buffer
const root = grammarRegistry.languageModeForGrammarAndBuffer(grammar, buffer).tree.rootNode;

在当前版本中,您只需执行 editor.getBuffer().getLanguageMode().tree。请注意,这可能是 TextMateLanguageMode 或 TreeSitterLanguageMode,具体取决于 Tree Sitter 对语言的支持以及核心 useTreeSitterParsers 设置的值。此外 none 似乎已记录在案 API(即稳定)。