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); } }
private static VisitorImplementationBuilder GetImplementationBuilder(ICSharpAssembly resultAssembly, VisitorModelCommonTypeContext attributeContext, VisitorImplementationTargetDetail implementation, IEnumerable <IGrouping <InheritanceDetailKey, VisitorBuilder> > visitorBuilderQuery, IAssembly assembly) { var result = new VisitorImplementationBuilder( new VisitorImplementationContext( implementation, attributeContext, visitorBuilderQuery.Select( v => new VisitorImplementationVariationContext( v.ToArray(), v.Key.TContext, v.Key.TResult, v.Key.TargetContext, v.Key.TargetAbstract, v.Key.VisitorBuilderHandler, assembly)), resultAssembly)); foreach (var variation in result.Context.Variations) { variation.ImplementationBuilder = result; } return(result); }