ОБНОВЛЕНИЕ
Я отразил 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
}
Может ли кто-нибудь дать какое-то направление по этому поводу?