几天前我参加了TechEd,看到了Kevin Pilch-Bisson的这个演讲(相关部分从大约18分钟开始)......我觉得它很酷,所以决定自己试着使用Roslyn。
我正在尝试制定一个“必须声明访问修饰符”(Stylecop SA1400)的规则-意思是,
以下内容违反了该规则:
static void Main(string[] args)
{
}
这样就可以了:
public static void Main(string[] args)
{
}
它必须有明确的internal、public、private或protected关键字。
检测到违规行为相当容易,但现在我正在尝试提供解决方法。我一直在尝试各种方法并到处搜索,但我找不到如何添加访问修饰符的方法。
这是我目前的代码:
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
而不是 new 它。然而,当使用 SyntaxFactory
时,我也无法确定需要使用哪种方法来创建一个 SyntaxKind.PublicKeyword
的 SyntaxToken
。如果有兴趣,我可以发布整个内容,包括 DiagnosticAnalyzer
。
static public void Main
。我已经添加了自己的解决方案,似乎可以工作。如果可能的话,请查看一下我的解决方案,以防我做了什么奇怪的事情,那就太好了。这是我为Roslyn制作的第一件事,所以可能有很多需要改进的地方。 - Ron Sijmpublic void AnalyzeNode(SyntaxNode node, SemanticModel semanticModel, Action<Diagnostic> addDiagnostic
而不是这样的:public Action<Diagnostic> AnalyzeNode(SyntaxNode node, SemanticModel semanticModel
?看起来有点奇怪。 - Ron Sijm