我正在尝试编写一个 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/