2013-10-01 8 views
6

Ich verwende Roslyn-Bibliothek. Ich möchte die Anweisungen nach passender Zeile hinzufügen: Hier ist die Voraussetzung. zunächst mag ich die folgende Zeile finden:Roslyn - wie Anweisungen nach dem Abgleich hinzufügen InvocationExpressionSyntax

_container.RegisterInstance(NavigationService); 

Und dann will ich im Folgenden Aussage nach der obigen Zeile hinzufügen:

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

Jede Hilfe wäre sehr geschätzt.

EDIT:? (Ich habe die Ausdrücke geschaffen, aber jetzt, wie diese beiden experssions meiner targetExpression hinzufügen

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); 

jetzt die Frage ist, wie mein aktualisiert Baum bekommen ?? bedeutet, wie meine Liste zu aktualisieren und erhalten Sie den Baum mit diesen Änderungen

Edit:. Jetzt erzeugen kann ich die Knoten hinzufügen, aber nur Ausgabe formatiert .. der Abstand nicht korrekt ist hier ist der Code:.

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); 

es generiert die Ausgabe mit allen Linien linksbündig .. irgendwelche Vorschläge?

+2

Was haben Sie bisher? –

+0

Ich bin nur in der Lage, meine Ziellinie zu finden ... aber ich bin mir nicht sicher, wie die Anweisungen nach meiner Ziellinie hinzugefügt werden. Zeichenfolge strContent = File.ReadAllText (strPath); SyntaxTree tree = SyntaxTree.ParseText (strContent); var targetMethod = tree.GetRoot(). DescendantNodes(). OfType () .FirstOrDefault ( x => x.Expression.ToString(). Enthält ("_ container.RegisterInstance") && x.ArgumentList.ToString() .Contains ("NavigationService")); –

+0

Ich habe den Thread bearbeitet .. Ich bin in der Lage, die Zielausdruck zu bekommen und auch zwei Knoten erstellt, die ich an meinem Zielausdruck anhängen möchte ... Irgendwelche Vorschläge? –

Antwort

6

Nach Ihrer Bearbeitung sieht es so aus, als ob die wichtigste Frage die Formatierung der Zeilen ist. In beiden Fällen können Sie einen Formatierer aufrufen, um ihn zu bereinigen. Sie haben zwei Möglichkeiten:

  1. Sie können auf Ihrem Knoten die NormalizeWhitespace() Nebenstelle anrufen, sobald Sie fertig sind, was sehr unsanft alle Knoten in etwas umformatiert Ferne „angemessen“. Wenn es Ihnen nicht darum geht, die Formatierung beizubehalten, die Sie hatten, und einfach nur, dass die Ausgabe nicht schrecklich aussieht, ist dies die einfache Option.
  2. Sie können auf die Roslyn.Services-Assembly verweisen und dann oben "Roslyn.Services" hinzufügen, wenn Sie dies nicht bereits tun. Von dort gibt es eine Format() -Methode, die ein viel schickerer Formatierer ist, der versucht, sich einzumessen, zu respektieren, was der Benutzer bereits hatte, usw., usw. Wenn Sie eine Syntax-Annotation auf den von Ihnen erstellten Knoten anbringen, können Sie dies tun Übergeben Sie diese Anmerkung an diesen Formatierer, damit er den Rest der Datei unberührt lässt.
+0

Sie sind fantastisch ... Vielen Dank Jason .... –

Verwandte Themen