From 0c5fa970654f79f44aa93c2601e3b9e9603c2762 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 9 Sep 2012 20:35:57 +0100 Subject: [PATCH] Fix null reference when building a project. Pre-build custom tool runner was not handling that IProject.ProjectSpecificItems can be null for a project that has no preferences xml file already created (e.g. project created by Visual Studio and then opened in SharpDevelop). --- .../Src/Project/ProjectCustomToolOptions.cs | 6 +++++- .../BeforeBuildCustomToolProjectItemsTests.cs | 19 ++++++++++++++++++- src/Main/Base/Test/Utils/ProjectHelper.cs | 6 +++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/ProjectCustomToolOptions.cs b/src/Main/Base/Project/Src/Project/ProjectCustomToolOptions.cs index 38d01ad02a..0c3e37fc3b 100644 --- a/src/Main/Base/Project/Src/Project/ProjectCustomToolOptions.cs +++ b/src/Main/Base/Project/Src/Project/ProjectCustomToolOptions.cs @@ -19,7 +19,11 @@ namespace ICSharpCode.SharpDevelop.Project void GetCustomToolProperties(IProject project) { - properties = project.ProjectSpecificProperties.Get("customTool", new Properties()); + if (project.ProjectSpecificProperties != null) { + properties = project.ProjectSpecificProperties.Get("customTool", new Properties()); + } else { + properties = new Properties(); + } } public bool RunCustomToolOnBuild { diff --git a/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs b/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs index 0e12ccaee9..ae5fa72800 100644 --- a/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs +++ b/src/Main/Base/Test/Project/BeforeBuildCustomToolProjectItemsTests.cs @@ -23,10 +23,16 @@ namespace ICSharpCode.SharpDevelop.Tests.Project IProject CreateProject(string fileName = @"d:\MyProject\MyProject.csproj") { - projectHelper = new ProjectHelper(fileName); + CreateProjectWithNoProjectSpecifiedProperties(fileName); + projectHelper.AddProjectSpecificProperties(); return projectHelper.Project; } + void CreateProjectWithNoProjectSpecifiedProperties(string fileName) + { + projectHelper = new ProjectHelper(fileName); + } + void CreateSolution(params IProject[] projects) { IProjectChangeWatcher watcher = MockRepository.GenerateStub(); @@ -263,5 +269,16 @@ namespace ICSharpCode.SharpDevelop.Tests.Project }; CollectionAssert.AreEqual(expectedProjectItems, projectItems); } + + [Test] + public void GetProjectItems_ProjectSpecificPropertiesIsNull_NoProjectItemsReturnedAndNoNullReferenceExceptionThrown() + { + CreateProjectWithNoProjectSpecifiedProperties(@"d:\MyProject\FirstProject.csproj"); + CreateBeforeBuildCustomToolProjectItems(); + + List projectItems = GetProjectItems(); + + Assert.AreEqual(0, projectItems.Count); + } } } diff --git a/src/Main/Base/Test/Utils/ProjectHelper.cs b/src/Main/Base/Test/Utils/ProjectHelper.cs index 459362f89c..2e269ed3af 100644 --- a/src/Main/Base/Test/Utils/ProjectHelper.cs +++ b/src/Main/Base/Test/Utils/ProjectHelper.cs @@ -25,10 +25,14 @@ namespace ICSharpCode.SharpDevelop.Tests.Utils .Return(null) .WhenCalled(mi => mi.ReturnValue = new ReadOnlyCollection(ProjectItems)); - Project.Stub(p => p.ProjectSpecificProperties).Return(ProjectSpecificProperties); Project.Stub(p => p.SyncRoot).Return(new Object()); } + public void AddProjectSpecificProperties() + { + Project.Stub(p => p.ProjectSpecificProperties).Return(ProjectSpecificProperties); + } + public void AddProjectItem(ProjectItem projectItem) { ProjectItems.Add(projectItem);