From baa60e5fb4deb5f5be9aa03915a4cb099fa9d4a8 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 1 Jul 2012 11:56:17 +0100 Subject: [PATCH] Fix null reference when accessing the InfoLocation of a EnvDTE CodeProperty's Type. --- .../Project/Src/EnvDTE/CodeProperty.cs | 2 +- .../Test/Src/EnvDTE/CodeProperty2Tests.cs | 36 +++++++++++++++++++ .../Test/Src/Helpers/ClassHelper.cs | 5 +++ .../Test/Src/Helpers/ProjectContentHelper.cs | 2 +- .../Test/Src/Helpers/PropertyHelper.cs | 9 +++++ .../Test/Src/Helpers/ReturnTypeHelper.cs | 2 -- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs index 8af15e7d02..899532c110 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs @@ -38,7 +38,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual CodeTypeRef Type { - get { return new CodeTypeRef2(null, this, Property.ReturnType); } + get { return new CodeTypeRef2(Property.ProjectContent, this, Property.ReturnType); } } public virtual CodeFunction Getter { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs index 47f9ed42aa..8e286c39d0 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs @@ -267,6 +267,42 @@ namespace PackageManagement.Tests.EnvDTE Assert.AreEqual(property, parent); } + [Test] + public void Type_PropertyTypeIsSystemString_TypeRefTypeInfoLocationIsExternal() + { + helper.CreatePublicProperty("MyProperty"); + helper.SetPropertyReturnType("System.String"); + helper.CreateProjectForProjectContent(); + var classHelper = new ClassHelper(); + classHelper.CreateClass("System.String"); + classHelper.SetProjectForProjectContent(null); + helper.ReturnTypeHelper.AddUnderlyingClass(classHelper.Class); + CreateCodeProperty2(); + + CodeTypeRef typeRef = property.Type; + vsCMInfoLocation location = typeRef.CodeType.InfoLocation; + + Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, location); + } + + [Test] + public void Type_PropertyTypeExistsInProject_TypeRefTypeInfoLocationIsProject() + { + helper.CreatePublicProperty("MyProperty"); + helper.SetPropertyReturnType("MyType"); + helper.CreateProjectForProjectContent(); + var classHelper = new ClassHelper(); + classHelper.CreateClass("MyType"); + classHelper.SetProjectForProjectContent(helper.Project); + helper.ReturnTypeHelper.AddUnderlyingClass(classHelper.Class); + CreateCodeProperty2(); + + CodeTypeRef typeRef = property.Type; + vsCMInfoLocation location = typeRef.CodeType.InfoLocation; + + Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationProject, location); + } + [Test] public void Kind_PublicProperty_ReturnsProperty() { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs index 6b4b76dcbd..0db7f57b60 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs @@ -157,5 +157,10 @@ namespace PackageManagement.Tests.Helpers { Class.Stub(c => c.ClassType).Return(type); } + + public void SetProjectForProjectContent(object project) + { + ProjectContentHelper.SetProjectForProjectContent(project); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs index 157e85ff5e..11469f9565 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs @@ -22,7 +22,7 @@ namespace PackageManagement.Tests.Helpers ProjectContent.Stub(pc => pc.NamespaceNames).Return(NamespaceNames); } - public void SetProjectForProjectContent(IProject project) + public void SetProjectForProjectContent(object project) { ProjectContent.Stub(pc => pc.Project).Return(project); } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs index 4cdbbe477d..f8f01154fe 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs @@ -122,5 +122,14 @@ namespace PackageManagement.Tests.Helpers ReturnTypeHelper.AddDotNetName(fullName); Property.Stub(p => p.ReturnType).Return(ReturnTypeHelper.ReturnType); } + + public object Project { + get { return ProjectContentHelper.ProjectContent.Project; } + } + + public void CreateProjectForProjectContent() + { + ProjectContentHelper.SetProjectForProjectContent(ProjectHelper.CreateTestProject()); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs index 0b7fbd5aae..cc2e60c826 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs @@ -32,7 +32,5 @@ namespace PackageManagement.Tests.Helpers { ReturnType.Stub(t => t.GetUnderlyingClass()).Return(c); } - - } }