[英]Add access modifier to method using Roslyn CodeFixProvider?
幾天前我在 TechEd 上,我看到了 Kevin Pilch-Bisson 的這個演講(相關部分從大約 18 分鍾開始) ......我覺得這很酷,所以我決定自己和 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);
希望這可以幫助
我真正需要的是這個:
var newModifiers = SyntaxFactory.TokenList(SyntaxFactory.Token(accessModifierToken))
.AddRange(methodDeclaration.Modifiers);
這幾乎是 Chris Eelmaa 的建議,但根據該建議,我最終得到了static public void Main
,它有效但丑陋。
附加public
將它添加到列表的末尾,據我所知,訪問修飾符應該始終是第一個。
好吧,要創建指示public static
修飾符,您可以使用:
var modifiers = SyntaxFactory.TokenList(
new SyntaxToken[] {
SyntaxFactory.Token(SyntaxKind.PublicKeyword),
SyntaxFactory.Token(SyntaxKind.StaticKeyword)
}),
但在你的情況下,我不明白為什么
var updatedModifiers = methodDeclaration
.Modifiers
.Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
methodDeclaration.WithModifiers(updatedModifiers);
行不通。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.