如何根据Roslyn中的类型重新排列方法中的参数?

时间:2019-01-31 12:20:57

标签: c# roslyn

我想根据其类型在InvocationExpressionSyntax中重新排列参数。如何获得参数的类型?

我已经尝试根据该方法获取类型,但这是不可能的,因为最后一个参数是“对象的参数”,而且我无法从中获取类型。

这是我的示例代码:

var code = SourceText.From(@"
class Foo
{
    void Bar()
    {
        Baz(""Some String"", new Exception(""some exception""), 200);
    }
    void Baz(string s, params object[] param)
    {
        Console.WriteLine(""do smth"");
    }
} 
");

在此示例中,我想在开头重新排列异常,然后在String和其余部分重新排列,但这仅是因为它是一个异常。

我该怎么做?在示例代码中,预期结果应为:

Baz(new Exception(""some exception""), ""Some String"", 200);

直到现在我还没有到达可以更改某些东西的地步,因为我已经无法获取参数的类型。这是我的获取方法引用的代码:

var references = SymbolFinder.FindReferencesAsync(model.GetDeclaredSymbol(methodDeclarationSyntax), workspace.CurrentSolution).Result;
foreach (var referencedSymbol in references)
{
    foreach (var referencSymbolLocaiton in referencedSymbol.Locations)
    {
        var result = GetInvocationExpressionFromLocation(referencSymbolLocaiton);

    }
}

这是将InvocationExpressionSyntaxReferenceLocation中剔除的方法:

public static InvocationExpressionSyntax GetInvocationExpressionFromLocation(ReferenceLocation referenceLocation)
{
    var ins = referenceLocation.Location.SourceTree.GetRoot()
                .FindNode(referenceLocation.Location.SourceSpan);
    InvocationExpressionSyntax returnValue = null;
    foreach (var invocationExpressionSyntax in ins.SyntaxTree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>())
    {
        foreach (var b in invocationExpressionSyntax.DescendantNodes().OfType<IdentifierNameSyntax>().Where(syntax => syntax.ToString() == ins.ToString()))
        {
            if (b.GetLocation().SourceSpan != ins.GetLocation().SourceSpan) continue;
            returnValue = invocationExpressionSyntax;
        }
    }
    return returnValue;
}

0 个答案:

没有答案