我正在玩Roslyn分析器和Codefixes。在我的场景中,我不希望每个域类都应该在另一个项目中有一个相应的构建器。
诊断部分没有问题,但现在我在使用codefix。 这就是我到目前为止所做的:
注册码(工作)
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) {
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
var diagnostic = context.Diagnostics.First();
var diagnosticSpan = diagnostic.Location.SourceSpan;
// Find the type declaration identified by the diagnostic.
var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType<TypeDeclarationSyntax>().First();
var equivalenceKey = "CreateTestDataBuilder";
var codeAction = CodeAction.Create(equivalenceKey, c => CreateTestDataBuilderAsync(context.Document, declaration, c), equivalenceKey: equivalenceKey);
context.RegisterCodeFix(codeAction, diagnostic);
}
创建文档的代码(崩溃)
private async Task<Solution> CreateTestDataBuilderAsync(Document contextDocument, TypeDeclarationSyntax declaration, CancellationToken cancellationToken) {
Project contextDocumentProject = contextDocument.Project;
Solution solution = contextDocumentProject.Solution;
Project testProject = solution.Projects.FirstOrDefault(p => p.Name == contextDocument.Project.Name + ".Test");
if (testProject == null) {
return solution;
}
var semanticModel = await contextDocument.GetSemanticModelAsync(cancellationToken);
var typeSymbol = semanticModel.GetDeclaredSymbol(declaration, cancellationToken);
string[] folders = new[] { "src/Builders" };
Document testDataBuilderDocument = testProject.AddDocument(typeSymbol + "Builder.cs", SourceText.From(string.Format(TestDataBuilderTemplate, typeSymbol.Name)), folders);
bool result = solution.Workspace.TryApplyChanges(solution);
return solution;
}
我想我不知道如何使用codefixes来操作解决方案。有帮助吗?