代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

Visual Studio代码分析-创建新规则以计算方法中的行数

  •  2
  • Ashish Gupta Shiva  · 技术社区  · 14 年前

    更新

    我想了想Microsoft.Cci.dll建立我的规则。很好用。然而,我面临着一些我提出的问题 here here . 我不想把所有的细节都说出来,从而增加这个问题的篇幅。

    我正在尝试编写一个代码分析规则,该规则将对具有 超过100行。我在跟踪 this 文章。但是,我无法通过遵循CodeAnalysis提供的API来计算行数。例如,

    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);
            }
        }
    

    在上述代码中,方法.Body.SourceContext斯达林和方法.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;
            }
    

    这里也是,语句.SourceContext.StartLine以及语句.SourceContext.EndLine返回相同的值。我看到每个语句的StartLine是不同的,需要将一个语句的StartLine值从其前一个语句中减去。但是,我看到结果是不稳定的。例如,在方法中的下面代码段中,它将语句1的行号作为startInNumber,而应该将If(SomeCondition)的startInNumber指定为:-

    if(SomeCondition)
    {
       Statement1
       Statement2
       Statement3
    }
    

    有人能给我指点方向吗?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Nicole Calinoiu    14 年前

    这更像是一个样式规则而不是一个正确性规则,因此它比FxCop规则更适合于StyleCop规则。

        2
  •  1
  •   Patrick from NDepend team    12 年前

    NbLinesOfCode 免责声明:我是该工具的开发人员之一

    创建新规则以计算方法中的行数

    使用NDepend,您可以编写 Code Rules over LINQ Queries (namely 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 default CQLinq code queries and rules 默认情况下建议。

        3
  •  1
  •   Vijay Sutaria    11 年前

    我在寻找相同的方法(得到一个方法中的总行数),我找到了解决方案。

    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;
        }
    

    你可以试试