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. 7
      ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs
  2. 14
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

7
ICSharpCode.NRefactory/TypeSystem/ITypeDefinition.cs

@ -104,6 +104,13 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -104,6 +104,13 @@ namespace ICSharpCode.NRefactory.TypeSystem
IList<ITypeDefinition> NestedTypes { 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<IMethod> Methods { get; }
IEnumerable<IProperty> Properties { get; }

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

@ -282,7 +282,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -282,7 +282,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
MemberList memberList;
MemberList GetMemberList()
MemberList GetMemberList(Predicate<IUnresolvedMethod> filter = null)
{
var result = LazyInit.VolatileRead(ref this.memberList);
if (result != null) {
@ -296,6 +296,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -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 @@ -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)
{
var defaultConstructor = DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]);
if (filter == null || filter(defaultConstructor)) {
contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this));
unresolvedMembers.Add(DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]));
unresolvedMembers.Add(defaultConstructor);
}
}
}
result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos);
@ -340,6 +345,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -340,6 +345,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return GetMemberList(); }
}
public IList<IMember> GetDefinedMembers (Predicate<IUnresolvedMethod> filter)
{
return GetMemberList(filter);
}
public IEnumerable<IField> Fields {
get {
var members = GetMemberList();

Loading…
Cancel
Save