2012-07-30 108 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

相关问题