Ejemplo n.º 1
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);
            }
        }
Ejemplo n.º 2
0
        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);
        }