Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn-从旧语法树获取语法节点更改_C#_Roslyn - Fatal编程技术网

C# Roslyn-从旧语法树获取语法节点更改

C# Roslyn-从旧语法树获取语法节点更改,c#,roslyn,C#,Roslyn,我试图使用Roslyn突出显示C代码,当用户键入时,编辑器将检查并突出显示相应的文本 在Roslyn中,有一种方法可以从旧的语法树中获取新的语法树(使用SyntaxTree.WithChanges),因此我可以在用户键入时获取新的语法树。但是每次得到新的树时,我都必须走到整个树(使用SyntaxWalker)以突出显示整个代码,这是非常糟糕的性能。 那么,有什么方法可以从旧树中检测语法节点的更改(与文本更改不同,使用SyntaxTree.GetTextChanges()) 例如: 旧文本:cla

我试图使用Roslyn突出显示C代码,当用户键入时,编辑器将检查并突出显示相应的文本

在Roslyn中,有一种方法可以从旧的语法树中获取新的语法树(使用
SyntaxTree.WithChanges
),因此我可以在用户键入时获取新的语法树。但是每次得到新的树时,我都必须走到整个树(使用
SyntaxWalker
)以突出显示整个代码,这是非常糟糕的性能。 那么,有什么方法可以从旧树中检测语法节点的更改(与文本更改不同,使用
SyntaxTree.GetTextChanges()

例如:

旧文本:
class A{}

新文本:
class/*A{}

您将看到文本差异仅为/*,但语法节点结构更改也将包括/*之后的文本,因为/*之后的所有内容都被视为注释


我怎样才能检测到这种变化,这样我就只需要更新特定变化的突出显示

你应该阅读Roslyn自己的语法突出显示代码的源代码。我已经尝试仔细扫描整个Roslyn项目(主分支)的源代码,许多功能(代码完整,突出显示参考…)但我找不到实现该突出显示功能的代码,一个线索是类“AbstractDocumentDifferenceService”,但没有使用它的地方,而且看起来它并不是该功能的有效方式。(我遗漏了什么?)基本上,您需要收集所有与已更改的标记相交的标记,但是如果在我上面的示例中,与标记相交可能只是标记
A
,但实际上,重新生成的文本“{}”也需要再次高亮显示,因为它会变成注释?(感谢您提供的信息,我将研究这些课程)