Browse Source

Implement missing parts of EnvDTE Project and ProjectItems to support T4 scaffolding.

pull/28/head
Matt Ward 14 years ago
parent
commit
e08408f6ef
  1. 7
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Configuration.cs
  2. 7
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ConfigurationManager.cs
  3. 2
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/DirectoryProjectItems.cs
  4. 30
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  5. 1
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  6. 23
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs
  7. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideProject.cs
  8. 54
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.cs
  9. 14
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs
  10. 97
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs
  11. 59
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectPropertyTests.cs
  12. 33
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
  13. 6
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs

7
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Configuration.cs

@ -7,12 +7,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -7,12 +7,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Configuration : MarshalByRefObject
{
public Configuration()
Project project;
public Configuration(Project project)
{
this.project = project;
}
public Properties Properties {
get { throw new NotImplementedException(); }
get { return project.Properties; }
}
}
}

7
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ConfigurationManager.cs

@ -7,12 +7,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -7,12 +7,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ConfigurationManager : MarshalByRefObject
{
public ConfigurationManager()
Configuration activeConfiguration;
public ConfigurationManager(Project project)
{
activeConfiguration = new Configuration(project);
}
public Configuration ActiveConfiguration {
get { throw new NotImplementedException(); }
get { return activeConfiguration; }
}
}
}

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

@ -11,7 +11,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -11,7 +11,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
ProjectItem projectItem;
public DirectoryProjectItems(ProjectItem projectItem)
: base(projectItem.ContainingProject, new PackageManagementFileService())
: base(projectItem.ContainingProject, projectItem, new PackageManagementFileService())
{
this.projectItem = projectItem;
}

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

@ -36,7 +36,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -36,7 +36,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
CreateProperties();
Object = new ProjectObject(this);
ProjectItems = new ProjectItems(this, fileService);
ProjectItems = new ProjectItems(this, this, fileService);
}
public Project()
@ -54,7 +54,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -54,7 +54,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
public virtual string UniqueName {
get { throw new NotImplementedException(); }
get { return Path.GetFileName(FileName); }
}
public virtual string FileName {
@ -136,16 +136,24 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -136,16 +136,24 @@ namespace ICSharpCode.PackageManagement.EnvDTE
projectService.RemoveProjectItem(MSBuildProject, referenceItem);
}
internal void AddFile(string include)
internal void AddFileUsingPathRelativeToProject(string include)
{
var fileProjectItem = CreateFileProjectItemUsingPathRelativeToProject(include);
projectService.AddProjectItem(MSBuildProject, fileProjectItem);
}
internal ProjectItem AddFileUsingFullPath(string path)
{
var fileProjectItem = CreateFileProjectItem(include);
FileProjectItem fileProjectItem = CreateFileProjectItemUsingFullPath(path);
fileProjectItem.FileName = path;
projectService.AddProjectItem(MSBuildProject, fileProjectItem);
return new ProjectItem(this, fileProjectItem);
}
FileProjectItem CreateFileProjectItem(string include)
FileProjectItem CreateFileProjectItemUsingPathRelativeToProject(string include)
{
ItemType itemType = GetDefaultItemType(include);
return CreateFileProjectItem(itemType, include);
return CreateFileProjectItemUsingPathRelativeToProject(itemType, include);
}
ItemType GetDefaultItemType(string include)
@ -153,13 +161,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -153,13 +161,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return MSBuildProject.GetDefaultItemType(include);
}
FileProjectItem CreateFileProjectItem(ItemType itemType, string include)
FileProjectItem CreateFileProjectItemUsingPathRelativeToProject(ItemType itemType, string include)
{
var fileProjectItem = new FileProjectItem(MSBuildProject, itemType);
fileProjectItem.Include = include;
return fileProjectItem;
}
FileProjectItem CreateFileProjectItemUsingFullPath(string path)
{
return CreateFileProjectItemUsingPathRelativeToProject(Path.GetFileName(path));
}
internal IList<string> GetAllPropertyNames()
{
var names = new List<string>();
@ -167,6 +180,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -167,6 +180,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
foreach (ProjectPropertyElement propertyElement in MSBuildProject.MSBuildProjectFile.Properties) {
names.Add(propertyElement.Name);
}
names.Add("OutputFileName");
}
return names;
}
@ -176,7 +190,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -176,7 +190,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
public virtual ConfigurationManager ConfigurationManager {
get { throw new NotImplementedException(); }
get { return new ConfigurationManager(this); }
}
internal virtual string GetLowercaseFileExtension()

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

@ -108,6 +108,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -108,6 +108,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public void Delete()
{
ContainingProject.DeleteFile(projectItem.FileName);
ContainingProject.Save();
}
}
}

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

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace ICSharpCode.PackageManagement.EnvDTE
{
@ -12,11 +13,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -12,11 +13,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
Project project;
IPackageManagementFileService fileService;
object parent;
public ProjectItems(Project project, IPackageManagementFileService fileService)
public ProjectItems(Project project, object parent, IPackageManagementFileService fileService)
{
this.project = project;
this.fileService = fileService;
this.parent = parent;
}
public ProjectItems()
@ -24,14 +27,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -24,14 +27,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
public virtual object Parent {
get { throw new NotImplementedException(); }
get { return parent; }
}
public virtual void AddFromFileCopy(string filePath)
{
string include = Path.GetFileName(filePath);
CopyFileIntoProject(filePath, include);
project.AddFile(include);
project.AddFileUsingPathRelativeToProject(include);
project.Save();
}
@ -72,15 +75,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -72,15 +75,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE
internal virtual ProjectItem Item(int index)
{
throw new NotImplementedException();
var items = new ProjectItemsInsideProject(project);
return items.GetItem(index - 1);
}
public virtual ProjectItem Item(object index)
{
// if (index is int) {
// return Item((int)index);
// }
// return null;
if (index is int) {
return Item((int)index);
}
return Item(index as string);
}
@ -91,7 +94,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -91,7 +94,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual ProjectItem AddFromFile(string fileName)
{
throw new NotImplementedException();
ProjectItem projectItem = project.AddFileUsingFullPath(fileName);
project.Save();
return projectItem;
}
public virtual int Count {

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideProject.cs

@ -141,5 +141,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -141,5 +141,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return GetEnumerator();
}
internal ProjectItem GetItem(int index)
{
List<ProjectItem> projectItems = GetProjectItems().ToList();
return projectItems[index];
}
}
}

54
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.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 System.IO;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
@ -18,32 +19,44 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -18,32 +19,44 @@ namespace ICSharpCode.PackageManagement.EnvDTE
protected override object GetValue()
{
string value = project.MSBuildProject.GetUnevalatedProperty(Name);
string value = GetMSBuildProjectProperty(Name);
if (value != null) {
return value;
}
if (IsTargetFrameworkMoniker(Name)) {
if (IsTargetFrameworkMoniker()) {
return GetTargetFrameworkMoniker();
} else if (IsFullPath(Name)) {
} else if (IsFullPath()) {
return GetFullPath();
} else if (IsOutputFileName()) {
return GetOutputFileName();
}
return EmptyStringIfNull(value);
}
bool IsTargetFrameworkMoniker(string name)
string GetMSBuildProjectProperty(string name)
{
return IsCaseInsensitiveMatch(name, "TargetFrameworkMoniker");
return MSBuildProject.GetUnevalatedProperty(name);
}
bool IsFullPath(string name)
bool IsTargetFrameworkMoniker()
{
return IsCaseInsensitiveMatch(name, "FullPath");
return IsCaseInsensitiveMatch(Name, "TargetFrameworkMoniker");
}
bool IsFullPath()
{
return IsCaseInsensitiveMatch(Name, "FullPath");
}
bool IsOutputFileName()
{
return IsCaseInsensitiveMatch(Name, "OutputFileName");
}
bool IsCaseInsensitiveMatch(string a, string b)
{
return String.Equals(a, b, StringComparison.InvariantCultureIgnoreCase);
return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
string GetTargetFrameworkMoniker()
@ -61,6 +74,31 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -61,6 +74,31 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return MSBuildProject.Directory;
}
string GetOutputFileName()
{
return String.Format("{0}{1}", MSBuildProject.AssemblyName, GetOutputTypeFileExtension());
}
string GetOutputTypeFileExtension()
{
string outputTypeProperty = GetMSBuildProjectProperty("OutputType");
OutputType outputType = GetOutputType(outputTypeProperty);
return CompilableProject.GetExtension(outputType);
}
OutputType GetOutputType(string outputTypeProperty)
{
if (outputTypeProperty == null) {
return OutputType.Exe;
}
OutputType outputType = OutputType.Exe;
if (Enum.TryParse<OutputType>(outputTypeProperty, true, out outputType)) {
return outputType;
}
return OutputType.Exe;
}
string EmptyStringIfNull(string value)
{
if (value != null) {

14
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs

@ -136,5 +136,19 @@ namespace PackageManagement.Tests.EnvDTE @@ -136,5 +136,19 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(@"d:\projects\myproject\src\program.cs", project.FakeFileService.PathPassedToRemoveFile);
}
[Test]
public void Delete_ProjectItemIsFile_ProjectIsSaved()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject.csproj";
msbuildProject.AddFile(@"src\program.cs");
ProjectItem directoryItem = projectItems.Item("src");
ProjectItem fileItem = directoryItem.ProjectItems.Item("program.cs");
fileItem.Delete();
Assert.IsTrue(msbuildProject.IsSaved);
}
}
}

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

@ -331,5 +331,102 @@ namespace PackageManagement.Tests.EnvDTE @@ -331,5 +331,102 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(1, count);
}
[Test]
public void Parent_GetProjectItemsParentForFileProjectItem_ReturnsFileProjectItem()
{
CreateProjectItems();
msbuildProject.AddFile("Program.cs");
var projectItem = projectItems.Item("program.cs") as DTE.ProjectItem;
object parent = projectItem.ProjectItems.Parent;
Assert.AreEqual(projectItem, parent);
}
[Test]
public void Parent_GetProjectItemsParentForDirectoryProjectItem_ReturnsDirectoryProjectItem()
{
CreateProjectItems();
msbuildProject.AddFile(@"src\Program.cs");
var projectItem = projectItems.Item("src") as DTE.ProjectItem;
object parent = projectItem.ProjectItems.Parent;
Assert.AreEqual(projectItem, parent);
}
[Test]
public void Item_GetProjectItemByIndex_ReturnsFileInsideProject()
{
CreateProjectItems();
msbuildProject.AddFile("Program.cs");
var projectItem = projectItems.Item(1) as DTE.ProjectItem;
string projectItemName = projectItem.Name;
Assert.AreEqual("Program.cs", projectItemName);
}
[Test]
public void AddFromFile_FullFileNameIsInsideProject_FileIsAddedToProject()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject.csproj";
string fileName = @"d:\projects\myproject\tools\test.cs";
msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page;
projectItems.AddFromFile(fileName);
var fileItem = msbuildProject.Items[0] as FileProjectItem;
Assert.AreEqual(@"tools\test.cs", fileItem.Include);
Assert.AreEqual(@"d:\projects\myproject\tools\test.cs", fileItem.FileName);
Assert.AreEqual(ItemType.Page, fileItem.ItemType);
Assert.AreEqual(msbuildProject, fileItem.Project);
}
[Test]
public void AddFromFile_FullFileNameIsInsideProject_ProjectIsSaved()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj";
string fileName = @"d:\projects\myproject\packages\tools\test.cs";
projectItems.AddFromFile(fileName);
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
[Test]
public void AddFromFile_FullFileNameIsInsideProject_ProjectItemReturned()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj";
string fileName = @"d:\projects\myproject\tools\test.cs";
msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page;
DTE.ProjectItem item = projectItems.AddFromFile(fileName);
string fullPath = (string)item.Properties.Item("FullPath").Value;
Assert.AreEqual("test.cs", item.Name);
Assert.AreEqual(@"d:\projects\myproject\tools\test.cs", fullPath);
}
[Test]
public void AddFromFile_FullFileNameIsInsideProject_FileNameUsedToDetermineProjectItemType()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj";
string fileName = @"d:\projects\myproject\tools\test.cs";
projectItems.AddFromFile(fileName);
Assert.AreEqual("test.cs", msbuildProject.FileNamePassedToGetDefaultItemType);
}
}
}

59
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectPropertyTests.cs

@ -152,5 +152,64 @@ namespace PackageManagement.Tests.EnvDTE @@ -152,5 +152,64 @@ namespace PackageManagement.Tests.EnvDTE
string expectedFullPath = @"d:\projects\MyProject";
Assert.AreEqual(expectedFullPath, fullPath);
}
[Test]
public void Value_GetOutputFileNameProperty_ReturnsOutputAssemblyFileNameWithoutPath()
{
CreateProperties();
msbuildProject.AssemblyName = "MyProject";
msbuildProject.SetProperty("OutputType", "Exe");
string fileName = (string)project.Properties.Item("OutputFileName").Value;
Assert.AreEqual(@"MyProject.exe", fileName);
}
[Test]
public void Properties_GetOutputFileNamePropertyInLowerCase_ReturnsOutputAssemblyFileNameWithoutPath()
{
CreateProperties();
msbuildProject.AssemblyName = "MyProject";
msbuildProject.SetProperty("OutputType", "Library");
string fileName = (string)project.Properties.Item("outputfilename").Value;
Assert.AreEqual(@"MyProject.dll", fileName);
}
[Test]
public void Properties_GetOutputFileNamePropertyWhenOutputTypeIsMissing_ReturnsOutputAssemblyFileNameWithExeFileExtension()
{
CreateProperties();
msbuildProject.AssemblyName = "MyProject";
string fileName = (string)project.Properties.Item("outputfilename").Value;
Assert.AreEqual(@"MyProject.exe", fileName);
}
[Test]
public void Properties_GetOutputFileNamePropertyWhenOutputTypeValueIsInLowerCase_ReturnsOutputAssemblyFileNameWithoutPath()
{
CreateProperties();
msbuildProject.AssemblyName = "MyProject";
msbuildProject.SetProperty("OutputType", "winexe");
string fileName = (string)project.Properties.Item("OutputFileName").Value;
Assert.AreEqual(@"MyProject.exe", fileName);
}
[Test]
public void Properties_GetOutputFileNamePropertyWhenOutputTypeValueIsInvalid_ReturnsOutputAssemblyFileNameWithExeFileExtension()
{
CreateProperties();
msbuildProject.AssemblyName = "MyProject";
msbuildProject.SetProperty("OutputType", "invalid");
string fileName = (string)project.Properties.Item("OutputFileName").Value;
Assert.AreEqual(@"MyProject.exe", fileName);
}
}
}

33
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs

@ -132,5 +132,38 @@ namespace PackageManagement.Tests.EnvDTE @@ -132,5 +132,38 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(String.Empty, kind);
}
[Test]
public void UniqueName_ProjectFileNameHasFullPath_ReturnsProjectFileNameWithoutDirectoryPart()
{
CreateProject();
msbuildProject.FileName = @"d:\projects\myproject\MyProject.csproj";
string name = project.UniqueName;
Assert.AreEqual("MyProject.csproj", name);
}
[Test]
public void ProjectItemsParent_ParentOfProjectsProjectItems_ReturnsTheProject()
{
CreateProject();
object parent = project.ProjectItems.Parent;
Assert.AreEqual(project, parent);
}
[Test]
public void ConfigurationManager_ActiveConfigurationOutputPathProperty_ReturnsOutputPathForProject()
{
CreateProject();
msbuildProject.SetProperty("OutputPath", @"bin\debug\");
Configuration activeConfig = project.ConfigurationManager.ActiveConfiguration;
string outputPath = (string)activeConfig.Properties.Item("OutputPath").Value;
Assert.AreEqual(@"bin\debug\", outputPath);
}
}
}

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

@ -11,6 +11,7 @@ namespace PackageManagement.Tests.Helpers @@ -11,6 +11,7 @@ namespace PackageManagement.Tests.Helpers
public class TestableProject : MSBuildBasedProject
{
public bool IsSaved;
string assemblyName;
public ItemType ItemTypeToReturnFromGetDefaultItemType {
get { return TestableProjectBehaviour.ItemTypeToReturnFromGetDefaultItemType; }
@ -61,5 +62,10 @@ namespace PackageManagement.Tests.Helpers @@ -61,5 +62,10 @@ namespace PackageManagement.Tests.Helpers
ProjectService.AddProjectItem(this, fileProjectItem);
return fileProjectItem;
}
public override string AssemblyName {
get { return assemblyName; }
set { assemblyName = value; }
}
}
}

Loading…
Cancel
Save