From 085dd5f0f52f4abc5dfd170134f0c2ab4799c482 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 25 Aug 2012 18:15:45 +0100 Subject: [PATCH] Implement EnvDTE.CodeTypeRef.TypeKind. The T4MVC template ignores methods that return something other than a reference type. --- .../Project/Src/EnvDTE/CodeTypeRef.cs | 2 +- .../Src/EnvDTE/IReturnTypeExtensions.cs | 47 +++++ .../Project/Src/EnvDTE/vsCMTypeRef.cs | 18 +- .../Test/Src/EnvDTE/CodeTypeRef2Tests.cs | 190 ++++++++++++++++++ .../Test/Src/Helpers/ReturnTypeHelper.cs | 5 + 5 files changed, 260 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs index 96adefeb47..6c1aa2b600 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs @@ -46,7 +46,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual vsCMTypeRef TypeKind { - get { throw new NotImplementedException(); } + get { return ReturnType.GetTypeKind(); } } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs index 492b1f7e38..ca3b769d7c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IReturnTypeExtensions.cs @@ -35,5 +35,52 @@ namespace ICSharpCode.PackageManagement.EnvDTE } return returnType.GetFullName(); } + + public static vsCMTypeRef GetTypeKind(this IReturnType returnType) + { + vsCMTypeRef typeRef = GetSystemTypeKind(returnType.FullyQualifiedName); + if (typeRef != vsCMTypeRef.vsCMTypeRefOther) { + return typeRef; + } + + if (returnType.IsReferenceType.GetValueOrDefault()) { + return vsCMTypeRef.vsCMTypeRefCodeType; + } + return vsCMTypeRef.vsCMTypeRefOther; + } + + static vsCMTypeRef GetSystemTypeKind(string fullyQualifiedTypeName) + { + switch (fullyQualifiedTypeName) { + case "System.String": + return vsCMTypeRef.vsCMTypeRefString; + case "System.Void": + return vsCMTypeRef.vsCMTypeRefVoid; + case "System.Boolean": + return vsCMTypeRef.vsCMTypeRefBool; + case "System.Int16": + case "System.UInt16": + return vsCMTypeRef.vsCMTypeRefShort; + case "System.Int32": + case "System.UInt32": + return vsCMTypeRef.vsCMTypeRefInt; + case "System.Int64": + case "System.UInt64": + return vsCMTypeRef.vsCMTypeRefLong; + case "System.Decimal": + return vsCMTypeRef.vsCMTypeRefDecimal; + case "System.Char": + return vsCMTypeRef.vsCMTypeRefChar; + case "System.Byte": + return vsCMTypeRef.vsCMTypeRefByte; + case "System.Object": + return vsCMTypeRef.vsCMTypeRefObject; + case "System.Double": + return vsCMTypeRef.vsCMTypeRefDouble; + case "System.Single": + return vsCMTypeRef.vsCMTypeRefFloat; + } + return vsCMTypeRef.vsCMTypeRefOther; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMTypeRef.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMTypeRef.cs index 3d8dba635d..670eb8549d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMTypeRef.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMTypeRef.cs @@ -7,6 +7,22 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public enum vsCMTypeRef { - vsCMTypeRefCodeType = 1 + vsCMTypeRefOther = 0, + vsCMTypeRefCodeType = 1, + vsCMTypeRefArray = 2, + vsCMTypeRefVoid = 3, + vsCMTypeRefPointer = 4, + vsCMTypeRefString = 5, + vsCMTypeRefObject = 6, + vsCMTypeRefByte = 7, + vsCMTypeRefChar = 8, + vsCMTypeRefShort = 9, + vsCMTypeRefInt = 10, + vsCMTypeRefLong = 11, + vsCMTypeRefFloat = 12, + vsCMTypeRefDouble = 13, + vsCMTypeRefDecimal = 14, + vsCMTypeRefBool = 15, + vsCMTypeRefVariant = 16 } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs index 9855719155..68a2acad41 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeRef2Tests.cs @@ -187,5 +187,195 @@ namespace PackageManagement.Tests.EnvDTE Assert.AreEqual("Test.MyClass", name); } + + [Test] + public void TypeKind_ReturnTypeIsReferenceType_ReturnsClassType() + { + helper.CreateReturnType("Test.MyClass"); + AddUnderlyingClassToReturnType("Test.MyClass"); + helper.MakeReferenceType(); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefCodeType, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsNotReferenceType_ReturnsNonClassType() + { + helper.CreateReturnType("Test.MyClass"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefOther, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemVoid_ReturnsVoidType() + { + helper.CreateReturnType("System.Void"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefVoid, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemString_ReturnsStringType() + { + helper.CreateReturnType("System.String"); + helper.MakeReferenceType(); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefString, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemBoolean_ReturnsBooleanType() + { + helper.CreateReturnType("System.Boolean"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefBool, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemByte_ReturnsByteType() + { + helper.CreateReturnType("System.Byte"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefByte, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemChar_ReturnsCharType() + { + helper.CreateReturnType("System.Char"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefChar, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemDecimal_ReturnsDecimalType() + { + helper.CreateReturnType("System.Decimal"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefDecimal, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemDouble_ReturnsDoubleType() + { + helper.CreateReturnType("System.Double"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefDouble, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemSingle_ReturnsFloatType() + { + helper.CreateReturnType("System.Single"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefFloat, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemInt32_ReturnsIntType() + { + helper.CreateReturnType("System.Int32"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefInt, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemInt16_ReturnsShortType() + { + helper.CreateReturnType("System.Int16"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefShort, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemInt64_ReturnsLongType() + { + helper.CreateReturnType("System.Int64"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefLong, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemUInt32_ReturnsIntType() + { + helper.CreateReturnType("System.UInt32"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefInt, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemUInt16_ReturnsShortType() + { + helper.CreateReturnType("System.UInt16"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefShort, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemUInt64_ReturnsLongType() + { + helper.CreateReturnType("System.UInt64"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefLong, kind); + } + + [Test] + public void TypeKind_ReturnTypeIsSystemObject_ReturnsObjectType() + { + helper.CreateReturnType("System.Object"); + CreateCodeTypeRef2(); + + vsCMTypeRef kind = typeRef.TypeKind; + + Assert.AreEqual(vsCMTypeRef.vsCMTypeRefObject, kind); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs index cc2e60c826..8999819495 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ReturnTypeHelper.cs @@ -32,5 +32,10 @@ namespace PackageManagement.Tests.Helpers { ReturnType.Stub(t => t.GetUnderlyingClass()).Return(c); } + + public void MakeReferenceType() + { + ReturnType.Stub(t => t.IsReferenceType).Return(true); + } } }