16 changed files with 647 additions and 5 deletions
@ -0,0 +1,54 @@ |
|||||||
|
// 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 ChildCodeNamespaces : List<CodeNamespace> |
||||||
|
{ |
||||||
|
IProjectContent projectContent; |
||||||
|
CodeNamespace parentNamespace; |
||||||
|
HashSet<string> namespacesAdded = new HashSet<string>(); |
||||||
|
|
||||||
|
public ChildCodeNamespaces(IProjectContent projectContent, CodeNamespace parentNamespace) |
||||||
|
{ |
||||||
|
this.projectContent = projectContent; |
||||||
|
this.parentNamespace = parentNamespace; |
||||||
|
AddChildNamespaces(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddChildNamespaces() |
||||||
|
{ |
||||||
|
foreach (string namespaceName in GetUniqueQualifiedChildNamespaceNames()) { |
||||||
|
AddCodeNamespace(namespaceName); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
IEnumerable<string> GetUniqueQualifiedChildNamespaceNames() |
||||||
|
{ |
||||||
|
foreach (string namespaceName in projectContent.NamespaceNames) { |
||||||
|
string qualifiedChildNamespaceName = parentNamespace.GetChildNamespaceName(namespaceName); |
||||||
|
if (IsUniqueChildNamespaceName(qualifiedChildNamespaceName)) { |
||||||
|
namespacesAdded.Add(qualifiedChildNamespaceName); |
||||||
|
yield return qualifiedChildNamespaceName; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bool IsUniqueChildNamespaceName(string name) |
||||||
|
{ |
||||||
|
if (name != null) { |
||||||
|
return !namespacesAdded.Contains(name); |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
void AddCodeNamespace(string namespaceName) |
||||||
|
{ |
||||||
|
Add(new CodeNamespace(projectContent, namespaceName)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,50 @@ |
|||||||
|
// 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; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class CodeNamespaceMembers : CodeElements |
||||||
|
{ |
||||||
|
List<CodeElement> elements = new List<CodeElement>(); |
||||||
|
IProjectContent projectContent; |
||||||
|
CodeNamespace codeNamespace; |
||||||
|
|
||||||
|
public CodeNamespaceMembers(IProjectContent projectContent, CodeNamespace codeNamespace) |
||||||
|
{ |
||||||
|
this.projectContent = projectContent; |
||||||
|
this.codeNamespace = codeNamespace; |
||||||
|
GetMembers(); |
||||||
|
} |
||||||
|
|
||||||
|
void GetMembers() |
||||||
|
{ |
||||||
|
AddNamespaceMembers(); |
||||||
|
AddTypesInNamespace(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddNamespaceMembers() |
||||||
|
{ |
||||||
|
elements.AddRange(new ChildCodeNamespaces(projectContent, codeNamespace)); |
||||||
|
} |
||||||
|
|
||||||
|
void AddTypesInNamespace() |
||||||
|
{ |
||||||
|
elements.AddRange(new CodeTypesInNamespace(projectContent, codeNamespace)); |
||||||
|
} |
||||||
|
|
||||||
|
public int Count { |
||||||
|
get { return elements.Count; } |
||||||
|
} |
||||||
|
|
||||||
|
public IEnumerator GetEnumerator() |
||||||
|
{ |
||||||
|
return elements.GetEnumerator(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,52 @@ |
|||||||
|
// 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)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,61 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class NamespaceName |
||||||
|
{ |
||||||
|
public NamespaceName(string qualifiedName) |
||||||
|
{ |
||||||
|
this.QualifiedName = qualifiedName; |
||||||
|
FirstPart = GetFirstPartOfNamespace(); |
||||||
|
LastPart = GetLastPartOfNamespace(); |
||||||
|
} |
||||||
|
|
||||||
|
string GetFirstPartOfNamespace() |
||||||
|
{ |
||||||
|
int index = QualifiedName.IndexOf('.'); |
||||||
|
if (index >= 0) { |
||||||
|
return QualifiedName.Substring(0, index); |
||||||
|
} |
||||||
|
return QualifiedName; |
||||||
|
} |
||||||
|
|
||||||
|
string GetLastPartOfNamespace() |
||||||
|
{ |
||||||
|
int index = QualifiedName.LastIndexOf('.'); |
||||||
|
return QualifiedName.Substring(index + 1); |
||||||
|
} |
||||||
|
|
||||||
|
public string FirstPart { get; private set; } |
||||||
|
public string LastPart { get; private set; } |
||||||
|
public string QualifiedName { get; private set; } |
||||||
|
|
||||||
|
public string GetChildNamespaceName(string namespaceName) |
||||||
|
{ |
||||||
|
if (QualifiedName == String.Empty) { |
||||||
|
return GetChildNamespaceNameForRootNamespace(namespaceName); |
||||||
|
} |
||||||
|
|
||||||
|
string dottedQualifiedName = QualifiedName + "."; |
||||||
|
if (namespaceName.StartsWith(dottedQualifiedName)) { |
||||||
|
int nextIndex = namespaceName.IndexOf('.', dottedQualifiedName.Length); |
||||||
|
if (nextIndex >= 0) { |
||||||
|
return namespaceName.Substring(0, nextIndex); |
||||||
|
} |
||||||
|
return namespaceName; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
string GetChildNamespaceNameForRootNamespace(string namespaceName) |
||||||
|
{ |
||||||
|
if (!String.IsNullOrEmpty(namespaceName)) { |
||||||
|
return new NamespaceName(namespaceName).FirstPart; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,53 @@ |
|||||||
|
// 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; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Linq; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement.EnvDTE |
||||||
|
{ |
||||||
|
public class ProjectCodeElements : CodeElements |
||||||
|
{ |
||||||
|
List<CodeElement> codeElements = new List<CodeElement>(); |
||||||
|
IProjectContent projectContent; |
||||||
|
|
||||||
|
public ProjectCodeElements(IProjectContent projectContent) |
||||||
|
{ |
||||||
|
this.projectContent = projectContent; |
||||||
|
AddCodeElements(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddCodeElements() |
||||||
|
{ |
||||||
|
AddNamespaceCodeElements(); |
||||||
|
AddClassesWithNoNamespace(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddNamespaceCodeElements() |
||||||
|
{ |
||||||
|
codeElements.AddRange(CreateChildNodeNamespaces()); |
||||||
|
} |
||||||
|
|
||||||
|
ChildCodeNamespaces CreateChildNodeNamespaces() |
||||||
|
{ |
||||||
|
return new ChildCodeNamespaces(projectContent, new CodeNamespace(projectContent, String.Empty)); |
||||||
|
} |
||||||
|
|
||||||
|
void AddClassesWithNoNamespace() |
||||||
|
{ |
||||||
|
codeElements.AddRange(new CodeTypesInNamespace(projectContent, String.Empty)); |
||||||
|
} |
||||||
|
|
||||||
|
public int Count { |
||||||
|
get { return codeElements.Count; } |
||||||
|
} |
||||||
|
|
||||||
|
public IEnumerator GetEnumerator() |
||||||
|
{ |
||||||
|
return codeElements.GetEnumerator(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,148 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests.EnvDTE |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class CodeNamespaceTests |
||||||
|
{ |
||||||
|
CodeNamespace codeNamespace; |
||||||
|
ProjectContentHelper helper; |
||||||
|
|
||||||
|
void CreateCodeNamespace(string namespaceName) |
||||||
|
{ |
||||||
|
codeNamespace = new CodeNamespace(helper.FakeProjectContent, namespaceName); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateProjectContent() |
||||||
|
{ |
||||||
|
helper = new ProjectContentHelper(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddClassToProjectContent(string namespaceName, string className) |
||||||
|
{ |
||||||
|
helper.AddClassToProjectContent(namespaceName, className); |
||||||
|
} |
||||||
|
|
||||||
|
void AddNamespaceToProjectContent(string name) |
||||||
|
{ |
||||||
|
helper.AddNamespaceNameToProjectContent(name); |
||||||
|
} |
||||||
|
|
||||||
|
void NoClassesInNamespace(string name) |
||||||
|
{ |
||||||
|
helper.AddEmptyNamespaceContents(name); |
||||||
|
} |
||||||
|
|
||||||
|
void AddUnknownCompletionEntryToNamespace(string namespaceName) |
||||||
|
{ |
||||||
|
helper.AddUnknownCompletionEntryTypeToNamespace(namespaceName); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Members_NamespaceHasOneClass_ReturnsOneClass() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
AddNamespaceToProjectContent("Tests"); |
||||||
|
AddClassToProjectContent("Tests", "Tests.MyClass"); |
||||||
|
CreateCodeNamespace("Tests"); |
||||||
|
|
||||||
|
CodeElements members = codeNamespace.Members; |
||||||
|
CodeClass2 codeClass = members.FirstOrDefault() as CodeClass2; |
||||||
|
|
||||||
|
Assert.AreEqual(1, members.Count); |
||||||
|
Assert.AreEqual("Tests.MyClass", codeClass.FullName); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Members_NamespaceHasOneChildNamespace_ReturnsOneChildNamespace() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
AddNamespaceToProjectContent("First.Second"); |
||||||
|
NoClassesInNamespace("First"); |
||||||
|
NoClassesInNamespace("First.Second"); |
||||||
|
CreateCodeNamespace("First"); |
||||||
|
|
||||||
|
CodeElements members = codeNamespace.Members; |
||||||
|
CodeNamespace childNamespace = members.FirstOrDefault() as CodeNamespace; |
||||||
|
|
||||||
|
Assert.AreEqual("First", codeNamespace.Name); |
||||||
|
Assert.AreEqual(1, members.Count); |
||||||
|
Assert.AreEqual("Second", childNamespace.Name); |
||||||
|
Assert.AreEqual("Second", childNamespace.FullName); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void InfoLocation_NamespaceHasNoClasses_ReturnsExternal() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
CreateCodeNamespace("Test"); |
||||||
|
|
||||||
|
Assert.AreEqual(vsCMInfoLocation.vsCMInfoLocationExternal, codeNamespace.InfoLocation); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Members_NamespaceHasOneChildNamespaceWithThreeNamespaceParts_ReturnsOneChildNamespaceWhichHasOneChildNamespace() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
AddNamespaceToProjectContent("First.Second.Third"); |
||||||
|
NoClassesInNamespace("First"); |
||||||
|
NoClassesInNamespace("First.Second"); |
||||||
|
NoClassesInNamespace("First.Second.Third"); |
||||||
|
CreateCodeNamespace("First"); |
||||||
|
|
||||||
|
CodeElements members = codeNamespace.Members; |
||||||
|
CodeNamespace secondNamespace = members.FirstOrDefault() as CodeNamespace; |
||||||
|
CodeNamespace thirdNamespace = secondNamespace.Members.FirstOrDefault() as CodeNamespace; |
||||||
|
|
||||||
|
Assert.AreEqual("First", codeNamespace.Name); |
||||||
|
Assert.AreEqual(1, members.Count); |
||||||
|
Assert.AreEqual("Second", secondNamespace.Name); |
||||||
|
Assert.AreEqual("Second", secondNamespace.FullName); |
||||||
|
Assert.AreEqual(1, secondNamespace.Members.Count); |
||||||
|
Assert.AreEqual("Third", thirdNamespace.FullName); |
||||||
|
Assert.AreEqual(0, thirdNamespace.Members.Count); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Members_ProjectHasTwoNamespacesWithCommonFirstAndSecondPartOfThreePartNamespace_ReturnsOneChildNamespaceWhichHasOneChildNamespace() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
AddNamespaceToProjectContent("First.Second.Third"); |
||||||
|
AddNamespaceToProjectContent("First.Second.Different"); |
||||||
|
NoClassesInNamespace("First"); |
||||||
|
NoClassesInNamespace("First.Second"); |
||||||
|
NoClassesInNamespace("First.Second.Third"); |
||||||
|
NoClassesInNamespace("First.Second.Different"); |
||||||
|
CreateCodeNamespace("First"); |
||||||
|
|
||||||
|
CodeElements members = codeNamespace.Members; |
||||||
|
CodeNamespace secondNamespace = members.FirstOrDefault() as CodeNamespace; |
||||||
|
|
||||||
|
Assert.AreEqual("First", codeNamespace.Name); |
||||||
|
Assert.AreEqual(1, members.Count); |
||||||
|
Assert.AreEqual("Second", secondNamespace.Name); |
||||||
|
Assert.AreEqual("Second", secondNamespace.FullName); |
||||||
|
Assert.AreEqual(2, secondNamespace.Members.Count); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Members_NamespaceHasUnknownNamespaceEntryType_ReturnsNoItems() |
||||||
|
{ |
||||||
|
CreateProjectContent(); |
||||||
|
AddNamespaceToProjectContent("Tests"); |
||||||
|
AddUnknownCompletionEntryToNamespace("Tests"); |
||||||
|
CreateCodeNamespace("Tests"); |
||||||
|
|
||||||
|
CodeElements members = codeNamespace.Members; |
||||||
|
|
||||||
|
Assert.AreEqual(0, members.Count); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
// 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 System.Linq; |
||||||
|
using ICSharpCode.PackageManagement.EnvDTE; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests.Helpers |
||||||
|
{ |
||||||
|
public static class CodeElementsHelpers |
||||||
|
{ |
||||||
|
public static CodeElement FirstOrDefault(this CodeElements codeElements) |
||||||
|
{ |
||||||
|
return ToList(codeElements).FirstOrDefault(); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<CodeElement> ToList(this CodeElements codeElements) |
||||||
|
{ |
||||||
|
var list = new List<CodeElement>(); |
||||||
|
foreach (CodeElement codeElement in codeElements) { |
||||||
|
list.Add(codeElement); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue