diff --git a/ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs b/ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs index ccc627f45e..1ec753368c 100644 --- a/ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs +++ b/ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs @@ -103,7 +103,14 @@ namespace ICSharpCode.NRefactory.TypeSystem IList NestedTypes { get; } IList Members { get; } - + + /// + /// Gets the members that are defined in this type. + /// + /// The filter used to select which members to return. + /// The filter is tested on the original member definitions (before specialization). + IList GetDefinedMembers (Predicate filter); + IEnumerable Fields { get; } IEnumerable Methods { get; } IEnumerable Properties { get; } diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs index b6cd1e09ce..236a3c1b05 100644 --- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs +++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs @@ -282,7 +282,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation MemberList memberList; - MemberList GetMemberList() + MemberList GetMemberList(Predicate filter = null) { var result = LazyInit.VolatileRead(ref this.memberList); if (result != null) { @@ -296,6 +296,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext); ITypeResolveContext contextForPart = parentContextForPart.WithCurrentTypeDefinition(this); foreach (var member in part.Members) { + if (filter != null && !filter(member)) + continue; IUnresolvedMethod method = member as IUnresolvedMethod; if (method != null && method.IsPartial) { // Merge partial method declaration and implementation @@ -328,8 +330,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.EntityType == EntityType.Constructor && !m.IsStatic) || kind == TypeKind.Enum || kind == TypeKind.Struct) { - contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this)); - unresolvedMembers.Add(DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0])); + var defaultConstructor = DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]); + if (filter == null || filter(defaultConstructor)) { + contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this)); + unresolvedMembers.Add(defaultConstructor); + } } } result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos); @@ -339,7 +344,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation public IList Members { get { return GetMemberList(); } } - + + public IList GetDefinedMembers (Predicate filter) + { + return GetMemberList(filter); + } + public IEnumerable Fields { get { var members = GetMemberList();