У меня есть немного конкретного здесь, в основном, я загружаю в специальное рабочее пространство и получаю ошибки, связанные с определенным значением в компиляции, потому что я точно знаю, какой текст мне нужно заменить, но не где. Код ниже.
public static async Task<Solution> UpdateEntityReferences(Solution solution, ProjectId servicesId, string oldValue, string newValue)
{
var project = solution.GetProject(servicesId);
var compilation = await project.GetCompilationAsync();
var diagnostics = compilation.GetDiagnostics().Where(diag => diag.GetMessage().Contains($"'{oldValue}'"));
foreach (var diagnostic in diagnostics)
{
var errorLineSpan = diagnostic.Location.GetLineSpan();
var document = project.FindDocumentByName(Path.GetFileName(errorLineSpan.Path));
var syntaxRoot = await document.GetSyntaxRootAsync();
var errorSpan = errorLineSpan.Span;
}
return solution;
}
Итак, с кодом до сих пор я получаю местоположение ошибки и в основном хочу вернуть новую версию этого документа с заменой «errorSpan» текстом «newValue», но не могу найти способ сделать это, возможно ли это ?
РЕДАКТИРОВАТЬ: с помощью Получите указанный SyntaxNode номер строки в SyntaxTree Я могу получить SyntaxNode из SyntaxTree и должен иметь возможность заменить текстовый диапазон (цикл for становится показанным ниже), но это не работает.
foreach (var diagnostic in diagnostics)
{
var errorLineSpan = diagnostic.Location.GetLineSpan();
var document = project.FindDocumentByName(Path.GetFileName(errorLineSpan.Path));
var syntaxTree = await document.GetSyntaxTreeAsync();
var errorSpan = errorLineSpan.Span;
var lineSpan = syntaxTree.GetText().Lines[errorSpan.Start.Line].Span;
var node = syntaxTree.GetRoot().DescendantNodes(lineSpan)
.First(n => lineSpan.Contains(n.FullSpan));
var errorTextSpan = TextSpan.FromBounds(errorSpan.Start.Character, errorSpan.End.Character);
var newNodeText = node.GetText().Replace(errorTextSpan, newValue);
}
Текст заменяется (неправильно в половине случаев), а затем у меня остается объект SourceText, который я не могу понять, как заменить в документе. Любые идеи?
Document.WithText(SourceText text)
для получения новой версии Document, затем использоватьProject.RemoveDocument(...)
для удаления старой версии иProject.AddDocument(...)
для добавления новой. Кстати, если вы попытаетесь написать собственный провайдер исправления кода, будет лучше, если вы будете исправлять документ, а не решение. - person George Alexandria   schedule 27.07.2018SyntaxRoot
, просто используйтеDocument.WithSyntaxRoot(newRoot)
или если вы хотите заменитьSourceText
, используйтеDocument.WithText(SourceText text)
, а затем, в обоих случаях, добавьте новый документ в текущий проект и удалите старый документ:Project.AddDocument(...), ... Project.RemoveDocument(...);
. Если у вас все еще есть проблема, сообщите об этом. - person George Alexandria   schedule 28.07.2018