From b80bfb80b6247d4a28c37a89f011ca6977e0c276 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 26 Aug 2012 17:54:23 +0100 Subject: [PATCH] Implement EnvDTE.CodeParameter2.ParameterKind The T4MVC template checks whether a parameter is optional so it can determine which controller action methods can be called without any parameters. --- .../Project/PackageManagement.csproj | 1 + .../Project/Src/EnvDTE/CodeParameter.cs | 9 +- .../Project/Src/EnvDTE/CodeParameter2.cs | 18 +++- .../Src/EnvDTE/IParameterExtensions.cs | 16 ++++ .../Project/Src/EnvDTE/vsCMParameterKind.cs | 7 +- .../Test/PackageManagement.Tests.csproj | 2 + .../Test/Src/EnvDTE/CodeParameter2Tests.cs | 93 +++++++++++++++++++ .../Test/Src/EnvDTE/CodeParameterTests.cs | 10 +- .../Test/Src/Helpers/ParameterHelper.cs | 44 +++++++++ 9 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IParameterExtensions.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameter2Tests.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ParameterHelper.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 61e8ad740e..0bf85fb523 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -127,6 +127,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs index 22e0e9b2b8..6613c1ee6e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs @@ -9,24 +9,25 @@ namespace ICSharpCode.PackageManagement.EnvDTE public class CodeParameter : CodeElement { IProjectContent projectContent; - IParameter parameter; public CodeParameter(IProjectContent projectContent, IParameter parameter) { this.projectContent = projectContent; - this.parameter = parameter; + this.Parameter = parameter; } + protected IParameter Parameter { get; private set; } + public override vsCMElement Kind { get { return vsCMElement.vsCMElementParameter; } } public override string Name { - get { return parameter.Name; } + get { return Parameter.Name; } } public virtual CodeTypeRef2 Type { - get { return new CodeTypeRef2(projectContent, this, parameter.ReturnType); } + get { return new CodeTypeRef2(projectContent, this, Parameter.ReturnType); } } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs index 721805894b..1d12478ee2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs @@ -14,7 +14,23 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual vsCMParameterKind ParameterKind { - get { throw new NotImplementedException(); } + get { return GetParameterKind(); } + } + + vsCMParameterKind GetParameterKind() + { + if (Parameter.IsOptional) { + return vsCMParameterKind.vsCMParameterKindOptional; + } else if (Parameter.IsOut) { + return vsCMParameterKind.vsCMParameterKindOut; + } else if (Parameter.IsRef) { + return vsCMParameterKind.vsCMParameterKindRef; + } else if (Parameter.IsParams) { + return vsCMParameterKind.vsCMParameterKindParamArray; + } else if (Parameter.IsIn()) { + return vsCMParameterKind.vsCMParameterKindIn; + } + return vsCMParameterKind.vsCMParameterKindNone; } public virtual CodeElements Attributes { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IParameterExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IParameterExtensions.cs new file mode 100644 index 0000000000..89b949c521 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IParameterExtensions.cs @@ -0,0 +1,16 @@ +// 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 IParameterExtensions + { + public static bool IsIn(this IParameter parameter) + { + return (parameter.Modifiers & ParameterModifiers.In) == ParameterModifiers.In; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMParameterKind.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMParameterKind.cs index 6959e8d1d0..8ffd82a8d2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMParameterKind.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMParameterKind.cs @@ -7,6 +7,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public enum vsCMParameterKind { - vsCMParameterKindOptional = 8 + vsCMParameterKindNone = 0, + vsCMParameterKindIn = 1, + vsCMParameterKindRef = 2, + vsCMParameterKindOut = 4, + vsCMParameterKindOptional = 8, + vsCMParameterKindParamArray = 16 } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 39a806b22d..f23b019105 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -88,6 +88,7 @@ + @@ -112,6 +113,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameter2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameter2Tests.cs new file mode 100644 index 0000000000..ad0b6d934d --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameter2Tests.cs @@ -0,0 +1,93 @@ +// 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 NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class CodeParameter2Tests + { + ParameterHelper helper; + CodeParameter2 parameter; + + [SetUp] + public void Init() + { + helper = new ParameterHelper(); + } + + void CreateParameter() + { + parameter = new CodeParameter2(null, helper.Parameter); + } + + [Test] + public void ParameterKind_NormalParameter_ReturnsNone() + { + CreateParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindNone, kind); + } + + [Test] + public void ParameterKind_OptionalParameter_ReturnsOptional() + { + CreateParameter(); + helper.MakeOptionalParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindOptional, kind); + } + + [Test] + public void ParameterKind_OutParameter_ReturnsOut() + { + CreateParameter(); + helper.MakeOutParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindOut, kind); + } + + [Test] + public void ParameterKind_RefParameter_ReturnsRef() + { + CreateParameter(); + helper.MakeRefParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindRef, kind); + } + + [Test] + public void ParameterKind_ParamArrayParameter_ReturnsParamArray() + { + CreateParameter(); + helper.MakeParamArrayParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindParamArray, kind); + } + + [Test] + public void ParameterKind_InParameter_ReturnsIn() + { + CreateParameter(); + helper.MakeInParameter(); + + vsCMParameterKind kind = parameter.ParameterKind; + + Assert.AreEqual(vsCMParameterKind.vsCMParameterKindIn, kind); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameterTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameterTests.cs index 5fd217f712..4843a65012 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameterTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeParameterTests.cs @@ -4,17 +4,25 @@ using System; using ICSharpCode.PackageManagement.EnvDTE; using NUnit.Framework; +using PackageManagement.Tests.Helpers; namespace PackageManagement.Tests.EnvDTE { [TestFixture] public class CodeParameterTests { + ParameterHelper helper; CodeParameter parameter; + [SetUp] + public void Init() + { + helper = new ParameterHelper(); + } + void CreateParameter() { - parameter = new CodeParameter(null, null); + parameter = new CodeParameter(null, helper.Parameter); } [Test] diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ParameterHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ParameterHelper.cs new file mode 100644 index 0000000000..e3a4806db8 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ParameterHelper.cs @@ -0,0 +1,44 @@ +// 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 ParameterHelper + { + public IParameter Parameter; + + public ParameterHelper() + { + Parameter = MockRepository.GenerateStub(); + } + + public void MakeOptionalParameter() + { + Parameter.Stub(p => p.IsOptional).Return(true); + } + + public void MakeOutParameter() + { + Parameter.Stub(p => p.IsOut).Return(true); + } + + public void MakeRefParameter() + { + Parameter.Stub(p => p.IsRef).Return(true); + } + + public void MakeParamArrayParameter() + { + Parameter.Stub(p => p.IsParams).Return(true); + } + + public void MakeInParameter() + { + Parameter.Stub(p => p.Modifiers).Return(ParameterModifiers.In); + } + } +}