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
void AddTask(Task task); void AddTask(Task task);
void BringErrorsPadToFront(); void BringErrorsPadToFront();
void DebugLog(string message, Exception ex); 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 @@
// 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 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Runtime.Remoting.Messaging;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
@ -42,5 +43,10 @@ namespace ICSharpCode.TextTemplating
{ {
LoggingService.DebugFormatted("{0}\r\n{1}", message, ex.ToString()); 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
public class TextTemplatingFileGenerator : ITextTemplatingFileGenerator public class TextTemplatingFileGenerator : ITextTemplatingFileGenerator
{ {
ITextTemplatingHost host; ITextTemplatingHost host;
FileProjectItem projectFile; FileProjectItem templateFile;
ITextTemplatingCustomToolContext context; ITextTemplatingCustomToolContext context;
public TextTemplatingFileGenerator( public TextTemplatingFileGenerator(
@ -22,7 +22,7 @@ namespace ICSharpCode.TextTemplating
ITextTemplatingCustomToolContext context) ITextTemplatingCustomToolContext context)
{ {
this.host = host; this.host = host;
this.projectFile = projectFile; this.templateFile = projectFile;
this.context = context; this.context = context;
} }
@ -34,6 +34,7 @@ namespace ICSharpCode.TextTemplating
public void ProcessTemplate() public void ProcessTemplate()
{ {
context.ClearTasksExceptCommentTasks(); context.ClearTasksExceptCommentTasks();
SetLogicalCallContextData();
if (TryGenerateOutputFileForTemplate()) { if (TryGenerateOutputFileForTemplate()) {
AddOutputFileToProjectIfRequired(); AddOutputFileToProjectIfRequired();
} }
@ -41,16 +42,15 @@ namespace ICSharpCode.TextTemplating
BringErrorsToFrontIfRequired(); BringErrorsToFrontIfRequired();
} }
void BringErrorsToFrontIfRequired() void SetLogicalCallContextData()
{ {
if (host.Errors.HasErrors) { var namespaceHint = new NamespaceHint(templateFile);
context.BringErrorsPadToFront(); context.SetLogicalCallContextData("NamespaceHint", namespaceHint.ToString());
}
} }
bool TryGenerateOutputFileForTemplate() bool TryGenerateOutputFileForTemplate()
{ {
string inputFileName = projectFile.FileName; string inputFileName = templateFile.FileName;
string outputFileName = GetOutputFileName(inputFileName); string outputFileName = GetOutputFileName(inputFileName);
return TryProcessingTemplate(inputFileName, outputFileName); return TryProcessingTemplate(inputFileName, outputFileName);
} }
@ -71,6 +71,13 @@ namespace ICSharpCode.TextTemplating
return false; return false;
} }
void BringErrorsToFrontIfRequired()
{
if (host.Errors.HasErrors) {
context.BringErrorsPadToFront();
}
}
void AddCompilerErrorToTemplatingHost(Exception ex, string fileName) void AddCompilerErrorToTemplatingHost(Exception ex, string fileName)
{ {
var error = new TemplatingHostProcessTemplateError(ex, fileName); var error = new TemplatingHostProcessTemplateError(ex, fileName);
@ -98,7 +105,7 @@ namespace ICSharpCode.TextTemplating
void AddOutputFileToProjectIfRequired() void AddOutputFileToProjectIfRequired()
{ {
context.EnsureOutputFileIsInProject(projectFile, host.OutputFile); context.EnsureOutputFileIsInProject(templateFile, host.OutputFile);
} }
} }
} }

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

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

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

@ -18,6 +18,8 @@ namespace TextTemplating.Tests.Helpers
public bool IsBringErrorsPadToFrontCalled; public bool IsBringErrorsPadToFrontCalled;
public Exception ExceptionPassedToDebugLog; public Exception ExceptionPassedToDebugLog;
public string MessagePassedToDebugLog; public string MessagePassedToDebugLog;
public string NamePassedToSetLogicalCallContextData;
public object DataPassedToSetLogicalCallContextData;
public List<Task> TasksAdded = new List<Task>(); public List<Task> TasksAdded = new List<Task>();
@ -58,5 +60,11 @@ namespace TextTemplating.Tests.Helpers
MessagePassedToDebugLog = message; MessagePassedToDebugLog = message;
ExceptionPassedToDebugLog = ex; 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 @@
// 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
string fileName; string fileName;
public TestableFileProjectItem(string fileName) public TestableFileProjectItem(string fileName)
: base(null, ItemType.None) : base(ProjectHelper.CreateProject(), ItemType.None)
{ {
this.fileName = fileName; this.fileName = fileName;
} }

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

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

@ -6,6 +6,7 @@ using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextTemplating; using ICSharpCode.TextTemplating;
using NUnit.Framework; using NUnit.Framework;
using TextTemplating.Tests.Helpers;
namespace TextTemplating.Tests namespace TextTemplating.Tests
{ {
@ -17,11 +18,7 @@ namespace TextTemplating.Tests
void CreateResolver() void CreateResolver()
{ {
var info = new ProjectCreateInformation(); project = ProjectHelper.CreateProject();
info.Solution = new Solution();
info.OutputProjectFileName = @"d:\projects\MyProject\MyProject.cs";
info.ProjectName = "MyProject";
project = new MSBuildBasedProject(info);
resolver = new TextTemplatingAssemblyResolver(project); resolver = new TextTemplatingAssemblyResolver(project);
} }

9
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextTemplating;
using NUnit.Framework; using NUnit.Framework;
using TextTemplating.Tests.Helpers; using TextTemplating.Tests.Helpers;
@ -20,11 +18,6 @@ namespace TextTemplating.Tests
customTool = new TestableTextTemplatingFileGeneratorCustomTool(); customTool = new TestableTextTemplatingFileGeneratorCustomTool();
} }
IProject CreateProject()
{
return new MSBuildFileProject(@"d:\projects\test.csproj", "test");
}
FileProjectItem GenerateCodeWithProjectFile() FileProjectItem GenerateCodeWithProjectFile()
{ {
var file = new TestableFileProjectItem("test.tt"); var file = new TestableFileProjectItem("test.tt");
@ -45,7 +38,7 @@ namespace TextTemplating.Tests
public void GenerateCode_CustomToolContextPassed_CustomToolContextUsedToCreateTextTemplatingFileGenerator() public void GenerateCode_CustomToolContextPassed_CustomToolContextUsedToCreateTextTemplatingFileGenerator()
{ {
CreateCustomTool(); CreateCustomTool();
IProject project = CreateProject(); IProject project = ProjectHelper.CreateProject();
var context = new CustomToolContext(project); var context = new CustomToolContext(project);
customTool.GenerateCode(null, context); customTool.GenerateCode(null, context);

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

@ -212,5 +212,27 @@ namespace TextTemplating.Tests
Assert.AreEqual("error", task.Description); 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 @@
<Compile Include="Helpers\FakeTextTemplatingCustomToolContext.cs" /> <Compile Include="Helpers\FakeTextTemplatingCustomToolContext.cs" />
<Compile Include="Helpers\FakeTextTemplatingHost.cs" /> <Compile Include="Helpers\FakeTextTemplatingHost.cs" />
<Compile Include="Helpers\FakeTextTemplatingFileGenerator.cs" /> <Compile Include="Helpers\FakeTextTemplatingFileGenerator.cs" />
<Compile Include="Helpers\ProjectHelper.cs" />
<Compile Include="Helpers\TestableFileProjectItem.cs" /> <Compile Include="Helpers\TestableFileProjectItem.cs" />
<Compile Include="Helpers\TestableTextTemplatingFileGeneratorCustomTool.cs" /> <Compile Include="Helpers\TestableTextTemplatingFileGeneratorCustomTool.cs" />
<Compile Include="Helpers\TestableTextTemplatingHost.cs" /> <Compile Include="Helpers\TestableTextTemplatingHost.cs" />
<Compile Include="Src\CompilerErrorTaskTests.cs" /> <Compile Include="Src\CompilerErrorTaskTests.cs" />
<Compile Include="Src\NamespaceHintTests.cs" />
<Compile Include="Src\TextTemplatingAssemblyResolverTests.cs" /> <Compile Include="Src\TextTemplatingAssemblyResolverTests.cs" />
<Compile Include="Src\TextTemplatingFileGeneratorCustomToolTests.cs" /> <Compile Include="Src\TextTemplatingFileGeneratorCustomToolTests.cs" />
<Compile Include="Src\TextTemplatingFileGeneratorTests.cs" /> <Compile Include="Src\TextTemplatingFileGeneratorTests.cs" />

Loading…
Cancel
Save