使用 Roslyn 创建命名空间代码重构
Create Namespace Code Refactoring using Roslyn
我正在尝试使用 Roslyn 创建代码重构扩展。我想要做的是根据我的默认命名空间重构命名空间。当名称空间只有一个单词时,它成功地找到并替换了名称空间,但是当我的名称空间看起来像 kuku.riku.example
并且我将默认名称空间更改为 aaa
时,结果是 kuku.riku.aaa
而不是 aaa
。我做错了什么?
我的代码:
public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
{
SyntaxNode node = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
NamespaceDeclarationSyntax namespaceDec = (NamespaceDeclarationSyntax)node.ChildNodes()
.FirstOrDefault(syntaxNode => syntaxNode as NamespaceDeclarationSyntax != null);
string defaultNamespace = GetDefaultNamespace(context.Document);
if (defaultNamespace != namespaceDec.Name.ToString())
{
var action = CodeAction.Create("Adjust Namespaces", c => AdjustNamespacesAsync(context.Document, namespaceDec, defaultNamespace, context.CancellationToken));
// Register this code action.
context.RegisterRefactoring(action);
}
}
private static async Task<Solution> AdjustNamespacesAsync(Document document, NamespaceDeclarationSyntax declerationSyntax, string newName, CancellationToken cancelationToken)
{
SemanticModel semanticModel = await document.GetSemanticModelAsync(cancelationToken);
var fist = declerationSyntax.Span;
INamespaceSymbol symbol = semanticModel.GetDeclaredSymbol(declerationSyntax, cancelationToken);
Solution origionalSolution = document.Project.Solution;
OptionSet workspaceOptions = document.Project.Solution.Workspace.Options;
return await Renamer.RenameSymbolAsync(origionalSolution, symbol, newName, workspaceOptions, cancelationToken);
}
如您所见,RenameSymbolAsync
仅重命名您传入的命名空间的一部分。支持添加或删除点的名称空间重命名是我们想要构建的东西,但还没有。
我正在尝试使用 Roslyn 创建代码重构扩展。我想要做的是根据我的默认命名空间重构命名空间。当名称空间只有一个单词时,它成功地找到并替换了名称空间,但是当我的名称空间看起来像 kuku.riku.example
并且我将默认名称空间更改为 aaa
时,结果是 kuku.riku.aaa
而不是 aaa
。我做错了什么?
我的代码:
public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
{
SyntaxNode node = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
NamespaceDeclarationSyntax namespaceDec = (NamespaceDeclarationSyntax)node.ChildNodes()
.FirstOrDefault(syntaxNode => syntaxNode as NamespaceDeclarationSyntax != null);
string defaultNamespace = GetDefaultNamespace(context.Document);
if (defaultNamespace != namespaceDec.Name.ToString())
{
var action = CodeAction.Create("Adjust Namespaces", c => AdjustNamespacesAsync(context.Document, namespaceDec, defaultNamespace, context.CancellationToken));
// Register this code action.
context.RegisterRefactoring(action);
}
}
private static async Task<Solution> AdjustNamespacesAsync(Document document, NamespaceDeclarationSyntax declerationSyntax, string newName, CancellationToken cancelationToken)
{
SemanticModel semanticModel = await document.GetSemanticModelAsync(cancelationToken);
var fist = declerationSyntax.Span;
INamespaceSymbol symbol = semanticModel.GetDeclaredSymbol(declerationSyntax, cancelationToken);
Solution origionalSolution = document.Project.Solution;
OptionSet workspaceOptions = document.Project.Solution.Workspace.Options;
return await Renamer.RenameSymbolAsync(origionalSolution, symbol, newName, workspaceOptions, cancelationToken);
}
RenameSymbolAsync
仅重命名您传入的命名空间的一部分。支持添加或删除点的名称空间重命名是我们想要构建的东西,但还没有。