我试图用罗斯林采取的对象创建表达式C#源文件,并添加名称的所有参数(所以从new SomeObject("hello")到new SomeObject(text: "hello").
我从SyntaxTree获得了ObjectCreationExpressionSyntax以及解决方案的SemanticModel.我试图用GetSymbol/TypeInfo为ObjectCreationExpressionSyntax的类型,但我似乎无法使用得到的参数名称.
基本上我想要的是这个:

具体是参数Something.Something.
请问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)
| 归档时间: |
|
| 查看次数: |
1586 次 |
| 最近记录: |