Jeśli zanalizować węzły przez użytkownika (CSharpSyntaxRewriter \ Walker) trzeba zastąpić:
public override SyntaxNode VisitIfDirectiveTrivia(IfDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitElseDirectiveTrivia(ElseDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitEndIfDirectiveTrivia(EndIfDirectiveTriviaSyntax node)
{
}
Jeśli chcesz dostać to nie przez odwiedzających, można to zrobić:
node.DescendantNodesAndSelf().OfType<ConditionalDirectiveTriviaSyntax>();
Możesz zobaczyć, co Roslyn generuje dla twojego warunku.
Aktualizacja
Sprawdziłem to i rzeczywiście tego rodzaju skomplikowanych tutaj, ponieważ jej nie Node
oczywiście. Węzeł jest tylko return 2
lub jeśli napiszesz #define DEBUG
jego return 1
.
Tak więc, w przypadku gdy masz że dyrektywa warunkowa wewnątrz metody można zrobić coś takiego:
// 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);
}
i nazwać tak:
GetConditionalDirectiveTrivia(method, SyntaxKind.IfDirectiveTrivia);
Można go znaleźć na wiele sposobów bez The Kind, ale uważam, że jest wystarczająco dobry.
Pamiętaj, że to tylko przykład. Wracam tutaj tylko pierwsze ciekawostki.
W swoim prawdziwym kodzie możesz napisać bardziej eleganckie rozwiązanie (może nawet metodę rozszerzenia), aby uzyskać np. AllTriviaOfKind
lub coś innego, co pasuje do twoich wymagań. Możesz także zwrócić drobiazgi tokenów lub węzeł nadrzędny, jeśli same ciekawostki są bezużyteczne, niezależnie od tego, czego potrzebujesz.
Mam nadzieję, że jej pomoc.
Jeśli jesteś gotów rozważyć rozwiązanie non-Roslyn, mogę opisz jedno, gdzie ten proces jest wyjątkowo prosty. –
@ ira-baxter To musi być roslyn specifc – adeel41