Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hutchinson <m.j.hutchinson@gmail.com>2015-02-02 05:28:54 +0300
committerMichael Hutchinson <m.j.hutchinson@gmail.com>2015-02-02 05:28:54 +0300
commitebc0d694c926ff44f4ff516ee2950ba2c7d3ae16 (patch)
treedff845ba3bf524608b140dee5ff19d0d7f19cf84 /main/src/addins/TextTemplating
parent61712fb2e20ac74eab1e6b9a854017b521f73c8f (diff)
[T4] Factor out helpers for directive processors
Diffstat (limited to 'main/src/addins/TextTemplating')
-rw-r--r--main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs67
-rw-r--r--main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs63
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 (), " ");
+ }
+ }
}
}