Как переставить аргументы из метода в соответствии с их типом в Roslyn? - PullRequest
0 голосов
/ 31 января 2019

Я хочу переставить аргументы в InvocationExpressionSyntax в соответствии с их типом.Как я могу получить тип аргумента?

Я уже пытался получить тип в соответствии с методом, но это невозможно, потому что последний параметр является «params of object», и я никак не могуможно получить тип из этого.

Вот мой пример кода:

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

В этом примере я хочу переставить исключение в начале, а затем в строку и остальные, но только потому, что это исключение.

Как мне это сделать?В примере кода ожидаемый результат должен быть:

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

    }
}

А вот метод, который выводит меня InvocationExpressionSyntax из ReferenceLocation:

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;
}
...