Мой софт:
Visual Studio Enterprise 2015 update 3 (14.0.25431.1), Resharper Ultimate 2016.2.2
В проекте используется LanguageExt.Core 1.9.2 (не спрашивайте меня — зачем оно, его туда уже притащили и с этим надо жить)
Пример метода
public Either<ControlException, BoringSectionDTO> RetrieveBoringSection(int employeeId)
=> Prelude.match(_securityService.GetCurrentUserId(), userId =>
Prelude.match(
_boringSectionRepository.RetrieveBoringSection(employeeId, userId),
section =>
Prelude.match(
_subsection1SecurityService.ApplyFieldsSecurity(section.Subsection1),
succededSubsection1Applied =>
Prelude.match(
_subsection2SecurityService.ApplyFieldsSecurity(
section.Subsection2), succededSubsection2Applied =>
Prelude.match(
_subsection3SecurityService.ApplyFieldsSecurity(
section.Subsection3), succededSubsection3Applied =>
Prelude.match(
_subsection4SecurityService.ApplyFieldsSecurity(
section.Subsection4), succededSubsection4Applied =>
Prelude.Right<ControlException, BoringSectionDTO>(
new BoringSectionDTO
{
Subsection1 = _typeAdapter
.Create
<MetadataObjectContainer<SubsectionType1>,
MetadataResponse<SubsectionType1DTO>>(
section.Subsection1),
Subsection2 = _typeAdapter
.Create
<MetadataObjectContainer<SubsectionType2>,
MetadataResponse<SubsectionType2DTO>>(
section.Subsection2),
Subsection3 = _typeAdapter
.Create
<MetadataObjectContainer<SubsectionType3>,
MetadataResponse<SubsectionType3DTO>>(
section.Subsection3),
Subsection4 = _typeAdapter
.Create
<MetadataObjectContainer<SubsectionType4>,
MetadataResponse<SubsectionType4DTO>>(
section.Subsection4),
}),
failToApply => failToApply),
failToApply => failToApply),
failToApply => failToApply),
failToApply => failToApply)
, failedToRetrieve => failedToRetrieve),
failedToRertieve => failedToRertieve);
Что здесь происходит — репозиторий (слой persistence) возвращает данные сотрудника из нескольких частей в виде доменного объекта, его части как-то фильтруются перед показом юзеру, затем преобразуются с помощью Autofac в DTO и улетают выше — в вебсервис.
Вроде бы ничего сложного, но — даже при простом перемещении текстового курсора по классу с несколькими такими методами, задержки между нажатием клавиши и перемещением курсора могут составлять 10-15 секунд. Это как-то совсем ненормально. Даже если закрыть файл, решарпер продолжит чего-то напряженно думать, и более того — даже запущенная сборка проекта не останавливает размышления решарпера, которые уже не нужны.
Я не думаю, что в разборе подобного кода есть какая-то большая алгоритмическая сложность, уж не хуже развесистого LINQ.
Можете починить?