Если разобрать узлы с помощью посетителя (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 генерирует для вашего условного.
Update
Я проверил это, и в самом деле его вид сложных здесь, потому что его не 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);
Вы можете найти его в более способами без Добрый, но я думаю, что он достаточно хорош.
Обратите внимание, что это только пример. Я возвращаю сюда только первые мелочи.
В вашем реальном коде вы можете написать более элегантное решение (возможно, даже метод расширения), чтобы получить, например, AllTriviaOfKind
или что-то еще, что соответствует вашим требованиям. Кроме того, вы можете вернуть пустые значения маркера или родительский узел, если сами пустяки бесполезны для вас, независимо от того, что вам нужно.
Я надеюсь его помощь.
Если вы готовы рассмотреть решение, не Roslyn, я могу описывают, где этот процесс чрезвычайно прост. –
@ ira-baxter это должно быть roslyn specificc – adeel41