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
}
Кто-нибудь может дать какое-то руководство по этому вопросу?