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