Roslynを使用してコードリファクタリング拡張を作成しようとしています。私がしたいことは、デフォルトの名前空間に従ってリファクタの名前空間です。名前空間が見つからない場合は、名前空間がkuku.riku.example
のようになり、デフォルトの名前空間をaaa
に変更すると、結果はaaa
ではなくkuku.riku.aaa
になります。私は間違って何をしていますか?名前空間コードを作成するRoslynを使用してリファクタリングする
マイコード:あなたが見ているよう
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);
}
新しい識別子がネストされたブロックで '使用中 'と衝突すると、ドットを追加すると非常に複雑なコーナーケースが作成される可能性があるため、これはまだサポートされていません。 – SLaks