From a7e6377779acee0d913dcbc58a9ca83f71c2138c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 3 Jun 2012 14:45:56 +0100 Subject: [PATCH] Implement EnvDTE.CodeTypeRef and EnvDTE.CodeTypeRef2. --- .../Project/PackageManagement.csproj | 1 + .../Project/Src/EnvDTE/CodeInterface.cs | 7 +- .../Project/Src/EnvDTE/CodeProperty.cs | 2 +- .../Project/Src/EnvDTE/CodeTypeRef.cs | 21 ++- .../Project/Src/EnvDTE/CodeTypeRef2.cs | 6 +- .../Src/EnvDTE/IReturnTypeExtensions.cs | 19 +++ .../Test/PackageManagement.Tests.csproj | 2 + .../Test/Src/EnvDTE/CodeProperty2Tests.cs | 26 ++++ .../Test/Src/EnvDTE/CodeTypeRef2Tests.cs | 128 ++++++++++++++++++ .../Test/Src/Helpers/AttributeHelper.cs | 8 +- .../Test/Src/Helpers/ClassHelper.cs | 10 +- .../Test/Src/Helpers/PropertyHelper.cs | 8 ++ .../Test/Src/Helpers/ReturnTypeHelper.cs | 35 +++++ 13 files changed, 252 insertions(+), 21 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index a7b0a9f8fb..18f803ce92 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -110,6 +110,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs index 3a5a564450..3858f0362b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs @@ -19,12 +19,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE public CodeInterface(IProjectContent projectContent, IReturnType type, IClass c) : base(projectContent, c) { - fullName = GetFullName(type); - } - - string GetFullName(IReturnType type) - { - return type.DotNetName.Replace("{", "<").Replace("}", ">"); + fullName = type.GetFullName(); } /// diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs index 31fa71bb69..4b34282b11 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs @@ -34,7 +34,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual CodeTypeRef Type { - get { throw new NotImplementedException(); } + get { return new CodeTypeRef2(null, this, Property.ReturnType); } } public virtual CodeFunction Getter { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs index 2e6bb34b06..f7cfebfe3a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs @@ -2,25 +2,38 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.PackageManagement.EnvDTE { public class CodeTypeRef : MarshalByRefObject { + IProjectContent projectContent; + CodeElement parent; + public CodeTypeRef() { } + public CodeTypeRef(IProjectContent projectContent, CodeElement parent, IReturnType returnType) + { + this.parent = parent; + this.projectContent = projectContent; + this.ReturnType = returnType; + } + + protected IReturnType ReturnType { get; private set; } + public virtual string AsFullName { - get { throw new NotImplementedException(); } + get { return ReturnType.GetFullName(); } } - public virtual object Parent { - get { throw new NotImplementedException(); } + public virtual CodeElement Parent { + get { return parent; } } public virtual CodeType CodeType { - get { throw new NotImplementedException(); } + get { return new CodeClass2(projectContent, ReturnType.GetUnderlyingClass()); } } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs index d67abdc0e4..e8f603f183 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs @@ -2,17 +2,19 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.PackageManagement.EnvDTE { public class CodeTypeRef2 : CodeTypeRef { - public CodeTypeRef2() + public CodeTypeRef2(IProjectContent projectContent, CodeElement parent, IReturnType returnType) + : base(projectContent, parent, returnType) { } public bool IsGeneric { - get { throw new NotImplementedException(); } + get { return ReturnType.DotNetName.Contains("{"); } } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs new file mode 100644 index 0000000000..30de929e0f --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs @@ -0,0 +1,19 @@ +// 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.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public static class IReturnTypeExtensions + { + public static string GetFullName(this IReturnType returnType) + { + return returnType + .DotNetName + .Replace('{', '<') + .Replace('}', '>'); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index d239dec577..d5ee3c4e26 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -82,6 +82,7 @@ + @@ -98,6 +99,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs index 1318e295a7..002903cc85 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs @@ -240,5 +240,31 @@ namespace PackageManagement.Tests.EnvDTE Assert.AreEqual(vsCMAccess.vsCMAccessPrivate, access); } + + [Test] + public void Type_PropertyTypeIsSystemString_ReturnsSystemString() + { + helper.CreatePublicProperty("MyProperty"); + helper.SetPropertyReturnType("System.String"); + CreateCodeProperty2(); + + CodeTypeRef typeRef = property.Type; + string fullName = typeRef.AsFullName; + + Assert.AreEqual("System.String", fullName); + } + + [Test] + public void Type_PropertyTypeIsSystemString_TypesParentIsProperty() + { + helper.CreatePublicProperty("MyProperty"); + helper.SetPropertyReturnType("System.String"); + CreateCodeProperty2(); + + CodeTypeRef typeRef = property.Type; + CodeElement parent = typeRef.Parent; + + Assert.AreEqual(property, parent); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs new file mode 100644 index 0000000000..4a58128e83 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs @@ -0,0 +1,128 @@ +// 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.EnvDTE; +using ICSharpCode.SharpDevelop.Dom; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class CodeTypeRef2Tests + { + CodeTypeRef2 typeRef; + ReturnTypeHelper helper; + CodeElement parent; + ClassHelper classHelper; + + [SetUp] + public void Init() + { + helper = new ReturnTypeHelper(); + classHelper = new ClassHelper(); + parent = new CodeElement(); + } + + void AddUnderlyingClassToReturnType(string fullyQualifiedName) + { + classHelper.CreatePublicClass(fullyQualifiedName); + helper.AddUnderlyingClass(classHelper.Class); + } + + void CreateCodeTypeRef2() + { + typeRef = new CodeTypeRef2(classHelper.ProjectContentHelper.FakeProjectContent, parent, helper.ReturnType); + } + + void ReturnTypeUsesDifferentProjectContent() + { + classHelper = new ClassHelper(); + classHelper.ProjectContentHelper.SetProjectForProjectContent(ProjectHelper.CreateTestProject()); + } + + void ReturnTypeSameProjectContent() + { + var project = ProjectHelper.CreateTestProject(); + classHelper.ProjectContentHelper.SetProjectForProjectContent(project); + } + + [Test] + public void CodeType_ReturnTypeIsSystemString_ReturnsCodeClass2ForSystemStringType() + { + helper.CreateReturnType("System.String"); + AddUnderlyingClassToReturnType("System.String"); + CreateCodeTypeRef2(); + + CodeClass2 codeClass = typeRef.CodeType as CodeClass2; + string name = codeClass.FullName; + + Assert.AreEqual("System.String", name); + } + + [Test] + public void CodeType_ReturnTypeFromDifferentProjectContent_CodeTypeLocationIsExternal() + { + helper.CreateReturnType("System.String"); + AddUnderlyingClassToReturnType("System.String"); + ReturnTypeUsesDifferentProjectContent(); + CreateCodeTypeRef2(); + + CodeClass2 codeClass = typeRef.CodeType as CodeClass2; + vsCMInfoLocation location = codeClass.InfoLocation; + + Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, location); + } + + [Test] + public void CodeType_ReturnTypeFromSameProjectContent_CodeTypeLocationIsProject() + { + helper.CreateReturnType("MyType"); + AddUnderlyingClassToReturnType("MyType"); + ReturnTypeSameProjectContent(); + CreateCodeTypeRef2(); + + CodeClass2 codeClass = typeRef.CodeType as CodeClass2; + vsCMInfoLocation location = codeClass.InfoLocation; + + Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationProject, location); + } + + [Test] + public void IsGeneric_NotGenericReturnType_ReturnsFalse() + { + helper.CreateReturnType("MyType"); + helper.AddDotNetName("MyType"); + CreateCodeTypeRef2(); + + bool generic = typeRef.IsGeneric; + + Assert.IsFalse(generic); + } + + [Test] + public void IsGeneric_GenericReturnType_ReturnsTrue() + { + helper.CreateReturnType("System.Nullable"); + helper.AddDotNetName("System.Nullable{System.String}"); + CreateCodeTypeRef2(); + + bool generic = typeRef.IsGeneric; + + Assert.IsTrue(generic); + } + + [Test] + public void AsFullName_GenericReturnType_ReturnsDotNetNameWithCurlyBracesReplacedWithAngleBrackets() + { + helper.CreateReturnType("System.Nullable"); + helper.AddDotNetName("System.Nullable{System.String}"); + CreateCodeTypeRef2(); + + string name = typeRef.AsFullName; + + Assert.AreEqual("System.Nullable", name); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/AttributeHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/AttributeHelper.cs index 30f5694aa0..0f68b2e0aa 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/AttributeHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/AttributeHelper.cs @@ -22,9 +22,11 @@ namespace PackageManagement.Tests.Helpers public void CreateAttribute(string fullName, string shortName) { - AttributeType = MockRepository.GenerateStub(); - AttributeType.Stub(at => at.FullyQualifiedName).Return(fullName); - AttributeType.Stub(at => at.Name).Return(shortName); + var returnTypeHelper = new ReturnTypeHelper(); + returnTypeHelper.CreateReturnType(fullName); + returnTypeHelper.AddShortName(shortName); + AttributeType = returnTypeHelper.ReturnType; + Attribute = MockRepository.GenerateStub(); Attribute.Stub(a => a.AttributeType).Return(AttributeType); Attribute.Stub(a => a.PositionalArguments).Return(PositionalArguments); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs index 33770d8d1e..eda9776aff 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs @@ -66,11 +66,11 @@ namespace PackageManagement.Tests.Helpers IReturnType CreateBaseType(IClass baseTypeClass, string baseTypeFullName, string baseTypeDotNetName) { - IReturnType baseType = MockRepository.GenerateStub(); - baseType.Stub(b => b.GetUnderlyingClass()).Return(baseTypeClass); - baseType.Stub(b => b.FullyQualifiedName).Return(baseTypeFullName); - baseType.Stub(b => b.DotNetName).Return(baseTypeDotNetName); - return baseType; + var returnTypeHelper = new ReturnTypeHelper(); + returnTypeHelper.CreateReturnType(baseTypeFullName); + returnTypeHelper.AddUnderlyingClass(baseTypeClass); + returnTypeHelper.AddDotNetName(baseTypeDotNetName); + return returnTypeHelper.ReturnType; } public void AddClassToClassBaseTypes(string fullName) diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs index 876280b4bf..8be4c396ae 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs @@ -12,6 +12,7 @@ namespace PackageManagement.Tests.Helpers { public IProperty Property; public ProjectContentHelper ProjectContentHelper = new ProjectContentHelper(); + public ReturnTypeHelper ReturnTypeHelper = new ReturnTypeHelper(); List attributes = new List(); List parameters = new List(); @@ -114,5 +115,12 @@ namespace PackageManagement.Tests.Helpers { GetterModifier = ModifierEnum.None; } + + public void SetPropertyReturnType(string fullName) + { + ReturnTypeHelper.CreateReturnType(fullName); + ReturnTypeHelper.AddDotNetName(fullName); + Property.Stub(p => p.ReturnType).Return(ReturnTypeHelper.ReturnType); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs new file mode 100644 index 0000000000..5c4c0b3414 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs @@ -0,0 +1,35 @@ +// 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.SharpDevelop.Dom; +using Rhino.Mocks; + +namespace PackageManagement.Tests.Helpers +{ + public class ReturnTypeHelper + { + public IReturnType ReturnType; + + public void CreateReturnType(string fullyQualifiedName) + { + ReturnType = MockRepository.GenerateStub(); + ReturnType.Stub(b => b.FullyQualifiedName).Return(fullyQualifiedName); + } + + public void AddDotNetName(string name) + { + ReturnType.Stub(t => t.DotNetName).Return(name); + } + + public void AddShortName(string name) + { + ReturnType.Stub(t => t.Name).Return(name); + } + + public void AddUnderlyingClass(IClass c) + { + ReturnType.Stub(t => t.GetUnderlyingClass()).Return(c); + } + } +}