我几天前在TechEd,我看到了
this talk by Kevin Pilch-Bisson (relevent part starts at about 18 minutes) …我以为是很酷,所以我决定和Roslyn一起玩耍.
我试图制定一个规则“访问修饰符必须被声明”(Stylecop SA1400) – 意思是,
这违反了规则:
static void Main(string[] args) { }
还行吧:
public static void Main(string[] args) { }
它必须有一个明确的内部关键字,公共关键字,私人关键字或受保护的关键字.
检测违规行为是相当容易的,但现在我试图提供一个修复.我一直在尝试和搜索无处不在,但我无法找到如何添加访问修饰符.
这是我到目前为止
public async Task<IEnumerable<CodeAction>> GetFixesAsync(Document document,TextSpan span,IEnumerable<Diagnostic> diagnostics,CancellationToken cancellationToken) { var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var token = root.FindToken(span.Start); var methodDeclaration = token.Parent as MethodDeclarationSyntax; //var newModifiers = methodDeclaration.Modifiers.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.PublicKeyword)); //var newModifiers = new SyntaxTokenList() { new SyntaxToken() }; MethodDeclarationSyntax newMethodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers); var newRoot = root.ReplaceNode(methodDeclaration,newMethodDeclaration); var newDocument = document.WithSyntaxRoot(newRoot); return new[] { CodeAction.Create("Add Public Keyword",newDocument) }; }
WithModifiers需要一个SyntaxTokenList,我可以使用New(),但是我不知道如何使它成为SyntaxKind.PublicKeyword.我也不知道我甚至假设新的,或使用SyntaxFactory.然而,当使用SyntaxFactory时,我也无法弄清楚我需要创建SyntaxToken的方法SyntaxKind.PublicKeyword
我可以发布整个事情,包括DiagnosticAnalyzer如果有兴趣…
解决方法
很高兴你喜欢这个讲话!我们实际上在语法模型中有一些帮助者可以更容易地将项目添加到列表中,因此您应该能够执行以下操作:
var newMethodDeclaration = methodDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
扩展形式将是:
var newModifiers = SyntaxFactory.TokenList(modifiers.Concat(new[] { SyntaxFactory.Token(SyntaxKind.PublicKeyword)})); var newMethodDeclaration = methodDeclaration.WithModifiers(newModifiers);
希望这可以帮助