如果您通过访问者 (CSharpSyntaxRewriter\Walker) 解析节点,则需要覆盖:
public override SyntaxNode VisitIfDirectiveTrivia(IfDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitElseDirectiveTrivia(ElseDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitEndIfDirectiveTrivia(EndIfDirectiveTriviaSyntax node)
{
}
如果您不想通过访问者获得此信息,您可以这样做:
node.DescendantNodesAndSelf().OfType<ConditionalDirectiveTriviaSyntax>();
您可以查看here 以了解 Roslyn 为您的条件生成了什么。
更新
我查了一下,这里确实有点复杂,因为它当然不是Node。该节点只是return 2,或者如果你写#define DEBUG它的return 1。
所以,如果你在方法中有条件指令,你可以这样做:
// First get the relevant method (or any other parent block depending in the case)
var method = root.DescendantNodes().OfType<MethodDeclarationSyntax>().First();
// Then, you can write method similar to this
static SyntaxTrivia GetConditionalDirectiveTrivia(SyntaxNode node, SyntaxKind kind)
{
foreach (SyntaxNode syntaxNode in node.DescendantNodes())
{
var trivia = syntaxNode.GetLeadingTrivia().FirstOrDefault(t => t.Kind() == kind);
if (trivia != default(SyntaxTrivia))
return trivia;
GetConditionalDirectiveTrivia(syntaxNode, kind);
}
return default(SyntaxTrivia);
}
然后这样称呼它:
GetConditionalDirectiveTrivia(method, SyntaxKind.IfDirectiveTrivia);
没有 Kind 你可以通过更多方式找到它,但我认为它已经足够好了。
请注意,这只是一个示例。我在这里只返回第一个琐事。
在您的真实代码中,您可以编写更优雅的解决方案(甚至可能是扩展方法)来获取例如AllTriviaOfKind 或其他符合您要求的东西。
此外,如果琐事本身对您无用,您可以返回令牌琐事或父节点,无论您想要什么\需要。
希望对你有所帮助。