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); + } } }