From 382ad266716a2d42861f45166d3d4a8071ff16a5 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 12 Mar 2011 17:00:26 +0000 Subject: [PATCH] Make the t4 template's CustomToolNamespace available in CallContext with the tag "NamespaceHint". --- .../Src/ITextTemplatingCustomToolContext.cs | 2 + .../Project/Src/NamespaceHint.cs | 43 +++++++++++++++ .../Src/TextTemplatingCustomToolContext.cs | 6 +++ .../Src/TextTemplatingFileGenerator.cs | 23 +++++--- .../Project/TextTemplating.csproj | 1 + .../FakeTextTemplatingCustomToolContext.cs | 8 +++ .../Test/Helpers/ProjectHelper.cs | 29 ++++++++++ .../Test/Helpers/TestableFileProjectItem.cs | 2 +- .../Test/Src/NamespaceHintTests.cs | 54 +++++++++++++++++++ .../TextTemplatingAssemblyResolverTests.cs | 7 +-- ...tTemplatingFileGeneratorCustomToolTests.cs | 9 +--- .../Src/TextTemplatingFileGeneratorTests.cs | 22 ++++++++ .../Test/TextTemplating.Tests.csproj | 2 + 13 files changed, 186 insertions(+), 22 deletions(-) create mode 100644 src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs create mode 100644 src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs create mode 100644 src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs index f60b919a18..e85ab976a5 100644 --- a/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs +++ b/src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs @@ -15,5 +15,7 @@ namespace ICSharpCode.TextTemplating void AddTask(Task task); void BringErrorsPadToFront(); void DebugLog(string message, Exception ex); + + void SetLogicalCallContextData(string name, object data); } } diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs b/src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs new file mode 100644 index 0000000000..34b7c801fe --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs @@ -0,0 +1,43 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.TextTemplating +{ + public class NamespaceHint + { + string hint = String.Empty; + FileProjectItem templateFile; + + public NamespaceHint(FileProjectItem templateFile) + { + this.templateFile = templateFile; + GetNamespaceHint(); + } + + void GetNamespaceHint() + { + hint = GetCustomToolNamespace(); + if (String.IsNullOrEmpty(hint)) { + hint = GetProjectRootNamespace(); + } + } + + string GetProjectRootNamespace() + { + return templateFile.Project.RootNamespace; + } + + string GetCustomToolNamespace() + { + return templateFile.GetEvaluatedMetadata("CustomToolNamespace"); + } + + public override string ToString() + { + return hint; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs index ca5251d72c..c74bd35a01 100644 --- a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Runtime.Remoting.Messaging; using ICSharpCode.Core; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; @@ -42,5 +43,10 @@ namespace ICSharpCode.TextTemplating { LoggingService.DebugFormatted("{0}\r\n{1}", message, ex.ToString()); } + + public void SetLogicalCallContextData(string name, object data) + { + CallContext.LogicalSetData(name, data); + } } } diff --git a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs index aa1bfefea8..80b7320a8e 100644 --- a/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs +++ b/src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.TextTemplating public class TextTemplatingFileGenerator : ITextTemplatingFileGenerator { ITextTemplatingHost host; - FileProjectItem projectFile; + FileProjectItem templateFile; ITextTemplatingCustomToolContext context; public TextTemplatingFileGenerator( @@ -22,7 +22,7 @@ namespace ICSharpCode.TextTemplating ITextTemplatingCustomToolContext context) { this.host = host; - this.projectFile = projectFile; + this.templateFile = projectFile; this.context = context; } @@ -34,6 +34,7 @@ namespace ICSharpCode.TextTemplating public void ProcessTemplate() { context.ClearTasksExceptCommentTasks(); + SetLogicalCallContextData(); if (TryGenerateOutputFileForTemplate()) { AddOutputFileToProjectIfRequired(); } @@ -41,16 +42,15 @@ namespace ICSharpCode.TextTemplating BringErrorsToFrontIfRequired(); } - void BringErrorsToFrontIfRequired() + void SetLogicalCallContextData() { - if (host.Errors.HasErrors) { - context.BringErrorsPadToFront(); - } + var namespaceHint = new NamespaceHint(templateFile); + context.SetLogicalCallContextData("NamespaceHint", namespaceHint.ToString()); } bool TryGenerateOutputFileForTemplate() { - string inputFileName = projectFile.FileName; + string inputFileName = templateFile.FileName; string outputFileName = GetOutputFileName(inputFileName); return TryProcessingTemplate(inputFileName, outputFileName); } @@ -71,6 +71,13 @@ namespace ICSharpCode.TextTemplating return false; } + void BringErrorsToFrontIfRequired() + { + if (host.Errors.HasErrors) { + context.BringErrorsPadToFront(); + } + } + void AddCompilerErrorToTemplatingHost(Exception ex, string fileName) { var error = new TemplatingHostProcessTemplateError(ex, fileName); @@ -98,7 +105,7 @@ namespace ICSharpCode.TextTemplating void AddOutputFileToProjectIfRequired() { - context.EnsureOutputFileIsInProject(projectFile, host.OutputFile); + context.EnsureOutputFileIsInProject(templateFile, host.OutputFile); } } } \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj index 5f6cca748b..74728ab545 100644 --- a/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj +++ b/src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj @@ -57,6 +57,7 @@ + diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs index 1bbec4f4e1..3d226c4f49 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs @@ -18,6 +18,8 @@ namespace TextTemplating.Tests.Helpers public bool IsBringErrorsPadToFrontCalled; public Exception ExceptionPassedToDebugLog; public string MessagePassedToDebugLog; + public string NamePassedToSetLogicalCallContextData; + public object DataPassedToSetLogicalCallContextData; public List TasksAdded = new List(); @@ -58,5 +60,11 @@ namespace TextTemplating.Tests.Helpers MessagePassedToDebugLog = message; ExceptionPassedToDebugLog = ex; } + + public void SetLogicalCallContextData(string name, object data) + { + NamePassedToSetLogicalCallContextData = name; + DataPassedToSetLogicalCallContextData = data; + } } } diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs new file mode 100644 index 0000000000..6c8b7da81f --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs @@ -0,0 +1,29 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Internal.Templates; +using ICSharpCode.SharpDevelop.Project; + +namespace TextTemplating.Tests.Helpers +{ + public static class ProjectHelper + { + public static IProject CreateProject() + { + var info = new ProjectCreateInformation(); + info.Solution = new Solution(); + info.OutputProjectFileName = @"d:\projects\MyProject\MyProject.csproj"; + info.ProjectName = "MyProject"; + return new MSBuildBasedProject(info); + } + + /// + /// Project.RootNamespace returns Project.Name + /// + public static void SetProjectRootNamespace(IProject project, string rootNamespace) + { + project.Name = rootNamespace; + } + } +} diff --git a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs index 2f5d839e78..71c92420fa 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs @@ -11,7 +11,7 @@ namespace TextTemplating.Tests.Helpers string fileName; public TestableFileProjectItem(string fileName) - : base(null, ItemType.None) + : base(ProjectHelper.CreateProject(), ItemType.None) { this.fileName = fileName; } diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs new file mode 100644 index 0000000000..42cf52f24f --- /dev/null +++ b/src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs @@ -0,0 +1,54 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.TextTemplating; +using NUnit.Framework; +using TextTemplating.Tests.Helpers; + +namespace TextTemplating.Tests +{ + [TestFixture] + public class NamespaceHintTests + { + NamespaceHint namespaceHint; + IProject project; + FileProjectItem templateFile; + + void CreateProjectTemplateFile() + { + project = ProjectHelper.CreateProject(); + templateFile = new FileProjectItem(project, ItemType.None, "MyTemplate.tt"); + } + + void CreateNamespaceHint() + { + namespaceHint = new NamespaceHint(templateFile); + } + + [Test] + public void ToString_TemplateFileHasCustomToolNamespaceSetToTest_ReturnsTest() + { + CreateProjectTemplateFile(); + templateFile.SetMetadata("CustomToolNamespace", "Test"); + CreateNamespaceHint(); + + string result = namespaceHint.ToString(); + + Assert.AreEqual("Test", result); + } + + [Test] + public void ToString_TemplateFileHasNoCustomToolNamespace_ReturnsProjectRootNamespace() + { + CreateProjectTemplateFile(); + ProjectHelper.SetProjectRootNamespace(project, "ProjectRootNamespace"); + CreateNamespaceHint(); + + string result = namespaceHint.ToString(); + + Assert.AreEqual("ProjectRootNamespace", result); + } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs index 658d480eec..911ce79b64 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs @@ -6,6 +6,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.TextTemplating; using NUnit.Framework; +using TextTemplating.Tests.Helpers; namespace TextTemplating.Tests { @@ -17,11 +18,7 @@ namespace TextTemplating.Tests void CreateResolver() { - var info = new ProjectCreateInformation(); - info.Solution = new Solution(); - info.OutputProjectFileName = @"d:\projects\MyProject\MyProject.cs"; - info.ProjectName = "MyProject"; - project = new MSBuildBasedProject(info); + project = ProjectHelper.CreateProject(); resolver = new TextTemplatingAssemblyResolver(project); } diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs index e0f0555d0a..110dd93804 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs @@ -2,9 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using ICSharpCode.SharpDevelop.Internal.Templates; using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.TextTemplating; using NUnit.Framework; using TextTemplating.Tests.Helpers; @@ -20,11 +18,6 @@ namespace TextTemplating.Tests customTool = new TestableTextTemplatingFileGeneratorCustomTool(); } - IProject CreateProject() - { - return new MSBuildFileProject(@"d:\projects\test.csproj", "test"); - } - FileProjectItem GenerateCodeWithProjectFile() { var file = new TestableFileProjectItem("test.tt"); @@ -45,7 +38,7 @@ namespace TextTemplating.Tests public void GenerateCode_CustomToolContextPassed_CustomToolContextUsedToCreateTextTemplatingFileGenerator() { CreateCustomTool(); - IProject project = CreateProject(); + IProject project = ProjectHelper.CreateProject(); var context = new CustomToolContext(project); customTool.GenerateCode(null, context); diff --git a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs index c747228165..b8a8b956e9 100644 --- a/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs +++ b/src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs @@ -212,5 +212,27 @@ namespace TextTemplating.Tests Assert.AreEqual("error", task.Description); } + + [Test] + public void ProcessTemplate_CustomToolNamespaceNotSet_LogicalCallContextNamespaceHintDataIsSet() + { + var templateFile = CreateGenerator(@"d:\a.tt"); + templateFile.Project.Name = "Test"; + generator.ProcessTemplate(); + + Assert.AreEqual("NamespaceHint", customToolContext.NamePassedToSetLogicalCallContextData); + } + + [Test] + public void ProcessTemplate_CustomToolNamespaceNotSet_LogicalCallContextNamespaceHintDataIsSetBefore() + { + var templateFile = CreateGenerator(@"d:\a.tt"); + templateFile.Project.Name = "Test"; + generator.ProcessTemplate(); + + string data = customToolContext.DataPassedToSetLogicalCallContextData as String; + + Assert.AreEqual("Test", data); + } } } \ No newline at end of file diff --git a/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj index 550a01d70f..980a4f6b33 100644 --- a/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj +++ b/src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj @@ -61,10 +61,12 @@ + +