Browse Source

Make the t4 template's CustomToolNamespace available in CallContext with the tag "NamespaceHint".

pull/16/merge
Matt Ward 15 years ago
parent
commit
382ad26671
  1. 2
      src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs
  2. 43
      src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs
  3. 6
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs
  4. 23
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs
  5. 1
      src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj
  6. 8
      src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs
  7. 29
      src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs
  8. 2
      src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs
  9. 54
      src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs
  10. 7
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs
  11. 9
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs
  12. 22
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs
  13. 2
      src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj

2
src/AddIns/Misc/TextTemplating/Project/Src/ITextTemplatingCustomToolContext.cs

@ -15,5 +15,7 @@ namespace ICSharpCode.TextTemplating @@ -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);
}
}

43
src/AddIns/Misc/TextTemplating/Project/Src/NamespaceHint.cs

@ -0,0 +1,43 @@ @@ -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;
}
}
}

6
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingCustomToolContext.cs

@ -2,6 +2,7 @@ @@ -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 @@ -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);
}
}
}

23
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingFileGenerator.cs

@ -13,7 +13,7 @@ namespace ICSharpCode.TextTemplating @@ -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 @@ -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 @@ -34,6 +34,7 @@ namespace ICSharpCode.TextTemplating
public void ProcessTemplate()
{
context.ClearTasksExceptCommentTasks();
SetLogicalCallContextData();
if (TryGenerateOutputFileForTemplate()) {
AddOutputFileToProjectIfRequired();
}
@ -41,16 +42,15 @@ namespace ICSharpCode.TextTemplating @@ -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 @@ -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 @@ -98,7 +105,7 @@ namespace ICSharpCode.TextTemplating
void AddOutputFileToProjectIfRequired()
{
context.EnsureOutputFileIsInProject(projectFile, host.OutputFile);
context.EnsureOutputFileIsInProject(templateFile, host.OutputFile);
}
}
}

1
src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj

@ -57,6 +57,7 @@ @@ -57,6 +57,7 @@
<Compile Include="Src\ITextTemplatingCustomToolContext.cs" />
<Compile Include="Src\ITextTemplatingHost.cs" />
<Compile Include="Src\ITextTemplatingFileGenerator.cs" />
<Compile Include="Src\NamespaceHint.cs" />
<Compile Include="Src\TemplatingHostProcessTemplateError.cs" />
<Compile Include="Src\TextTemplatingAppDomain.cs" />
<Compile Include="Src\TextTemplatingAppDomainFactory.cs" />

8
src/AddIns/Misc/TextTemplating/Test/Helpers/FakeTextTemplatingCustomToolContext.cs

@ -18,6 +18,8 @@ namespace TextTemplating.Tests.Helpers @@ -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<Task> TasksAdded = new List<Task>();
@ -58,5 +60,11 @@ namespace TextTemplating.Tests.Helpers @@ -58,5 +60,11 @@ namespace TextTemplating.Tests.Helpers
MessagePassedToDebugLog = message;
ExceptionPassedToDebugLog = ex;
}
public void SetLogicalCallContextData(string name, object data)
{
NamePassedToSetLogicalCallContextData = name;
DataPassedToSetLogicalCallContextData = data;
}
}
}

29
src/AddIns/Misc/TextTemplating/Test/Helpers/ProjectHelper.cs

@ -0,0 +1,29 @@ @@ -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);
}
/// <summary>
/// Project.RootNamespace returns Project.Name
/// </summary>
public static void SetProjectRootNamespace(IProject project, string rootNamespace)
{
project.Name = rootNamespace;
}
}
}

2
src/AddIns/Misc/TextTemplating/Test/Helpers/TestableFileProjectItem.cs

@ -11,7 +11,7 @@ namespace TextTemplating.Tests.Helpers @@ -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;
}

54
src/AddIns/Misc/TextTemplating/Test/Src/NamespaceHintTests.cs

@ -0,0 +1,54 @@ @@ -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);
}
}
}

7
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingAssemblyResolverTests.cs

@ -6,6 +6,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates; @@ -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 @@ -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);
}

9
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorCustomToolTests.cs

@ -2,9 +2,7 @@ @@ -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 @@ -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 @@ -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);

22
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingFileGeneratorTests.cs

@ -212,5 +212,27 @@ namespace TextTemplating.Tests @@ -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);
}
}
}

2
src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj

@ -61,10 +61,12 @@ @@ -61,10 +61,12 @@
<Compile Include="Helpers\FakeTextTemplatingCustomToolContext.cs" />
<Compile Include="Helpers\FakeTextTemplatingHost.cs" />
<Compile Include="Helpers\FakeTextTemplatingFileGenerator.cs" />
<Compile Include="Helpers\ProjectHelper.cs" />
<Compile Include="Helpers\TestableFileProjectItem.cs" />
<Compile Include="Helpers\TestableTextTemplatingFileGeneratorCustomTool.cs" />
<Compile Include="Helpers\TestableTextTemplatingHost.cs" />
<Compile Include="Src\CompilerErrorTaskTests.cs" />
<Compile Include="Src\NamespaceHintTests.cs" />
<Compile Include="Src\TextTemplatingAssemblyResolverTests.cs" />
<Compile Include="Src\TextTemplatingFileGeneratorCustomToolTests.cs" />
<Compile Include="Src\TextTemplatingFileGeneratorTests.cs" />

Loading…
Cancel
Save