/// <summary> /// Infers whether the type is a test type based on its structure. /// </summary> /// <remarks> /// <para> /// Returns true if the type any associated patterns, if it has /// non-nested type members (subject to <see cref="GetMemberBindingFlags" />) /// with patterns, if it has generic parameters with patterns, or if any /// of its nested types satisfy the preceding rules. /// </para> /// </remarks> /// <param name="evaluator">The pattern evaluator.</param> /// <param name="type">The type.</param> /// <returns>True if the type is likely a test type.</returns> protected virtual bool InferTestType(IPatternEvaluator evaluator, ITypeInfo type) { if (evaluator.HasPatterns(type)) { return(true); } BindingFlags bindingFlags = GetMemberBindingFlags(type); if (HasCodeElementWithPattern(evaluator, type.GetMethods(bindingFlags)) || HasCodeElementWithPattern(evaluator, type.GetProperties(bindingFlags)) || HasCodeElementWithPattern(evaluator, type.GetFields(bindingFlags)) || HasCodeElementWithPattern(evaluator, type.GetEvents(bindingFlags))) { return(true); } if (type.IsGenericTypeDefinition && HasCodeElementWithPattern(evaluator, type.GenericArguments)) { return(true); } if (ShouldConsumeConstructors(type) && HasCodeElementWithPattern(evaluator, type.GetConstructors(ConstructorBindingFlags))) { return(true); } foreach (ITypeInfo nestedType in type.GetNestedTypes(NestedTypeBindingFlags)) { if (InferTestType(evaluator, nestedType)) { return(true); } } return(false); }
/// <summary> /// Consumes type members including fields, properties, methods and events. /// </summary> /// <param name="typeScope">The scope to be used as the containing scope.</param> /// <param name="type">The type whose members are to be consumed.</param> protected void ConsumeMembers(IPatternScope typeScope, ITypeInfo type) { BindingFlags bindingFlags = GetMemberBindingFlags(type); // TODO: We should probably process groups of members in sorted order working outwards // from the base type, like an onion. foreach (IFieldInfo field in CodeElementSorter.SortMembersByDeclaringType(type.GetFields(bindingFlags))) { typeScope.Consume(field, false, DefaultFieldPattern); } foreach (IPropertyInfo property in CodeElementSorter.SortMembersByDeclaringType(type.GetProperties(bindingFlags))) { typeScope.Consume(property, false, DefaultPropertyPattern); } foreach (IMethodInfo method in CodeElementSorter.SortMembersByDeclaringType(type.GetMethods(bindingFlags))) { typeScope.Consume(method, false, DefaultMethodPattern); } foreach (IEventInfo @event in CodeElementSorter.SortMembersByDeclaringType(type.GetEvents(bindingFlags))) { typeScope.Consume(@event, false, DefaultEventPattern); } }
public override EventInfo[] GetEvents(BindingFlags bindingAttr) { return(GenericCollectionUtils.ConvertAllToArray <IEventInfo, EventInfo>(adapter.GetEvents(bindingAttr), delegate(IEventInfo @event) { return @event.Resolve(false); })); }