Example #1
0
 private static InheritanceDetailKey GetInheritanceDetailKey(VisitorImplementationInheritanceDetail inheritanceDetail)
 {
     return(new InheritanceDetailKey(
                inheritanceDetail.VisitorBuilderHandler,
                inheritanceDetail.TContext,
                inheritanceDetail.TResult,
                inheritanceDetail.VisitRefactorName ?? string.Empty,
                inheritanceDetail.VisitRefactorAbstract));
 }
Example #2
0
        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);
            }
        }