javascript - 在 Atom 包中获取整个树守护者解析树

标签 javascript parsing atom-editor parse-tree

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

在阅读 Atom 包的一些教程时,我遇到了一个看起来很有希望的页面,其中讨论了获取“缓冲区坐标中 given position 的范围描述符”,并在同一页面上获取了 current grammar 的方法。但对于获取整个解析树没有任何作用。使用 Atom 环境提供的 api 可以吗?如果不是的话我该怎么做呢?也许从包内部重新解析树(尽管这听起来比其值(value)更多的工作而且效率低下)?

最佳答案

对于将来可能需要执行此操作的任何其他人,Atom 公开了 atom.workspace,它可用于从事件环境中获取各种内容,例如文本编辑器、语法等。在跟踪 Atom 的源代码时,我发现工作区中可访问的 GrammarRegistry 对象 (atom.workspace.grammarRegistry) 有一个名为 languageModeForGrammarAndBuffer 的方法它返回一个 TreeSitterLanguageMode 对象,该对象又具有树的 getter (.tree)。该方法又需要一个语法和一个textBuffer,两者都可以从工作区获取(缓冲区可以从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;

关于javascript - 在 Atom 包中获取整个树守护者解析树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664236/

相关文章:

javascript - 如何获取表单值并将其推送到数组? (修复代码)

java - 当记录布局直到运行时才知道时,使用什么方法来解析具有固定长度记录的文件?

c++ - 如何在 C/C++ 源代码中公开 typedef?

php - 如何在 PHP 5.1 中解码 json?

regex - 使用 Atom 中的查找/替换重新排列文本

JavaScript 动画运动

javascript - 如何通过 Vue 模板中的单击事件传递 Vue 组件?

javascript - jsPDF 不适用于 Chrome,仅适用于 Firefox 和 Safari

atom-editor - Atom 编辑器 - 将行尾转换为 UNIX

atom-editor - Windows 上的 Cmd 键