Roslyn: Как сделать codefix по контексту в другом проекте? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь написать собственный анализатор и кодовое исправление для следующей проблемы.Не забывайте, что я впервые использую API Roslyn.Я с радостью приму любые общие советы и рекомендации.

Существует огромная кодовая база с тысячами классов и требованием для изменения иерархии наследования классов.Мне нужно изменить верхний базовый класс определенных цепочек наследования с System.Object на System.MarshalByRefObject.Проблема заключается в том, что обоснование необходимости изменения в одном из подклассов.Метод AnalyzeSymbol, передается SymbolAnalysisContext, который указывает на один подкласс, но кодовое исправление необходимо в другом месте.

Я попытался передать местоположение объявления базового класса как свойство AdditionalLocations в Diagnosticчто я сообщаю.Это работает, вроде.Я могу получить это местоположение на стороне CodeFixProvider, но только если местоположение находится в том же проекте.Если объявление базового класса находится в другом проекте, как и в большинстве случаев, свойство AdditionalLocations пусто.

Пример в коде:Производный класс помечается анализатором, здесь фиктивная причина - интерфейс IVisible.

// Project A
class BaseClass
{
    ...
}


// Project B
class DerivedClass : BaseClass, API.IVisible
{
    ...
}

Ожидаемый кодовый код:

// Project A
class BaseClass : System.MarshalByRefObject
{
    ...
}


// Project B
class DerivedClass : BaseClass, API.IVisible
{
    ...
}

Какой правильный способ указатьв другой контекст для CodeFixProvider?Есть ли лучший способ сделать такой рефакторинг?

...