Я пишу анализатор кода, который инвертирует оператор if для уменьшения вложенности.Roslyn для вставки узлов после указанного узла
Я могу сгенерировать новый узел if и заменить его на корень документа. Однако я должен переместить весь контент (заявления), исходящий из этого утверждения if, ниже него. Позвольте мне показать, что я достиг до сих пор:
var ifNode = @if;
var ifStatement = @if.Statement as BlockSyntax;
var returnNode = (ifNode.Parent as BlockSyntax).Statements.Last() as ReturnStatementSyntax ?? SyntaxFactory.ReturnStatement();
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
var invertedIf = ifNode.WithCondition(Negate(ifNode.Condition, semanticModel, cancellationToken))
.WithStatement(returnNode)
.WithAdditionalAnnotations(Formatter.Annotation);
var root = await document.GetSyntaxRootAsync(cancellationToken);
var newRoot = root.ReplaceNode(ifNode, invertedIf);
newRoot = newRoot.InsertNodesAfter(invertedIf, ifStatement.Statements); //It seems no to be working. There's no code after specified node.
return document.WithSyntaxRoot(newRoot);
До:
public int Foo()
{
if (true)
{
var a = 3;
return a;
}
return 0;
}
После:
public int Foo()
{
if (false)
return 0;
var a = 3;
return a;
}
Это немного сложно (возможно, только для меня), чтобы увидеть, чего вы пытаетесь достичь. Не могли бы вы предоставить до и после того, что вы хотели бы достичь? – JoshVarty
Как @JoshVarty спросил, есть ли пример для до/после. – Gandarez
Как вы выполняете синтаксис @If? – MHGameWork