16 changed files with 647 additions and 5 deletions
@ -0,0 +1,54 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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