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

时间:2017-06-15 05:08:48

标签: c# .net parsing roslyn

我正在尝试制作一个突出许多不同语言语法的Xamarin.Android应用。我计划使用ANTLR来处理它们中的大多数,但是对于C#我想使用Roslyn,因为毫无疑问它会比ANTLR更快,更少错误。

使用Roslyn实现语法突出显示的最佳方法是什么?为了突出显示Java语法,我采用的方法是将文本解析为解析树,并使用访问者为与每个终端关联的文本着色。您可以查看我的代码here。这对Roslyn来说也是一个好主意,或者Roslyn是否提供语法高亮的API? (例如,Visual Studio中语法高亮显示的代码是否存在于dotnet/roslyn回购中?)我真的不想重新发明轮子,但如果必须的话,我会这样做。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

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