【问题标题】:Is there a standard ReSharper code style definition that matches all the StyleCop requirements?是否有符合所有 StyleCop 要求的标准 ReSharper 代码样式定义?
【发布时间】:2010-09-08 15:24:49
【问题描述】:

ReSharper 重新格式化代码功能非常方便和灵活,特别是 JetBrains 在 3.0 版中添加了新的代码布局模板灵活性。

是否有一组标准的 ReSharper 代码样式设置与 Microsoft StyleCop 强制执行的规则相匹配,以便 StyleCop 合规性可以像运行 ReSharper“重新格式化代码”功能一样简单?

【问题讨论】:

    标签: resharper stylecop


    【解决方案1】:

    试用 ReSharper StyleCop 插件:http://www.codeplex.com/StyleCopForReSharper

    【讨论】:

    • 这个插件看起来很方便,但你误解了我的问题。我一直在寻找一些与 StyleCop 规定的匹配的预装 ReSharper 代码样式格式设置(例如,公共/私有成员的排序、括号周围的空格等)
    • 更新:StyleCopForResharper 现在附带一个标准代码样式设置文件,可以将其导入 ReSharper。
    【解决方案2】:

    我也在寻找同样的东西。

    这是一个自定义类型成员布局:

    <?xml version="1.0" encoding="utf-8"?>
    <Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">
    
      <!--Do not reorder COM interfaces and structs marked by 
          StructLayout attribute-->
      <Pattern>
        <Match>
          <Or Weight="100">
            <And>
              <Kind Is="interface"/>
              <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"/>
            </And>
            <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"/>
          </Or>
        </Match>
      </Pattern>
    
      <!--Special formatting of NUnit test fixture-->
      <Pattern RemoveAllRegions="true">
        <Match>
          <And Weight="100">
            <Kind Is="class"/>
            <HasAttribute CLRName="NUnit.Framework.TestFixtureAttribute" 
                          Inherit="true"/>
          </And>
        </Match>
    
        <!--Setup/Teardow-->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Or>
                <HasAttribute CLRName="NUnit.Framework.SetUpAttribute" 
                              Inherit="true"/>
                <HasAttribute CLRName="NUnit.Framework.TearDownAttribute" 
                              Inherit="true"/>
                <HasAttribute CLRName="NUnit.Framework.FixtureSetUpAttribute" 
                              Inherit="true"/>
                <HasAttribute CLRName="NUnit.Framework.FixtureTearDownAttribute" 
                              Inherit="true"/>
              </Or>
            </And>
          </Match>
          <Group Region="Setup/Teardown"/>
        </Entry>
    
        <!--All other members-->
        <Entry/>
    
        <!--Test methods-->
        <Entry>
          <Match>
            <And Weight="100">
              <Kind Is="method"/>
              <HasAttribute CLRName="NUnit.Framework.TestAttribute" 
                            Inherit="false"/>
            </And>
          </Match>
          <Sort>
            <Name/>
          </Sort>
        </Entry>
      </Pattern>
    
      <!--Default pattern-->
      <Pattern>
        <!--public delegate-->
        <Entry>
          <Match>
            <And Weight="100">
              <Access Is="public"/>
              <Kind Is="delegate"/>
            </And>
          </Match>
          <Sort>
            <Name/>
          </Sort>
          <Group Region="Delegates"/>
        </Entry>
    
        <!--public enum-->
        <Entry>
          <Match>
            <And Weight="100">
              <Access Is="public"/>
              <Kind Is="enum"/>
            </And>
          </Match>
          <Sort>
            <Name/>
          </Sort>
          <Group>
            <Name Region="${Name} enum"/>
          </Group>
        </Entry>
    
        <!--fields and constants-->
        <Entry>
          <Match>
            <Or>
              <Kind Is="constant"/>
              <Kind Is="field"/>
            </Or>
          </Match>
          <Sort>
            <Kind Order="constant field"/>
            <Readonly/>
            <Static/>
            <Name/>
          </Sort>
          <Group Region="Fields"/>
        </Entry>
    
        <!-- Events-->
        <Entry>
          <Match>
            <Kind Is="event"/>
          </Match>
          <Sort>
            <Name/>
          </Sort>
          <Group Region="Events"/>
        </Entry>
    
        <!--Constructors. Place static one first-->
        <Entry>
          <Match>
            <Kind Is="constructor"/>
          </Match>
          <Sort>
            <Static/>
          </Sort>
          <Group Region="Constructors"/>
        </Entry>
    
        <!--properties, indexers-->
        <Entry>
          <Match>
            <Or>
              <Kind Is="property"/>
              <Kind Is="indexer"/>
            </Or>
          </Match>
          <Sort>
            <Name/>
          </Sort>
          <Group Region="Properties"/>
        </Entry>
    
        <!--interface implementations-->
        <Entry>
          <Match>
            <And Weight="100">
              <Kind Is="member"/>
              <ImplementsInterface/>
            </And>
          </Match>
          <Sort>
            <ImplementsInterface Immediate="true"/>
            <Kind Order="property"/>
            <Name/>
          </Sort>
          <Group>
            <ImplementsInterface Immediate="true" 
                                 Region="${ImplementsInterface} Members"/>
          </Group>
        </Entry>
    
        <!-- public Methods -->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Access Is="public"/>
            </And>
          </Match>
          <Sort>
            <Static/>
            <Name/>
          </Sort>
          <Group>
          </Group>
        </Entry>
    
        <!-- internal Methods -->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Access Is="internal"/>
            </And>
          </Match>
          <Sort>
            <Static/>
            <Name/>
          </Sort>
          <Group>
          </Group>
        </Entry>
    
        <!--protected internal Methods -->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Access Is="protected-internal"/>
            </And>
          </Match>
          <Sort>
            <Static/>
            <Name/>
          </Sort>
          <Group>
          </Group>
        </Entry>
    
    
        <!-- protected Methods -->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Access Is="protected"/>
            </And>
          </Match>
          <Sort>
            <Static/>
            <Name/>
          </Sort>
          <Group>
          </Group>
        </Entry>
    
        <!-- private Methods -->
        <Entry>
          <Match>
            <And>
              <Kind Is="method"/>
              <Access Is="private"/>
            </And>
          </Match>
          <Sort>
            <Static/>
            <Name/>
          </Sort>
          <Group>
          </Group>
        </Entry>
    
        <!--all other members-->
        <Entry/>
    
        <!--nested types-->
        <Entry>
          <Match>
            <Kind Is="type"/>
          </Match>
          <Sort>
            <Name/>
          </Sort>
          <Group>
            <Name Region="Nested type: ${Name}"/>
          </Group>
        </Entry>
      </Pattern>
    </Patterns>
    <!--
    I. Overall
    
    I.1 Each pattern can have <Match>....</Match> element. For the given type 
        declaration, the pattern with the match, evaluated to 'true' with the 
        largest weight, will be used 
    I.2 Each pattern consists of the sequence of <Entry>...</Entry> elements. 
        Type member declarations are distributed between entries
    I.3 If pattern has RemoveAllRegions="true" attribute, then all regions 
        will be cleared prior to reordering. Otherwise, only auto-generated 
        regions will be cleared
    I.4 The contents of each entry is sorted by given keys (First key is 
        primary,  next key is secondary, etc). Then the declarations are 
        grouped and en-regioned by given property
    
    II. Available match operands
    
    Each operand may have Weight="..." attribute. This weight will be added 
    to the match weight if the operand is evaluated to 'true'.The default 
    weight is 1
    
    II.1 Boolean functions:
    II.1.1 <And>....</And>
    II.1.2 <Or>....</Or>
    II.1.3 <Not>....</Not>
    
    II.2 Operands
    II.2.1  <Kind Is="..."/>. Kinds are: class, struct, interface, enum, 
            delegate, type, constructor, destructor, property, indexer, method, 
            operator, field, constant, event, member
    II.2.2  <Name Is="..." [IgnoreCase="true/false"] />. The 'Is' attribute 
            contains regular expression
    II.2.3  <HasAttribute CLRName="..." [Inherit="true/false"] />. The 'CLRName'
            attribute contains regular expression
    II.2.4  <Access Is="..."/>. The 'Is' values are: public, protected, internal,
            protected internal, private
    II.2.5  <Static/>
    II.2.6  <Abstract/>
    II.2.7  <Virtual/>
    II.2.8  <Override/>
    II.2.9  <Sealed/>
    II.2.10 <Readonly/>
    II.2.11 <ImplementsInterface CLRName="..."/>. The 'CLRName' attribute 
            contains regular expression
    II.2.12 <HandlesEvent />
    -->
    

    基于这个,这对我没有用,但值得称赞的是:http://www.clydesdalesoftware.net/blogs/jluif/CommentView,guid,1875594b-0d23-401f-8e22-f1cbf87beefe.aspx

    这是一个符合 stylecop 的标头 sn-p:

    // <copyright file="$FileName$" company="$Company$">
    // Copyright (c) 2008 All Right Reserved
    // </copyright>
    // <author>$author$</author>
    // <email>$email$</email>
    // <date>$date$</date>
    // <summary>$summary$</summary>
    

    还没有完成,但这是一个开始。

    自此答案以来,自定义类型成员布局已放入 StyleCop for resharper 插件中。见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多