2
// GeneratedCodeSettings.cs
5
// Mike KrĆ¼ger <mkrueger@xamarin.com>
7
// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28
using System.Collections.Generic;
30
namespace ICSharpCode.NRefactory.CSharp
32
public enum GeneratedCodeMember
50
public class GeneratedCodeSettings
52
List<GeneratedCodeMember> codeMemberOrder;
54
public List<GeneratedCodeMember> CodeMemberOrder {
56
return codeMemberOrder;
59
codeMemberOrder = value;
63
public bool GenerateCategoryComments {
68
public bool SubOrderAlphabetical {
73
public void Apply (AstNode rootNode)
76
throw new ArgumentNullException ("rootNode");
77
rootNode.AcceptVisitor (new GenerateCodeVisitior (this));
80
public virtual string GetCategoryLabel(GeneratedCodeMember memberCategory)
82
switch (memberCategory) {
83
case GeneratedCodeMember.StaticFields:
84
return "Static Fields";
85
case GeneratedCodeMember.InstanceFields:
87
case GeneratedCodeMember.StaticProperties:
88
return "Static Properties";
89
case GeneratedCodeMember.InstanceProperties:
91
case GeneratedCodeMember.Indexer:
93
case GeneratedCodeMember.Constructors:
94
return "Constructors";
95
case GeneratedCodeMember.StaticMethods:
96
return "Static Methods";
97
case GeneratedCodeMember.InstanceMethods:
99
case GeneratedCodeMember.StaticEvents:
100
return "Static Events";
101
case GeneratedCodeMember.InstanceEvents:
103
case GeneratedCodeMember.Operators:
105
case GeneratedCodeMember.NestedTypes:
106
return "Nested Types";
111
class GenerateCodeVisitior : DepthFirstAstVisitor
113
GeneratedCodeSettings settings;
115
public GenerateCodeVisitior(GeneratedCodeSettings settings)
117
if (settings == null)
118
throw new ArgumentNullException("settings");
119
this.settings = settings;
122
GeneratedCodeMember GetCodeMemberCategory(EntityDeclaration x)
124
bool isStatic = x.HasModifier(Modifiers.Static) || x.HasModifier(Modifiers.Const);
125
if (x is FieldDeclaration)
126
return isStatic ? GeneratedCodeMember.StaticFields : GeneratedCodeMember.InstanceFields;
127
if (x is IndexerDeclaration)
128
return GeneratedCodeMember.Indexer;
129
if (x is PropertyDeclaration)
130
return isStatic ? GeneratedCodeMember.StaticProperties : GeneratedCodeMember.InstanceProperties;
131
if (x is ConstructorDeclaration || x is DestructorDeclaration)
132
return GeneratedCodeMember.Constructors;
133
if (x is MethodDeclaration)
134
return isStatic ? GeneratedCodeMember.StaticMethods : GeneratedCodeMember.InstanceMethods;
135
if (x is OperatorDeclaration)
136
return GeneratedCodeMember.Operators;
137
if (x is EventDeclaration || x is CustomEventDeclaration)
138
return isStatic ? GeneratedCodeMember.StaticEvents : GeneratedCodeMember.InstanceEvents;
140
if (x is TypeDeclaration)
141
return GeneratedCodeMember.NestedTypes;
143
return GeneratedCodeMember.Unknown;
146
public override void VisitTypeDeclaration (TypeDeclaration typeDeclaration)
148
if (typeDeclaration.ClassType == ClassType.Enum)
150
var entities = new List<EntityDeclaration> (typeDeclaration.Members);
151
entities.Sort ((x, y) => {
152
int i1 = settings.CodeMemberOrder.IndexOf (GetCodeMemberCategory (x));
153
int i2 = settings.CodeMemberOrder.IndexOf (GetCodeMemberCategory (y));
155
return i1.CompareTo (i2);
156
if (settings.SubOrderAlphabetical)
157
return (x.Name ?? "").CompareTo ((y.Name ?? ""));
158
return entities.IndexOf (x).CompareTo (entities.IndexOf (y));
160
typeDeclaration.Members.Clear ();
161
typeDeclaration.Members.AddRange (entities);
163
if (settings.GenerateCategoryComments) {
164
var curCat = GeneratedCodeMember.Unknown;
165
foreach (var mem in entities) {
166
if (mem.NextSibling is EntityDeclaration)
167
mem.Parent.InsertChildAfter (mem, new UnixNewLine (), Roles.NewLine);
169
var cat = GetCodeMemberCategory (mem);
173
var label = settings.GetCategoryLabel (curCat);
174
if (string.IsNullOrEmpty (label))
177
var cmt = new Comment ("", CommentType.SingleLine);
178
var cmt2 = new Comment (" " + label, CommentType.SingleLine);
179
var cmt3 = new Comment ("", CommentType.SingleLine);
180
mem.Parent.InsertChildBefore (mem, cmt, Roles.Comment);
181
mem.Parent.InsertChildBefore (mem, cmt2, Roles.Comment);
182
mem.Parent.InsertChildBefore (mem, cmt3, Roles.Comment);
183
if (cmt.PrevSibling is EntityDeclaration)
184
mem.Parent.InsertChildBefore (cmt, new UnixNewLine (), Roles.NewLine);
190
static Lazy<GeneratedCodeSettings> defaultSettings = new Lazy<GeneratedCodeSettings>(
191
() => new GeneratedCodeSettings() {
192
CodeMemberOrder = new List<GeneratedCodeMember>() {
193
GeneratedCodeMember.StaticFields,
194
GeneratedCodeMember.InstanceFields,
195
GeneratedCodeMember.StaticProperties,
196
GeneratedCodeMember.InstanceProperties,
197
GeneratedCodeMember.Indexer,
198
GeneratedCodeMember.Constructors,
199
GeneratedCodeMember.StaticMethods,
200
GeneratedCodeMember.InstanceMethods,
201
GeneratedCodeMember.StaticEvents,
202
GeneratedCodeMember.InstanceEvents,
203
GeneratedCodeMember.Operators,
204
GeneratedCodeMember.NestedTypes
206
GenerateCategoryComments = true,
207
SubOrderAlphabetical = true
210
public static GeneratedCodeSettings Default {
212
return defaultSettings.Value;
b'\\ No newline at end of file'