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 @@ @@ -103,7 +103,6 @@
<Compile Include="Src\EnvDTE\Projects.cs" />
<Compile Include="Src\EnvDTE\SourceControl.cs" />
<Compile Include="Src\EnvDTE\TextPoint.cs" />
<Compile Include="Src\EnvDTE\CodeTypesInNamespace.cs" />
<Compile Include="Src\EnvDTE\vsCMAccess.cs" />
<Compile Include="Src\EnvDTE\vsCMFunction.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 @@ -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)
{
}

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

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

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

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

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

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

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

@ -34,12 +34,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -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);
}
}
}

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

@ -8,10 +8,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -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()

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

@ -1,52 +0,0 @@ @@ -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 @@ -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 @@ -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 @@ -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;

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

@ -17,10 +17,13 @@ namespace PackageManagement.Tests.EnvDTE @@ -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 @@ -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 @@ -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 @@ -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);
}
}
}

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

@ -27,7 +27,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -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)

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

@ -38,6 +38,16 @@ namespace PackageManagement.Tests.EnvDTE @@ -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 @@ -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);
}
}
}

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

@ -4,7 +4,9 @@ @@ -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 @@ -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<ICompletionEntry>();
@ -42,23 +49,41 @@ namespace PackageManagement.Tests.Helpers @@ -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<IProjectContent>();
AddClassToProjectContentCommon(differentProjectContent, className);
}
IClass AddClassToProjectContentCommon(string className)
IClass AddClassToProjectContentCommon(IProjectContent projectContent, string className)
{
IClass fakeClass = MockRepository.GenerateMock<IClass, IEntity>();
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<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);
return fakeClass;
}
@ -93,5 +118,25 @@ namespace PackageManagement.Tests.Helpers @@ -93,5 +118,25 @@ namespace PackageManagement.Tests.Helpers
.ToList();
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