簡體   English   中英

在 Roslyn 分析器中分析后預處理器代碼

[英]Analyze post-preprocessor code in Roslyn analyzer

我正在編寫一個 Roslyn 分析器(實際上是源生成器,但它們在很大程度上共享相同的 API),我想讓它只分析后處理器代碼。 例如,如果我有使用#if/#else 排除的代碼,我希望我的分析器不能處理該代碼。 同樣,我希望#beginregion/#endregion 等不要出現在我的分析儀中。

有沒有辦法從 Roslyn 獲得預處理后的編譯或語法樹? 我可以執行以下操作,但它會丟棄我所有的原始位置信息,我猜我的編譯語義 model 對新生成的語法樹一無所知:

var preprocessorSymbols = candidate.SyntaxTree.Options.PreprocessorSymbolNames;
var parseOptions = CSharpParseOptions.Default.WithPreprocessorSymbols(preprocessorSymbols);
var newSyntaxTree = CSharpSyntaxTree.ParseText(candidate.SyntaxTree.ToString(), parseOptions);

Roslyn 解析器已經跳過了 #if/#else 中不活動的代碼,因為解析器本身就是處理這些代碼的那個。 跳過的文本仍然表示為樹內的瑣事,它是附加到語法節點的數據,但根本沒有常規語法節點。 因此,您的分析器不會偶然發現表示禁用#if 內代碼的語法節點,因為它首先不存在。

另一方面,對於#regions,這些並不特別; 語法樹包含額外的瑣事; 如果您想排除其中的代碼,您可以步行並找到它們。 如果您想了解更多詳細信息,則必須更具體地滿足您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM