Browse Source

Fix duplicate directory project items being returned by EnvDTE.ProjectItems.

pull/28/head
Matt Ward 13 years ago
parent
commit
1cdc439a10
  1. 29
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ChildProjectItems.cs
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  3. 39
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs

29
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ChildProjectItems.cs

@ -18,10 +18,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -18,10 +18,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
this.ProjectItem = projectItem;
this.Project = projectItem.ContainingProject;
this.ChildDirectoryProjectItems = new List<ProjectItem>();
}
ProjectItem ProjectItem { get; set; }
Project Project { get; set; }
List<ProjectItem> ChildDirectoryProjectItems { get; set; }
IEnumerator IEnumerable.GetEnumerator()
{
@ -37,17 +39,38 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -37,17 +39,38 @@ namespace ICSharpCode.PackageManagement.EnvDTE
IEnumerable<ProjectItem> GetProjectItems()
{
foreach (SD.ProjectItem msbuildProjectItem in Project.MSBuildProject.Items) {
ProjectItem item = ConvertToProjectItem(msbuildProjectItem);
if (item != null) {
ProjectItem item = GetChildProjectItem(msbuildProjectItem);
if (!IgnoreChildProjectItem(item)) {
yield return item;
}
}
}
ProjectItem ConvertToProjectItem(SD.ProjectItem msbuildProjectItem)
ProjectItem GetChildProjectItem(SD.ProjectItem msbuildProjectItem)
{
ProjectItemRelationship relationship = ProjectItem.GetRelationship(msbuildProjectItem);
return relationship.GetChild();
}
bool IgnoreChildProjectItem(ProjectItem item)
{
if (item == null) {
return true;
}
if (item.IsDirectory) {
return ChildDirectoryProjectItemSeenBefore(item);
}
return false;
}
bool ChildDirectoryProjectItemSeenBefore(ProjectItem directoryProjectItem)
{
if (ChildDirectoryProjectItems.Any(item => item.Name == directoryProjectItem.Name)) {
return true;
}
ChildDirectoryProjectItems.Add(directoryProjectItem);
return false;
}
}
}

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

@ -42,7 +42,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -42,7 +42,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return Constants.VsProjectItemKindPhysicalFile;
}
bool IsDirectory {
internal bool IsDirectory {
get { return projectItem.ItemType == ItemType.Folder; }
}

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

@ -69,6 +69,11 @@ namespace PackageManagement.Tests.EnvDTE @@ -69,6 +69,11 @@ namespace PackageManagement.Tests.EnvDTE
return projectItems.OfType<DTE.ProjectItem>().FirstOrDefault();
}
List<DTE.ProjectItem> GetAllChildItems(ProjectItems projectItems)
{
return projectItems.OfType<DTE.ProjectItem>().ToList();
}
[Test]
public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileIsIncludedInProjectInProjectFolder()
{
@ -723,5 +728,39 @@ namespace PackageManagement.Tests.EnvDTE @@ -723,5 +728,39 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual("jQueryPlugin.ps1", jqueryPluginFileItem.Name);
}
[Test]
public void GetEnumerator_ProjectHasTwoFilesInFolderTwoLevelsDeep_TopLevelFolderOnlyHasOneProjectItemForChildFolder()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj";
msbuildProject.AddFile(@"CodeTemplates\Scaffolders\File1.cs");
msbuildProject.AddFile(@"CodeTemplates\Scaffolders\File2.cs");
DTE.ProjectItem codeTemplatesFolderItem = GetChildItem(projectItems, "CodeTemplates");
List<DTE.ProjectItem> childItems = GetAllChildItems(codeTemplatesFolderItem.ProjectItems);
DTE.ProjectItem scaffoldersFolderItem = childItems.FirstOrDefault();
Assert.AreEqual(1, childItems.Count);
Assert.AreEqual("Scaffolders", scaffoldersFolderItem.Name);
}
[Test]
public void GetEnumerator_ProjectHasTwoFilesInFolderTwoLevelsDeepAndProjectItemsForChildFolderCalledTwice_TopLevelFolderOnlyHasOneProjectItemForChildFolder()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj";
msbuildProject.AddFile(@"CodeTemplates\Scaffolders\File1.cs");
msbuildProject.AddFile(@"CodeTemplates\Scaffolders\File2.cs");
DTE.ProjectItem codeTemplatesFolderItem = GetChildItem(projectItems, "CodeTemplates");
List<DTE.ProjectItem> childItems = GetAllChildItems(codeTemplatesFolderItem.ProjectItems);
// Call ProjectItems again.
childItems = GetAllChildItems(codeTemplatesFolderItem.ProjectItems);
DTE.ProjectItem scaffoldersFolderItem = childItems.FirstOrDefault();
Assert.AreEqual(1, childItems.Count);
Assert.AreEqual("Scaffolders", scaffoldersFolderItem.Name);
}
}
}

Loading…
Cancel
Save