C# Roslyn-从旧语法树获取语法节点更改
我试图使用Roslyn突出显示C代码,当用户键入时,编辑器将检查并突出显示相应的文本 在Roslyn中,有一种方法可以从旧的语法树中获取新的语法树(使用C# Roslyn-从旧语法树获取语法节点更改,c#,roslyn,C#,Roslyn,我试图使用Roslyn突出显示C代码,当用户键入时,编辑器将检查并突出显示相应的文本 在Roslyn中,有一种方法可以从旧的语法树中获取新的语法树(使用SyntaxTree.WithChanges),因此我可以在用户键入时获取新的语法树。但是每次得到新的树时,我都必须走到整个树(使用SyntaxWalker)以突出显示整个代码,这是非常糟糕的性能。 那么,有什么方法可以从旧树中检测语法节点的更改(与文本更改不同,使用SyntaxTree.GetTextChanges()) 例如: 旧文本:cla
SyntaxTree.WithChanges
),因此我可以在用户键入时获取新的语法树。但是每次得到新的树时,我都必须走到整个树(使用SyntaxWalker
)以突出显示整个代码,这是非常糟糕的性能。
那么,有什么方法可以从旧树中检测语法节点的更改(与文本更改不同,使用SyntaxTree.GetTextChanges()
)
例如:
旧文本:class A{}
新文本:class/*A{}
您将看到文本差异仅为/*,但语法节点结构更改也将包括/*之后的文本,因为/*之后的所有内容都被视为注释
我怎样才能检测到这种变化,这样我就只需要更新特定变化的突出显示你应该阅读Roslyn自己的语法突出显示代码的源代码。我已经尝试仔细扫描整个Roslyn项目(主分支)的源代码,许多功能(代码完整,突出显示参考…)但我找不到实现该突出显示功能的代码,一个线索是类“AbstractDocumentDifferenceService”,但没有使用它的地方,而且看起来它并不是该功能的有效方式。(我遗漏了什么?)基本上,您需要收集所有与已更改的标记相交的标记,但是如果在我上面的示例中,与标记相交可能只是标记
A
,但实际上,重新生成的文本“{}”也需要再次高亮显示,因为它会变成注释?(感谢您提供的信息,我将研究这些课程)