1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections;
6
using System.Collections.Generic;
9
namespace ICSharpCode.SharpDevelop.Dom
11
static class ExtensionMethods
13
public static void AddRange(this ArrayList arrayList, IEnumerable elements)
15
foreach (object o in elements)
19
public static void AddRange<T>(this ICollection<T> list, IEnumerable<T> elements)
21
foreach (T o in elements)
26
/// Converts a recursive data structure into a flat list.
28
/// <param name="input">The root elements of the recursive data structure.</param>
29
/// <param name="recursive">The function that gets the children of an element.</param>
30
/// <returns>Iterator that enumerates the tree structure in preorder.</returns>
31
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> input, Func<T, IEnumerable<T>> recursion)
33
Stack<IEnumerator<T>> stack = new Stack<IEnumerator<T>>();
35
stack.Push(input.GetEnumerator());
36
while (stack.Count > 0) {
37
while (stack.Peek().MoveNext()) {
38
T element = stack.Peek().Current;
40
IEnumerable<T> children = recursion(element);
41
if (children != null) {
42
stack.Push(children.GetEnumerator());
45
stack.Pop().Dispose();
48
while (stack.Count > 0) {
49
stack.Pop().Dispose();
54
public static IEnumerable<IUsing> GetAllUsings(this ICompilationUnit cu)
56
return (new[]{cu.UsingScope}).Flatten(s=>s.ChildScopes).SelectMany(s=>s.Usings);
61
/// Publicly visible helper methods.
63
public static class ExtensionMethodsPublic
65
// the difference between IClass and IReturnType is that IClass only contains the members
66
// that are declared in this very class,
67
// and IReturnType contains also members from base classes (including System.Object) and default (undeclared) constructors
69
static SignatureComparer memberSignatureComparer = new SignatureComparer();
71
public static bool HasMember(this IClass containingClass, IMember member)
73
return containingClass.AllMembers.Any(m => memberSignatureComparer.Equals(member, m));
76
public static bool HasMember(this IReturnType containingClass, IMember member)
78
return containingClass.GetMembers().Any(m => memberSignatureComparer.Equals(member, m));
81
public static bool ImplementsInterface(this IClass targetClass, IClass requiredInterface)
83
var targetClassType = targetClass.GetCompoundClass().DefaultReturnType;
84
var requiredInterfaceType = requiredInterface.GetCompoundClass().DefaultReturnType;
85
// class.DefaultReturnType.GetMethods() returns also methods from base classes, default ctor, ToString() etc. etc.
86
return !requiredInterfaceType.GetMembers().Any(missingMember => !targetClassType.HasMember(missingMember));
89
public static bool ImplementsAbstractClass(this IClass targetClass, IClass abstractClass)
91
var requiredAbstractMembers = MemberLookupHelper.GetAccessibleMembers(abstractClass.DefaultReturnType, targetClass, LanguageProperties.CSharp, true).Where(m => m.IsAbstract);
92
return !requiredAbstractMembers.Any(missingMember => !targetClass.HasMember(missingMember));
95
public static IEnumerable<IMember> GetMembers(this IReturnType typeReference)
97
var properties = typeReference.GetProperties().Cast<IMember>();
98
var methods = typeReference.GetMethods().Cast<IMember>();
99
var fields = typeReference.GetFields().Cast<IMember>();
100
var events = typeReference.GetEvents().Cast<IMember>();
101
return properties.Concat(methods).Concat(fields).Concat(events);