Browse Source

Add support for enumerating EnvDTE.Project.ProjectItems in PowerShell scripts.

pull/15/head
Matt Ward 14 years ago
parent
commit
1915a655f6
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 3
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  3. 23
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  4. 16
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs
  5. 133
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideDirectory.cs
  6. 196
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs
  7. 7
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs

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

@ -72,7 +72,9 @@ @@ -72,7 +72,9 @@
<Compile Include="Src\Design\FakePackageManagementProject.cs" />
<Compile Include="Src\EnvDTE\DTE.cs" />
<Compile Include="Src\EnvDTE\ItemOperations.cs" />
<Compile Include="Src\EnvDTE\ProjectItem.cs" />
<Compile Include="Src\EnvDTE\ProjectItems.cs" />
<Compile Include="Src\EnvDTE\ProjectItemsInsideDirectory.cs" />
<Compile Include="Src\EnvDTE\ProjectObject.cs" />
<Compile Include="Src\EnvDTE\Properties.cs" />
<Compile Include="Src\EnvDTE\Property.cs" />

3
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project;
using SD = ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
@ -77,7 +78,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -77,7 +78,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return false;
}
internal IEnumerable<ProjectItem> GetReferences()
internal IEnumerable<SD.ProjectItem> GetReferences()
{
return MSBuildProject.GetItemsOfType(ItemType.Reference);
}

23
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// 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 SD = ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItem
{
SD.ProjectItem projectItem;
public ProjectItem(SD.ProjectItem projectItem)
{
this.projectItem = projectItem;
}
public string Name {
get { return Path.GetFileName(projectItem.Include); }
}
}
}

16
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs

@ -2,12 +2,13 @@ @@ -2,12 +2,13 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItems
public class ProjectItems : IEnumerable<ProjectItem>
{
Project project;
IPackageManagementFileService fileService;
@ -36,5 +37,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -36,5 +37,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return Path.Combine(project.MSBuildProject.Directory, fileName);
}
public IEnumerator<ProjectItem> GetEnumerator()
{
var items = new ProjectItemsInsideDirectory(project);
return items.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

133
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideDirectory.cs

@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
// 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;
using System.Collections.Generic;
using System.IO;
using SD = ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItemsInsideDirectory : IEnumerable<ProjectItem>
{
Project project;
Dictionary<string, string> directoriesIncluded = new Dictionary<string, string>();
public ProjectItemsInsideDirectory(Project project)
{
this.project = project;
}
public IEnumerator<ProjectItem> GetEnumerator()
{
foreach (SD.ProjectItem item in project.MSBuildProject.Items) {
ProjectItem projectItem = ConvertToProjectItem(item);
if (projectItem != null) {
yield return projectItem;
}
}
}
ProjectItem ConvertToProjectItem(SD.ProjectItem item)
{
var fileItem = item as SD.FileProjectItem;
if (fileItem != null) {
return ConvertFileToProjectItem(fileItem);
}
return null;
}
ProjectItem ConvertFileToProjectItem(SD.FileProjectItem fileItem)
{
if (IsInProjectRootFolder(fileItem)) {
if (IsDirectory(fileItem)) {
return CreateDirectoryProjectItemIfDirectoryNotAlreadyIncluded(fileItem);
}
return new ProjectItem(fileItem);
}
return ConvertDirectoryToProjectItem(fileItem);
}
bool IsInProjectRootFolder(SD.FileProjectItem item)
{
if (item.IsLink) {
return !HasDirectoryInPath(item.VirtualName);
}
return !HasDirectoryInPath(item.Include);
}
bool HasDirectoryInPath(string path)
{
string directoryName = Path.GetDirectoryName(path);
return !String.IsNullOrEmpty(directoryName);
}
bool IsDirectory(SD.FileProjectItem fileItem)
{
return fileItem.ItemType == SD.ItemType.Folder;
}
ProjectItem CreateDirectoryProjectItemIfDirectoryNotAlreadyIncluded(SD.FileProjectItem fileItem)
{
string directory = fileItem.Include;
if (!IsDirectoryIncludedAlready(directory)) {
AddIncludedDirectory(directory);
return new ProjectItem(fileItem);
}
return null;
}
ProjectItem ConvertDirectoryToProjectItem(SD.FileProjectItem fileItem)
{
string subDirectoryName = GetFirstSubDirectoryName(fileItem.Include);
if (IsDirectoryInsideProject(subDirectoryName)) {
return CreateDirectoryProjectItemIfDirectoryNotAlreadyIncluded(subDirectoryName);
}
return null;
}
ProjectItem CreateDirectoryProjectItemIfDirectoryNotAlreadyIncluded(string subDirectoryName)
{
if (!IsDirectoryIncludedAlready(subDirectoryName)) {
AddIncludedDirectory(subDirectoryName);
return CreateDirectoryProjectItem(subDirectoryName);
}
return null;
}
bool IsDirectoryInsideProject(string directoryName)
{
return !directoryName.StartsWith("..");
}
bool IsDirectoryIncludedAlready(string directory)
{
return directoriesIncluded.ContainsKey(directory);
}
void AddIncludedDirectory(string directoryName)
{
directoriesIncluded.Add(directoryName, directoryName);
}
ProjectItem CreateDirectoryProjectItem(string directoryName)
{
var directoryItem = new SD.FileProjectItem(project.MSBuildProject, SD.ItemType.Folder);
directoryItem.Include = directoryName;
return new ProjectItem(directoryItem);
}
string GetFirstSubDirectoryName(string include)
{
string[] directoryNames = include.Split('\\');
return directoryNames[0];
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

196
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs

@ -2,7 +2,10 @@ @@ -2,7 +2,10 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.PackageManagement.EnvDTE;
using DTE = ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
@ -25,6 +28,24 @@ namespace PackageManagement.Tests.EnvDTE @@ -25,6 +28,24 @@ namespace PackageManagement.Tests.EnvDTE
fakeFileService = project.FakeFileService;
}
void ProjectItemCollectionAssertAreEqual(string[] expectedItems, List<DTE.ProjectItem> itemsList)
{
var actualItems = new List<string>();
itemsList.ForEach(r => actualItems.Add(r.Name));
CollectionAssert.AreEqual(expectedItems, actualItems);
}
void ProjectItemCollectionAssertAreEqual(string[] expectedItems, IEnumerable itemsList)
{
var actualItems = new List<string>();
foreach (DTE.ProjectItem item in itemsList) {
actualItems.Add(item.Name);
}
CollectionAssert.AreEqual(expectedItems, actualItems);
}
[Test]
public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileIsIncludedInProjectInProjectFolder()
{
@ -104,5 +125,180 @@ namespace PackageManagement.Tests.EnvDTE @@ -104,5 +125,180 @@ namespace PackageManagement.Tests.EnvDTE
CollectionAssert.AreEqual(expectedFileNames, actualFileNames);
}
[Test]
public void GetEnumerator_ProjectHasTwoFiles_TwoFilesReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"Test.cs");
var itemsList = new List<DTE.ProjectItem>();
itemsList.AddRange(projectItems);
var expectedItems = new string[] {
"Test.cs"
};
ProjectItemCollectionAssertAreEqual(expectedItems, itemsList);
}
[Test]
public void GetEnumerator_UseUntypedEnumeratorProjectHasOneFile_OneFileReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedFiles = new string[] {
"Program.cs"
};
ProjectItemCollectionAssertAreEqual(expectedFiles, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneFileAndOneReference_OneFileReturned()
{
CreateProjectItems();
msbuildProject.AddReference("NUnit.Framework");
msbuildProject.AddFile(@"Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedFiles = new string[] {
"Program.cs"
};
ProjectItemCollectionAssertAreEqual(expectedFiles, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneFileInSubDirectory_OneFolderReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"src\Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"src"
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasTwoFilesInDifferentSubDirectories_TwoFoldersReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"Controllers\Program.cs");
msbuildProject.AddFile(@"ViewModels\Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"Controllers",
"ViewModels"
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasTwoFilesInSameSubDirectory_OneFolderReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"Controllers\Tests\Program1.cs");
msbuildProject.AddFile(@"Controllers\Tests\Program2.cs");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"Controllers",
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneFolderAndOneFileInSameSubDirectory_OneFileAndOneFolderReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"Controllers\Program.cs");
msbuildProject.AddDirectory(@"Controllers");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"Controllers",
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneFolderAndOneFileInSameSubDirectoryWithDirectoryFirstInProject_OneFileAndOneFolderReturned()
{
CreateProjectItems();
msbuildProject.AddDirectory(@"Controllers");
msbuildProject.AddFile(@"Controllers\Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"Controllers",
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneLinkedFile_OneFileReturned()
{
CreateProjectItems();
var fileItem = msbuildProject.AddFile(@"..\..\Program.cs");
fileItem.SetMetadata("Link", "MyProgram.cs");
var enumerable = projectItems as IEnumerable;
var expectedFiles = new string[] {
"Program.cs"
};
ProjectItemCollectionAssertAreEqual(expectedFiles, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasFileWithRelativePath_FileIsTreatedAsLinkAndReturned()
{
CreateProjectItems();
msbuildProject.AddFile(@"..\..\Program.cs");
var enumerable = projectItems as IEnumerable;
var expectedFiles = new string[] {
"Program.cs"
};
ProjectItemCollectionAssertAreEqual(expectedFiles, enumerable);
}
[Test]
public void GetEnumerator_ProjectHasOneLinkedFileInProjectSubDirectoryAndOneDirectory_OneDirectoryReturned()
{
CreateProjectItems();
msbuildProject.AddDirectory("Configuration");
var fileItem = msbuildProject.AddFile(@"..\..\AssemblyInfo.cs");
fileItem.SetMetadata("Link", @"Configuration\MyAssemblyInfo.cs");
var enumerable = projectItems as IEnumerable;
var expectedItems = new string[] {
"Configuration"
};
ProjectItemCollectionAssertAreEqual(expectedItems, enumerable);
}
}
}

7
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs

@ -46,5 +46,12 @@ namespace PackageManagement.Tests.Helpers @@ -46,5 +46,12 @@ namespace PackageManagement.Tests.Helpers
ProjectService.AddProjectItem(this, fileProjectItem);
return fileProjectItem;
}
public FileProjectItem AddDirectory(string include)
{
var fileProjectItem = new FileProjectItem(this, ItemType.Folder, include);
ProjectService.AddProjectItem(this, fileProjectItem);
return fileProjectItem;
}
}
}

Loading…
Cancel
Save