Перед тем, как StyleCop регистрирует нарушение правила, он выполняет проверку, чтобы убедиться, что нарушение должно быть подавлено. Он делает это, проверяя, указано ли подавление в элементе (который вызывает нарушение) или любой из его родителей (например, класс будет родителем метода, метод будет родителем элемента объявления переменной в метод). Это означает, что два различных нарушения внутри метода будут подавлены подавлением самого метода.
Ключевым моментом является поиск соответствующего элемента и поиск элементов. Следующий метод в CsParser.cs, в рамках проекта CSharperParser источника:
private static bool MatchElementWithPossibleElementsTraversingParents(CsElement element, IList<CsElement> possibleElements)
{
Param.AssertNotNull(element, "element");
Param.AssertNotNull(possibleElements, "possibleElements");
// Loop through each possible element using a for-style loop rather than a foreach, since this
// is faster and this method is called very often.
for (int i = 0; i < possibleElements.Count; ++i)
{
CsElement possibleMatch = possibleElements[i];
// Walk through the element and each of its parents to see if any is a match.
CsElement item = element;
while (item != null)
{
if (item == possibleMatch)
{
return true;
}
item = item.FindParentElement();
}
}
return false;
}
Резервное копирование немного, чтобы понять контекст, элемент параметра CsElement будет родительский элемент анализируемой лексемы, где нарушение имеет были обнаружены и возможныеElements - список CsElements, привязанных к правилу подавления. Каждый элемент, который проходит через этот метод, будет соответствовать перечислению «ElementType», используемому стилем. Несколько типов элементов элемента - это класс, поле, конструктор и использование директивы, в которой один из этих типов элементов будет привязан к рассматриваемому нарушению.
В примере, указанном в моем вопросе, это фактически то, что происходит;
- Анализатор правил (например, SpacingRules.cs) столкнулся с нарушением на 'var Temp = ""; и сообщите, что это номер строки/местоположения строки и текущий родительский элемент токена в ядре stylecop.
- Stylecop затем будет запускаться через MatchElementWithPossibleElementsTraversingParents, начиная с родительского элемента инструкции, который является методом 'Testing1()'.
- Наш методMatch здесь - это метод CsElement, метод 'Testing1()', который был разобран и добавлен в список подавления ранее, так как над ним был помещен атрибут подавления.
- Элементы соответствуют, поэтому первое нарушение будет подавлено.
- Сразу после этого в следующем утверждении будет найдено другое нарушение того же типа. Однако это родительский тип - это то, что будет искать сначала, так что «Testing1()».
Следовательно, оба нарушения подавляются одним и тем же атрибутом подавления, поэтому ответ на мой вопрос в конечном итоге отсутствует.
Я ценю предложение для этого конкретного стиля кодирования и, безусловно, согласен с ним. Однако в случае этого вопроса я пытаюсь выяснить, может ли правило, где правило быть любым правилом, может быть подавлено и по-прежнему иметь другое правило того же типа внутри одного и того же метода/класса, которое нарушает нарушение. Пока это кажется невозможным, но я просто хотел бы узнать, знает ли кто-то другой. – sseghers