如何在源代码中创建具有正确行号的 FxCop Problem() 对象

Posted

技术标签:

【中文标题】如何在源代码中创建具有正确行号的 FxCop Problem() 对象【英文标题】:How to create FxCop Problem() object with correct line number in source 【发布时间】:2011-10-27 21:43:53 【问题描述】:

我创建了一个检查 DateTime.Now 使用的 FxCop 规则。它工作得很好,除了它将有问题的行号报告为方法的开始,而不是实际调用 DateTime.Now 的代码行。我需要做什么才能在 FxCop 报告中获得正确的行号。这是我的代码:

public override void VisitMemberBinding(MemberBinding memberBinding)

   string name = memberBinding.BoundMember.FullName;
   if (name == "System.DateTime.get_Now")
   
      Problems.Add(new Problem(GetResolution(), memberBinding.BoundMember.SourceContext));
   

   base.VisitMemberBinding(memberBinding);

我试过 memberBinding.SourceContext 和 memberBinding.BoundMember.SourceContext 都返回方法的起始行号。

我可以使用 SourceContext.(Start|End)LineNumber 但是哪一个?似乎我只是没有使用正确的 object.SourceContext

【问题讨论】:

【参考方案1】:

核心问题是 FxCop 分析引擎没有将源上下文分配给成员绑定。但是,它确实为方法调用分配了源上下文,因此您可以将您的 VisitMemberBinding 覆盖替换为以下 VisitMethodCall 覆盖:

public override void VisitMethodCall(MethodCall call)

    string name = ((MemberBinding)call.Callee).BoundMember.FullName;
    if (name == "System.DateTime.get_Now")
    
        this.Problems.Add(new Problem(this.GetResolution(), call));
    

    base.VisitMethodCall(call);

【讨论】:

工作得很好,谢谢!所以 VisitMemeberBinding 发生在 DateTime.Now 属性内,而 VisitMethodCall 发生在 DateTime.Now 被调用时?还是反过来? VisitMemberBinding 实际上将由基本的 VisitMethodCall 调用。但是,方法调用有额外的元数据可用,因为它是一条指令,其源上下文在 PDB 文件中被跟踪。我不太确定 FxCop 团队为什么不选择将该源上下文传输到被调用方法的成员绑定,因为我想不出任何不可靠的情况。无论哪种方式,它都不存在,所以我们不能使用它。

以上是关于如何在源代码中创建具有正确行号的 FxCop Problem() 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中创建具有匹配颜色和线条形状的图例

在 ExtJs 中创建具有两个比例的网格

如何在颤动中创建具有多行的行

此代码是不是会在我的合约中创建一致的数据存储? + 如何正确使用内存

如何在 swiftUI 中创建具有多列的列表?

在 WordPress 中创建具有某些属性的短代码