From 0daa6cf0631cfb2c44478d812f859262a6087613 Mon Sep 17 00:00:00 2001
From: Matt Ward <ward.matt@gmail.com>
Date: Sun, 13 Jan 2013 17:04:26 +0000
Subject: [PATCH] T4 template now handles project not returning a
 CodeDomProvider.

Default to using C# code dom provider and add warning to Errors
window instead of failing to pre-processing a template.
---
 .../Src/TextTemplatingFilePreprocessor.cs     | 26 +++++++++++++++----
 .../Test/Helpers/TestableProject.cs           |  4 ++-
 .../Src/TextTemplatingPreprocessorTests.cs    | 23 ++++++++++++++++
 3 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFilePreprocessor.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFilePreprocessor.cs
index 9aa9439ee4..b94ece1d96 100644
--- a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFilePreprocessor.cs
+++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFilePreprocessor.cs
@@ -6,7 +6,10 @@ using System.CodeDom.Compiler;
 using System.IO;
 using System.Text;
 
+using ICSharpCode.Core;
+using ICSharpCode.SharpDevelop;
 using ICSharpCode.SharpDevelop.Project;
+using Microsoft.CSharp;
 
 namespace ICSharpCode.TextTemplating
 {
@@ -72,7 +75,7 @@ namespace ICSharpCode.TextTemplating
 					outputFileName,
 					Encoding.UTF8,
 					out language,
-					out references);			
+					out references);
 			} catch (Exception ex) {
 				AddCompilerErrorToTemplatingHost(ex, inputFileName);
 				DebugLogException(ex, inputFileName);
@@ -88,10 +91,23 @@ namespace ICSharpCode.TextTemplating
 		
 		string CreateValidClassName(string className)
 		{
-			return TemplateFile
-				.Project
-				.CreateCodeDomProvider()
-				.CreateValidIdentifier(className);
+			return CreateCodeDomProvider().CreateValidIdentifier(className);
+		}
+		
+		CodeDomProvider CreateCodeDomProvider()
+		{
+			CodeDomProvider provider = TemplateFile.Project.CreateCodeDomProvider();
+			if (provider != null) {
+				return provider;
+			}
+			AddMissingCodeDomProviderTask();
+			return new CSharpCodeProvider();
+		}
+		
+		void AddMissingCodeDomProviderTask()
+		{
+			string message = "Project does not provide a CodeDomProvider. Using C# provider by default";
+			Context.AddTask(new SDTask(null, message, 0, 0, TaskType.Warning));
 		}
 	}
 }
diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableProject.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableProject.cs
index 285d8cb64e..3e021417c9 100644
--- a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableProject.cs
+++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableProject.cs
@@ -35,9 +35,11 @@ namespace TextTemplating.Tests.Helpers
 			set { rootNamespace = value; }
 		}
 		
+		public CodeDomProvider CodeDomProviderToReturn = new CSharpCodeProvider();
+		
 		public override CodeDomProvider CreateCodeDomProvider()
 		{
-			return new CSharpCodeProvider();
+			return CodeDomProviderToReturn;
 		}
 	}
 }
diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingPreprocessorTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingPreprocessorTests.cs
index a056604d6a..89379facd7 100644
--- a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingPreprocessorTests.cs
+++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingPreprocessorTests.cs
@@ -263,5 +263,28 @@ namespace TextTemplating.Tests
 			
 			Assert.AreEqual("_class", templatingHost.ClassNamePassedToPreprocessTemplate);
 		}
+		
+		[Test]
+		public void PreprocessTemplate_ProjectHasNoCodeDomProvider_CSharpCodeDomProviderUsedByDefaultAndClassNameChangedToValidClassName()
+		{
+			TestableFileProjectItem projectFile = CreatePreprocessor(@"d:\class.tt");
+			projectFile.TestableProject.CodeDomProviderToReturn = null;
+			
+			preprocessor.PreprocessTemplate();
+			
+			Assert.AreEqual("_class", templatingHost.ClassNamePassedToPreprocessTemplate);
+		}
+		
+		[Test]
+		public void PreprocessTemplate_ProjectHasNoCodeDomProvider_WarningTaskAdded()
+		{
+			TestableFileProjectItem projectFile = CreatePreprocessor(@"d:\test.tt");
+			projectFile.TestableProject.CodeDomProviderToReturn = null;
+			
+			preprocessor.PreprocessTemplate();
+			
+			SDTask task = customToolContext.FirstTaskAdded;
+			Assert.AreEqual(TaskType.Warning, task.TaskType);
+		}
 	}
 }