我们在代码中会写 #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 关注我的主页。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有