diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 4b80ed21a9..a7b0a9f8fb 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -87,6 +87,8 @@ + + @@ -95,6 +97,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs index 08f7f958fb..af33960fc3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs @@ -17,7 +17,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE { } - public vsCMAccess Access { + public CodeFunction(IProperty property) + : base(property) + { + } + + public virtual vsCMAccess Access { get { return GetAccess(); } set { } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs new file mode 100644 index 0000000000..667c274a99 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.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 class CodeGetterFunction : CodeGetterOrSetterFunction + { + public CodeGetterFunction(IProperty property) + : base(property, property.GetterModifiers) + { + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs new file mode 100644 index 0000000000..f23ae2c603 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs @@ -0,0 +1,29 @@ +// 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 class CodeGetterOrSetterFunction : CodeFunction + { + ModifierEnum modifier; + + public CodeGetterOrSetterFunction(IProperty property, ModifierEnum modifier) + : base(property) + { + this.modifier = modifier; + } + + public override vsCMAccess Access { + get { + if (modifier == ModifierEnum.None) { + return base.Access; + } + return vsCMAccess.vsCMAccessPrivate; + } + set { } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs index 23c70cad8a..31fa71bb69 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeProperty.cs @@ -8,8 +8,6 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public class CodeProperty : CodeElement { - CodeElements attributes; - public CodeProperty() { } @@ -32,12 +30,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual CodeElements Attributes { - get { - if (attributes == null) { - attributes = new CodeAttributes(Property); - } - return attributes; - } + get { return new CodeAttributes(Property); } } public virtual CodeTypeRef Type { @@ -45,11 +38,27 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual CodeFunction Getter { - get { throw new NotImplementedException(); } + get { return GetGetter(); } + } + + CodeFunction GetGetter() + { + if (Property.CanGet) { + return new CodeGetterFunction(Property); + } + return null; } public virtual CodeFunction Setter { - get { throw new NotImplementedException(); } + get { return GetSetter(); } + } + + CodeFunction GetSetter() + { + if (Property.CanSet) { + return new CodeSetterFunction(Property); + } + return null; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs new file mode 100644 index 0000000000..f34b51a81e --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.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 class CodeSetterFunction : CodeGetterOrSetterFunction + { + public CodeSetterFunction(IProperty property) + : base(property, property.SetterModifiers) + { + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 69d15dc3b5..d239dec577 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -88,7 +88,7 @@ - + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs index da4b359a37..1318e295a7 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeProperty2Tests.cs @@ -120,5 +120,125 @@ namespace PackageManagement.Tests.EnvDTE Assert.AreEqual(vsCMPropertyKind.vsCMPropertyKindWriteOnly, kind); } + + [Test] + public void Parameters_PropertyIsIndexerWithOneParameter_ReturnsOneParameter() + { + helper.CreatePublicProperty("MyProperty"); + helper.AddParameterToProperty("item"); + CreateCodeProperty2(); + + CodeElements parameters = property.Parameters; + CodeParameter parameter = parameters.FirstCodeParameterOrDefault(); + + Assert.AreEqual(1, parameters.Count); + Assert.AreEqual("item", parameter.Name); + } + + [Test] + public void Getter_PublicGetter_ReturnsPublicGetterCodeFunction() + { + helper.CreatePublicProperty("MyProperty"); + helper.HasGetterOnly(); + helper.GetterModifierIsNone(); + CreateCodeProperty2(); + + CodeFunction getter = property.Getter; + vsCMAccess access = getter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPublic, access); + } + + [Test] + public void Getter_PrivateGetter_ReturnsPrivateGetterCodeFunction() + { + helper.CreatePrivateProperty("MyProperty"); + helper.HasGetterOnly(); + helper.GetterModifierIsNone(); + CreateCodeProperty2(); + + CodeFunction getter = property.Getter; + vsCMAccess access = getter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPrivate, access); + } + + [Test] + public void Getter_NoGetter_ReturnsNull() + { + helper.CreatePublicProperty("MyProperty"); + CreateCodeProperty2(); + + CodeFunction getter = property.Getter; + + Assert.IsNull(getter); + } + + [Test] + public void Getter_PublicPropertyButPrivateGetter_ReturnsPrivateGetterCodeFunction() + { + helper.CreatePublicProperty("MyProperty"); + helper.HasGetterAndSetter(); + helper.GetterModifierIsPrivate(); + CreateCodeProperty2(); + + CodeFunction getter = property.Getter; + vsCMAccess access = getter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPrivate, access); + } + + [Test] + public void Setter_PublicSetter_ReturnsPublicSetterCodeFunction() + { + helper.CreatePublicProperty("MyProperty"); + helper.HasSetterOnly(); + helper.SetterModifierIsNone(); + CreateCodeProperty2(); + + CodeFunction setter = property.Setter; + vsCMAccess access = setter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPublic, access); + } + + [Test] + public void Setter_PrivateSetter_ReturnsPrivateSetterCodeFunction() + { + helper.CreatePrivateProperty("MyProperty"); + helper.HasSetterOnly(); + helper.SetterModifierIsNone(); + CreateCodeProperty2(); + + CodeFunction setter = property.Setter; + vsCMAccess access = setter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPrivate, access); + } + + [Test] + public void Setter_NoSetter_ReturnsNull() + { + helper.CreatePublicProperty("MyProperty"); + CreateCodeProperty2(); + + CodeFunction setter = property.Setter; + + Assert.IsNull(setter); + } + + [Test] + public void Setter_PublicPropertyButPrivateSetter_ReturnsPrivateSetterCodeFunction() + { + helper.CreatePublicProperty("MyProperty"); + helper.HasGetterAndSetter(); + helper.SetterModifierIsPrivate(); + CreateCodeProperty2(); + + CodeFunction setter = property.Setter; + vsCMAccess access = setter.Access; + + Assert.AreEqual(vsCMAccess.vsCMAccessPrivate, access); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsHelpers.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsHelpers.cs deleted file mode 100644 index 83bdc6d784..0000000000 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsHelpers.cs +++ /dev/null @@ -1,77 +0,0 @@ -// 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 System.Collections.Generic; -using System.Linq; -using ICSharpCode.PackageManagement.EnvDTE; - -namespace PackageManagement.Tests.Helpers -{ - public static class CodeElementsHelpers - { - public static List ToList(this CodeElements codeElements) - { - var list = new List(); - foreach (CodeElement codeElement in codeElements) { - list.Add(codeElement); - } - return list; - } - - public static CodeElement FirstOrDefault(this CodeElements codeElements) - { - return ToList(codeElements).FirstOrDefault(); - } - - public static CodeFunction FirstCodeFunctionOrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeFunction; - } - - public static CodeClass2 FirstCodeClass2OrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeClass2; - } - - public static CodeInterface FirstCodeInterfaceOrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeInterface; - } - - public static CodeAttributeArgument FirstCodeAttributeArgumentOrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeAttributeArgument; - } - - public static CodeNamespace FirstCodeNamespaceOrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeNamespace; - } - - public static CodeNamespace LastCodeNamespaceOrDefault(this CodeElements codeElements) - { - return codeElements.LastOrDefault() as CodeNamespace; - } - - public static CodeElement LastOrDefault(this CodeElements codeElements) - { - return codeElements.ToList().LastOrDefault(); - } - - public static CodeAttribute2 FirstCodeAttribute2OrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeAttribute2; - } - - public static CodeProperty2 FirstCodeProperty2OrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeProperty2; - } - - public static CodeVariable FirstCodeVariableOrDefault(this CodeElements codeElements) - { - return codeElements.FirstOrDefault() as CodeVariable; - } - } -} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs index a054fa2c3f..876280b4bf 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PropertyHelper.cs @@ -11,9 +11,11 @@ namespace PackageManagement.Tests.Helpers public class PropertyHelper { public IProperty Property; - public List Attributes = new List(); public ProjectContentHelper ProjectContentHelper = new ProjectContentHelper(); + List attributes = new List(); + List parameters = new List(); + /// /// Property name should include class prefix (e.g. "Class1.MyProperty") /// @@ -21,7 +23,8 @@ namespace PackageManagement.Tests.Helpers { Property = MockRepository.GenerateMock(); Property.Stub(p => p.FullyQualifiedName).Return(fullyQualifiedName); - Property.Stub(p => p.Attributes).Return(Attributes); + Property.Stub(p => p.Attributes).Return(attributes); + Property.Stub(p => p.Parameters).Return(parameters); Property.Stub(p => p.ProjectContent).Return(ProjectContentHelper.FakeProjectContent); } @@ -29,7 +32,7 @@ namespace PackageManagement.Tests.Helpers { var attributeHelper = new AttributeHelper(); attributeHelper.CreateAttribute(fullName, shortName); - Attributes.Add(attributeHelper.Attribute); + attributes.Add(attributeHelper.Attribute); } public void AddParentClass(string className) @@ -76,5 +79,40 @@ namespace PackageManagement.Tests.Helpers HasGetter = false; HasSetter = true; } + + public void AddParameterToProperty(string name) + { + IParameter parameter = MockRepository.GenerateStub(); + parameter.Stub(p => p.Name).Return(name); + parameters.Add(parameter); + } + + public void GetterModifierIsPrivate() + { + GetterModifier = ModifierEnum.Private; + } + + ModifierEnum GetterModifier { + set { Property.Stub(p => p.GetterModifiers).Return(value); } + } + + public void GetterModifierIsNone() + { + GetterModifier = ModifierEnum.None; + } + + public void SetterModifierIsPrivate() + { + SetterModifier = ModifierEnum.Private; + } + + ModifierEnum SetterModifier { + set { Property.Stub(p => p.SetterModifiers).Return(value); } + } + + public void SetterModifierIsNone() + { + GetterModifier = ModifierEnum.None; + } } }