Browse Source

Return project or external vsCMInfoLocation for EnvDTE.CodeType

pull/28/head
Matt Ward 14 years ago
parent
commit
c5da8349f9
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs
  3. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs
  4. 2
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElementsInNamespace.cs
  5. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
  6. 8
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModel.cs
  7. 11
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
  8. 52
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypesInNamespace.cs
  9. 6
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs
  10. 59
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeModelTests.cs
  11. 2
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs
  12. 34
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectTests.cs
  13. 53
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ProjectContentHelper.cs

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

@ -103,7 +103,6 @@
<Compile Include="Src\EnvDTE\Projects.cs" /> <Compile Include="Src\EnvDTE\Projects.cs" />
<Compile Include="Src\EnvDTE\SourceControl.cs" /> <Compile Include="Src\EnvDTE\SourceControl.cs" />
<Compile Include="Src\EnvDTE\TextPoint.cs" /> <Compile Include="Src\EnvDTE\TextPoint.cs" />
<Compile Include="Src\EnvDTE\CodeTypesInNamespace.cs" />
<Compile Include="Src\EnvDTE\vsCMAccess.cs" /> <Compile Include="Src\EnvDTE\vsCMAccess.cs" />
<Compile Include="Src\EnvDTE\vsCMFunction.cs" /> <Compile Include="Src\EnvDTE\vsCMFunction.cs" />
<Compile Include="Src\EnvDTE\vsCMInfoLocation.cs" /> <Compile Include="Src\EnvDTE\vsCMInfoLocation.cs" />

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

@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{ {
public class CodeClass : CodeType public class CodeClass : CodeType
{ {
public CodeClass(IClass c) public CodeClass(IProjectContent projectContent, IClass c)
: base(c) : base(projectContent, c)
{ {
} }

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

@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{ {
public class CodeClass2 : CodeClass public class CodeClass2 : CodeClass
{ {
public CodeClass2(IClass c) public CodeClass2(IProjectContent projectContent, IClass c)
: base(c) : base(projectContent, c)
{ {
} }

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

@ -56,7 +56,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
void AddCodeClass(IClass c) void AddCodeClass(IClass c)
{ {
AddCodeElement(new CodeClass2(c)); AddCodeElement(new CodeClass2(projectContent, c));
} }
void AddCodeElement(CodeElement codeElement) void AddCodeElement(CodeElement codeElement)

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

@ -8,8 +8,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{ {
public class CodeInterface : CodeType public class CodeInterface : CodeType
{ {
public CodeInterface(IClass c) public CodeInterface(IProjectContent projectContent, IClass c)
: base(c) : base(projectContent, c)
{ {
} }

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

@ -34,12 +34,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return null; return null;
} }
CodeType CreateCodeTypeForClass(IClass @class) CodeType CreateCodeTypeForClass(IClass c)
{ {
if (@class.ClassType == ClassType.Interface) { if (c.ClassType == ClassType.Interface) {
return new CodeInterface(@class); return new CodeInterface(projectContent, c);
} }
return new CodeClass2(@class); return new CodeClass2(projectContent, c);
} }
} }
} }

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

@ -8,10 +8,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{ {
public class CodeType : CodeElement public class CodeType : CodeElement
{ {
public CodeType(IClass c) public CodeType(IProjectContent projectContent, IClass c)
: base(c) : base(c)
{ {
this.Class = 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() public CodeType()

52
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypesInNamespace.cs

@ -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<CodeType>
{
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<ICompletionEntry> 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));
}
}
}

6
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeElementsInNamespaceTests.cs

@ -65,7 +65,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test] [Test]
public void GetEnumerator_OneClassCompletionEntryInNamespace_ReturnsOneCodeClass() public void GetEnumerator_OneClassCompletionEntryInNamespace_ReturnsOneCodeClass()
{ {
helper.AddClassToProjectContent("Test", "Test.MyClass"); helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test"); CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.ToList().FirstOrDefault() as CodeClass2; CodeClass2 codeClass = codeElements.ToList().FirstOrDefault() as CodeClass2;
@ -114,7 +114,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test] [Test]
public void Item_OneClassCompletionEntryAndFirstItemSelected_ReturnsOneCodeClass() public void Item_OneClassCompletionEntryAndFirstItemSelected_ReturnsOneCodeClass()
{ {
helper.AddClassToProjectContent("Test", "Test.MyClass"); helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test"); CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.Item(1) as CodeClass2; CodeClass2 codeClass = codeElements.Item(1) as CodeClass2;
@ -125,7 +125,7 @@ namespace PackageManagement.Tests.EnvDTE
[Test] [Test]
public void Item_OneClassCompletionEntryAndItemSelectedByName_ReturnsOneCodeClass() public void Item_OneClassCompletionEntryAndItemSelectedByName_ReturnsOneCodeClass()
{ {
helper.AddClassToProjectContent("Test", "Test.MyClass"); helper.AddClassToProjectContentAndCompletionEntries("Test", "Test.MyClass");
CreateCodeElements("Test"); CreateCodeElements("Test");
CodeClass2 codeClass = codeElements.Item("MyClass") as CodeClass2; CodeClass2 codeClass = codeElements.Item("MyClass") as CodeClass2;

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

@ -17,10 +17,13 @@ namespace PackageManagement.Tests.EnvDTE
{ {
CodeModel codeModel; CodeModel codeModel;
ProjectContentHelper helper; ProjectContentHelper helper;
TestableProject msbuildProject;
void CreateCodeModel() void CreateCodeModel()
{ {
helper = new ProjectContentHelper(); helper = new ProjectContentHelper();
msbuildProject = ProjectHelper.CreateTestProject();
helper.SetProjectForProjectContent(msbuildProject);
codeModel = new CodeModel(helper.FakeProjectContent); codeModel = new CodeModel(helper.FakeProjectContent);
} }
@ -29,9 +32,14 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddClassToProjectContent(className); helper.AddClassToProjectContent(className);
} }
void AddClassToDifferentProjectContent(string className)
{
helper.AddClassToDifferentProjectContent(className);
}
void AddClassToProjectContent(string namespaceName, string className) void AddClassToProjectContent(string namespaceName, string className)
{ {
helper.AddClassToProjectContent(namespaceName, className); helper.AddClassToProjectContentAndCompletionEntries(namespaceName, className);
} }
void AddInterfaceToProjectContent(string interfaceName) void AddInterfaceToProjectContent(string interfaceName)
@ -39,6 +47,11 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddInterfaceToProjectContent(interfaceName); helper.AddInterfaceToProjectContent(interfaceName);
} }
void AddInterfaceToDifferentProjectContent(string interfaceName)
{
helper.AddInterfaceToDifferentProjectContent(interfaceName);
}
[Test] [Test]
public void CodeTypeFromFullName_NoSuchTypeInProject_ReturnsNull() public void CodeTypeFromFullName_NoSuchTypeInProject_ReturnsNull()
{ {
@ -160,5 +173,49 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(1, members.Count); Assert.AreEqual(1, members.Count);
Assert.AreEqual("Tests", codeNamespace.Name); 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);
}
} }
} }

2
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeNamespaceTests.cs

@ -27,7 +27,7 @@ namespace PackageManagement.Tests.EnvDTE
void AddClassToProjectContent(string namespaceName, string className) void AddClassToProjectContent(string namespaceName, string className)
{ {
helper.AddClassToProjectContent(namespaceName, className); helper.AddClassToProjectContentAndCompletionEntries(namespaceName, className);
} }
void AddUnknownCompletionEntryToNamespace(string namespaceName) void AddUnknownCompletionEntryToNamespace(string namespaceName)

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

@ -38,6 +38,16 @@ namespace PackageManagement.Tests.EnvDTE
helper.AddClassToProjectContent(className); helper.AddClassToProjectContent(className);
} }
void SetProjectForProjectContent()
{
helper.SetProjectForProjectContent(msbuildProject);
}
void SetDifferentProjectForProjectContent()
{
helper.SetProjectForProjectContent(ProjectHelper.CreateTestProject());
}
[Test] [Test]
public void Name_ProjectNameIsMyApp_ReturnsMyApp() public void Name_ProjectNameIsMyApp_ReturnsMyApp()
{ {
@ -216,5 +226,29 @@ namespace PackageManagement.Tests.EnvDTE
Assert.IsNotNull(codeType); 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);
}
} }
} }

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

@ -4,7 +4,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using Rhino.Mocks; using Rhino.Mocks;
namespace PackageManagement.Tests.Helpers namespace PackageManagement.Tests.Helpers
@ -20,7 +22,12 @@ namespace PackageManagement.Tests.Helpers
FakeProjectContent.Stub(pc => pc.NamespaceNames).Return(NamespaceNames); 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); IClass fakeClass = AddClassToProjectContent(className);
var namespaceContents = new List<ICompletionEntry>(); var namespaceContents = new List<ICompletionEntry>();
@ -42,23 +49,41 @@ namespace PackageManagement.Tests.Helpers
public IClass AddClassToProjectContent(string className) public IClass AddClassToProjectContent(string className)
{ {
IClass fakeClass = AddClassToProjectContentCommon(className); IClass fakeClass = AddClassToProjectContentCommon(FakeProjectContent, className);
fakeClass.Stub(c => c.ClassType).Return(ClassType.Class); fakeClass.Stub(c => c.ClassType).Return(ClassType.Class);
return fakeClass; return fakeClass;
} }
public void AddClassToDifferentProjectContent(string className)
{
IProjectContent differentProjectContent = MockRepository.GenerateStub<IProjectContent>();
AddClassToProjectContentCommon(differentProjectContent, className);
}
IClass AddClassToProjectContentCommon(string className) IClass AddClassToProjectContentCommon(IProjectContent projectContent, string className)
{ {
IClass fakeClass = MockRepository.GenerateMock<IClass, IEntity>(); IClass fakeClass = MockRepository.GenerateMock<IClass, IEntity>();
FakeProjectContent.Stub(pc => pc.GetClass(className, 0)).Return(fakeClass); FakeProjectContent.Stub(pc => pc.GetClass(className, 0)).Return(fakeClass);
fakeClass.Stub(c => c.FullyQualifiedName).Return(className); fakeClass.Stub(c => c.FullyQualifiedName).Return(className);
fakeClass.Stub(c => c.ProjectContent).Return(projectContent);
return fakeClass; return fakeClass;
} }
public IClass AddInterfaceToProjectContent(string interfaceName) public IClass AddInterfaceToProjectContent(string interfaceName)
{ {
IClass fakeClass = AddClassToProjectContentCommon(interfaceName); return AddInterfaceToProjectContent(FakeProjectContent, interfaceName);
}
public IClass AddInterfaceToDifferentProjectContent(string interfaceName)
{
IProjectContent projectContent = MockRepository.GenerateStub<IProjectContent>();
return AddInterfaceToProjectContent(projectContent, interfaceName);
}
public IClass AddInterfaceToProjectContent(IProjectContent projectContent, string interfaceName)
{
IClass fakeClass = AddClassToProjectContentCommon(projectContent, interfaceName);
fakeClass.Stub(c => c.ClassType).Return(ClassType.Interface); fakeClass.Stub(c => c.ClassType).Return(ClassType.Interface);
return fakeClass; return fakeClass;
} }
@ -93,5 +118,25 @@ namespace PackageManagement.Tests.Helpers
.ToList(); .ToList();
AddCompletionEntriesToNamespace(parentNamespaceName, entries); AddCompletionEntriesToNamespace(parentNamespaceName, entries);
} }
public void AddClassCompletionEntriesInDifferentProjectContent(string namespaceName, string className)
{
IProjectContent differentProjectContent = MockRepository.GenerateStub<IProjectContent>();
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<IClass>();
fakeClass.Stub(c => c.ProjectContent).Return(projectContent);
var entries = new List<ICompletionEntry>();
entries.Add(fakeClass);
AddCompletionEntriesToNamespace(namespaceName, entries);
}
} }
} }

Loading…
Cancel
Save