在 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(即稳定)。
我正在尝试编写一个 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(即稳定)。