【问题标题】:What's the best way to highlight C# syntax using Roslyn?使用 Roslyn 突出显示 C# 语法的最佳方法是什么?
【发布时间】:2018-04-17 03:36:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net parsing roslyn


    【解决方案1】:

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

    【讨论】:

    • Jonathon Marolf,感谢您向我指出这些 API,我事先并不知道它们存在。这对于我的用例来说几乎是完美的。但是,是否有关于 ClassifiedSpan.ClassificationType 可以采用哪些值的文档?
    • 我自己想出来的。对于希望使用这些 API 并立即遇到完全相同问题的任何人,请查看 ClassificationTypeNames 类。
    【解决方案2】:

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

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

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

    【讨论】:

    • Tamas,感谢您冗长而详尽的回答。不过,在我尝试这些方法之前,我会先尝试使用 Jonathon Marolf 的方法,因为看起来 Roslyn 提供了官方 API 来执行此操作。
    • 完美。顺便说一句,ConsoleClassifier 使用与 SourceBrowser 相同的 API(因此它需要访问工作区)。
    • Tamas 是的,我刚刚意识到:github.com/dotnet/roslyn/issues/20261。不幸的是,我的应用程序此时只考虑一个 .cs 文件,它没有通过考虑整个项目/解决方案来提供更广泛的集成。我会接受你的回答,因为我现在正在调查 SonarQube。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多