Browse Source
Change EnvDTE.ProjectItems.AddFileFromCopy to add .resx and .Designer.cs files to the project with DependentUpon set to the parent file if a parent file is found in the project.pull/28/head
7 changed files with 305 additions and 9 deletions
@ -0,0 +1,92 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public class DependentFile |
||||||
|
{ |
||||||
|
IProject project; |
||||||
|
|
||||||
|
public DependentFile(IProject project) |
||||||
|
{ |
||||||
|
this.project = project; |
||||||
|
} |
||||||
|
|
||||||
|
public FileProjectItem GetParentFileProjectItem(string fileName) |
||||||
|
{ |
||||||
|
string parentFileName = GetParentFileName(fileName); |
||||||
|
if (parentFileName != null) { |
||||||
|
return project.FindFile(parentFileName); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
string GetParentFileName(string fileName) |
||||||
|
{ |
||||||
|
if (IsResxFile(fileName)) { |
||||||
|
return GetParentFileNameForResxFile(fileName); |
||||||
|
} else if (IsDesignerFile(fileName)) { |
||||||
|
return GetParentFileNameForDesignerFile(fileName); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
bool IsResxFile(string fileName) |
||||||
|
{ |
||||||
|
return HasMatchingFileExtension(".resx", fileName); |
||||||
|
} |
||||||
|
|
||||||
|
string GetParentFileNameForResxFile(string fileName) |
||||||
|
{ |
||||||
|
string fileExtension = GetFileExtensionForProjectSourceCodeFiles(); |
||||||
|
return Path.ChangeExtension(fileName, fileExtension); |
||||||
|
} |
||||||
|
|
||||||
|
bool IsDesignerFile(string fileName) |
||||||
|
{ |
||||||
|
string fileNameWithoutPath = Path.GetFileName(fileName); |
||||||
|
return GetIndexOfDesignerNameInFileName(fileNameWithoutPath) > 0; |
||||||
|
} |
||||||
|
|
||||||
|
int GetIndexOfDesignerNameInFileName(string fileName) |
||||||
|
{ |
||||||
|
return fileName.LastIndexOf(".designer", StringComparison.OrdinalIgnoreCase); |
||||||
|
} |
||||||
|
|
||||||
|
string GetParentFileNameForDesignerFile(string fileName) |
||||||
|
{ |
||||||
|
int index = GetIndexOfDesignerNameInFileName(fileName); |
||||||
|
return fileName.Substring(0, index) + Path.GetExtension(fileName); |
||||||
|
} |
||||||
|
|
||||||
|
string GetFileExtensionForProjectSourceCodeFiles() |
||||||
|
{ |
||||||
|
if (IsVisualBasicProjectFile(project.FileName)) { |
||||||
|
return ".vb"; |
||||||
|
} |
||||||
|
return ".cs"; |
||||||
|
} |
||||||
|
|
||||||
|
bool IsVisualBasicProjectFile(string fileName) |
||||||
|
{ |
||||||
|
return HasMatchingFileExtension(".vbproj", fileName); |
||||||
|
} |
||||||
|
|
||||||
|
bool HasMatchingFileExtension(string extension, string fileName) |
||||||
|
{ |
||||||
|
string otherExtension = Path.GetExtension(fileName); |
||||||
|
return IsMatchIgnoringCase(extension, otherExtension); |
||||||
|
} |
||||||
|
|
||||||
|
bool IsMatchIgnoringCase(string a, string b) |
||||||
|
{ |
||||||
|
return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,163 @@ |
|||||||
|
// 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 ICSharpCode.SharpDevelop.Project; |
||||||
|
using NUnit.Framework; |
||||||
|
using PackageManagement.Tests.Helpers; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class DependentFileTests |
||||||
|
{ |
||||||
|
TestableProject project; |
||||||
|
DependentFile dependentFile; |
||||||
|
|
||||||
|
void CreateCSharpProject(string projectFileName) |
||||||
|
{ |
||||||
|
project = ProjectHelper.CreateTestProject(); |
||||||
|
project.FileName = projectFileName; |
||||||
|
} |
||||||
|
|
||||||
|
FileProjectItem AddFileToProject(string include) |
||||||
|
{ |
||||||
|
return project.AddFile(include); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateDependentFile() |
||||||
|
{ |
||||||
|
dependentFile = new DependentFile(project); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_ResxFileNameAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject("test.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.resx"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_ResxFileNameAndProjectHasNoFiles_ReturnsNull() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.resx"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.IsNull(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_ResxFileNameAndProjectHasOneCSharpFileWithDifferentFileNameToResxFile_ReturnsNull() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
AddFileToProject(@"d:\projects\MyProject\program.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.resx"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.IsNull(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_ResxFileNameAndVisualBasicParentFileExistsInProject_ReturnsParentFileProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.vbproj"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject("test.vb"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.resx"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_ResxFileNameAndVisualBasicParentFileExistsInProjectWhenProjectFileExtensionIsInUpperCase_ReturnsParentFileProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.VBPROJ"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject("test.vb"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.resx"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_DesignerFileNameAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject("test.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.Designer.cs"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_DesignerFileNameInLowerCaseAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject("test.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\test.designer.cs"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_DesignerInFileNameButMissingDot_ReturnsNull() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
AddFileToProject("abc.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\abc2Designer.cs"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.IsNull(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_DesignerInFolderName_ReturnsNull() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
AddFileToProject("abc.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\abc.Designer\foo.cs"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.IsNull(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetParentFileProjectItem_DesignerInFolderNameAndInFileName_ReturnsMatchingParentProjectItem() |
||||||
|
{ |
||||||
|
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj"); |
||||||
|
FileProjectItem expectedProjectItem = AddFileToProject(@"Form.Designer\abc.cs"); |
||||||
|
CreateDependentFile(); |
||||||
|
string fileName = @"d:\projects\MyProject\Form.Designer\abc.Designer.cs"; |
||||||
|
|
||||||
|
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName); |
||||||
|
|
||||||
|
Assert.AreEqual(expectedProjectItem, projectItem); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue