zoukankan      html  css  js  c++  java
  • 自定义StyleCop规则

    参考:StyleCopSDK.chm与 Byeah的 编写StyleCop自定义规则教程(一)---编写中文备注的简单校验规则

    1.建立“类库”类型的C#项目

    2.加入 Microsoft.StyleCop.dll 与 Microsoft.StyleCop.CSharp.dll 的引用

    3.增加一个类,继承于:SourceAnalyzer,并带有 [SourceAnalyzer(typeof(CsParser))] 标题头。

    4.重写AnalyzeDocument方法

    5.使用WalkDocument遍历代码,并执行指定的方法

    6.建立与类同名的XML文件

    编译,生成 DLL
    放到C:Program FilesMicrosoft StyleCop 4.3
    打开VS2008,即可让规则生效

    编号定义:飞鹏替换规则为 FP+原编号,飞鹏新规则为 FPN+100开始的编号

    已生效的,VS2008 打开的情况下,就不能删除了。(以前认为已生效的,要失效一次,再生效一次,是不是CACHE造成的误解)

    如何调试?
    生成,拷贝到stylecop目录,启动VS2008,执行 StyleCop
    在生成后事件命令行输入如下内容会方便很多:
    copy "$(TargetDir)$(TargetName).*" "C:Program FilesMicrosoft StyleCop 4.3" /y

    element 这个对象必须非常熟悉

    代码如果没有变更,检测也是假的,调试不会中断。要把使用 cache 关掉

    =====跟踪

    [证明是错的]如果已被系统检查了,就不会产生中断了。(例如 SA1623开启时,FP1623就不会中断)

    VS2008打开时,原来注册的,现在却无法取消

    VS产生的XML文件格式与记事本产生的有一些不同(都是 UTF-8)

    XML是包含在DLL的资源中,而不是分成两个文件

    代码分析:

    执行 WalkDocument 时,StyleCop 调用 CodeWalker<T>.Start(静态方法)
    (反射工具有一个错误:查找 CodeWalker.Start 的 User By 时,只找到 CSharp.Expression.WalkExpression 调用它,实际上 CsDocument类 的 WalkDocument 方法也有调用)
    Start时,创立一个 CodeWalker 实例。
    创立实例时,又执行 this.WalkElement
    WalkElement里面代码如下:
    private bool WalkElement(CsElement element, CsElement parentElement, T context)
    {
        if (element != null)
        {
            // 元素不为空时
            // 第一次调用时,context 为空
            T local = context;
            if (!this.VisitElement(element, parentElement, ref local))
            {
                // 查看元素,返回 false 时
                return false;
            }

            foreach (Statement statement in element.ChildStatements)
            {
                // 对元素的每一个表达式进行检查
                if (!this.WalkStatement(statement, null, null, element, local))
                {
                    return false;
                }
            }

            foreach (CsElement element2 in element.ChildElements)
            {
                // 对元素的每一个子类进行检查
                if (!this.WalkElement(element2, element, local))
                {
                    return false;
                }
            }
        }

        // 返回 true,让下一个子类检查得以继续
        return true;
    }
    第一次进入时,元素即 CsDocument.RootElement(Namespace{}),
    VisitElement里面代码如下:
    private bool VisitElement(CsElement element, CsElement parentElement, ref T context)
    {
        if (this.elementCallback != null)
        {
            return this.elementCallback(element, parentElement, context);
        }

        return true;
    }
    elementCallback 就是我们自己写的子程序了。

    现在的担心,如果我们写的代码没有像原规则那样考虑那么多问题,怎么办?
    不过,反射工具可以提供内部所有代码:
    装载 Microsoft.StyleCop.CSharp.Rules.dll
    先搜索 AnalyzeDocument (它的做法与我们的做法是一样的)找到DocumentationRules的那个(因为 SA1603在DocumentationRules中)
    Microsoft.StyleCop.CSharp.DocumentationRules.AnalyzeDocument(CodeDocument) : Void
    里面有一个代码:
    this.CheckElementDocumentation(document2);
    中间也是用 WalkDocument
        document.WalkDocument<AnalyzerSettings>(new CodeWalkerElementVisitor<AnalyzerSettings>(this.CheckDocumentationForElement), context);
    注册的内容为:CheckDocumentationForElement,点下去,
    对于属性,它有:this.CheckHeader(element, settings, false);
    接着对于有头内容的,它执行: this.ParseHeader(element, element.Header, element.LineNumber, partialElement);
    ParseHeader,对属性的处理代码如下:
            else if (element.ElementType == ElementType.Property)
            {
                this.CheckPropertyValueTag(element, doc);
                this.CheckPropertySummaryFormatting(element as Property, doc);
            }
    这时,进入关键的代码:CheckPropertySummaryFormatting
    这个就是网页中(http://www.cnblogs.com/Byeah/archive/2011/06/27/2091222.html)体现的代码,放心了,我们的代码就是抄它的。

  • 相关阅读:
    【工业控制】What is a Waveform
    【工业控制】什么是波形
    【工业控制】学习喷墨打印技术 怎么能不知道波形
    【工业控制】UV打印机喷头波形和墨水关系
    VMware-workstation-full序列码
    【Centos】Centos7.5取消自动锁屏功能
    微信公众平台开发入门教程(图文)
    微信公众平台开发(34)微相册
    微信公众平台开发(33)在线点歌/在线音乐
    微信公众平台开发(32)快递物流
  • 原文地址:https://www.cnblogs.com/yzx99/p/3356308.html
Copyright © 2011-2022 走看看