【发布时间】:2017-09-20 19:00:04
【问题描述】:
我正在使用 Roslyn 在 C# 中修改我早期的代码分析器,但我再次遇到了一些我不知道如何应用的更改。
基于:https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Analysis我已经创建了一些基础来解决这个问题:Finding all not inheriting C# classes with Roslyn and changing to inheriting from base object (java-like)
我已解析并遍历树以查找所有方法声明及其参数。基于 VS Syntax Visualiser,我构建了这个:
foreach (var c in root1.DescendantNodesAndSelf())
{
var methodDeclaration = c as MethodDeclarationSyntax;
if (methodDeclaration == null)
continue;
if (methodDeclaration.ParameterList != null) //Have parameters
{
foreach (var p in methodDeclaration.ParameterList.Parameters)
{
var parameter = p as ParameterSyntax;
String name, type;
name = parameter.GetLastToken().Value.ToString();
type = parameter.GetFirstToken().Value.ToString();
if (parameter == null)
continue;
if (name == "caller" && type == "string")
{
AttributeSyntax ats = SyntaxFactory.Attribute(SyntaxFactory.QualifiedName(SyntaxFactory.IdentifierName("System.Runtime.CompilerServices"),SyntaxFactory.IdentifierName("CallerMemberName")));
SeparatedSyntaxList<AttributeSyntax> ssl = new SeparatedSyntaxList<AttributeSyntax>();
ssl = ssl.Add(ats);
AttributeListSyntax als = SyntaxFactory.AttributeList(ssl);
var par1 = parameter.AddAttributeLists(als);
//ExpressionSyntax es = SyntaxFactory.AssignmentExpression(SyntaxKind.EqualsValueClause,null,SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression))
//SyntaxFactory.EqualsValueClause(es);
par1 = par1.AddModifiers();
root2 = root2.ReplaceNode(parameter, par1);
}
}
}
else //Don't have parameters
continue;
}
我正在尝试转换这样声明的方法:
private void testM3(string caller)
进入
private void testM3([System.Runtime.CompilerServices.CallerMemberName] string caller = "")
这部分:
//ExpressionSyntax es = SyntaxFactory.AssignmentExpression(SyntaxKind.EqualsValueClause,null,SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression))
//SyntaxFactory.EqualsValueClause(es);
是我创建equals节点的失败尝试。
据我了解,这部分:
AttributeSyntax ats = SyntaxFactory.Attribute(SyntaxFactory.QualifiedName(SyntaxFactory.IdentifierName("System.Runtime.CompilerServices"),SyntaxFactory.IdentifierName("CallerMemberName")));
SeparatedSyntaxList<AttributeSyntax> ssl = new SeparatedSyntaxList<AttributeSyntax>();
ssl = ssl.Add(ats);
AttributeListSyntax als = SyntaxFactory.AttributeList(ssl);
var par1 = parameter.AddAttributeLists(als);
会在var par1 中给我新的参数节点,它已经包含属性,所以我需要添加默认值设置。如果我对这个属性有错误,请纠正我,我想知道如何正确构建这个等于表达式节点。
【问题讨论】:
标签: c# roslyn parse-tree