Данный репозиторий представляет собой анализатор и кодфиксер, написанный с использованием
Roslyn API
- Возвращение
nullзначения вместо пустой коллекции в методах, возвращаемым типом которых является коллекция- В том числе кейсы, где есть
yield return
- В том числе кейсы, где есть
- Использование непереопределённого оператора
==для сравнения типов (вместо.Equals)
-
В случае, когда возвращаемый тип у коллекций - один из: [
IEnumerable,IList,ICollection,IReadOnlyCollection,List,IReadOnlyList,SortedList] илиArrayи возвращаетсяnullвместо пустой коллекци- Кидается диагностика о том, что это нужно фиксить
- В случае обычного
returnArray<T>-nullзаменяется наreturn new T[] { }List<T>-nullзаменяется наreturn new List<T>()- В остальных случаях -
nullзаменяется наreturn Array.Empty<T>()
- В случае
yeld returnIEnumerable<T[]>-nullзаменяется наyeld return new T[] { }IEnumerable<List<T>>-nullзаменяется наyeld return new List<T>()- В остальных случаях -
nullзаменяется наyeld return Array.Empty<T>()
-
В случае, когда используется оператор
==требуется проанализировать базовые классы от сравниваемых, чтобы проанализировать, есть ли у них перегрузка==или.Equals- Если оба операнда, являющиеся
ref type, НЕ имеют перегрузки==(учитывая базовые классы) - диагностика кидается и==заменяется на.Equals - Если оба операнда, являющиеся
ref type, имеют перегрузки==(учитывая базовые классы) - диагностика не кидается - Если оба операнда, являются
value type- диагностика не кидается - Если левый операнд имеет перегрузку
==(учитывая базовые классы), а правый не имеет - диагностика не кидается - Если правый операнд имеет перегрузку, а правый не имеет - диагностика кидается и
==заменяется на.Equals - Если хотя бы один операнд является
interface- диагностика не кидается
- Если оба операнда, являющиеся
Стоит заметить что анализатор сразу отбрасывает случаи, когда хотя бы один операнд является value type или interface, т.к. сравнение value types по дефолту идёт посредством сопоставления всех полей 2х операндов, а реализовать сравнение у интерфейсов довольно проблематично.

