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);
+ }
+ }
+}