This is a preview of a new language for Reflector that outputs to Refly (Refly is wraps up and simplifies the use of CodeDom).
What does the language do ?
The language creates Refly code. If the Refly code is executed it will generate the original code. This is particularly usefull to rapidely design CodeDom template: write the expected output, Reflectorize-it and get the Refly code. In the figure below, we see the code "cycle of life" with a decompiler and how it is modified if we add the "Refly" language.
A preview example
There is still a lot of work to do on the language but it can already generate the outline of classes. Let's see that on a simple class:
public class Original{ private string name; public Original() {} public string Name { get { return this.name;} set { this.name = value;} } public void Run(string someParamter) { Console.WriteLine("{0}: someParameter"); } public event EventHandler Click; protected virtual void OnClick(EventArgs e) { if (this.Click != null) this.Click(this, e); }}
public class Original
{
{}
}
After compiling and loading in Reflector, the Refly language is outputting:
NamespaceDeclaration _dragAndDropUnitTesting = new NamespaceDeclaration("Original"); ClassDeclaration _original = _dragAndDropUnitTesting.AddClass("Original"); // FieldsFieldDeclaration name = _original.AddField(typeof(System.String), "name");FieldDeclaration Click = _original.AddField(typeof(System.EventHandler), "Click"); // EventsEventDeclaration _click = _original.AddEvent(typeof(System.EventHandler), "Click"); // Constructor and MethodsConstructorDeclaration ctor0 = _original.AddConstructor();ctor0.Attributes |= System.CodeDom.MemberAttributes.Assembly;ctor0.Attributes |= System.CodeDom.MemberAttributes.Family;MethodDeclaration _run = _original.AddMethod("Run");_run.Attributes |= System.CodeDom.MemberAttributes.Assembly;_run.Attributes |= System.CodeDom.MemberAttributes.Family;ParameterDeclaration _runsomeParamter = _run.Signature.Parameters.Add(typeof(System.String), "someParamter");MethodDeclaration _onClick = _original.AddMethod("OnClick");_onClick.Attributes |= System.CodeDom.MemberAttributes.Family;ParameterDeclaration _onClicke = _onClick.Signature.Parameters.Add(typeof(System.EventArgs), "e"); // PropertiesPropertyDeclaration _name = _original.AddProperty(typeof(System.String), "Name");
NamespaceDeclaration _dragAndDropUnitTesting = new NamespaceDeclaration("Original");
ClassDeclaration _original = _dragAndDropUnitTesting.AddClass("Original");
// Fields
// Events
// Constructor and Methods
ctor0.Attributes |= System.CodeDom.
_run.Attributes |= System.CodeDom.
_onClick.Attributes |= System.CodeDom.
// Properties
That's pretty ugly but not as much if you had to write CodeDom for that. We can compile and generate the code using the following instruction:
CodeGenerator gen = new CodeGenerator();gen.GenerateCode(".", _dragAndDropUnitTesting);
Finally, the output of the execution is as follows:
using System;/// <summary />/// <remarks />public class Original{ /// <summary /> /// <remarks /> private string _name; /// <summary /> /// <remarks /> private System.EventHandler _click; /// <summary /> /// <remarks /> Original() { } /// <summary /> /// <remarks /> public virtual string Name { } /// <summary /> /// <remarks /> public event System.EventHandler Click; /// <summary /> /// <remarks /> void Run(string someParamter) { } /// <summary /> /// <remarks /> void OnClick(System.EventArgs e) { }}
Original()
Of course, the result is far from behing perfect. Visibility handling sucks, statements are not reflected, etc... But sounds very promising to me :)
Page rendered at Monday, October 13, 2008 11:38:28 AM UTC
Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.