Browse Source

Add classes to EnvDTE.FileCodeModel2.CodeElements

pull/28/head
Matt Ward 14 years ago
parent
commit
f81c495eac
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs
  3. 33
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeElements.cs
  4. 38
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs
  5. 21
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespaceMembers.cs
  6. 81
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/FileCodeModel2Tests.cs
  7. 8
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs
  8. 5
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsExtensions.cs
  9. 2
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CompilationUnitHelper.cs
  10. 5
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/UsingScopeHelper.cs

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

@ -122,6 +122,8 @@ @@ -122,6 +122,8 @@
<Compile Include="Src\EnvDTE\EditPoint.cs" />
<Compile Include="Src\EnvDTE\FileCodeModel2.cs" />
<Compile Include="Src\EnvDTE\FileCodeModelCodeElements.cs" />
<Compile Include="Src\EnvDTE\FileCodeModelCodeNamespace.cs" />
<Compile Include="Src\EnvDTE\FileCodeModelCodeNamespaceMembers.cs" />
<Compile Include="Src\EnvDTE\ImplementedInterfacesOnClass.cs" />
<Compile Include="Src\EnvDTE\IReturnTypeExtensions.cs" />
<Compile Include="Src\EnvDTE\NamespaceName.cs" />

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

@ -40,7 +40,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -40,7 +40,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
get { return namespaceName.LastPart; }
}
public CodeElements Members {
public virtual CodeElements Members {
get { return new CodeElementsInNamespace(projectContent, namespaceName); }
}
}

33
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeElements.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
@ -11,6 +12,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -11,6 +12,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public class FileCodeModelCodeElements : CodeElementsList
{
ICompilationUnit compilationUnit;
List<FileCodeModelCodeNamespace> fileCodeModelNamespaces = new List<FileCodeModelCodeNamespace>();
public FileCodeModelCodeElements(ICompilationUnit compilationUnit)
{
@ -23,6 +25,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -23,6 +25,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
foreach (IUsing namespaceUsing in GetNamespaceImports()) {
AddNamespaceImport(namespaceUsing);
}
AddClasses();
}
IList<IUsing> GetNamespaceImports()
@ -36,5 +39,35 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -36,5 +39,35 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
AddCodeElement(new CodeImport(import));
}
void AddClasses()
{
foreach (IClass c in compilationUnit.Classes) {
FileCodeModelCodeNamespace codeNamespace = GetOrCreateFileCodeModelNamespace(c);
codeNamespace.AddClass(compilationUnit.ProjectContent, c);
}
}
FileCodeModelCodeNamespace GetOrCreateFileCodeModelNamespace(IClass c)
{
var codeNamespace = FindFileCodeModelNamespace(c);
if (codeNamespace != null) {
return codeNamespace;
}
return CreateFileCodeModelNamespace(c);
}
FileCodeModelCodeNamespace FindFileCodeModelNamespace(IClass c)
{
return fileCodeModelNamespaces.FirstOrDefault(ns => ns.FullName == c.Namespace);
}
FileCodeModelCodeNamespace CreateFileCodeModelNamespace(IClass c)
{
var codeNamespace = new FileCodeModelCodeNamespace(compilationUnit.ProjectContent, c.Namespace);
AddCodeElement(codeNamespace);
fileCodeModelNamespaces.Add(codeNamespace);
return codeNamespace;
}
}
}

38
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
/// <summary>
/// File code model namespaces take the full name of the namespace that a class
/// is inside. So for the FileCodeModelNamespace class the CodeNamespace.Name
/// would be ICSharpCode.PackageManagement.EnvDTE.
/// This differs from the CodeModel CodeNamespace which breaks up the namespaces into
/// parts.
/// </summary>
public class FileCodeModelCodeNamespace : CodeNamespace
{
FileCodeModelCodeNamespaceMembers members = new FileCodeModelCodeNamespaceMembers();
public FileCodeModelCodeNamespace(IProjectContent projectContent, string namespaceName)
: base(projectContent, namespaceName)
{
}
public override string Name {
get { return base.FullName; }
}
public override CodeElements Members {
get { return members; }
}
public void AddClass(IProjectContent projectContent, IClass c)
{
members.AddClass(projectContent, c);
}
}
}

21
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespaceMembers.cs

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class FileCodeModelCodeNamespaceMembers : CodeElementsList
{
public FileCodeModelCodeNamespaceMembers()
{
}
public void AddClass(IProjectContent projectContent, IClass c)
{
var codeClass = new CodeClass2(projectContent, c);
AddCodeElement(codeClass);
}
}
}

81
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/FileCodeModel2Tests.cs

@ -56,6 +56,11 @@ namespace PackageManagement.Tests.EnvDTE @@ -56,6 +56,11 @@ namespace PackageManagement.Tests.EnvDTE
return fileCodeModel.CodeElements.FirstCodeImportOrDefault();
}
CodeNamespace GetFirstCodeNamespaceFromCodeElements()
{
return fileCodeModel.CodeElements.FirstCodeNamespaceOrDefault();
}
void AddNamespaceToCompilationUnit(string namespaceName)
{
compilationUnitHelper.AddNamespace(namespaceName);
@ -65,7 +70,21 @@ namespace PackageManagement.Tests.EnvDTE @@ -65,7 +70,21 @@ namespace PackageManagement.Tests.EnvDTE
{
compilationUnitHelper.AddNamespaceAlias(alias, namespaceName);
}
void AddClassToCompilationUnit(string namespaceName, string className)
{
var classHelper = new ClassHelper();
classHelper.CreatePublicClass(className);
classHelper.AddNamespaceUsingScopeToClass(namespaceName);
classHelper.AddClassNamespace(namespaceName);
compilationUnitHelper.AddClass(classHelper.Class);
}
CodeNamespace GetLastCodeNamespaceFromCodeElements()
{
return fileCodeModel.CodeElements.LastCodeNamespaceOrDefault();
}
[Test]
public void CodeElements_OneNamespaceInFile_FileNameUsedToGetCompilationUnit()
{
@ -116,5 +135,65 @@ namespace PackageManagement.Tests.EnvDTE @@ -116,5 +135,65 @@ namespace PackageManagement.Tests.EnvDTE
namespaceCreator.AssertWasCalled(creator => creator.AddNamespace(compilationUnitHelper.CompilationUnit, "System.Xml"));
}
[Test]
public void CodeElements_OneClassInFileWithNamespace_ReturnsOneCodeNamespace()
{
CreateProjectWithOneFile();
CreateCompilationUnitForFileProjectItem();
AddClassToCompilationUnit("Test.CodeModel", "Test.CodeModel.Class1");
CreateFileCodeModel();
CodeNamespace ns = GetFirstCodeNamespaceFromCodeElements();
Assert.AreEqual("Test.CodeModel", ns.Name);
}
[Test]
public void CodeElements_OneClassInFileWithNamespace_ReturnsOneClassInsideCodeNamespace()
{
CreateProjectWithOneFile();
CreateCompilationUnitForFileProjectItem();
AddClassToCompilationUnit("Test.CodeModel", "Test.CodeModel.Class1");
CreateFileCodeModel();
CodeNamespace ns = GetFirstCodeNamespaceFromCodeElements();
CodeClass2 codeClass = ns.Members.FirstCodeClass2OrDefault();
Assert.AreEqual("Test.CodeModel.Class1", codeClass.FullName);
}
[Test]
public void CodeElements_TwoClassesInFileWithNamespace_ReturnsTwoClassesInsideCodeNamespace()
{
CreateProjectWithOneFile();
CreateCompilationUnitForFileProjectItem();
AddClassToCompilationUnit("Test.CodeModel", "Test.CodeModel.Class1");
AddClassToCompilationUnit("Test.CodeModel", "Test.CodeModel.Class2");
CreateFileCodeModel();
CodeNamespace ns = GetFirstCodeNamespaceFromCodeElements();
CodeClass2 codeClass1 = ns.Members.FirstCodeClass2OrDefault();
CodeClass2 codeClass2 = ns.Members.LastCodeClass2OrDefault();
Assert.AreEqual("Test.CodeModel.Class1", codeClass1.FullName);
Assert.AreEqual("Test.CodeModel.Class2", codeClass2.FullName);
}
[Test]
public void CodeElements_TwoClassesInFileEachWithDifferentNamespace_ReturnsTwoCodeNamespaces()
{
CreateProjectWithOneFile();
CreateCompilationUnitForFileProjectItem();
AddClassToCompilationUnit("Test.CodeModel1", "Test.CodeModel.Class1");
AddClassToCompilationUnit("Test.CodeModel2", "Test.CodeModel.Class2");
CreateFileCodeModel();
CodeNamespace ns1 = GetFirstCodeNamespaceFromCodeElements();
CodeNamespace ns2 = GetLastCodeNamespaceFromCodeElements();
Assert.AreEqual("Test.CodeModel1", ns1.Name);
Assert.AreEqual("Test.CodeModel2", ns2.Name);
}
}
}

8
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs

@ -172,5 +172,13 @@ namespace PackageManagement.Tests.Helpers @@ -172,5 +172,13 @@ namespace PackageManagement.Tests.Helpers
{
Class.Stub(c => c.IsPartial).Return(true);
}
public void AddNamespaceUsingScopeToClass(string namespaceName)
{
var usingScopeHelper = new UsingScopeHelper();
usingScopeHelper.SetNamespaceName(namespaceName);
Class.Stub(c => c.UsingScope).Return(usingScopeHelper.UsingScope);
}
}
}

5
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CodeElementsExtensions.cs

@ -83,5 +83,10 @@ namespace PackageManagement.Tests.Helpers @@ -83,5 +83,10 @@ namespace PackageManagement.Tests.Helpers
{
return codeElements.FirstOrDefault() as CodeImport;
}
public static CodeClass2 LastCodeClass2OrDefault(this CodeElements codeElements)
{
return codeElements.LastOrDefault() as CodeClass2;
}
}
}

2
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/CompilationUnitHelper.cs

@ -14,6 +14,7 @@ namespace PackageManagement.Tests.Helpers @@ -14,6 +14,7 @@ namespace PackageManagement.Tests.Helpers
public FakeCodeGenerator FakeCodeGenerator = new FakeCodeGenerator();
public List<IClass> Classes = new List<IClass>();
public UsingScopeHelper UsingScopeHelper = new UsingScopeHelper();
public ProjectContentHelper ProjectContentHelper = new ProjectContentHelper();
public CompilationUnitHelper()
{
@ -23,6 +24,7 @@ namespace PackageManagement.Tests.Helpers @@ -23,6 +24,7 @@ namespace PackageManagement.Tests.Helpers
CompilationUnit.Stub(unit => unit.Language).Return(language);
CompilationUnit.Stub(unit => unit.Classes).Return(Classes);
CompilationUnit.Stub(unit => unit.UsingScope).Return(UsingScopeHelper.UsingScope);
CompilationUnit.Stub(unit => unit.ProjectContent).Return(ProjectContentHelper.ProjectContent);
}
public void SetFileName(string fileName)

5
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/UsingScopeHelper.cs

@ -37,5 +37,10 @@ namespace PackageManagement.Tests.Helpers @@ -37,5 +37,10 @@ namespace PackageManagement.Tests.Helpers
usingHelper.AddNamespaceAlias(alias, namespaceName);
Usings.Add(usingHelper.Using);
}
public void SetNamespaceName(string namespaceName)
{
UsingScope.Stub(u => u.NamespaceName).Return(namespaceName);
}
}
}

Loading…
Cancel
Save