From 8e4fa6759f37b97a7e12fbb707ddd912714927f5 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 20 May 2012 10:50:35 +0100 Subject: [PATCH] Implement EnvDTE.CodeModel.CodeTypeFromFullName. --- .../Project/PackageManagement.csproj | 4 + .../FakePackageManagementProjectService.cs | 8 +- .../Project/Src/EnvDTE/CodeClass.cs | 6 ++ .../Project/Src/EnvDTE/CodeClass2.cs | 6 ++ .../Project/Src/EnvDTE/CodeElement.cs | 23 +++++- .../Project/Src/EnvDTE/CodeInterface.cs | 4 +- .../Project/Src/EnvDTE/CodeModel.cs | 20 ++++- .../Project/Src/EnvDTE/CodeType.cs | 11 ++- .../Project/Src/EnvDTE/Project.cs | 2 +- .../Project/Src/EnvDTE/vsCMInfoLocation.cs | 3 +- .../Src/IPackageManagementProjectService.cs | 5 +- .../Src/PackageManagementProjectService.cs | 7 ++ .../Test/PackageManagement.Tests.csproj | 9 +++ .../Test/Src/EnvDTE/CodeModelTests.cs | 79 +++++++++++++++++++ .../Test/Src/EnvDTE/ProjectTests.cs | 40 +++++++++- .../Test/Src/Helpers/ProjectContentHelper.cs | 42 ++++++++++ 16 files changed, 259 insertions(+), 10 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 0473bbb41d..778ab534d4 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -441,6 +441,10 @@ ICSharpCode.Core.Presentation False + + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} + ICSharpCode.SharpDevelop.Dom + {7048AE18-EB93-4A84-82D0-DD60EB58ADBD} ICSharpCode.Scripting diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs index 522f3c0866..5bbb903496 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs @@ -3,8 +3,9 @@ using System; using System.Collections.Generic; -using ICSharpCode.SharpDevelop.Project; using ICSharpCode.PackageManagement; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.PackageManagement.Design { @@ -79,5 +80,10 @@ namespace ICSharpCode.PackageManagement.Design { project.Save(); } + + public IProjectContent GetProjectContent(IProject project) + { + return new DefaultProjectContent(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs index 5a8b8dce64..122585390e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs @@ -2,11 +2,17 @@ // 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 CodeClass : CodeType { + public CodeClass(IClass c) + : base(c) + { + } + public virtual CodeElements ImplementedInterfaces { get { throw new NotImplementedException(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs index a984711752..f31b21b73d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs @@ -2,11 +2,17 @@ // 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 CodeClass2 : CodeClass { + public CodeClass2(IClass c) + : base(c) + { + } + public CodeElements PartialClasses { get { throw new NotImplementedException(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs index 52acfb829c..43ee2615c5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs @@ -2,12 +2,33 @@ // 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 CodeElement : MarshalByRefObject { - public virtual string Name { get; set; } + public CodeElement(IEntity entity) + { + this.Entity = entity; + } + + public CodeElement() + { + } + + protected IEntity Entity { get; private set; } + + public virtual string Name { + get { return GetName(); } + } + + string GetName() + { + int index = Entity.FullyQualifiedName.LastIndexOf('.'); + return Entity.FullyQualifiedName.Substring(index + 1); + } + public virtual string Language { get; private set; } // default is vsCMPart.vsCMPartWholeWithAttributes diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs index 8421704557..a9eca11b8e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs @@ -2,12 +2,14 @@ // 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 CodeInterface : CodeType { - public CodeInterface() + public CodeInterface(IClass c) + : base(c) { } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs index 655ac754ec..ba957ce9dd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs @@ -2,13 +2,17 @@ // 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 CodeModel : MarshalByRefObject { - public CodeModel() + IProjectContent projectContent; + + public CodeModel(IProjectContent projectContent) { + this.projectContent = projectContent; } public CodeElements CodeElements { @@ -17,7 +21,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE public CodeType CodeTypeFromFullName(string name) { - throw new NotImplementedException(); + IClass matchedClass = projectContent.GetClass(name, 0); + if (matchedClass != null) { + return CreateCodeTypeForClass(matchedClass); + } + return null; + } + + CodeType CreateCodeTypeForClass(IClass @class) + { + if (@class.ClassType == ClassType.Interface) { + return new CodeInterface(@class); + } + return new CodeClass2(@class); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs index 2c11f55d66..563de33a6a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs @@ -2,15 +2,24 @@ // 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 CodeType : CodeElement { + public CodeType(IClass c) + : base(c) + { + this.Class = c; + } + + protected IClass Class { get; private set; } + public virtual vsCMAccess Access { get; set; } public virtual string FullName { - get { throw new NotImplementedException(); } + get { return Class.FullyQualifiedName; } } public virtual CodeElements Members { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs index 0a1ac4f0fc..7da23c5ee2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs @@ -199,7 +199,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public virtual CodeModel CodeModel { - get { throw new NotImplementedException(); } + get { return new CodeModel(projectService.GetProjectContent(MSBuildProject) ); } } public virtual ConfigurationManager ConfigurationManager { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs index 7b1eb5e9e0..0eff3ade8b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs @@ -7,6 +7,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public enum vsCMInfoLocation { - vsCMInfoLocationProject = 1 + vsCMInfoLocationProject = 1, + vsCMInfoLocationExternal = 2 } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs index a5f3c01e6e..a692a977d1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.PackageManagement @@ -22,6 +23,8 @@ namespace ICSharpCode.PackageManagement void RemoveProjectItem(IProject project, ProjectItem item); void Save(IProject project); - IEnumerable GetOpenProjects(); + IEnumerable GetOpenProjects(); + + IProjectContent GetProjectContent(IProject project); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs index 41fbedbfc7..63ad28d556 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project.Commands; @@ -68,6 +70,11 @@ namespace ICSharpCode.PackageManagement } } + public IProjectContent GetProjectContent(IProject project) + { + return ParserService.GetProjectContent(project); + } + public event ProjectEventHandler ProjectAdded { add { ProjectService.ProjectAdded += value; } remove { ProjectService.ProjectAdded -= value; } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index be34d23df6..a4713e2160 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -50,6 +50,9 @@ 3.0 + + ..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll + 3.5 @@ -69,11 +72,13 @@ Properties\GlobalAssemblyInfo.cs + + @@ -286,6 +291,10 @@ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} ICSharpCode.Core + + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} + ICSharpCode.SharpDevelop.Dom + {7048AE18-EB93-4A84-82D0-DD60EB58ADBD} ICSharpCode.Scripting diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs new file mode 100644 index 0000000000..3fffbd7e51 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs @@ -0,0 +1,79 @@ +// 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; +using Rhino.Mocks; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class CodeModelTests + { + CodeModel codeModel; + ProjectContentHelper helper; + + void CreateCodeModel() + { + helper = new ProjectContentHelper(); + codeModel = new CodeModel(helper.FakeProjectContent); + } + + void AddClassToProjectContent(string className) + { + helper.AddClassToProjectContent(className); + } + + void AddInterfaceToProjectContent(string interfaceName) + { + helper.AddInterfaceToProjectContent(interfaceName); + } + + [Test] + public void CodeTypeFromFullName_NoSuchTypeInProject_ReturnsNull() + { + CreateCodeModel(); + + CodeType codeType = codeModel.CodeTypeFromFullName("UnknownType"); + + Assert.IsNull(codeType); + } + + [Test] + public void CodeTypeFromFullName_ClassExistsInProject_ReturnsCodeClass2() + { + CreateCodeModel(); + AddClassToProjectContent("Tests.TestClass"); + + var codeClass = codeModel.CodeTypeFromFullName("Tests.TestClass") as CodeClass2; + + Assert.AreEqual("Tests.TestClass", codeClass.FullName); + Assert.AreEqual("TestClass", codeClass.Name); + } + + [Test] + public void CodeTypeFromFullName_ClassWithoutNamespaceExistsInProject_ReturnsCodeClass2() + { + CreateCodeModel(); + AddClassToProjectContent("TestClass"); + + var codeClass = codeModel.CodeTypeFromFullName("TestClass") as CodeClass2; + + Assert.AreEqual("TestClass", codeClass.FullName); + } + + [Test] + public void CodeTypeFromFullName_InterfaceExistsInProject_ReturnsCodeInterface() + { + CreateCodeModel(); + AddInterfaceToProjectContent("Interface1"); + + var codeInterface = codeModel.CodeTypeFromFullName("Interface1") as CodeInterface; + + Assert.AreEqual("Interface1", codeInterface.FullName); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs index f34fb970f2..9ec5b9ac2f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs @@ -2,10 +2,13 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.EnvDTE; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Project; using NUnit.Framework; using PackageManagement.Tests.Helpers; +using Rhino.Mocks; namespace PackageManagement.Tests.EnvDTE { @@ -14,11 +17,25 @@ namespace PackageManagement.Tests.EnvDTE { Project project; TestableProject msbuildProject; + ProjectContentHelper helper; + IPackageManagementProjectService fakeProjectService; + IPackageManagementFileService fakeFileService; void CreateProject() { msbuildProject = ProjectHelper.CreateTestProject(); - project = new Project(msbuildProject); + helper = new ProjectContentHelper(); + + fakeProjectService = MockRepository.GenerateStub(); + fakeProjectService.Stub(service => service.GetProjectContent(msbuildProject)).Return(helper.FakeProjectContent); + + fakeFileService = MockRepository.GenerateStub(); + project = new Project(msbuildProject, fakeProjectService, fakeFileService); + } + + void AddClassToProjectContent(string className) + { + helper.AddClassToProjectContent(className); } [Test] @@ -178,5 +195,26 @@ namespace PackageManagement.Tests.EnvDTE Assert.AreEqual(@"bin\debug\", outputPath); } + + [Test] + public void CodeModel_NoTypesInProjectAndCallCodeTypeFromFullName_ReturnsNull() + { + CreateProject(); + + CodeType codeType = project.CodeModel.CodeTypeFromFullName("UnknownTypeName"); + + Assert.IsNull(codeType); + } + + [Test] + public void CodeModel_ClassExistsInProjectContentAndCallCodeTypeFromFullName_ReturnsNonCodeType() + { + CreateProject(); + AddClassToProjectContent("Tests.MyClass"); + + CodeType codeType = project.CodeModel.CodeTypeFromFullName("Tests.MyClass"); + + Assert.IsNotNull(codeType); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs new file mode 100644 index 0000000000..52f796b712 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs @@ -0,0 +1,42 @@ +// 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 ProjectContentHelper + { + public IProjectContent FakeProjectContent; + + public ProjectContentHelper() + { + FakeProjectContent = MockRepository.GenerateStub(); + } + + public IClass AddClassToProjectContent(string className) + { + IClass fakeClass = AddClassToProjectContentCommon(className); + fakeClass.Stub(c => c.ClassType).Return(ClassType.Class); + + return fakeClass; + } + + IClass AddClassToProjectContentCommon(string className) + { + IClass fakeClass = MockRepository.GenerateMock(); + FakeProjectContent.Stub(pc => pc.GetClass(className, 0)).Return(fakeClass); + fakeClass.Stub(c => c.FullyQualifiedName).Return(className); + return fakeClass; + } + + public IClass AddInterfaceToProjectContent(string interfaceName) + { + IClass fakeClass = AddClassToProjectContentCommon(interfaceName); + fakeClass.Stub(c => c.ClassType).Return(ClassType.Interface); + return fakeClass; + } + } +}