diff options
author | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2015-02-02 05:28:54 +0300 |
---|---|---|
committer | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2015-02-02 05:28:54 +0300 |
commit | ebc0d694c926ff44f4ff516ee2950ba2c7d3ae16 (patch) | |
tree | dff845ba3bf524608b140dee5ff19d0d7f19cf84 /main/src/addins/TextTemplating | |
parent | 61712fb2e20ac74eab1e6b9a854017b521f73c8f (diff) |
[T4] Factor out helpers for directive processors
Diffstat (limited to 'main/src/addins/TextTemplating')
2 files changed, 69 insertions, 61 deletions
diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs index 85df3d30d6..cc5eb4123d 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs @@ -24,35 +24,26 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.CodeDom.Compiler; using System.CodeDom; +using System.CodeDom.Compiler; +using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Reflection; +using Mono.TextTemplating; namespace Microsoft.VisualStudio.TextTemplating { public sealed class ParameterDirectiveProcessor : DirectiveProcessor, IRecognizeHostSpecific { CodeDomProvider provider; - bool isCSharp; - bool useMonoHack; bool hostSpecific; readonly List<CodeStatement> postStatements = new List<CodeStatement> (); - readonly CodeTypeMemberCollection members = new CodeTypeMemberCollection (); + readonly List<CodeTypeMember> members = new List<CodeTypeMember> (); public override void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors) { base.StartProcessingRun (languageProvider, templateContents, errors); - this.provider = languageProvider; - //HACK: Mono as of 2.10.2 doesn't implement GenerateCodeFromMember - if (Type.GetType ("Mono.Runtime") != null) - useMonoHack = true; - if (languageProvider is Microsoft.CSharp.CSharpCodeProvider) - isCSharp = true; + provider = languageProvider; postStatements.Clear (); members.Clear (); } @@ -73,18 +64,7 @@ namespace Microsoft.VisualStudio.TextTemplating public override string GetClassCodeForProcessingRun () { - var options = new CodeGeneratorOptions (); - using (var sw = new StringWriter ()) { - GenerateCodeFromMembers (sw, options); - return Indent (sw.ToString (), " "); - } - } - - string Indent (string s, string indent) - { - if (isCSharp) - return Mono.TextTemplating.TemplatingEngine.IndentSnippetText (s, indent); - return s; + return TemplatingEngine.GenerateIndentedClassCode (provider, members); } public override string[] GetImportsForProcessingRun () @@ -94,7 +74,7 @@ namespace Microsoft.VisualStudio.TextTemplating public override string GetPostInitializationCodeForProcessingRun () { - return Indent (StatementsToCode (postStatements), " "); + return TemplatingEngine.IndentSnippetText (provider, StatementsToCode (postStatements), " "); } public override string GetPreInitializationCodeForProcessingRun () @@ -226,39 +206,6 @@ namespace Microsoft.VisualStudio.TextTemplating public bool RequiresProcessingRunIsHostSpecific { get { return false; } } - - void GenerateCodeFromMembers (StringWriter sw, CodeGeneratorOptions options) - { - if (!useMonoHack) { - foreach (CodeTypeMember member in members) - provider.GenerateCodeFromMember (member, sw, options); - } - - var cgType = typeof (CodeGenerator); - var cgInit = cgType.GetMethod ("InitOutput", BindingFlags.NonPublic | BindingFlags.Instance); - var cgFieldGen = cgType.GetMethod ("GenerateField", BindingFlags.NonPublic | BindingFlags.Instance); - var cgPropGen = cgType.GetMethod ("GenerateProperty", BindingFlags.NonPublic | BindingFlags.Instance); - -#pragma warning disable 0618 - var generator = (CodeGenerator) provider.CreateGenerator (); -#pragma warning restore 0618 - var dummy = new CodeTypeDeclaration ("Foo"); - - foreach (CodeTypeMember member in members) { - var f = member as CodeMemberField; - if (f != null) { - cgInit.Invoke (generator, new object[] { sw, options }); - cgFieldGen.Invoke (generator, new object[] { f }); - continue; - } - var p = member as CodeMemberProperty; - if (p != null) { - cgInit.Invoke (generator, new object[] { sw, options }); - cgPropGen.Invoke (generator, new object[] { p, dummy }); - continue; - } - } - } } } diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs index d090b55db3..4bc75ce85b 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs @@ -333,7 +333,14 @@ namespace Mono.TextTemplating return settings; } - + + public static string IndentSnippetText (CodeDomProvider provider, string text, string indent) + { + if (provider is CSharpCodeProvider) + return IndentSnippetText (text, indent); + return text; + } + public static string IndentSnippetText (string text, string indent) { var builder = new StringBuilder (text.Length); @@ -1054,5 +1061,59 @@ namespace Mono.TextTemplating } #endregion + + //HACK: Mono as of 2.10.2 doesn't implement GenerateCodeFromMember + static readonly bool useMonoHack = Type.GetType ("Mono.Runtime") != null; + + /// <summary> + /// An implementation of CodeDomProvider.GenerateCodeFromMember that works on Mono. + /// </summary> + public static void GenerateCodeFromMembers (CodeDomProvider provider, CodeGeneratorOptions options, StringWriter sw, IEnumerable<CodeTypeMember> members) + { + if (!useMonoHack) { + foreach (CodeTypeMember member in members) + provider.GenerateCodeFromMember (member, sw, options); + return; + } + + var cgType = typeof (CodeGenerator); + var cgInit = cgType.GetMethod ("InitOutput", BindingFlags.NonPublic | BindingFlags.Instance); + var cgFieldGen = cgType.GetMethod ("GenerateField", BindingFlags.NonPublic | BindingFlags.Instance); + var cgPropGen = cgType.GetMethod ("GenerateProperty", BindingFlags.NonPublic | BindingFlags.Instance); + + #pragma warning disable 0618 + var generator = (CodeGenerator) provider.CreateGenerator (); + #pragma warning restore 0618 + var dummy = new CodeTypeDeclaration ("Foo"); + + foreach (CodeTypeMember member in members) { + var f = member as CodeMemberField; + if (f != null) { + cgInit.Invoke (generator, new object[] { sw, options }); + cgFieldGen.Invoke (generator, new object[] { f }); + continue; + } + var p = member as CodeMemberProperty; + if (p != null) { + cgInit.Invoke (generator, new object[] { sw, options }); + cgPropGen.Invoke (generator, new object[] { p, dummy }); + continue; + } + } + } + + public static string GenerateIndentedClassCode (CodeDomProvider provider, params CodeTypeMember[] members) + { + return GenerateIndentedClassCode (provider, (IEnumerable<CodeTypeMember>)members); + } + + public static string GenerateIndentedClassCode (CodeDomProvider provider, IEnumerable<CodeTypeMember> members) + { + var options = new CodeGeneratorOptions (); + using (var sw = new StringWriter ()) { + TemplatingEngine.GenerateCodeFromMembers (provider, options, sw, members); + return TemplatingEngine.IndentSnippetText (provider, sw.ToString (), " "); + } + } } } |