Анализ кода Visual Studio - создание нового правила для подсчета количества строк в методах - PullRequest
2 голосов
/ 06 сентября 2010

UPDATE

Я отразил Microsoft.Cci.dll и выстроил свое правило. Работает нормально. Тем не менее, я столкнулся с некоторой проблемой, которую я поставил здесь со всеми деталями. Исходный код здесь . Я не хотел увеличивать длину этого вопроса, помещая все детали.

Я пытаюсь написать правило анализа кода, которое выдает предупреждения для методов, имеющих более 100 строк. Я следую этой статье. Однако я не могу подсчитать количество строк, следуя API, предоставленному CodeAnalysis. например,

public override ProblemCollection Check(Member member)
        {
            Method method = member as Method;
            if (method == null)
            {
                return null;
            }
            CheckForLOC(method);
            return Problems;
        }

Ниже следует CheckForLOC ()

private void CheckForLOC(Method method)
    {
        int startLineForMethod = method.Body.SourceContext.StartLine;
        int endLineForMethod = method.Body.SourceContext.EndLine;
        if (endLineForMethod > startLineForMethod
            && ((endLineForMethod - startLineForMethod) > constMaximumLOCforAMethod))
        {
            Resolution resolution = GetResolution(method, constMaximumLOCforAMethod);
            Problem problem = new Problem(resolution);
            Problems.Add(problem);
        }
    }

В приведенном выше коде method.Body.SourceContext.StartLine и method.Body.SourceContext.EndLine возвращают одно и то же значение. Не уверен почему.

Я также пытался использовать StatementCollection: -

private void CheckForLOC(Method method)
        {
            int LOCPerMethod = 0;

            if (method.Body.Statements.Count >= 1)
            {
                foreach (var statement in method.Body.Statements)
                {
                    LOCPerMethod += GetNumberOfLinesPerStatement(statement);
                }

            }
            if (LOCPerMethod > constMaximumLOCforAMethod)
            {
                Resolution resolution = GetResolution(method, constMaximumLOCforAMethod);
                Problem problem = new Problem(resolution);
                Problems.Add(problem);
            }
        }

        private int GetNumberOfLinesPerStatement(Statement statement)
        {
            int LOCperStatement = 0;
            if (statement.SourceContext.EndLine > statement.SourceContext.StartLine)
            {
                LOCperStatement = statement.SourceContext.EndLine - statement.SourceContext.StartLine;
            }
            return LOCperStatement;
        }

Здесь также Statement.SourceContext.StartLine и Statement.SourceContext.EndLine возвращают одно и то же значение. Я вижу, что StartLine для каждого оператора отличается, и нужно вычесть значение StartLine одного оператора из предыдущего. Тем не менее, я вижу, что результат является ошибочным. Например, в приведенном ниже фрагменте метода он дает мне номер строки Statement1 в качестве StartLineNumber, тогда как он должен давать StartLineNumber для If (SomeCondition): -

if(SomeCondition)
{
   Statement1
   Statement2
   Statement3
}

Кто-нибудь может дать какое-то руководство по этому вопросу?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Это скорее правило стиля, чем правило корректности, поэтому он будет лучшим кандидатом в правило StyleCop, чем правило FxCop.

При этом, если вы действительно хотите реализовать его через FxCop,Вы должны взглянуть на то, как Microsoft.FxCop.Sdk.MethodMetrics.CalculateLinesOfCode (Method) выполняет ту же задачу.

1 голос
/ 20 мая 2013

Я искал то же самое (чтобы получить общее количество строк в методе), и я нашел решение.

Ниже приведен образец:

public override ProblemCollection Check(Member member)
    {
        Method method = member as Method;
        if (method != null)
        {
            **if (method.Metrics.ClassCoupling > 20)**
            {
                Resolution resolu = GetResolution(new string[] { method.ToString() });
                Problems.Add(new Problem(resolu));
            }
        }
        return Problems;
    }

Вы можете попробовать method.Metrics.ClassCoupling , чтобы получить общее количество строк метода.

1 голос
/ 19 октября 2010

Инструмент NDepend поддерживает метрику NbLinesOfCode на любом языке .NET. Кроме того, он интегрируется в Visual Studio 2012, 2010, 2008. Отказ от ответственности: я являюсь одним из разработчиков инструмента

Вы просите ...

Создание нового правила для подсчета количества строк в методах

С помощью NDepend вы можете написать Правила кода по запросам LINQ (а именно CQLinq) . Следовательно, создание нового правила для подсчета количества строк в методах может быть так же просто, как написание ...

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

... и получить немедленный результат в Visual Studio. Просто дважды щелкнув метод в результате, вы переходите к объявлению метода в коде:

enter image description here

Вокруг 200 по умолчанию предлагаются запросы и правила кода CQLinq .

...