11 changed files with 364 additions and 8 deletions
@ -0,0 +1,129 @@
@@ -0,0 +1,129 @@
|
||||
using System; |
||||
namespace ICSharpCode.NRefactory.CSharp |
||||
{ |
||||
public enum NewLineType { |
||||
Unix, |
||||
Windows, |
||||
Mac |
||||
} |
||||
|
||||
public abstract class NewLineNode : AstNode |
||||
{ |
||||
public override NodeType NodeType { |
||||
get { |
||||
return NodeType.Whitespace; |
||||
} |
||||
} |
||||
|
||||
public abstract NewLineType NewLineType { |
||||
get; |
||||
} |
||||
|
||||
TextLocation startLocation; |
||||
public override TextLocation StartLocation { |
||||
get { |
||||
return startLocation; |
||||
} |
||||
} |
||||
|
||||
public override TextLocation EndLocation { |
||||
get { |
||||
return new TextLocation (startLocation.Line + 1, 1); |
||||
} |
||||
} |
||||
|
||||
public NewLineNode() : this (TextLocation.Empty) |
||||
{ |
||||
} |
||||
|
||||
public NewLineNode(TextLocation startLocation) |
||||
{ |
||||
this.startLocation = startLocation; |
||||
} |
||||
|
||||
public override void AcceptVisitor(IAstVisitor visitor) |
||||
{ |
||||
visitor.VisitNewLine (this); |
||||
} |
||||
|
||||
public override T AcceptVisitor<T>(IAstVisitor<T> visitor) |
||||
{ |
||||
return visitor.VisitNewLine (this); |
||||
} |
||||
|
||||
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) |
||||
{ |
||||
return visitor.VisitNewLine (this, data); |
||||
} |
||||
} |
||||
|
||||
public class UnixNewLine : NewLineNode |
||||
{ |
||||
public override NewLineType NewLineType { |
||||
get { |
||||
return NewLineType.Unix; |
||||
} |
||||
} |
||||
|
||||
public UnixNewLine() |
||||
{ |
||||
} |
||||
|
||||
public UnixNewLine(TextLocation startLocation) : base (startLocation) |
||||
{ |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) |
||||
{ |
||||
var o = other as UnixNewLine; |
||||
return o != null; |
||||
} |
||||
} |
||||
|
||||
public class WindowsNewLine : NewLineNode |
||||
{ |
||||
public override NewLineType NewLineType { |
||||
get { |
||||
return NewLineType.Windows; |
||||
} |
||||
} |
||||
|
||||
public WindowsNewLine() |
||||
{ |
||||
} |
||||
|
||||
public WindowsNewLine(TextLocation startLocation) : base (startLocation) |
||||
{ |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) |
||||
{ |
||||
var o = other as WindowsNewLine; |
||||
return o != null; |
||||
} |
||||
} |
||||
|
||||
public class MacNewLine : NewLineNode |
||||
{ |
||||
public override NewLineType NewLineType { |
||||
get { |
||||
return NewLineType.Mac; |
||||
} |
||||
} |
||||
|
||||
public MacNewLine() |
||||
{ |
||||
} |
||||
|
||||
public MacNewLine(TextLocation startLocation) : base (startLocation) |
||||
{ |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) |
||||
{ |
||||
var o = other as MacNewLine; |
||||
return o != null; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@ -0,0 +1,173 @@
@@ -0,0 +1,173 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ICSharpCode.NRefactory.CSharp |
||||
{ |
||||
public enum GeneratedCodeMember |
||||
{ |
||||
Unknown, |
||||
|
||||
StaticFields, |
||||
InstanceFields, |
||||
StaticProperties, |
||||
InstanceProperties, |
||||
Constructors, |
||||
StaticMethods, |
||||
InstanceMethods, |
||||
StaticEvents, |
||||
InstanceEvents, |
||||
NestedTypes |
||||
} |
||||
|
||||
public class GeneratedCodeSettings |
||||
{ |
||||
List<GeneratedCodeMember> codeMemberOrder; |
||||
|
||||
public List<GeneratedCodeMember> CodeMemberOrder { |
||||
get { |
||||
return codeMemberOrder; |
||||
} |
||||
set { |
||||
codeMemberOrder = value; |
||||
} |
||||
} |
||||
|
||||
public bool GenerateCategoryComments { |
||||
get; |
||||
set; |
||||
} |
||||
|
||||
public bool SubOrderAlphabetical { |
||||
get; |
||||
set; |
||||
} |
||||
|
||||
public void Apply (AstNode rootNode) |
||||
{ |
||||
if (rootNode == null) |
||||
throw new ArgumentNullException ("rootNode"); |
||||
rootNode.AcceptVisitor (new GenerateCodeVisitior (this)); |
||||
} |
||||
|
||||
public virtual string GetCategoryLabel(GeneratedCodeMember memberCategory) |
||||
{ |
||||
switch (memberCategory) { |
||||
case GeneratedCodeMember.StaticFields: |
||||
return "Static Fields"; |
||||
case GeneratedCodeMember.InstanceFields: |
||||
return "Fields"; |
||||
case GeneratedCodeMember.StaticProperties: |
||||
return "Static Properties"; |
||||
case GeneratedCodeMember.InstanceProperties: |
||||
return "Properties"; |
||||
case GeneratedCodeMember.Constructors: |
||||
return "Constructors"; |
||||
case GeneratedCodeMember.StaticMethods: |
||||
return "Static Methods"; |
||||
case GeneratedCodeMember.InstanceMethods: |
||||
return "Methods"; |
||||
case GeneratedCodeMember.StaticEvents: |
||||
return "Static Events"; |
||||
case GeneratedCodeMember.InstanceEvents: |
||||
return "Events"; |
||||
case GeneratedCodeMember.NestedTypes: |
||||
return "Nested Types"; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
class GenerateCodeVisitior : DepthFirstAstVisitor |
||||
{ |
||||
GeneratedCodeSettings settings; |
||||
|
||||
public GenerateCodeVisitior(GeneratedCodeSettings settings) |
||||
{ |
||||
if (settings == null) |
||||
throw new ArgumentNullException("settings"); |
||||
this.settings = settings; |
||||
} |
||||
|
||||
GeneratedCodeMember GetCodeMemberCategory(EntityDeclaration x) |
||||
{ |
||||
bool isStatic = x.HasModifier(Modifiers.Static) || x.HasModifier(Modifiers.Const); |
||||
if (x is FieldDeclaration) |
||||
return isStatic ? GeneratedCodeMember.StaticFields : GeneratedCodeMember.InstanceFields; |
||||
if (x is PropertyDeclaration) |
||||
return isStatic ? GeneratedCodeMember.StaticProperties : GeneratedCodeMember.InstanceProperties; |
||||
if (x is ConstructorDeclaration || x is DestructorDeclaration) |
||||
return GeneratedCodeMember.Constructors; |
||||
if (x is MethodDeclaration) |
||||
return isStatic ? GeneratedCodeMember.StaticMethods : GeneratedCodeMember.InstanceMethods; |
||||
if (x is EventDeclaration) |
||||
return isStatic ? GeneratedCodeMember.StaticEvents : GeneratedCodeMember.InstanceEvents; |
||||
|
||||
if (x is TypeDeclaration) |
||||
return GeneratedCodeMember.NestedTypes; |
||||
|
||||
return GeneratedCodeMember.Unknown; |
||||
} |
||||
|
||||
public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) |
||||
{ |
||||
if (typeDeclaration.ClassType == ClassType.Enum) |
||||
return; |
||||
var entities = new List<EntityDeclaration>(typeDeclaration.Members); |
||||
entities.Sort((x, y) => { |
||||
int i1 = settings.CodeMemberOrder.IndexOf(GetCodeMemberCategory(x)); |
||||
int i2 = settings.CodeMemberOrder.IndexOf(GetCodeMemberCategory(y)); |
||||
if (i1 != i2) |
||||
return i1.CompareTo(i2); |
||||
if (settings.SubOrderAlphabetical) |
||||
return (x.Name ?? "").CompareTo((y.Name ?? "")); |
||||
return entities.IndexOf(x).CompareTo(entities.IndexOf(y)); |
||||
}); |
||||
typeDeclaration.Members.Clear(); |
||||
typeDeclaration.Members.AddRange(entities); |
||||
|
||||
if (settings.GenerateCategoryComments) { |
||||
var curCat = GeneratedCodeMember.Unknown; |
||||
foreach (var mem in entities) { |
||||
var cat = GetCodeMemberCategory(mem); |
||||
if (cat == curCat) |
||||
continue; |
||||
curCat = cat; |
||||
var label = settings.GetCategoryLabel(curCat); |
||||
if (string.IsNullOrEmpty(label)) |
||||
continue; |
||||
|
||||
var cmt = new Comment("", CommentType.SingleLine); |
||||
var cmt2 = new Comment(" " + label, CommentType.SingleLine); |
||||
var cmt3 = new Comment("", CommentType.SingleLine); |
||||
mem.Parent.InsertChildsBefore(mem, Roles.Comment, cmt, cmt2, cmt3); |
||||
mem.Parent.InsertChildBefore(cmt, new UnixNewLine(), Roles.NewLine); |
||||
mem.Parent.InsertChildAfter(cmt3, new UnixNewLine(), Roles.NewLine); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
static Lazy<GeneratedCodeSettings> defaultSettings = new Lazy<GeneratedCodeSettings>( |
||||
() => new GeneratedCodeSettings() { |
||||
CodeMemberOrder = new List<GeneratedCodeMember>() { |
||||
GeneratedCodeMember.StaticFields, |
||||
GeneratedCodeMember.InstanceFields, |
||||
GeneratedCodeMember.StaticProperties, |
||||
GeneratedCodeMember.InstanceProperties, |
||||
GeneratedCodeMember.Constructors, |
||||
GeneratedCodeMember.StaticMethods, |
||||
GeneratedCodeMember.InstanceMethods, |
||||
GeneratedCodeMember.StaticEvents, |
||||
GeneratedCodeMember.InstanceEvents, |
||||
GeneratedCodeMember.NestedTypes |
||||
}, |
||||
GenerateCategoryComments = true, |
||||
SubOrderAlphabetical = true |
||||
}); |
||||
|
||||
public static GeneratedCodeSettings Default { |
||||
get { |
||||
return defaultSettings.Value; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue