Browse Source

Implement EnvDTE.CodeModel.CodeTypeFromFullName.

pull/28/head
Matt Ward 14 years ago
parent
commit
8e4fa6759f
  1. 4
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 8
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs
  3. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
  4. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
  5. 23
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs
  6. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
  7. 20
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
  8. 11
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
  9. 2
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  10. 3
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs
  11. 5
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs
  12. 7
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs
  13. 9
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  14. 79
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
  15. 40
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
  16. 42
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs

4
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -441,6 +441,10 @@ @@ -441,6 +441,10 @@
<Name>ICSharpCode.Core.Presentation</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\BackendBindings\Scripting\Project\ICSharpCode.Scripting.csproj">
<Project>{7048AE18-EB93-4A84-82D0-DD60EB58ADBD}</Project>
<Name>ICSharpCode.Scripting</Name>

8
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs

@ -3,8 +3,9 @@ @@ -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 @@ -79,5 +80,10 @@ namespace ICSharpCode.PackageManagement.Design
{
project.Save();
}
public IProjectContent GetProjectContent(IProject project)
{
return new DefaultProjectContent();
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs

@ -2,11 +2,17 @@ @@ -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(); }
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs

@ -2,11 +2,17 @@ @@ -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(); }
}

23
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs

@ -2,12 +2,33 @@ @@ -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

4
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs

@ -2,12 +2,14 @@ @@ -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)
{
}

20
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs

@ -2,13 +2,17 @@ @@ -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 @@ -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);
}
}
}

11
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs

@ -2,15 +2,24 @@ @@ -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 {

2
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs

@ -199,7 +199,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -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 {

3
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/vsCMInfoLocation.cs

@ -7,6 +7,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -7,6 +7,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public enum vsCMInfoLocation
{
vsCMInfoLocationProject = 1
vsCMInfoLocationProject = 1,
vsCMInfoLocationExternal = 2
}
}

5
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs

@ -3,6 +3,7 @@ @@ -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 @@ -22,6 +23,8 @@ namespace ICSharpCode.PackageManagement
void RemoveProjectItem(IProject project, ProjectItem item);
void Save(IProject project);
IEnumerable<IProject> GetOpenProjects();
IEnumerable<IProject> GetOpenProjects();
IProjectContent GetProjectContent(IProject project);
}
}

7
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs

@ -3,6 +3,8 @@ @@ -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 @@ -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; }

9
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -50,6 +50,9 @@ @@ -50,6 +50,9 @@
<Reference Include="PresentationFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="Rhino.Mocks">
<HintPath>..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
@ -69,11 +72,13 @@ @@ -69,11 +72,13 @@
<Compile Include="..\..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Src\EnvDTE\CodeModelTests.cs" />
<Compile Include="Src\EnvDTE\SolutionTests.cs" />
<Compile Include="Src\Helpers\FakeSelectProjectsService.cs" />
<Compile Include="Src\Helpers\FakeSolutionPackageRepositoryFactory.cs" />
<Compile Include="Src\Helpers\FakeUpdatePackageActions.cs" />
<Compile Include="Src\Helpers\FakeUpdatePackageActionsFactory.cs" />
<Compile Include="Src\Helpers\ProjectContentHelper.cs" />
<Compile Include="Src\Helpers\PropertiesHelper.cs" />
<Compile Include="Src\Helpers\SelectedProjectCollectionAssert.cs" />
<Compile Include="Src\Helpers\TestableInstalledPackageViewModel.cs" />
@ -286,6 +291,10 @@ @@ -286,6 +291,10 @@
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\BackendBindings\Scripting\Project\ICSharpCode.Scripting.csproj">
<Project>{7048AE18-EB93-4A84-82D0-DD60EB58ADBD}</Project>
<Name>ICSharpCode.Scripting</Name>

79
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs

@ -0,0 +1,79 @@ @@ -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);
}
}
}

40
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs

@ -2,10 +2,13 @@ @@ -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 @@ -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<IPackageManagementProjectService>();
fakeProjectService.Stub(service => service.GetProjectContent(msbuildProject)).Return(helper.FakeProjectContent);
fakeFileService = MockRepository.GenerateStub<IPackageManagementFileService>();
project = new Project(msbuildProject, fakeProjectService, fakeFileService);
}
void AddClassToProjectContent(string className)
{
helper.AddClassToProjectContent(className);
}
[Test]
@ -178,5 +195,26 @@ namespace PackageManagement.Tests.EnvDTE @@ -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);
}
}
}

42
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs

@ -0,0 +1,42 @@ @@ -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<IProjectContent>();
}
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<IClass, IEntity>();
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;
}
}
}
Loading…
Cancel
Save