1
ļ»æ// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
3
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
// software and associated documentation files (the "Software"), to deal in the Software
5
// without restriction, including without limitation the rights to use, copy, modify, merge,
6
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
// to whom the Software is furnished to do so, subject to the following conditions:
9
// The above copyright notice and this permission notice shall be included in all copies or
10
// substantial portions of the Software.
12
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17
// DEALINGS IN THE SOFTWARE.
20
using System.Collections.Generic;
22
using ICSharpCode.NRefactory.Documentation;
23
using ICSharpCode.NRefactory.Utils;
25
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
28
/// Default implementation of <see cref="ITypeDefinition"/>.
30
public class DefaultResolvedTypeDefinition : ITypeDefinition
32
readonly ITypeResolveContext parentContext;
33
readonly IUnresolvedTypeDefinition[] parts;
34
Accessibility accessibility = Accessibility.Internal;
35
bool isAbstract, isSealed, isShadowing;
36
bool isSynthetic = true; // true if all parts are synthetic
38
public DefaultResolvedTypeDefinition(ITypeResolveContext parentContext, params IUnresolvedTypeDefinition[] parts)
40
if (parentContext == null || parentContext.CurrentAssembly == null)
41
throw new ArgumentException("Parent context does not specify any assembly", "parentContext");
42
if (parts == null || parts.Length == 0)
43
throw new ArgumentException("No parts were specified", "parts");
44
this.parentContext = parentContext;
47
foreach (IUnresolvedTypeDefinition part in parts) {
48
isAbstract |= part.IsAbstract;
49
isSealed |= part.IsSealed;
50
isShadowing |= part.IsShadowing;
51
isSynthetic &= part.IsSynthetic; // true if all parts are synthetic
53
// internal is the default, so use another part's accessibility until we find a non-internal accessibility
54
if (accessibility == Accessibility.Internal)
55
accessibility = part.Accessibility;
59
IList<ITypeParameter> typeParameters;
61
public IList<ITypeParameter> TypeParameters {
63
var result = LazyInit.VolatileRead(ref this.typeParameters);
67
ITypeResolveContext contextForTypeParameters = parts[0].CreateResolveContext(parentContext);
68
contextForTypeParameters = contextForTypeParameters.WithCurrentTypeDefinition(this);
69
if (parentContext.CurrentTypeDefinition == null || parentContext.CurrentTypeDefinition.TypeParameterCount == 0) {
70
result = parts[0].TypeParameters.CreateResolvedTypeParameters(contextForTypeParameters);
72
// This is a nested class inside a generic class; copy type parameters from outer class if we can:
73
var outerClass = parentContext.CurrentTypeDefinition;
74
ITypeParameter[] typeParameters = new ITypeParameter[parts[0].TypeParameters.Count];
75
for (int i = 0; i < typeParameters.Length; i++) {
76
var unresolvedTP = parts[0].TypeParameters[i];
77
if (i < outerClass.TypeParameterCount && outerClass.TypeParameters[i].Name == unresolvedTP.Name)
78
typeParameters[i] = outerClass.TypeParameters[i];
80
typeParameters[i] = unresolvedTP.CreateResolvedTypeParameter(contextForTypeParameters);
82
result = Array.AsReadOnly(typeParameters);
84
return LazyInit.GetOrSet(ref this.typeParameters, result);
88
IList<IAttribute> attributes;
90
public IList<IAttribute> Attributes {
92
var result = LazyInit.VolatileRead(ref this.attributes);
96
result = new List<IAttribute>();
97
foreach (IUnresolvedTypeDefinition part in parts) {
98
ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
99
foreach (var attr in part.Attributes) {
100
result.Add(attr.CreateResolvedAttribute(parentContextForPart));
103
if (result.Count == 0)
104
result = EmptyList<IAttribute>.Instance;
105
return LazyInit.GetOrSet(ref this.attributes, result);
109
public IList<IUnresolvedTypeDefinition> Parts {
110
get { return parts; }
113
public EntityType EntityType {
114
get { return parts[0].EntityType; }
117
public virtual TypeKind Kind {
118
get { return parts[0].Kind; }
122
IList<ITypeDefinition> nestedTypes;
124
public IList<ITypeDefinition> NestedTypes {
126
IList<ITypeDefinition> result = LazyInit.VolatileRead(ref this.nestedTypes);
127
if (result != null) {
132
from nestedTypeRef in part.NestedTypes
133
group nestedTypeRef by new { nestedTypeRef.Name, nestedTypeRef.TypeParameters.Count } into g
134
select new DefaultResolvedTypeDefinition(new SimpleTypeResolveContext(this), g.ToArray())
135
).ToList<ITypeDefinition>().AsReadOnly();
136
return LazyInit.GetOrSet(ref this.nestedTypes, result);
143
sealed class MemberList : IList<IMember>
145
internal readonly ITypeResolveContext[] contextPerMember;
146
internal readonly IUnresolvedMember[] unresolvedMembers;
147
internal readonly IMember[] resolvedMembers;
148
internal readonly int NonPartialMemberCount;
150
public MemberList(List<ITypeResolveContext> contextPerMember, List<IUnresolvedMember> unresolvedNonPartialMembers, List<PartialMethodInfo> partialMethodInfos)
152
this.NonPartialMemberCount = unresolvedNonPartialMembers.Count;
153
this.contextPerMember = contextPerMember.ToArray();
154
this.unresolvedMembers = unresolvedNonPartialMembers.ToArray();
155
if (partialMethodInfos == null) {
156
this.resolvedMembers = new IMember[unresolvedNonPartialMembers.Count];
158
this.resolvedMembers = new IMember[unresolvedNonPartialMembers.Count + partialMethodInfos.Count];
159
for (int i = 0; i < partialMethodInfos.Count; i++) {
160
var info = partialMethodInfos[i];
161
int memberIndex = NonPartialMemberCount + i;
162
resolvedMembers[memberIndex] = DefaultResolvedMethod.CreateFromMultipleParts(
163
info.Parts.ToArray(), info.Contexts.ToArray (), false);
168
public IMember this[int index] {
170
IMember output = LazyInit.VolatileRead(ref resolvedMembers[index]);
171
if (output != null) {
174
return LazyInit.GetOrSet(ref resolvedMembers[index], unresolvedMembers[index].CreateResolved(contextPerMember[index]));
176
set { throw new NotSupportedException(); }
180
get { return resolvedMembers.Length; }
183
bool ICollection<IMember>.IsReadOnly {
187
public int IndexOf(IMember item)
189
for (int i = 0; i < this.Count; i++) {
190
if (this[i].Equals(item))
196
void IList<IMember>.Insert(int index, IMember item)
198
throw new NotSupportedException();
201
void IList<IMember>.RemoveAt(int index)
203
throw new NotSupportedException();
206
void ICollection<IMember>.Add(IMember item)
208
throw new NotSupportedException();
211
void ICollection<IMember>.Clear()
213
throw new NotSupportedException();
216
bool ICollection<IMember>.Contains(IMember item)
218
return IndexOf(item) >= 0;
221
void ICollection<IMember>.CopyTo(IMember[] array, int arrayIndex)
223
for (int i = 0; i < this.Count; i++) {
224
array[arrayIndex + i] = this[i];
228
bool ICollection<IMember>.Remove(IMember item)
230
throw new NotSupportedException();
233
public IEnumerator<IMember> GetEnumerator()
235
for (int i = 0; i < this.Count; i++) {
236
yield return this[i];
240
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
242
return GetEnumerator();
246
sealed class PartialMethodInfo
248
public readonly string Name;
249
public readonly int TypeParameterCount;
250
public readonly IList<IParameter> Parameters;
251
public readonly List<IUnresolvedMethod> Parts = new List<IUnresolvedMethod>();
252
public readonly List<ITypeResolveContext> Contexts = new List<ITypeResolveContext>();
254
public PartialMethodInfo(IUnresolvedMethod method, ITypeResolveContext context)
256
this.Name = method.Name;
257
this.TypeParameterCount = method.TypeParameters.Count;
258
this.Parameters = method.Parameters.CreateResolvedParameters(context);
259
this.Parts.Add(method);
260
this.Contexts.Add (context);
263
public void AddPart(IUnresolvedMethod method, ITypeResolveContext context)
265
if (method.HasBody) {
266
// make the implementation the primary part
267
this.Parts.Insert(0, method);
268
this.Contexts.Insert (0, context);
270
this.Parts.Add(method);
271
this.Contexts.Add (context);
275
public bool IsSameSignature(PartialMethodInfo other, StringComparer nameComparer)
277
return nameComparer.Equals(this.Name, other.Name)
278
&& this.TypeParameterCount == other.TypeParameterCount
279
&& ParameterListComparer.Instance.Equals(this.Parameters, other.Parameters);
283
MemberList memberList;
285
MemberList GetMemberList()
287
var result = LazyInit.VolatileRead(ref this.memberList);
288
if (result != null) {
291
List<IUnresolvedMember> unresolvedMembers = new List<IUnresolvedMember>();
292
List<ITypeResolveContext> contextPerMember = new List<ITypeResolveContext>();
293
List<PartialMethodInfo> partialMethodInfos = null;
294
bool addDefaultConstructorIfRequired = false;
295
foreach (IUnresolvedTypeDefinition part in parts) {
296
ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
297
ITypeResolveContext contextForPart = parentContextForPart.WithCurrentTypeDefinition(this);
298
foreach (var member in part.Members) {
299
IUnresolvedMethod method = member as IUnresolvedMethod;
300
if (method != null && method.IsPartial) {
301
// Merge partial method declaration and implementation
302
if (partialMethodInfos == null)
303
partialMethodInfos = new List<PartialMethodInfo>();
304
PartialMethodInfo newInfo = new PartialMethodInfo(method, contextForPart);
305
PartialMethodInfo existingInfo = null;
306
foreach (var info in partialMethodInfos) {
307
if (newInfo.IsSameSignature(info, Compilation.NameComparer)) {
312
if (existingInfo != null) {
313
// Add the unresolved method to the PartialMethodInfo:
314
existingInfo.AddPart(method, contextForPart);
316
partialMethodInfos.Add(newInfo);
319
unresolvedMembers.Add(member);
320
contextPerMember.Add(contextForPart);
324
addDefaultConstructorIfRequired |= part.AddDefaultConstructorIfRequired;
326
if (addDefaultConstructorIfRequired) {
327
TypeKind kind = this.Kind;
328
if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.EntityType == EntityType.Constructor && !m.IsStatic)
329
|| kind == TypeKind.Enum || kind == TypeKind.Struct)
331
contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this));
332
unresolvedMembers.Add(DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]));
335
result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos);
336
return LazyInit.GetOrSet(ref this.memberList, result);
339
public IList<IMember> Members {
340
get { return GetMemberList(); }
343
public IEnumerable<IField> Fields {
345
var members = GetMemberList();
346
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
347
if (members.unresolvedMembers[i].EntityType == EntityType.Field)
348
yield return (IField)members[i];
353
public IEnumerable<IMethod> Methods {
355
var members = GetMemberList();
356
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
357
if (members.unresolvedMembers[i] is IUnresolvedMethod)
358
yield return (IMethod)members[i];
360
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
361
yield return (IMethod)members[i];
366
public IEnumerable<IProperty> Properties {
368
var members = GetMemberList();
369
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
370
switch (members.unresolvedMembers[i].EntityType) {
371
case EntityType.Property:
372
case EntityType.Indexer:
373
yield return (IProperty)members[i];
380
public IEnumerable<IEvent> Events {
382
var members = GetMemberList();
383
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
384
if (members.unresolvedMembers[i].EntityType == EntityType.Event)
385
yield return (IEvent)members[i];
391
volatile KnownTypeCode knownTypeCode = (KnownTypeCode)(-1);
393
public KnownTypeCode KnownTypeCode {
395
KnownTypeCode result = this.knownTypeCode;
396
if (result == (KnownTypeCode)(-1)) {
397
result = KnownTypeCode.None;
398
for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++) {
399
KnownTypeReference r = KnownTypeReference.Get((KnownTypeCode)i);
400
if (r != null && r.Resolve(parentContext) == this) {
401
result = (KnownTypeCode)i;
405
this.knownTypeCode = result;
411
volatile IType enumUnderlyingType;
413
public IType EnumUnderlyingType {
415
IType result = this.enumUnderlyingType;
416
if (result == null) {
417
if (this.Kind == TypeKind.Enum) {
418
result = CalculateEnumUnderlyingType();
420
result = SpecialType.UnknownType;
422
this.enumUnderlyingType = result;
428
IType CalculateEnumUnderlyingType()
430
foreach (var part in parts) {
431
var context = part.CreateResolveContext(parentContext).WithCurrentTypeDefinition(this);
432
foreach (var baseTypeRef in part.BaseTypes) {
433
IType type = baseTypeRef.Resolve(context);
434
if (type.Kind != TypeKind.Unknown)
438
return this.Compilation.FindType(KnownTypeCode.Int32);
441
volatile byte hasExtensionMethods; // 0 = unknown, 1 = true, 2 = false
443
public bool HasExtensionMethods {
445
byte val = this.hasExtensionMethods;
447
if (CalculateHasExtensionMethods())
451
this.hasExtensionMethods = val;
457
bool CalculateHasExtensionMethods()
459
bool noExtensionMethods = true;
460
foreach (var part in parts) {
461
// Return true if any part has extension methods
462
if (part.HasExtensionMethods == true)
464
if (part.HasExtensionMethods == null)
465
noExtensionMethods = false;
467
// Return false if all parts are known to have no extension methods
468
if (noExtensionMethods)
470
// If unsure, look at the resolved methods.
471
return Methods.Any(m => m.IsExtensionMethod);
474
public bool? IsReferenceType {
478
case TypeKind.Interface:
479
case TypeKind.Module:
480
case TypeKind.Delegate:
482
case TypeKind.Struct:
487
throw new InvalidOperationException("Invalid value for TypeKind");
492
public int TypeParameterCount {
493
get { return parts[0].TypeParameters.Count; }
496
public IList<IType> TypeArguments {
498
// ToList() call is necessary because IList<> isn't covariant
499
return TypeParameters.ToList<IType>();
503
public bool IsParameterized {
504
get { return false; }
507
#region DirectBaseTypes
508
IList<IType> directBaseTypes;
510
public IEnumerable<IType> DirectBaseTypes {
512
IList<IType> result = LazyInit.VolatileRead(ref this.directBaseTypes);
513
if (result != null) {
516
result = CalculateDirectBaseTypes();
517
return LazyInit.GetOrSet(ref this.directBaseTypes, result);
522
IList<IType> CalculateDirectBaseTypes()
524
List<IType> result = new List<IType>();
525
bool hasNonInterface = false;
526
if (this.Kind != TypeKind.Enum) {
527
foreach (var part in parts) {
528
var context = part.CreateResolveContext(parentContext).WithCurrentTypeDefinition(this);
529
foreach (var baseTypeRef in part.BaseTypes) {
530
IType baseType = baseTypeRef.Resolve(context);
531
if (!(baseType.Kind == TypeKind.Unknown || result.Contains(baseType))) {
532
result.Add(baseType);
533
if (baseType.Kind != TypeKind.Interface)
534
hasNonInterface = true;
539
if (!hasNonInterface && !(this.Name == "Object" && this.Namespace == "System" && this.TypeParameterCount == 0)) {
540
KnownTypeCode primitiveBaseType;
543
primitiveBaseType = KnownTypeCode.Enum;
545
case TypeKind.Struct:
547
primitiveBaseType = KnownTypeCode.ValueType;
549
case TypeKind.Delegate:
550
primitiveBaseType = KnownTypeCode.Delegate;
553
primitiveBaseType = KnownTypeCode.Object;
556
IType t = parentContext.Compilation.FindType(primitiveBaseType);
557
if (t.Kind != TypeKind.Unknown)
564
public string FullName {
565
get { return parts[0].FullName; }
569
get { return parts[0].Name; }
572
public string ReflectionName {
573
get { return parts[0].ReflectionName; }
576
public string Namespace {
577
get { return parts[0].Namespace; }
580
public FullTypeName FullTypeName {
581
get { return parts[0].FullTypeName; }
584
public DomRegion Region {
585
get { return parts[0].Region; }
588
public DomRegion BodyRegion {
589
get { return parts[0].BodyRegion; }
592
public ITypeDefinition DeclaringTypeDefinition {
593
get { return parentContext.CurrentTypeDefinition; }
596
public IType DeclaringType {
597
get { return parentContext.CurrentTypeDefinition; }
600
public IAssembly ParentAssembly {
601
get { return parentContext.CurrentAssembly; }
604
public virtual DocumentationComment Documentation {
606
foreach (var part in parts) {
607
var unresolvedProvider = part.UnresolvedFile as IUnresolvedDocumentationProvider;
608
if (unresolvedProvider != null) {
609
var doc = unresolvedProvider.GetDocumentation(part, this);
614
IDocumentationProvider provider = AbstractResolvedEntity.FindDocumentation(parentContext);
615
if (provider != null)
616
return provider.GetDocumentation(this);
622
public ICompilation Compilation {
623
get { return parentContext.Compilation; }
627
public bool IsStatic { get { return isAbstract && isSealed; } }
628
public bool IsAbstract { get { return isAbstract; } }
629
public bool IsSealed { get { return isSealed; } }
630
public bool IsShadowing { get { return isShadowing; } }
631
public bool IsSynthetic { get { return isSynthetic; } }
633
public Accessibility Accessibility {
634
get { return accessibility; }
637
bool IHasAccessibility.IsPrivate {
638
get { return accessibility == Accessibility.Private; }
641
bool IHasAccessibility.IsPublic {
642
get { return accessibility == Accessibility.Public; }
645
bool IHasAccessibility.IsProtected {
646
get { return accessibility == Accessibility.Protected; }
649
bool IHasAccessibility.IsInternal {
650
get { return accessibility == Accessibility.Internal; }
653
bool IHasAccessibility.IsProtectedOrInternal {
654
get { return accessibility == Accessibility.ProtectedOrInternal; }
657
bool IHasAccessibility.IsProtectedAndInternal {
658
get { return accessibility == Accessibility.ProtectedAndInternal; }
662
ITypeDefinition IType.GetDefinition()
667
IType IType.AcceptVisitor(TypeVisitor visitor)
669
return visitor.VisitTypeDefinition(this);
672
IType IType.VisitChildren(TypeVisitor visitor)
677
public ITypeReference ToTypeReference()
679
ITypeDefinition declTypeDef = this.DeclaringTypeDefinition;
680
if (declTypeDef != null) {
681
return new NestedTypeReference(declTypeDef.ToTypeReference(), this.Name, this.TypeParameterCount - declTypeDef.TypeParameterCount);
683
IAssembly asm = this.ParentAssembly;
684
IAssemblyReference asmRef;
686
asmRef = new DefaultAssemblyReference(asm.AssemblyName);
689
return new GetClassTypeReference(asmRef, this.Namespace, this.Name, this.TypeParameterCount);
693
public IEnumerable<IType> GetNestedTypes(Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None)
695
const GetMemberOptions opt = GetMemberOptions.IgnoreInheritedMembers | GetMemberOptions.ReturnMemberDefinitions;
696
if ((options & opt) == opt) {
698
return this.NestedTypes;
700
return GetNestedTypesImpl(filter);
702
return GetMembersHelper.GetNestedTypes(this, filter, options);
706
IEnumerable<IType> GetNestedTypesImpl(Predicate<ITypeDefinition> filter)
708
foreach (var nestedType in this.NestedTypes) {
709
if (filter(nestedType))
710
yield return nestedType;
714
public IEnumerable<IType> GetNestedTypes(IList<IType> typeArguments, Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None)
716
return GetMembersHelper.GetNestedTypes(this, typeArguments, filter, options);
720
IEnumerable<IMember> GetFilteredMembers(Predicate<IUnresolvedMember> filter)
722
var members = GetMemberList();
723
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
724
if (filter == null || filter(members.unresolvedMembers[i])) {
725
yield return members[i];
728
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
729
var method = (IMethod)members[i];
731
foreach (var part in method.Parts) {
732
if (filter == null || filter(part)) {
742
IEnumerable<IMethod> GetFilteredMethods(Predicate<IUnresolvedMethod> filter)
744
var members = GetMemberList();
745
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
746
IUnresolvedMethod unresolved = members.unresolvedMembers[i] as IUnresolvedMethod;
747
if (unresolved != null && (filter == null || filter(unresolved))) {
748
yield return (IMethod)members[i];
751
for (int i = members.unresolvedMembers.Length; i < members.Count; i++) {
752
var method = (IMethod)members[i];
754
foreach (var part in method.Parts) {
755
if (filter == null || filter(part)) {
765
IEnumerable<TResolved> GetFilteredNonMethods<TUnresolved, TResolved>(Predicate<TUnresolved> filter) where TUnresolved : class, IUnresolvedMember where TResolved : class, IMember
767
var members = GetMemberList();
768
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
769
TUnresolved unresolved = members.unresolvedMembers[i] as TUnresolved;
770
if (unresolved != null && (filter == null || filter(unresolved))) {
771
yield return (TResolved)members[i];
776
public virtual IEnumerable<IMethod> GetMethods(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None)
778
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
779
return GetFilteredMethods(Utils.ExtensionMethods.And(m => !m.IsConstructor, filter));
781
return GetMembersHelper.GetMethods(this, filter, options);
785
public virtual IEnumerable<IMethod> GetMethods(IList<IType> typeArguments, Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None)
787
return GetMembersHelper.GetMethods(this, typeArguments, filter, options);
790
public virtual IEnumerable<IMethod> GetConstructors(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.IgnoreInheritedMembers)
792
if (ComHelper.IsComImport(this)) {
793
IType coClass = ComHelper.GetCoClass(this);
794
using (var busyLock = BusyManager.Enter(this)) {
795
if (busyLock.Success) {
796
return coClass.GetConstructors(filter, options)
797
.Select(m => new SpecializedMethod(m, m.Substitution) { DeclaringType = this });
800
return EmptyList<IMethod>.Instance;
802
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
803
return GetFilteredMethods(Utils.ExtensionMethods.And(m => m.IsConstructor && !m.IsStatic, filter));
805
return GetMembersHelper.GetConstructors(this, filter, options);
809
public virtual IEnumerable<IProperty> GetProperties(Predicate<IUnresolvedProperty> filter = null, GetMemberOptions options = GetMemberOptions.None)
811
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
812
return GetFilteredNonMethods<IUnresolvedProperty, IProperty>(filter);
814
return GetMembersHelper.GetProperties(this, filter, options);
818
public virtual IEnumerable<IField> GetFields(Predicate<IUnresolvedField> filter = null, GetMemberOptions options = GetMemberOptions.None)
820
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
821
return GetFilteredNonMethods<IUnresolvedField, IField>(filter);
823
return GetMembersHelper.GetFields(this, filter, options);
827
public virtual IEnumerable<IEvent> GetEvents(Predicate<IUnresolvedEvent> filter = null, GetMemberOptions options = GetMemberOptions.None)
829
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
830
return GetFilteredNonMethods<IUnresolvedEvent, IEvent>(filter);
832
return GetMembersHelper.GetEvents(this, filter, options);
836
public virtual IEnumerable<IMember> GetMembers(Predicate<IUnresolvedMember> filter = null, GetMemberOptions options = GetMemberOptions.None)
838
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
839
return GetFilteredMembers(filter);
841
return GetMembersHelper.GetMembers(this, filter, options);
845
public virtual IEnumerable<IMethod> GetAccessors(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None)
847
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
848
return GetFilteredAccessors(filter);
850
return GetMembersHelper.GetAccessors(this, filter, options);
854
IEnumerable<IMethod> GetFilteredAccessors(Predicate<IUnresolvedMethod> filter)
856
var members = GetMemberList();
857
for (int i = 0; i < members.unresolvedMembers.Length; i++) {
858
IUnresolvedMember unresolved = members.unresolvedMembers[i];
859
var unresolvedProperty = unresolved as IUnresolvedProperty;
860
var unresolvedEvent = unresolved as IUnresolvedEvent;
861
if (unresolvedProperty != null) {
862
if (unresolvedProperty.CanGet && (filter == null || filter(unresolvedProperty.Getter)))
863
yield return ((IProperty)members[i]).Getter;
864
if (unresolvedProperty.CanSet && (filter == null || filter(unresolvedProperty.Setter)))
865
yield return ((IProperty)members[i]).Setter;
866
} else if (unresolvedEvent != null) {
867
if (unresolvedEvent.CanAdd && (filter == null || filter(unresolvedEvent.AddAccessor)))
868
yield return ((IEvent)members[i]).AddAccessor;
869
if (unresolvedEvent.CanRemove && (filter == null || filter(unresolvedEvent.RemoveAccessor)))
870
yield return ((IEvent)members[i]).RemoveAccessor;
871
if (unresolvedEvent.CanInvoke && (filter == null || filter(unresolvedEvent.InvokeAccessor)))
872
yield return ((IEvent)members[i]).InvokeAccessor;
878
#region GetInterfaceImplementation
879
public IMember GetInterfaceImplementation(IMember interfaceMember)
881
return GetInterfaceImplementation(new[] { interfaceMember })[0];
884
public IList<IMember> GetInterfaceImplementation(IList<IMember> interfaceMembers)
886
// TODO: review the subtle rules for interface reimplementation,
887
// write tests and fix this method.
888
// Also virtual/override is going to be tricky -
889
// I think we'll need to consider the 'virtual' method first for
890
// reimplemenatation purposes, but then actually return the 'override'
891
// (as that's the method that ends up getting called)
893
interfaceMembers = interfaceMembers.ToList(); // avoid evaluating more than once
895
var result = new IMember[interfaceMembers.Count];
896
var signatureToIndexDict = new MultiDictionary<IMember, int>(SignatureComparer.Ordinal);
897
for (int i = 0; i < interfaceMembers.Count; i++) {
898
signatureToIndexDict.Add(interfaceMembers[i], i);
900
foreach (var member in GetMembers(m => !m.IsExplicitInterfaceImplementation)) {
901
foreach (int interfaceMemberIndex in signatureToIndexDict[member]) {
902
result[interfaceMemberIndex] = member;
905
foreach (var explicitImpl in GetMembers(m => m.IsExplicitInterfaceImplementation)) {
906
foreach (var interfaceMember in explicitImpl.ImplementedInterfaceMembers) {
907
foreach (int potentialMatchingIndex in signatureToIndexDict[interfaceMember]) {
908
if (interfaceMember.Equals(interfaceMembers[potentialMatchingIndex])) {
909
result[potentialMatchingIndex] = explicitImpl;
918
public TypeParameterSubstitution GetSubstitution()
920
return TypeParameterSubstitution.Identity;
923
public TypeParameterSubstitution GetSubstitution(IList<IType> methodTypeArguments)
925
return TypeParameterSubstitution.Identity;
928
public bool Equals(IType other)
930
return this == other;
933
public override string ToString()
935
return this.ReflectionName;