Browse Source

Implement IVsSolution and FlavoredProject for T4 scaffolding.

pull/28/head
Matt Ward 14 years ago
parent
commit
c1835c0fbc
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectType.cs
  3. 29
      src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/FlavoredProject.cs
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/Package.cs
  5. 14
      src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsConstants.cs
  6. 57
      src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsSolution.cs
  7. 2
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  8. 75
      src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/FlavoredProjectTests.cs
  9. 9
      src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/PackageTests.cs
  10. 102
      src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/VsSolutionTests.cs

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

@ -405,6 +405,8 @@ @@ -405,6 +405,8 @@
<Compile Include="Src\VisualStudio\Package.cs" />
<Compile Include="Src\VisualStudio\SVsExtensionManager.cs" />
<Compile Include="Src\VisualStudio\ThreadHelper.cs" />
<Compile Include="Src\VisualStudio\VsConstants.cs" />
<Compile Include="Src\VisualStudio\VsSolution.cs" />
</ItemGroup>
<ItemGroup>
<Page Include="Src\ManagePackagesView.xaml" />

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectType.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 ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
@ -15,6 +16,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -15,6 +16,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
this.Type = GetProjectType(project);
}
public ProjectType(MSBuildBasedProject project)
: this(new Project(project))
{
}
string GetProjectType(Project project)
{
string extension = project.GetLowercaseFileExtension();

29
src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/FlavoredProject.cs

@ -2,19 +2,44 @@ @@ -2,19 +2,44 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.VisualStudio.Shell.Interop;
namespace Microsoft.VisualStudio.Shell.Flavor
{
public class FlavoredProject : MarshalByRefObject, IVsAggregatableProject, IVsHierarchy
{
public FlavoredProject()
MSBuildBasedProject project;
public FlavoredProject(MSBuildBasedProject project)
{
this.project = project;
}
public int GetAggregateProjectTypeGuids(out string projTypeGuids)
{
throw new NotImplementedException();
projTypeGuids = GetProjectTypeGuidsFromProject();
if (projTypeGuids == null) {
projTypeGuids = GetProjectTypeGuidsBasedOnProjectFileExtension();
}
return VsConstants.S_OK;
}
string GetProjectTypeGuidsFromProject()
{
return project.GetUnevalatedProperty("ProjectTypeGuids");
}
string GetProjectTypeGuidsBasedOnProjectFileExtension()
{
var projectType = new ProjectType(project);
if (projectType.Type == ProjectType.CSharp) {
return ProjectTypeGuids.CSharp;
} else if (projectType.Type == ProjectType.VBNet) {
return ProjectTypeGuids.VBNet;
}
return String.Empty;
}
}
}

5
src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/Package.cs

@ -3,7 +3,9 @@ @@ -3,7 +3,9 @@
using System;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.PackageManagement.VisualStudio;
using Microsoft.VisualStudio.ExtensionManager;
using Microsoft.VisualStudio.Shell.Interop;
namespace Microsoft.VisualStudio.Shell
{
@ -11,12 +13,13 @@ namespace Microsoft.VisualStudio.Shell @@ -11,12 +13,13 @@ namespace Microsoft.VisualStudio.Shell
{
public static object GetGlobalService(Type serviceType)
{
//typeof(IVsSolution)
//typeof(SComponentModel) --> not used - console initializer.
if (serviceType == typeof(DTE)) {
return new DTE();
} else if (serviceType == typeof(SVsExtensionManager)) {
return new SVsExtensionManager();
} else if (serviceType == typeof(IVsSolution)) {
return new VsSolution();
}
return null;
}

14
src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsConstants.cs

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
// 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;
namespace Microsoft.VisualStudio
{
public class VsConstants
{
public const int S_OK = 0;
public const int E_FAIL = -2147467259;
}
}

57
src/AddIns/Misc/PackageManagement/Project/Src/VisualStudio/VsSolution.cs

@ -0,0 +1,57 @@ @@ -0,0 +1,57 @@
// 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.IO;
using System.Linq;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Flavor;
using Microsoft.VisualStudio.Shell.Interop;
namespace ICSharpCode.PackageManagement.VisualStudio
{
public class VsSolution : MarshalByRefObject, IVsSolution
{
IPackageManagementProjectService projectService;
public VsSolution()
: this(new PackageManagementProjectService())
{
}
public VsSolution(IPackageManagementProjectService projectService)
{
this.projectService = projectService;
}
public int GetProjectOfUniqueName(string uniqueName, out IVsHierarchy hierarchy)
{
hierarchy = null;
MSBuildBasedProject project = FindProject(uniqueName);
if (project != null) {
hierarchy = new FlavoredProject(project);
return VsConstants.S_OK;
}
return VsConstants.E_FAIL;
}
MSBuildBasedProject FindProject(string uniqueName)
{
return projectService
.GetOpenProjects()
.SingleOrDefault(project => ProjectUniqueNameMatches(project, uniqueName)) as MSBuildBasedProject;
}
bool ProjectUniqueNameMatches(IProject project, string uniqueName)
{
return IsCaseInsensitiveMatch(Path.GetFileName(project.FileName), uniqueName);
}
bool IsCaseInsensitiveMatch(string a, string b)
{
return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
}
}

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

@ -268,8 +268,10 @@ @@ -268,8 +268,10 @@
<Compile Include="Src\UpdatePackageActionTests.cs" />
<Compile Include="Src\UpdatePackageInAllProjectsTests.cs" />
<Compile Include="Src\ViewModelBaseTests.cs" />
<Compile Include="Src\VisualStudio\FlavoredProjectTests.cs" />
<Compile Include="Src\VisualStudio\PackageTests.cs" />
<Compile Include="Src\VisualStudio\SVsExtensionManagerTests.cs" />
<Compile Include="Src\VisualStudio\VsSolutionTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">

75
src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/FlavoredProjectTests.cs

@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
// 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 Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Flavor;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.VisualStudio
{
[TestFixture]
public class FlavoredProjectTests
{
FlavoredProject project;
TestableProject msbuildProject;
void CreateFlavoredProject(MSBuildBasedProject msbuildProject)
{
project = new FlavoredProject(msbuildProject);
}
void CreateMSBuildProject(string fileName)
{
msbuildProject = ProjectHelper.CreateTestProject();
msbuildProject.FileName = fileName;
}
void AddProjectTypeGuidsToMSBuildProject(string guids)
{
msbuildProject.SetProperty("ProjectTypeGuids", guids, false);
}
[Test]
public void GetAggregateProjectTypeGuids_VisualBasicProject_ReturnsVisualBasicProjectTypeGuid()
{
CreateMSBuildProject(@"d:\projects\test\test.vbproj");
CreateFlavoredProject(msbuildProject);
string guids;
int result = project.GetAggregateProjectTypeGuids(out guids);
Assert.AreEqual(VsConstants.S_OK, result);
Assert.AreEqual(ProjectTypeGuids.VBNet, guids);
}
[Test]
public void GetAggregateProjectTypeGuids_UnknownProject_ReturnsEmptyString()
{
CreateMSBuildProject(@"d:\projects\test\test.unknown");
CreateFlavoredProject(msbuildProject);
string guids;
int result = project.GetAggregateProjectTypeGuids(out guids);
Assert.AreEqual(VsConstants.S_OK, result);
Assert.AreEqual(String.Empty, guids);
}
[Test]
public void GetAggregateProjectTypeGuids_MSBuildProjectHasProjectTypeGuidsDefined_ReturnsGuidsFromMSBuildProject()
{
CreateMSBuildProject(@"d:\projects\test\test.csproj");
string expectedGuids = "{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}";
AddProjectTypeGuidsToMSBuildProject(expectedGuids);
CreateFlavoredProject(msbuildProject);
string guids;
project.GetAggregateProjectTypeGuids(out guids);
Assert.AreEqual(expectedGuids, guids);
}
}
}

9
src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/PackageTests.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using ICSharpCode.PackageManagement.EnvDTE;
using Microsoft.VisualStudio.ExtensionManager;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using NUnit.Framework;
namespace PackageManagement.Tests.VisualStudio
@ -35,5 +36,13 @@ namespace PackageManagement.Tests.VisualStudio @@ -35,5 +36,13 @@ namespace PackageManagement.Tests.VisualStudio
Assert.IsNull(instance);
}
[Test]
public void GetGlobalService_GetIVsSolution_ReturnsIVsSolution()
{
object solution = Package.GetGlobalService(typeof(IVsSolution)) as IVsSolution;
Assert.IsInstanceOf(typeof(IVsSolution), solution);
}
}
}

102
src/AddIns/Misc/PackageManagement/Test/Src/VisualStudio/VsSolutionTests.cs

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
// 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.Design;
using ICSharpCode.PackageManagement.VisualStudio;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests.VisualStudio
{
[TestFixture]
public class VsSolutionTests
{
VsSolution solution;
IVsHierarchy hierarchy;
FakePackageManagementProjectService fakeProjectService;
void CreateVsSolution()
{
fakeProjectService = new FakePackageManagementProjectService();
solution = new VsSolution(fakeProjectService);
}
int GetProjectOfUniqueName(string name)
{
return solution.GetProjectOfUniqueName(name, out hierarchy);
}
void AddProjectToMSBuildSolution(string fileName)
{
TestableProject project = ProjectHelper.CreateTestProject();
project.FileName = fileName;
fakeProjectService.AddFakeProject(project);
}
[Test]
public void GetProjectOfUniqueName_NoSolutionOpen_ReturnsError()
{
CreateVsSolution();
int result = GetProjectOfUniqueName("Test.csproj");
Assert.AreEqual(VsConstants.E_FAIL, result);
}
[Test]
public void GetProjectOfUniqueName_SolutionHasProjectMatchingUniqueName_ReturnsSuccessAndVsHierarchy()
{
CreateVsSolution();
AddProjectToMSBuildSolution(@"d:\projects\test\Test.csproj");
int result = GetProjectOfUniqueName("Test.csproj");
Assert.AreEqual(VsConstants.S_OK, result);
Assert.IsNotNull(hierarchy);
}
[Test]
public void GetProjectOfUniqueName_SolutionHasProjectButDoesNotMatchUniqueName_ReturnsError()
{
CreateVsSolution();
AddProjectToMSBuildSolution(@"d:\projects\test\unknown.vbproj");
int result = GetProjectOfUniqueName("Test.csproj");
Assert.AreEqual(VsConstants.E_FAIL, result);
}
[Test]
public void GetProjectOfUniqueName_UniqueNameCaseIsIgnored_ReturnsSuccess()
{
CreateVsSolution();
AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj");
int result = GetProjectOfUniqueName("TEST.CSPROJ");
Assert.AreEqual(VsConstants.S_OK, result);
Assert.IsNotNull(hierarchy);
}
[Test]
public void GetProjectOfUniqueName_ProjectTypeGuidsRetrievedFromAggregatableCSharpProject_ReturnsCSharpProjectTypeGuid()
{
CreateVsSolution();
AddProjectToMSBuildSolution(@"d:\projects\test\test.csproj");
GetProjectOfUniqueName("test.csproj");
var project = hierarchy as IVsAggregatableProject;
string guids;
int result = project.GetAggregateProjectTypeGuids(out guids);
Assert.AreEqual(VsConstants.S_OK, result);
Assert.AreEqual(ProjectTypeGuids.CSharp, guids);
}
}
}
Loading…
Cancel
Save