【发布时间】:2016-04-30 01:10:36
【问题描述】:
小猪退出Add a parameter to a method with a Roslyn CodeFixProvider,
我正在创建一个CodeFixProvider,以确保所有异步方法都采用CancellationToken:
//Before Code Fix:
public async Task Example(){}
//After Code Fix
public async Task Example(CancellationToken token){}
我可以将参数添加到方法中,但我必须使用Type.FullName 这样做。相反,我想将 System.Threading 的 using 语句添加到类文件的顶部,这样该方法就不需要使用完整的命名空间。换句话说:
// What I have thus far:
public class AClass{
public async Task Example(System.Threading.CancellationToken token){}
}
// What I want:
using System.Threading;
public class AClass{
public async Task Example(CancellationToken token){}
}
如何向Document 添加using 语句?
我尝试了几种方法,但是当我替换 SyntaxTree 引用中的多个节点时它会出现接缝丢失(因为树是不可变的,并且在每次更改时都会重建)。
我能够使用下面的代码使其部分工作,但这仅在填充 CompilationUnitSyntax.Using 属性时才有效,当 using 语句出现在命名空间之后 时,情况并非如此。这也依赖于文件中至少有一个using 语句。
有没有更好的方法来做到这一点?
private async Task<Document> HaveMethodTakeACancellationTokenParameter(
Document document, SyntaxNode syntaxNode, CancellationToken cancellationToken)
{
var syntaxTree =
(await document.GetSyntaxTreeAsync(cancellationToken))
.GetRoot(cancellationToken);
var method = syntaxNode as MethodDeclarationSyntax;
#region Add Parameter
var newParameter =
SyntaxFactory.Parameter(
SyntaxFactory.Identifier("cancellationToken")
)
.WithType(
SyntaxFactory.ParseTypeName(
typeof(CancellationToken).FullName));
var updatedMethod = method.AddParameterListParameters(newParameter);
syntaxTree = syntaxTree.ReplaceNode(method, updatedMethod);
#endregion
#region Add Using Statements
var compilation =
syntaxTree as CompilationUnitSyntax;
var systemThreadingUsingName =
SyntaxFactory.QualifiedName(
SyntaxFactory.IdentifierName("System"),
SyntaxFactory.IdentifierName("Threading"));
if (compilation.Usings.All(u => u.Name.GetText().ToString() != typeof(CancellationToken).Namespace))
{
syntaxTree = syntaxTree.InsertNodesAfter(compilation.Usings.Last(), new[]
{
SyntaxFactory.UsingDirective(
systemThreadingUsingName)
});
}
#endregion
return document.WithSyntaxRoot(syntaxTree);
}
【问题讨论】:
-
使用
DocumentEditor对单个文档进行多项更改。 -
@JeroenVannevel - 是否有关于如何在任何地方使用
DocumentEditor的教程?
标签: c# code-analysis roslyn roslyn-code-analysis