专栏首页walterlv - 吕毅的博客在 Roslyn 分析语法树时添加条件编译符号的支持

在 Roslyn 分析语法树时添加条件编译符号的支持

我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。

然而如果我们没有做任何特殊处理,那么使用 Roslyn 分析使用了条件编译符号的源码时,就会无法识别这些源码。


如果你不知道条件编译符号是什么或者不知道怎么设置,请参见:

我们在使用 Roslyn 分析语法树时,会创建语法树的一个实例。如果使用默认的构造函数,那么就不会识别设置了条件编译符号的语句,如下图:

而实际上构造函数的参数中带有 preprocessorSymbols 参数,即预处理符号。在传入此预处理符号的情况下,Roslyn 就可以识别此符号了:

方法是传入 preprocessorSymbols 参数:

var preprocessorSymbols = new[] {"DEBUG", "TRACE", "WALTERLV", "NETCOREAPP2_1"};
var syntaxTree = CSharpSyntaxTree.ParseText(originalText, new CSharpParseOptions(
    LanguageVersion.Latest, DocumentationMode.None, SourceCodeKind.Regular, preprocessorSymbols)

此后,你可以拿 syntaxTree 做其他事情了:

var compileTypeVisitor = new CompileTypeVisitor();
compileTypeVisitor.Visit(syntaxTree.GetRoot());
Types = compileTypeVisitor.Types.ToList();

当然这段代码你可能编译不通过,因为这是另一篇博客中的源码:

本文所用的查看语法树的插件,你可以查看另一篇博客:

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/roslyn-syntax-tree-supporting-preprocessor-symbols.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例

    我们知道,在编译期间相同的字符串,在运行期间就会是相同的字符串实例。然而,如果编译期间存在字符串的运算,那么在运行期间是否是同一个实例呢?

    walterlv
  • Windows/Linux 系统中获取端口被哪个应用程序占用

    管理服务程序的时候,可能会查询某个端口当前被哪个进程占用。不仅能找出有问题的进程将其处理掉,也可以用来辅助检查某个程序是否开启了服务并在监听端口。

    walterlv
  • Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

    发布于 2018-05-25 13:24 更新于 2018-06...

    walterlv
  • C语言中%d,%p,%u,%lu等都有什么用处

    %d   有符号10进制整数(%ld 长整型,%hd短整型 ) %hu   无符号短整形(%u无符号整形,%lu无符号长整形) %i    有符号10进制整数 ...

    黑泽君
  • 2015年平台、数居、软件将改变传统企业软件

    曾经有一份简单的生活摆在企业IT商店中,我没有认清,可能只是从概念上的简单。 IT企业给员工发放PC和手提电话,维护企业软件、数据库和服务器以及支撑整个企...

    人称T客
  • openstack集群访问外部服务出现访问失败

    openstack私有云中的容器服务A(部署在openshift上)需要通过http访问阿里云中的B服务,中间需要经过openstack的nat网关,以及阿里云...

    charlieroro
  • 创新乏力,企业软件正在阻碍业务的发展

    科技发展到今天,我们可以很自信地说企业软件已经取得了很大的进步。毕竟,过去几十年时间里企业办公的方式已经从简单地使用纸张和铅笔转变为使用云中的程序来管理其运营,...

    人称T客
  • SAP Fiori里的List是如何做到懒加载Lazy load的

    今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示。

    Jerry Wang
  • 怎么对ChannelHandler做测试?

    爬蜥
  • SaaS 行业即将进入整合时代

    编者按:近两年来,SaaS 行业的发展非常迅速,越来越多的公司都已经在开展自己的 SaaS 业务,本文作者 Tomasz Tunguz 是红点投资的知名投资人,...

    静一

扫码关注云+社区

领取腾讯云代金券