2012-07-30 66 views
0

說我有這個InvocationExpression,GetDelegate<Func<double,double,double>>("Add")(),我將如何刪除在ArgumentListSyntax中找到的Open/Close parens?
我試圖找出Node.ReplaceNodes <>()方法,但即使如此,我不知道如何替換Nodes。從ArgumentListSyntax中刪除OpenParen SyntaxToken的簡單方法是什麼?

我正在檢查出this bit of sample code,他將整個節點拆分成組件以改變它。有沒有更簡單的方法來做到這一點?我找不到任何種類的Node.RemoveNode()方法。

我也試圖做這樣的事情,沒有成功:

argNodeMinusParen = argNodeMinusParen.WithArgumentList(argNodeMinusParen .ArgumentList.ReplaceToken(Syntax.Token(SyntaxKind.OpenParenToken), Syntax.Token(SyntaxKind.WhitespaceTrivia))); 

澄清: 我試圖修改此InvocationExpression這樣的:

GetDelegate<Func<double,double,double>>("Add")()

GetDelegate<Func<double,double,double>>("Add")

的問題,我試圖解決:

開始使用此代碼。

private void Init() 
    { 
     StoredMethods.Add("Add", /*new InvocationExpression for identical signature method as controller.Add*/); 
     StoredMethods.Add("Mul", /*new InvocationExpression for identical signature method as controller.SubMember.Mul*/); 
    } 

    private void RandomMethod() 
    { 
     var result = controller.SubMember.Mul(2, 3); 
     var result2 = controller.Add(5, 5); 
     var result3 = controller.Add(controller.SubMember.Mul(4, 5), 6); 
     var result4 = controller.Subtract(5, controller.Add(1, 1)); 
    } 

    public Dictionary<string, InvocationExpressionSyntax> StoredMethods 
    { 
     get; 
     set; 
    } 

我想把它變成這個。 請注意,這只是半僞代碼,我實際上在做一堆更復雜的靜態泛型類型的東西,爲簡明起見,這是簡化的。

對於在整個項目中發現的每個調用,如果在StoredMethods中找到方法名稱,則將調用替換爲StoredMethod調用。 結果應該是這樣的:

private void RandomMethod() 
    { 
     var result = StoredMethods.GetDelegate("Mul")(2, 3); 
     var result2 = StoredMethods.GetDelegate("Add")(5, 5); 
     var result3 = StoredMethods.GetDelegate("Add")(StoredMethods.GetDelegate("Mul")(4, 5), 6); 
     var result4 = controller.Subtract(5, StoredMethods.GetDelegate("Add")(1, 1)); 
    }//Notice that Subtract was NOT substituted, because it wasn't in StoredMethods, where Add was replaced in the inner arg 

我更大的問題是試圖找出如何處理嵌套/複合類和成員。我認爲遞歸可以處理多個MemeberAccess表達式,但是我很難將問題分解到我的頭上。 另外,我使用SyntaxRewriter訪問每個節點,所以我不知道如何把compilationUnit成

+0

你可以澄清你想要什麼,一旦更換完成?只是最後一批失蹤的人,或(「添加」)的東西? – 2012-07-30 03:13:39

回答

2

不能在「刪除括號」的角度來考慮它,羅斯林是不是字符,它關於語法樹。如果你看看你的表情作爲樹的一部分,你會看到它有兩個相關屬性:

  • Expression,表示GetDelegate<Func<double,double,double>>("Add")
  • ArgumentList,表示()

所以,你想那是什麼Expression(在innerInvocation變量這裏):

var code = "GetDelegate<Func<double,double,double>>(\"Add\")()"; 
var outerInvocation = (InvocationExpressionSyntax)Syntax.ParseExpression(code); 
var innerInvocation = (InvocationExpressionSyntax)outerInvocation.Expression; 

如果調用一些較大的一段代碼的一部分,你要刪除的括號那裏,你將需要使用Replace()

var compilationUnit = …; 

// or some other code to locate the invocation 
var outerInvocation = compilationUnit.DescendantNodes() 
            .OfType<InvocationExpressionSyntax>() 
            .First(); 
var innerInvocation = (InvocationExpressionSyntax)outerInvocation.Expression; 

var newCompilationUnit = compilationUnit.ReplaceNode(
    outerInvocation, innerInvocation); 
+0

我要用我想解決的問題的更廣泛概述來更新我的問題。 – 2012-07-30 07:54:22

相關問題