private static InheritanceDetailKey GetInheritanceDetailKey(VisitorImplementationInheritanceDetail inheritanceDetail) { return(new InheritanceDetailKey( inheritanceDetail.VisitorBuilderHandler, inheritanceDetail.TContext, inheritanceDetail.TResult, inheritanceDetail.VisitRefactorName ?? string.Empty, inheritanceDetail.VisitRefactorAbstract)); }
public static IEnumerable <IVisitorImplementationBuilder> GetImplementationContext(IAssembly assembly, ICSharpAssembly resultAssembly, IIntermediateCliManager identityManager) { var attributeContext = new VisitorModelCommonTypeContext(identityManager); var visitorBuilders = GetVisitorContexts(assembly, attributeContext, resultAssembly, identityManager); var distinctImplementations = new HashSet <VisitorImplementationTargetDetail>( from metadatum in assembly.Metadata.Where(k => k.Type == attributeContext.ImplementationTargetAttribute) select VisitorImplementationTargetDetail.DeriveFromMetadata(metadatum)); var inheritanceDetails = new HashSet <VisitorImplementationInheritanceDetail>( assembly .Metadata .Where(k => k.Type == attributeContext.ImplementationInheritanceAttribute) .Select(k => VisitorImplementationInheritanceDetail.DeriveFromMetadata(k))); var implementationDetail = (from inheritanceDetail in inheritanceDetails orderby inheritanceDetail.TargetContext, inheritanceDetail.VisitRefactorName, inheritanceDetail.VisitRefactorAbstract, inheritanceDetail.ContextualVisitor, inheritanceDetail.YieldingVisitor join implementation in distinctImplementations on inheritanceDetail.ImplementationDetailMatch equals implementation group inheritanceDetail by implementation).ToDictionary(k => k.Key, v => v.ToArray()); foreach (var detail in implementationDetail.Keys) { detail.InheritanceDetail = new ControlledCollection <VisitorImplementationInheritanceDetail>(implementationDetail[detail]); } var implementationBuilders = (from implementation in implementationDetail.Keys let visitorBuilderQuery = from inheritanceDetail in implementationDetail[implementation] from visitorDetail in inheritanceDetail.VisitorTargets join visitor in visitorBuilders on new { visitorDetail.TargetContext, visitorDetail.ContextualVisitor, visitorDetail.YieldingVisitor } equals new { visitor.Detail.TargetContext, visitor.Detail.ContextualVisitor, visitor.Detail.YieldingVisitor } group visitor by GetInheritanceDetailKey(inheritanceDetail) select GetImplementationBuilder(resultAssembly, attributeContext, implementation, visitorBuilderQuery, assembly)) .ToArray(); foreach (var builder in implementationBuilders) { yield return(builder); } }