gpt4 book ai didi

c# - Roslyn - 如何在匹配 InvocationExpressionSyntax 后添加语句

转载 作者:太空狗 更新时间:2023-10-29 21:28:03 25 4
gpt4 key购买 nike

我正在使用 Roslyn 库。我想在匹配行之后添加语句:这是要求。首先我想找到下面一行:

_container.RegisterInstance(NavigationService);

然后我想在上面一行之后添加以下语句:

_container.RegisterInstance<ISessionStateService>(SessionStateService);
_container.RegisterInstance<IFlyoutService>(FlyoutService);

如有任何帮助,我们将不胜感激。

编辑:(我已经创建了表达式,但现在如何将这两个表达式添加到我的目标表达式中?

   string strContent = File.ReadAllText(strPath);
SyntaxTree tree = SyntaxTree.ParseText(strContent);
var targetExpression = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>()
.FirstOrDefault(
x => x.Expression.ToString().Contains("_container.RegisterInstance") && x.ArgumentList.ToString().Contains("NavigationService"));

InvocationExpressionSyntax replacementNode1 =
Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);"));

InvocationExpressionSyntax replacementNode2 =
Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<IFlyoutService>(FlyoutService);"));

MethodDeclarationSyntax targetMethod = (MethodDeclarationSyntax)targetExpression.Parent.Parent.Parent;

List<InvocationExpressionSyntax> list = targetMethod.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList();
int index = list.IndexOf(targetExpression);

list.Insert(index + 1, replacementNode1);
list.Insert(index + 1, replacementNode2);

现在的问题是如何获取更新的树??意味着如何更新我的列表并获得具有这些更改的树。

编辑:现在我可以生成添加节点,但唯一的问题是格式.. 间距不正确。这是代码:

   string strContent = File.ReadAllText(strPath);
SyntaxTree tree = SyntaxTree.ParseText(strContent);

ExpressionStatementSyntax expressionStatementSyntax =
Syntax.ExpressionStatement(Syntax.ParseExpression("_container.RegisterInstance(NavigationService);"));

var targetBlock =
tree.GetRoot()
.DescendantNodes()
.OfType<BlockSyntax>()
.FirstOrDefault(x => x.Statements.Any(y => y.ToString().Contains("_container.RegisterInstance")));

StatementSyntax syn1 =
Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);");
StatementSyntax syn2 = Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService2);");

List<StatementSyntax> newSynList = new List<StatementSyntax> { syn1, syn2 };

SyntaxList<StatementSyntax> blockWithNewStatements = targetBlock.Statements;

foreach (var syn in newSynList)
{
blockWithNewStatements = blockWithNewStatements.Insert(1, syn);
}

BlockSyntax newBlock = Syntax.Block(blockWithNewStatements);

var newRoot = tree.GetRoot().ReplaceNode(targetBlock, newBlock);

它生成所有行左对齐的输出。有什么建议吗?

最佳答案

在您编辑之后,剩下的主要问题似乎是关于处理行格式。在这两种情况下,一旦获得最终根,就可以调用格式化程序来清理它。您有两个选择:

  1. 完成后,您可以在节点上调用 NormalizeWhitespace() 扩展,这非常粗鲁地将所有节点重新格式化为远程“合理”的格式。如果您不关心保留任何格式,只是希望输出看起来不那么糟糕,这是一个简单的选择。
  2. 您可以引用 Roslyn.Services 程序集,然后在顶部添加“使用 Roslyn.Services”(如果您还没有的话)。从那里开始,有一个 Format() 方法,它是一个更高级的格式化程序,它试图保持原样缩进,尊重用户已经拥有的内容,等等。如果您在创建的节点上粘贴语法注释,那么您可以将该注释传递给此格式化程序,以便它知道保持文件的其余部分不变。

关于c# - Roslyn - 如何在匹配 InvocationExpressionSyntax 后添加语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19111099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com