使用 Roslyn 突出显示 C# 语法的最佳方法是什么?

What's the best way to highlight C# syntax using Roslyn?

我正在尝试制作一个 Xamarin.Android 应用程序来突出显示许多不同语言的语法。我计划使用 ANTLR 来处理其中的大部分,但对于 C#,我想使用 Roslyn,因为它无疑比 ANTLR 更快且错误更少。

使用 Roslyn 实现语法高亮显示的最佳方法是什么?为了突出显示 Java 语法,我采用的方法是将文本解析为解析树,并使用访问者为与每个终端关联的文本着色。您可以查看我的代码 here. Is this also a good idea for Roslyn, or does Roslyn provide APIs for syntax highlighting? (e.g. Does the code behind syntax highlighting in Visual Studio live in the dotnet/roslyn 存储库?)我真的不想重新发明轮子,但如果必须的话,我会的。

编辑: 我接受了 Tamas 的回答,因为他的解决方案对我的用例来说是最实用的;我无权访问用于构建语义模型的完整解决方案,因此我将不得不进行一些自己的分析。但是,如果您的应用程序支持更广泛的 C# 集成并且可以构建语义模型,请查看 Jonathon Marolf 的回答中使用的 Roslyn 分类 API。

你看过SourceBrowser了吗?如果您可以构建完整的解决方案,那么我会使用相同的方法。

如果你的上下文不允许完整构建,那么你可以根据语法标记类型实现一些相对较好的东西。但是,您可能必须处理一些极端情况,例如上下文关键字 var、隐式声明的局部变量(例如 value)等。看看 SonarQube 正在使用什么。

同样,您可以寻找您知道的基于 Roslyn 的其他工具,例如 OmniSharp。我不确定是否使用正则表达式或 Roslyn 来突出显示。但无论如何,您也可以使用 Regex 走得更远。

roslyn 示例中的 ConsoleClassifier 项目应该是一个很好的起点。