Skip to content

Instantly share code, notes, and snippets.

@kbaesler
Last active December 28, 2015 08:29
Show Gist options
  • Save kbaesler/7472165 to your computer and use it in GitHub Desktop.
Save kbaesler/7472165 to your computer and use it in GitHub Desktop.
A ReSharper Type Member Layout for C# that organizes the contents into logical regions.
<?xml version="1.0" encoding="utf-8" ?>
<!--
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 />
-->
<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"/>
<Or>
<HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"/>
<HasAttribute CLRName="System.Runtime.InteropServices.ComImport"/>
</Or>
</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 RemoveAllRegions="true">
<!-- delegate-->
<Entry>
<Match>
<Kind Is="delegate"/>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Delegates"/>
</Entry>
<!-- enum-->
<Entry>
<Match>
<Kind Is="enum"/>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Enumerations"/>
</Entry>
<!--constants-->
<Entry>
<Match>
<Kind Is="constant"/>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Constants"/>
</Entry>
<!--instance fields-->
<Entry>
<Match>
<Kind Is="field"/>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Fields"/>
</Entry>
<!--constructors. Place static one first-->
<Entry>
<Match>
<Kind Is="constructor"/>
</Match>
<Sort>
<Static/>
</Sort>
<Group Region="Constructors"/>
</Entry>
<!--destructors. Place static one first-->
<Entry>
<Match>
<Kind Is="destructor"/>
</Match>
<Sort>
<Static/>
</Sort>
<Group Region="Destructors"/>
</Entry>
<!-- events -->
<Entry>
<Match>
<Kind Is="event"/>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Events"/>
</Entry>
<!--public properties, indexers-->
<Entry>
<Match>
<And>
<Access Is="public"/>
<Or>
<Kind Is="property"/>
<Kind Is="indexer"/>
</Or>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Public Properties"/>
</Entry>
<!--internal properties, indexers-->
<Entry>
<Match>
<And>
<Access Is="internal"/>
<Or>
<Kind Is="property"/>
<Kind Is="indexer"/>
</Or>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Internal Properties"/>
</Entry>
<!--protected-internal properties, indexers-->
<Entry>
<Match>
<And>
<Access Is="protected-internal"/>
<Or>
<Kind Is="property"/>
<Kind Is="indexer"/>
</Or>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Protected Internal Properties"/>
</Entry>
<!--protected properties, indexers-->
<Entry>
<Match>
<And>
<Access Is="protected"/>
<Or>
<Kind Is="property"/>
<Kind Is="indexer"/>
</Or>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Protected Properties"/>
</Entry>
<!--private properties, indexers-->
<Entry>
<Match>
<And>
<Access Is="private"/>
<Or>
<Kind Is="property"/>
<Kind Is="indexer"/>
</Or>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Private Properties"/>
</Entry>
<!--interface implementations-->
<Entry>
<Match>
<And Weight="100">
<Kind Is="member"/>
<ImplementsInterface/>
</And>
</Match>
<Sort>
<ImplementsInterface Immediate="true"/>
</Sort>
<Group>
<ImplementsInterface Immediate="true" Region="${ImplementsInterface} Members"/>
</Group>
</Entry>
<!--public methods-->
<Entry>
<Match>
<And>
<Access Is="public"/>
<Kind Is="method"/>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Public Methods"/>
</Entry>
<!--internal methods-->
<Entry>
<Match>
<And>
<Access Is="internal"/>
<Kind Is="method"/>
</And>
</Match>
<Sort>
<Readonly/>
<Name/>
</Sort>
<Group Region="Internal Methods"/>
</Entry>
<!--protected-internal methods-->
<Entry>
<Match>
<And>
<Access Is="protected-internal"/>
<Kind Is="method"/>
</And>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Protected Internal Methods"/>
</Entry>
<!--protected methods-->
<Entry>
<Match>
<And>
<Access Is="protected"/>
<Kind Is="method"/>
</And>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Protected Methods"/>
</Entry>
<!--private methods-->
<Entry>
<Match>
<And>
<Access Is="private"/>
<Kind Is="method"/>
</And>
</Match>
<Sort>
<Name/>
</Sort>
<Group Region="Private Methods"/>
</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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment