Browse Source

Fix T4MVC T4 template failing to run.

Extend the text templating addin to allow addins to define their own service providers.
Package management addin defines a service provider that can be used in a T4 template to create EnvDTE types such as DTE.
pull/28/head
Matt Ward 13 years ago
parent
commit
7dd2cc0296
  1. 6
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin
  2. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  3. 16
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServiceProvider.cs
  4. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  5. 30
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementServiceProviderTests.cs
  6. 37
      src/AddIns/Misc/TextTemplating/Project/Src/CustomServiceTextTemplatingServiceProviders.cs
  7. 1
      src/AddIns/Misc/TextTemplating/Project/Src/IAddInTree.cs
  8. 5
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAddInTree.cs
  9. 16
      src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingServiceProvider.cs
  10. 8
      src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin
  11. 1
      src/AddIns/Misc/TextTemplating/Project/TextTemplating.csproj
  12. 5
      src/AddIns/Misc/TextTemplating/Test/Helpers/FakeAddInTree.cs
  13. 85
      src/AddIns/Misc/TextTemplating/Test/Src/CustomTextTemplatingServiceProvidersTests.cs
  14. 52
      src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingServiceProviderTests.cs
  15. 4
      src/AddIns/Misc/TextTemplating/Test/TextTemplating.Tests.csproj
  16. 6
      src/AddIns/Misc/TextTemplating/TextTemplating.sln

6
src/AddIns/Misc/PackageManagement/Project/PackageManagement.addin

@ -102,4 +102,10 @@ @@ -102,4 +102,10 @@
id="InstallPackages"
class="ICSharpCode.PackageManagement.InstallProjectTemplatePackagesCommand"/>
</Path>
<Path name="/SharpDevelop/TextTemplating/ServiceProviders">
<Class
id="PackageManagementServiceProvider"
class="ICSharpCode.PackageManagement.PackageManagementServiceProvider"/>
</Path>
</AddIn>

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

@ -214,6 +214,7 @@ @@ -214,6 +214,7 @@
<Compile Include="Src\IThreadSafePackageManagementEvents.cs" />
<Compile Include="Src\ManagePackagesUserPrompts.cs" />
<Compile Include="Src\ManagePackagesViewTitle.cs" />
<Compile Include="Src\PackageManagementServiceProvider.cs" />
<Compile Include="Src\VirtualMethodUpdater.cs" />
<Compile Include="Src\NewProjectsCreated.cs" />
<Compile Include="Src\OpenMSBuildProjects.cs" />

16
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServiceProvider.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// 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 Microsoft.VisualStudio.Shell;
namespace ICSharpCode.PackageManagement
{
public class PackageManagementServiceProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
return Package.GetGlobalService(serviceType);
}
}
}

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -186,6 +186,7 @@ @@ -186,6 +186,7 @@
<Compile Include="Src\Helpers\TestableInstallProjectTemplatePackagesCommand.cs" />
<Compile Include="Src\Helpers\TestablePowerShellMissingConsoleHost.cs" />
<Compile Include="Src\InstallProjectTemplatePackagesCommandTests.cs" />
<Compile Include="Src\PackageManagementServiceProviderTests.cs" />
<Compile Include="Src\VirtualMethodUpdaterTests.cs" />
<Compile Include="Src\NewProjectsCreatedTests.cs" />
<Compile Include="Src\PackageActionRunnerTests.cs" />

30
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementServiceProviderTests.cs

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
// 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.PackageManagement;
using NUnit.Framework;
namespace PackageManagement.Tests
{
[TestFixture]
public class PackageManagementServiceProviderTests
{
PackageManagementServiceProvider serviceProvider;
public void CreateServiceProvider()
{
serviceProvider = new PackageManagementServiceProvider();
}
[Test]
public void GetService_TypeOfDTE_ReturnsDTE()
{
CreateServiceProvider();
object dte = serviceProvider.GetService(typeof(global::EnvDTE.DTE)) as global::EnvDTE.DTE;
Assert.IsInstanceOf(typeof(global::EnvDTE.DTE), dte);
}
}
}

37
src/AddIns/Misc/TextTemplating/Project/Src/CustomServiceTextTemplatingServiceProviders.cs

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
// 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 System.Collections.Generic;
namespace ICSharpCode.TextTemplating
{
public class CustomServiceTextTemplatingServiceProviders : IServiceProvider
{
public static readonly string AddInPath = "/SharpDevelop/TextTemplating/ServiceProviders";
List<IServiceProvider> serviceProviders;
public CustomServiceTextTemplatingServiceProviders()
: this(new TextTemplatingAddInTree())
{
}
public CustomServiceTextTemplatingServiceProviders(IAddInTree addInTree)
{
serviceProviders = addInTree.BuildServiceProviders(AddInPath);
}
public object GetService(Type serviceType)
{
foreach (IServiceProvider provider in serviceProviders) {
object service = provider.GetService(serviceType);
if (service != null) {
return service;
}
}
return null;
}
}
}

1
src/AddIns/Misc/TextTemplating/Project/Src/IAddInTree.cs

@ -9,5 +9,6 @@ namespace ICSharpCode.TextTemplating @@ -9,5 +9,6 @@ namespace ICSharpCode.TextTemplating
public interface IAddInTree
{
IEnumerable<IAddIn> GetAddIns();
List<IServiceProvider> BuildServiceProviders(string path);
}
}

5
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingAddInTree.cs

@ -15,5 +15,10 @@ namespace ICSharpCode.TextTemplating @@ -15,5 +15,10 @@ namespace ICSharpCode.TextTemplating
yield return new TextTemplatingAddIn(addIn);
}
}
public List<IServiceProvider> BuildServiceProviders(string path)
{
return AddInTree.BuildItems<IServiceProvider>(path, null);
}
}
}

16
src/AddIns/Misc/TextTemplating/Project/Src/TextTemplatingServiceProvider.cs

@ -7,8 +7,24 @@ namespace ICSharpCode.TextTemplating @@ -7,8 +7,24 @@ namespace ICSharpCode.TextTemplating
{
public class TextTemplatingServiceProvider : IServiceProvider
{
IServiceProvider serviceProvider;
public TextTemplatingServiceProvider()
: this(new CustomServiceTextTemplatingServiceProviders())
{
}
public TextTemplatingServiceProvider(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
object service = serviceProvider.GetService(serviceType);
if (service != null) {
return service;
}
return serviceType.Assembly.CreateInstance(serviceType.FullName);
}
}

8
src/AddIns/Misc/TextTemplating/Project/TextTemplating.addin

@ -51,4 +51,12 @@ @@ -51,4 +51,12 @@
<Path name="/SharpDevelop/BackendBindings/Templates">
<Directory id="TextTemplating" path="./Templates"/>
</Path>
<!-- Defines service providers that will be used by the text templating host
to create types before the default TextTemplatingServiceProvider class -->
<Path name="/SharpDevelop/TextTemplating/ServiceProviders">
<!-- Example
<Class id="Default" class="MyNamespace.MyServiceProvider" />
-->
</Path>
</AddIn>

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

@ -53,6 +53,7 @@ @@ -53,6 +53,7 @@
<Compile Include="Src\AddInAssemblyName.cs" />
<Compile Include="Src\AddInAssemblyRuntime.cs" />
<Compile Include="Src\CompilerErrorTask.cs" />
<Compile Include="Src\CustomServiceTextTemplatingServiceProviders.cs" />
<Compile Include="Src\IAddIn.cs" />
<Compile Include="Src\IAddInRuntime.cs" />
<Compile Include="Src\IAddInTree.cs" />

5
src/AddIns/Misc/TextTemplating/Test/Helpers/FakeAddInTree.cs

@ -24,5 +24,10 @@ namespace TextTemplating.Tests.Helpers @@ -24,5 +24,10 @@ namespace TextTemplating.Tests.Helpers
{
return FakeAddIns;
}
public List<IServiceProvider> BuildServiceProviders(string path)
{
return null;
}
}
}

85
src/AddIns/Misc/TextTemplating/Test/Src/CustomTextTemplatingServiceProvidersTests.cs

@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
// 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 System.Collections.Generic;
using ICSharpCode.TextTemplating;
using NUnit.Framework;
using Rhino.Mocks;
namespace TextTemplating.Tests
{
[TestFixture]
public class CustomTextTemplatingServiceProvidersTests
{
CustomServiceTextTemplatingServiceProviders customServiceProviders;
IAddInTree fakeAddInTree;
List<IServiceProvider> addInTreeServiceProviders;
void CreateFakeAddInTree()
{
fakeAddInTree = MockRepository.GenerateStub<IAddInTree>();
addInTreeServiceProviders = new List<IServiceProvider>();
fakeAddInTree
.Stub(tree => tree.BuildServiceProviders(CustomServiceTextTemplatingServiceProviders.AddInPath))
.Return(addInTreeServiceProviders);
}
void CreateCustomTextTemplatingServiceProviders()
{
customServiceProviders = new CustomServiceTextTemplatingServiceProviders(fakeAddInTree);
}
void AddServiceObjectToReturnFromServiceProvider(IServiceProvider serviceProvider, Type type, object objectToReturn)
{
serviceProvider.Stub(provider => provider.GetService(type)).Return(objectToReturn);
}
IServiceProvider AddServiceProviderToAddInTree()
{
IServiceProvider serviceProvider = MockRepository.GenerateStub<IServiceProvider>();
addInTreeServiceProviders.Add(serviceProvider);
return serviceProvider;
}
[Test]
public void GetService_AddInTreeDefinesNoServiceProviders_ReturnsNull()
{
CreateFakeAddInTree();
CreateCustomTextTemplatingServiceProviders();
object result = customServiceProviders.GetService(typeof(string));
Assert.IsNull(result);
}
[Test]
public void GetService_AddInTreeDefinesOneServiceProvider_TypeReturnedFromServiceProvider()
{
CreateFakeAddInTree();
IServiceProvider serviceProvider = AddServiceProviderToAddInTree();
object objectToReturnFromServiceProvider = new object();
AddServiceObjectToReturnFromServiceProvider(serviceProvider, typeof(string), objectToReturnFromServiceProvider);
CreateCustomTextTemplatingServiceProviders();
object result = customServiceProviders.GetService(typeof(string));
Assert.AreEqual(objectToReturnFromServiceProvider, result);
}
[Test]
public void GetService_AddInTreeDefinesTwoServiceProvidersAndSecondDefinesServiceType_TypeReturnedFromSecondServiceProvider()
{
CreateFakeAddInTree();
AddServiceProviderToAddInTree();
IServiceProvider serviceProvider = AddServiceProviderToAddInTree();
object objectToReturnFromServiceProvider = new object();
AddServiceObjectToReturnFromServiceProvider(serviceProvider, typeof(string), objectToReturnFromServiceProvider);
CreateCustomTextTemplatingServiceProviders();
object result = customServiceProviders.GetService(typeof(string));
Assert.AreEqual(objectToReturnFromServiceProvider, result);
}
}
}

52
src/AddIns/Misc/TextTemplating/Test/Src/TextTemplatingServiceProviderTests.cs

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
using System;
using ICSharpCode.TextTemplating;
using NUnit.Framework;
using Rhino.Mocks;
using TextTemplating.Tests.Helpers;
namespace TextTemplating.Tests
@ -11,20 +12,59 @@ namespace TextTemplating.Tests @@ -11,20 +12,59 @@ namespace TextTemplating.Tests
[TestFixture]
public class TextTemplatingServiceProviderTests
{
TextTemplatingServiceProvider serviceProvider;
TextTemplatingServiceProvider textTemplatingServiceProvider;
void CreateServiceProvider()
void CreateTextTemplatingServiceProvider()
{
serviceProvider = new TextTemplatingServiceProvider();
IServiceProvider serviceProvider = CreateFakeServiceProvider();
CreateTextTemplatingServiceProvider(serviceProvider);
}
void CreateTextTemplatingServiceProvider(IServiceProvider serviceProvider)
{
textTemplatingServiceProvider = new TextTemplatingServiceProvider(serviceProvider);
}
IServiceProvider CreateFakeServiceProvider()
{
return MockRepository.GenerateStub<IServiceProvider>();
}
IServiceProvider CreateFakeServiceProvider(Type serviceType, object service)
{
IServiceProvider serviceProvider = CreateFakeServiceProvider();
AddServiceToFakeServiceProvider(serviceProvider, serviceType, service);
return serviceProvider;
}
void AddServiceToFakeServiceProvider(IServiceProvider serviceProvider, Type serviceType, object service)
{
serviceProvider
.Stub(provider => provider.GetService(serviceType))
.Return(service);
}
[Test]
public void GetService_TypeOfFakeServiceProvider_ReturnsNewFakeServiceProvider()
public void GetService_TypeOfTextTemplatingServiceProviderTests_ReturnsTextTemplatingServiceProviderTests()
{
CreateServiceProvider();
FakeServiceProvider service = serviceProvider.GetService(typeof(FakeServiceProvider)) as FakeServiceProvider;
CreateTextTemplatingServiceProvider();
var service = textTemplatingServiceProvider.GetService(typeof(TextTemplatingServiceProviderTests)) as TextTemplatingServiceProviderTests;
Assert.IsNotNull(service);
}
[Test]
public void GetService_ServiceDefinedByServiceProviderUsedInConstructor_ReturnsServiceFromServiceProvider()
{
var expectedService = new object();
IServiceProvider fakeServiceProvider =
CreateFakeServiceProvider(typeof(TextTemplatingServiceProviderTests), expectedService);
CreateTextTemplatingServiceProvider(fakeServiceProvider);
object service = textTemplatingServiceProvider.GetService(typeof(TextTemplatingServiceProviderTests));
Assert.AreEqual(expectedService, service);
}
}
}

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

@ -44,6 +44,9 @@ @@ -44,6 +44,9 @@
<Reference Include="nunit.framework">
<HintPath>..\..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="Rhino.Mocks">
<HintPath>..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
@ -85,6 +88,7 @@ @@ -85,6 +88,7 @@
<Compile Include="Src\AddInAssemblyNameTests.cs" />
<Compile Include="Src\AddInAssemblyRuntimeTests.cs" />
<Compile Include="Src\CompilerErrorTaskTests.cs" />
<Compile Include="Src\CustomTextTemplatingServiceProvidersTests.cs" />
<Compile Include="Src\NamespaceHintTests.cs" />
<Compile Include="Src\TextTemplatingAssemblyPathResolverTests.cs" />
<Compile Include="Src\TextTemplatingAssemblyResolverTests.cs" />

6
src/AddIns/Misc/TextTemplating/TextTemplating.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.1.0.7374-alpha
# SharpDevelop 4.3
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTemplating", "Project\TextTemplating.csproj", "{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "..\..\..\Libraries\AvalonDock\AvalonDock\AvalonDock.csproj", "{87E61430-4243-45F2-B74E-0A4C096CEBF3}"
@ -106,5 +106,9 @@ Global @@ -106,5 +106,9 @@ Global
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|x86.ActiveCfg = Release|Any CPU
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.Build.0 = Release|Any CPU
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|Any CPU.Build.0 = Debug|x86
{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Debug|Any CPU.ActiveCfg = Debug|x86
{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|Any CPU.Build.0 = Release|x86
{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}.Release|Any CPU.ActiveCfg = Release|x86
EndGlobalSection
EndGlobal

Loading…
Cancel
Save