Browse Source

[TypeSystem] Added a method to get only defined members with a filter

predicate.
TODO: Add similar methods for all members ?
newNRvisualizers
Mike Krüger 13 years ago
parent
commit
aa324f018a
  1. 9
      ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs
  2. 18
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

9
ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs

@ -103,7 +103,14 @@ namespace ICSharpCode.NRefactory.TypeSystem
IList<ITypeDefinition> NestedTypes { get; } IList<ITypeDefinition> NestedTypes { get; }
IList<IMember> Members { get; } IList<IMember> Members { get; }
/// <summary>
/// Gets the members that are defined in this type.
/// </summary>
/// <param name="filter">The filter used to select which members to return.
/// The filter is tested on the original member definitions (before specialization).</param>
IList<IMember> GetDefinedMembers (Predicate<IUnresolvedMethod> filter);
IEnumerable<IField> Fields { get; } IEnumerable<IField> Fields { get; }
IEnumerable<IMethod> Methods { get; } IEnumerable<IMethod> Methods { get; }
IEnumerable<IProperty> Properties { get; } IEnumerable<IProperty> Properties { get; }

18
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

@ -282,7 +282,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
MemberList memberList; MemberList memberList;
MemberList GetMemberList() MemberList GetMemberList(Predicate<IUnresolvedMethod> filter = null)
{ {
var result = LazyInit.VolatileRead(ref this.memberList); var result = LazyInit.VolatileRead(ref this.memberList);
if (result != null) { if (result != null) {
@ -296,6 +296,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext); ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
ITypeResolveContext contextForPart = parentContextForPart.WithCurrentTypeDefinition(this); ITypeResolveContext contextForPart = parentContextForPart.WithCurrentTypeDefinition(this);
foreach (var member in part.Members) { foreach (var member in part.Members) {
if (filter != null && !filter(member))
continue;
IUnresolvedMethod method = member as IUnresolvedMethod; IUnresolvedMethod method = member as IUnresolvedMethod;
if (method != null && method.IsPartial) { if (method != null && method.IsPartial) {
// Merge partial method declaration and implementation // 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) if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.EntityType == EntityType.Constructor && !m.IsStatic)
|| kind == TypeKind.Enum || kind == TypeKind.Struct) || kind == TypeKind.Enum || kind == TypeKind.Struct)
{ {
contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this)); var defaultConstructor = DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]);
unresolvedMembers.Add(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); result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos);
@ -339,7 +344,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public IList<IMember> Members { public IList<IMember> Members {
get { return GetMemberList(); } get { return GetMemberList(); }
} }
public IList<IMember> GetDefinedMembers (Predicate<IUnresolvedMethod> filter)
{
return GetMemberList(filter);
}
public IEnumerable<IField> Fields { public IEnumerable<IField> Fields {
get { get {
var members = GetMemberList(); var members = GetMemberList();

Loading…
Cancel
Save