Sto utilizzando la libreria Roslyn. Voglio aggiungere le istruzioni dopo la riga corrispondente: Ecco il requisito. Prima di tutto voglio trovare la linea di seguito:Roslyn - come aggiungere istruzioni dopo la corrispondenza InvocationExpressionSyntax
_container.RegisterInstance(NavigationService);
E poi voglio aggiungere di seguito le dichiarazioni dopo la linea di cui sopra:
_container.RegisterInstance<ISessionStateService>(SessionStateService);
_container.RegisterInstance<IFlyoutService>(FlyoutService);
Qualsiasi aiuto sarebbe molto apprezzato.
EDIT:? (Ho creato le espressioni, ma ora come aggiungere quei due experssions alla mia 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);
ora il problema è come ottenere il mio albero aggiornato ?? Significa come aggiornare la mia lista e ottenere l'albero con questi cambiamenti
Edit:. Ora sono in grado di generare aggiungere i nodi, ma unico problema è la formattazione .. la distanza non è corretta qui è il codice:.
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);
genera l'output con tutte le linee allineate a sinistra .. qualche suggerimento?
Cosa hai finora? –
Sono solo in grado di trovare la mia linea di destinazione ... ma non sono sicuro di come aggiungere le dichiarazioni dopo la mia linea di destinazione. string strContent = File.ReadAllText (strPath); SyntaxTree tree = SyntaxTree.ParseText (strContent); var targetMethod = tree.GetRoot(). DescendantNodes(). OfType() .FirstOrDefault ( x => x.Expression.ToString(). Contains ("_ container.RegisterInstance") && x.ArgumentList.ToString() .Contains ("NavigationService")); –
Ho modificato il thread .. Sono in grado di ottenere il targetExpression e ho anche creato due nodi che voglio aggiungere al mio targetExpression ... Qualche suggerimento? –