我正在使用Roslyn库.
我想在匹配行后添加语句:这是要求.
首先,我想找到以下行:
我想在匹配行后添加语句:这是要求.
首先,我想找到以下行:
_container.RegisterInstance(NavigationService);
然后我想在上面的行之后添加以下语句:
_container.RegisterInstance<ISessionStateService>(SessionStateService); _container.RegisterInstance<IFlyoutService>(FlyoutService);
任何帮助将不胜感激.
编辑:(我已经创建了表达式,但现在如何将这两个表达添加到我的targetExpression?
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);
解决方法
在编辑之后,看起来剩下的主要问题是关于处理行格式.在这两种情况下,一旦你获得了最终的根,你可以调用一个格式化程序来清理它.您有两种选择:
>一旦完成,您可以在节点上调用NormalizeWhitespace()扩展,这非常粗暴地将所有节点重新格式化为远程“合理”的节点.如果您不关心保留任何格式,只是希望输出看起来不太糟糕,这是一个简单的选择.>您可以引用Roslyn.Services程序集,然后在顶部添加“使用Roslyn.Services”(如果尚未添加).从那里开始,有一个Format()方法,它是一个更加高级的格式化程序,它试图保持缩进,尊重用户已经拥有的内容等等.如果你在你创建的节点上粘贴语法注释,那么你可以将该注释传递给此格式化程序,以便它知道保持文件的其余部分不变.