Wenn Sie die Knoten über Besucher (CSharpSyntaxRewriter \ Walker) analysieren müssen Sie außer Kraft zu setzen:
public override SyntaxNode VisitIfDirectiveTrivia(IfDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitElseDirectiveTrivia(ElseDirectiveTriviaSyntax node)
{
}
public override SyntaxNode VisitEndIfDirectiveTrivia(EndIfDirectiveTriviaSyntax node)
{
}
Wenn Sie dies nicht über Besucher erhalten möchten, können Sie dies tun:
node.DescendantNodesAndSelf().OfType<ConditionalDirectiveTriviaSyntax>();
Sie können einen Blick auf here werfen, um zu sehen, was Roslyn für Ihre Bedingung erzeugt.
aktualisiert
Ich habe es, und in der Tat seine Art hier komplizierter, weil es nicht Node
natürlich. Der Knoten ist nur return 2
oder wenn Sie schreiben #define DEBUG
seine return 1
.
Also, falls Sie haben, dass bedingte Direktive innerhalb Methode, die Sie so etwas tun kann:
// 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);
}
Und es so nennen:
GetConditionalDirectiveTrivia(method, SyntaxKind.IfDirectiveTrivia);
Sie es in mehr Wege finden können, ohne die Art, aber ich denke, es ist gut genug.
Beachten Sie, dass es nur ein Beispiel ist. Ich komme hier nur auf die ersten Kleinigkeiten zurück.
In Ihrem echten Code können Sie elegantere Lösung (vielleicht sogar eine Erweiterungsmethode) schreiben, um zum Beispiel oder etwas anderes zu bekommen, das Ihren Anforderungen entspricht. Sie können auch die Token Trivia oder den Elternknoten zurückgeben, wenn die Trivia selbst für Sie nutzlos ist, was immer Sie wollen.
Ich hoffe es hilft.
Wenn Sie bereit sind, eine nicht-Roslyn Lösung zu betrachten, kann ich Beschreiben Sie eine, wo dieser Prozess extrem einfach ist. –
@ ira-baxter es muss roslyn specifc sein – adeel41