Как ограничить запрос методов NDepend по атрибуту типа

Я пытаюсь заставить NDepend идентифицировать длинные методы, используя модифицированную версию стандартного запроса «Слишком большие методы».

Я не хочу сообщать о длинных методах, над которыми у разработчиков мало контроля, поэтому я отфильтровываю сгенерированный код, используя атрибут DebuggerNonUserCode и InitializeComponent().

К сожалению, я все еще получаю несколько ложных срабатываний, поскольку также сообщаются методы в сгенерированных типах. Проблема в том, что хотя у самого типа есть атрибут DebuggerNonUserCode, а у методов его нет, поэтому они включаются в вывод, несмотря на то, что они сгенерированы.

Я ищу что-то вроде соединения между типами и методами: дайте мне все типы, у которых нет атрибута DebuggerNonUserCode, и выполните запрос для них, но я не могу понять, как выразить это в CQL.

Для некоторых сборок я могу просто фильтровать по полному имени, но, к сожалению, некоторые из наших сборок смешивают типы, созданные разработчиком, и сгенерированные типы. К сожалению, в этом случае нельзя использовать IsGeneratedByCompiler.

Мой запрос

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC

person Brian Rasmussen    schedule 04.03.2010    source источник
comment
Я не смог найти способ объединения методов и информации о типах, и даже в примечаниях к выпуску V3 это не упоминается.   -  person Timores    schedule 04.03.2010
comment
Вы пробовали использовать атрибут метода IsGeneratedByCompiler?   -  person Timores    schedule 04.03.2010
comment
@Timores: Точно, я бы хотел объединить их. Я не смотрел на IsGeneratedByCompiler. Судя по документации, это не помогает. но я все равно попробую и обновлю вопрос.   -  person Brian Rasmussen    schedule 04.03.2010
comment
Я отправил запрос в службу поддержки NDepend. Я обновлю комментарий или опубликую ответ, когда что-то получу.   -  person Timores    schedule 04.03.2010


Ответы (2)


Брайан, спасибо Code Rule over LINQ Query (CQLinq) за исходный код кода правило, которое вы просите:

warnif count > 0
from m in Application.Methods where
  m.NbLinesOfCode > 30 &&
 !m.ParentType.HasAttribute( "System.Diagnostics.DebuggerNonUserCodeAttribute") &&
  m.Name != "InitializeComponent()"
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }

Синтаксис CQLinq также позволяет определить, что такое Just-My-Code. Эта функция описана здесь. В основном вам нужно определить набор JustMyCode с помощью запросов с префиксом notmycode. Тогда правило, которое вы запрашиваете, можно легко переписать:

warnif count > 0
from m in JustMyCode.Methods where
   m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending    
select new { m, m.NbLinesOfCode }

Набор JustMyCode, определенный один раз для всех, можно повторно использовать в любом правиле кода. Кроме того, вы можете просмотреть запрос по умолчанию notmycode Отменить сгенерированный и дизайнерские методы из JustMyCode

person Timores    schedule 05.03.2010

Мне очень нравится NDepend, но по-прежнему самым большим недостатком является то, что информация о пространстве имен/типе/методе не может быть объединена в один запрос. Эта функция сделает CQL действительно мощным инструментом.

Кроме того, могут быть полезны проверки 'IsGeneratedByCompiler' и 'IsInFrameworkAssembly'. Вы также можете удалить определенные пространства имен из запроса (ВНЕ ПРОСТРАНСТВА ИМЕН "...")

person flq    schedule 04.03.2010
comment
Конечно, было бы! Я знаю о функции OUT OF, но, к сожалению, соответствующие сборки объединяют как код, созданный разработчиком, так и код генерации в одном и том же пространстве имен :( - person Brian Rasmussen; 04.03.2010
comment
flq, Брайан, посмотри на мой ответ выше :) - person Patrick from NDepend team; 05.06.2012