使用Roslyn从ObjectCreationExpressionSyntax获取构造函数声明?

Mat*_*Sot 9 c# roslyn

我试图用罗斯林采取的对象创建表达式C#源文件,并添加名称的所有参数(所以从new SomeObject("hello")new SomeObject(text: "hello").

我从SyntaxTree获得了ObjectCreationExpressionSyntax以及解决方案的SemanticModel.我试图用GetSymbol/TypeInfoObjectCreationExpressionSyntax的类型,但我似乎无法使用得到的参数名称.

基本上我想要的是这个:

具体是参数Something.Something.

and*_*dyp 8

请问SemanticModel对于SymbolInfo您要前往/重写的节点.它返回的符号应该始终是一个包含构造函数的所有参数的IMethodSymbol属性Parameters.

出于好奇,我写了一个SyntaxRewriter完全符合你想要的东西.它当然还没有经过彻底的测试,我会错过(或者只是省略,就像已经命名的参数一样).

public class NameAllParametersRewriter : CSharpSyntaxRewriter
{
    private readonly SemanticModel _semanticModel;

    public NameAllParametersRewriter(Document document)
    {
        _semanticModel = document.GetSemanticModelAsync().Result;
    }

    public override SyntaxNode VisitObjectCreationExpression(
        ObjectCreationExpressionSyntax node)
    {
        var baseResult = (ObjectCreationExpressionSyntax)
            base.VisitObjectCreationExpression(node);

        var ctorSymbol = _semanticModel.GetSymbolInfo(node).Symbol as IMethodSymbol;
        if (ctorSymbol == null)
            return baseResult;

        var newArgumentListArguments = new SeparatedSyntaxList<ArgumentSyntax>();
        for (int i = 0; i < baseResult.ArgumentList.Arguments.Count; i++)
        {
            var oldArgumentSyntax = baseResult.ArgumentList.Arguments[i];
            var parameterName = ctorSymbol.Parameters[i].Name;

            var identifierSyntax = SyntaxFactory.IdentifierName(parameterName);
            var nameColonSyntax = SyntaxFactory
                .NameColon(identifierSyntax)
                .WithTrailingTrivia(SyntaxFactory.Whitespace(" "));

            var newArgumentSyntax = SyntaxFactory.Argument(
                nameColonSyntax, 
                oldArgumentSyntax.RefOrOutKeyword, 
                oldArgumentSyntax.Expression);

            newArgumentListArguments = newArgumentListArguments.Add(newArgumentSyntax);
        }

        return baseResult
            .WithArgumentList(baseResult.ArgumentList
                .WithArguments(newArgumentListArguments));
    }
}
Run Code Online (Sandbox Code Playgroud)