diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
index 2dce48c12c..662e8586b6 100644
--- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
+++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
@@ -103,7 +103,6 @@
-
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
index 61ad9b8e6b..973eaa4da9 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
@@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeClass : CodeType
{
- public CodeClass(IClass c)
- : base(c)
+ public CodeClass(IProjectContent projectContent, IClass c)
+ : base(projectContent, c)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
index f31b21b73d..aaeb7b7d82 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
@@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeClass2 : CodeClass
{
- public CodeClass2(IClass c)
- : base(c)
+ public CodeClass2(IProjectContent projectContent, IClass c)
+ : base(projectContent, c)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs
index 2b65082e2d..53edd646e6 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs
@@ -56,7 +56,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
void AddCodeClass(IClass c)
{
- AddCodeElement(new CodeClass2(c));
+ AddCodeElement(new CodeClass2(projectContent, c));
}
void AddCodeElement(CodeElement codeElement)
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
index a9eca11b8e..df1b58a376 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
@@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeInterface : CodeType
{
- public CodeInterface(IClass c)
- : base(c)
+ public CodeInterface(IProjectContent projectContent, IClass c)
+ : base(projectContent, c)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
index 28820f488d..f72d84b70e 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
@@ -34,12 +34,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return null;
}
- CodeType CreateCodeTypeForClass(IClass @class)
+ CodeType CreateCodeTypeForClass(IClass c)
{
- if (@class.ClassType == ClassType.Interface) {
- return new CodeInterface(@class);
+ if (c.ClassType == ClassType.Interface) {
+ return new CodeInterface(projectContent, c);
}
- return new CodeClass2(@class);
+ return new CodeClass2(projectContent, c);
}
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
index 6159391d98..6b7809ada4 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
@@ -8,10 +8,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class CodeType : CodeElement
{
- public CodeType(IClass c)
+ public CodeType(IProjectContent projectContent, IClass c)
: base(c)
{
this.Class = c;
+ InfoLocation = GetInfoLocation(projectContent, c);
+ }
+
+ vsCMInfoLocation GetInfoLocation(IProjectContent projectContent, IClass c)
+ {
+ if (projectContent.Project == c.ProjectContent.Project) {
+ return vsCMInfoLocation.vsCMInfoLocationProject;
+ }
+ return vsCMInfoLocation.vsCMInfoLocationExternal;
}
public CodeType()
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypesInNamespace.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypesInNamespace.cs
deleted file mode 100644
index 0a2cc9e23d..0000000000
--- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypesInNamespace.cs
+++ /dev/null
@@ -1,52 +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 ICSharpCode.SharpDevelop.Dom;
-
-namespace ICSharpCode.PackageManagement.EnvDTE
-{
- public class CodeTypesInNamespace : List
- {
- IProjectContent projectContent;
- CodeNamespace codeNamespace;
-
- public CodeTypesInNamespace(IProjectContent projectContent, string namespaceName)
- : this(projectContent, new CodeNamespace(projectContent, namespaceName))
- {
- }
-
- public CodeTypesInNamespace(IProjectContent projectContent, CodeNamespace codeNamespace)
- {
- this.projectContent = projectContent;
- this.codeNamespace = codeNamespace;
- AddTypes();
- }
-
- void AddTypes()
- {
- foreach (ICompletionEntry completionEntry in GetTypesInNamespace()) {
- AddMember(completionEntry);
- }
- }
-
- List GetTypesInNamespace()
- {
- return projectContent.GetNamespaceContents(codeNamespace.QualifiedName);
- }
-
- void AddMember(ICompletionEntry completionEntry)
- {
- IClass classMember = completionEntry as IClass;
- if (classMember != null) {
- AddClassMember(classMember);
- }
- }
-
- void AddClassMember(IClass classMember)
- {
- Add(new CodeClass2(classMember));
- }
- }
-}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs
index 4f56846cfa..4fe1d5a528 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs
@@ -65,7 +65,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test]
public void GetEnumerator_OneClassCompletionEntryInNamespace_ReturnsOneCodeClass()
{
- helper.AddClassToProjectContent("Test", "Test.MyClass");
+ helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.ToList().FirstOrDefault() as CodeClass2;
@@ -114,7 +114,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test]
public void Item_OneClassCompletionEntryAndFirstItemSelected_ReturnsOneCodeClass()
{
- helper.AddClassToProjectContent("Test", "Test.MyClass");
+ helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.Item(1) as CodeClass2;
@@ -125,7 +125,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test]
public void Item_OneClassCompletionEntryAndItemSelectedByName_ReturnsOneCodeClass()
{
- helper.AddClassToProjectContent("Test", "Test.MyClass");
+ helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.Item("MyClass") as CodeClass2;
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
index 5603709e30..6056e8c402 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
@@ -17,10 +17,13 @@ namespace PackageManagement.Tests.EnvDTE
{
CodeModel codeModel;
ProjectContentHelper helper;
+ TestableProject msbuildProject;
void CreateCodeModel()
{
helper = new ProjectContentHelper();
+ msbuildProject = ProjectHelper.CreateTestProject();
+ helper.SetProjectForProjectContent(msbuildProject);
codeModel = new CodeModel(helper.FakeProjectContent);
}
@@ -29,9 +32,14 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddClassToProjectContent(className);
}
+ void AddClassToDifferentProjectContent(string className)
+ {
+ helper.AddClassToDifferentProjectContent(className);
+ }
+
void AddClassToProjectContent(string namespaceName, string className)
{
- helper.AddClassToProjectContent(namespaceName, className);
+ helper.AddClassToProjectContentAndCompletionEntries(namespaceName, className);
}
void AddInterfaceToProjectContent(string interfaceName)
@@ -39,6 +47,11 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddInterfaceToProjectContent(interfaceName);
}
+ void AddInterfaceToDifferentProjectContent(string interfaceName)
+ {
+ helper.AddInterfaceToDifferentProjectContent(interfaceName);
+ }
+
[Test]
public void CodeTypeFromFullName_NoSuchTypeInProject_ReturnsNull()
{
@@ -160,5 +173,49 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(1, members.Count);
Assert.AreEqual("Tests", codeNamespace.Name);
}
+
+ [Test]
+ public void CodeTypeFromFullName_ClassExistsInProject_InfoLocationIsLocalProject()
+ {
+ CreateCodeModel();
+ AddClassToProjectContent("Tests.TestClass");
+
+ var codeClass = codeModel.CodeTypeFromFullName("Tests.TestClass") as CodeClass2;
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationProject, codeClass.InfoLocation);
+ }
+
+ [Test]
+ public void CodeTypeFromFullName_ClassExistsInDifferentProject_InfoLocationIsExternal()
+ {
+ CreateCodeModel();
+ AddClassToDifferentProjectContent("Tests.TestClass");
+
+ var codeClass = codeModel.CodeTypeFromFullName("Tests.TestClass") as CodeClass2;
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, codeClass.InfoLocation);
+ }
+
+ [Test]
+ public void CodeTypeFromFullName_InterfaceExistsInProject_InfoLocationIsLocalProject()
+ {
+ CreateCodeModel();
+ AddInterfaceToProjectContent("Tests.ITest");
+
+ var codeInterface = codeModel.CodeTypeFromFullName("Tests.ITest") as CodeInterface;
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationProject, codeInterface.InfoLocation);
+ }
+
+ [Test]
+ public void CodeTypeFromFullName_InterfaceExistsInDifferentProject_InfoLocationIsExternal()
+ {
+ CreateCodeModel();
+ AddInterfaceToDifferentProjectContent("Tests.ITest");
+
+ var codeInterface = codeModel.CodeTypeFromFullName("Tests.ITest") as CodeInterface;
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, codeInterface.InfoLocation);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs
index 1e45523b1c..d96f399196 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs
@@ -27,7 +27,7 @@ namespace PackageManagement.Tests.EnvDTE
void AddClassToProjectContent(string namespaceName, string className)
{
- helper.AddClassToProjectContent(namespaceName, className);
+ helper.AddClassToProjectContentAndCompletionEntries(namespaceName, className);
}
void AddUnknownCompletionEntryToNamespace(string namespaceName)
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
index 9ec5b9ac2f..0a1f3c680d 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
@@ -38,6 +38,16 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddClassToProjectContent(className);
}
+ void SetProjectForProjectContent()
+ {
+ helper.SetProjectForProjectContent(msbuildProject);
+ }
+
+ void SetDifferentProjectForProjectContent()
+ {
+ helper.SetProjectForProjectContent(ProjectHelper.CreateTestProject());
+ }
+
[Test]
public void Name_ProjectNameIsMyApp_ReturnsMyApp()
{
@@ -216,5 +226,29 @@ namespace PackageManagement.Tests.EnvDTE
Assert.IsNotNull(codeType);
}
+
+ [Test]
+ public void CodeModel_ClassExistsInProjectContentForProject_ReturnsClassWithLocationSetToInProject()
+ {
+ CreateProject();
+ SetProjectForProjectContent();
+ helper.AddClassToCompletionEntries(String.Empty, "MyClass");
+
+ CodeElement element = project.CodeModel.CodeElements.FirstOrDefault();
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationProject, element.InfoLocation);
+ }
+
+ [Test]
+ public void CodeModel_ClassExistsInProjectContentForDifferentProject_ReturnsClassWithLocationSetToExternal()
+ {
+ CreateProject();
+ SetProjectForProjectContent();
+ helper.AddClassCompletionEntriesInDifferentProjectContent(String.Empty, "MyClass");
+
+ CodeElement element = project.CodeModel.CodeElements.FirstOrDefault();
+
+ Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, element.InfoLocation);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs
index 6dfa0b46fb..9d299c03dc 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs
@@ -4,7 +4,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
+
using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Project;
using Rhino.Mocks;
namespace PackageManagement.Tests.Helpers
@@ -20,7 +22,12 @@ namespace PackageManagement.Tests.Helpers
FakeProjectContent.Stub(pc => pc.NamespaceNames).Return(NamespaceNames);
}
- public IClass AddClassToProjectContent(string namespaceName, string className)
+ public void SetProjectForProjectContent(IProject project)
+ {
+ FakeProjectContent.Stub(pc => pc.Project).Return(project);
+ }
+
+ public IClass AddClassToProjectContentAndCompletionEntries(string namespaceName, string className)
{
IClass fakeClass = AddClassToProjectContent(className);
var namespaceContents = new List();
@@ -42,23 +49,41 @@ namespace PackageManagement.Tests.Helpers
public IClass AddClassToProjectContent(string className)
{
- IClass fakeClass = AddClassToProjectContentCommon(className);
+ IClass fakeClass = AddClassToProjectContentCommon(FakeProjectContent, className);
fakeClass.Stub(c => c.ClassType).Return(ClassType.Class);
return fakeClass;
}
+
+ public void AddClassToDifferentProjectContent(string className)
+ {
+ IProjectContent differentProjectContent = MockRepository.GenerateStub();
+ AddClassToProjectContentCommon(differentProjectContent, className);
+ }
- IClass AddClassToProjectContentCommon(string className)
+ IClass AddClassToProjectContentCommon(IProjectContent projectContent, string className)
{
IClass fakeClass = MockRepository.GenerateMock();
FakeProjectContent.Stub(pc => pc.GetClass(className, 0)).Return(fakeClass);
fakeClass.Stub(c => c.FullyQualifiedName).Return(className);
+ fakeClass.Stub(c => c.ProjectContent).Return(projectContent);
return fakeClass;
}
public IClass AddInterfaceToProjectContent(string interfaceName)
{
- IClass fakeClass = AddClassToProjectContentCommon(interfaceName);
+ return AddInterfaceToProjectContent(FakeProjectContent, interfaceName);
+ }
+
+ public IClass AddInterfaceToDifferentProjectContent(string interfaceName)
+ {
+ IProjectContent projectContent = MockRepository.GenerateStub();
+ return AddInterfaceToProjectContent(projectContent, interfaceName);
+ }
+
+ public IClass AddInterfaceToProjectContent(IProjectContent projectContent, string interfaceName)
+ {
+ IClass fakeClass = AddClassToProjectContentCommon(projectContent, interfaceName);
fakeClass.Stub(c => c.ClassType).Return(ClassType.Interface);
return fakeClass;
}
@@ -93,5 +118,25 @@ namespace PackageManagement.Tests.Helpers
.ToList();
AddCompletionEntriesToNamespace(parentNamespaceName, entries);
}
+
+ public void AddClassCompletionEntriesInDifferentProjectContent(string namespaceName, string className)
+ {
+ IProjectContent differentProjectContent = MockRepository.GenerateStub();
+ AddClassToCompletionEntries(differentProjectContent, namespaceName, className);
+ }
+
+ public void AddClassToCompletionEntries(string namespaceName, string className)
+ {
+ AddClassToCompletionEntries(FakeProjectContent, namespaceName, className);
+ }
+
+ void AddClassToCompletionEntries(IProjectContent projectContent, string namespaceName, string className)
+ {
+ IClass fakeClass = MockRepository.GenerateStub();
+ fakeClass.Stub(c => c.ProjectContent).Return(projectContent);
+ var entries = new List();
+ entries.Add(fakeClass);
+ AddCompletionEntriesToNamespace(namespaceName, entries);
+ }
}
}