Example #1
0
        public ConstructionPlanInfo CreatePlanFromAnalysis(AnalyzerResultInfo analyzerResultInfo)
        {
            var factoryFiles      = new List <FactoryFileInfo>();
            var knownDependencies = GetKnownDependencies(analyzerResultInfo);

            foreach (var projectInfo in analyzerResultInfo.ProjectInfos)
            {
                foreach (var documentInfo in projectInfo.DocumentInfos)
                {
                    var factoryFile = FactoryFileInfo.Create(projectInfo.ProjectPath, documentInfo.FilePath,
                                                             documentInfo.NameSpace);
                    foreach (var moduleInfo in documentInfo.ModuleInfos)
                    {
                        foreach (var mappingInfo in moduleInfo.MappingInfos)
                        {
                            var factoryClassName = CreateFactoryClassName(mappingInfo.To.FullMetadataName);
                            var moduleFullName   = moduleInfo.FullName;
                            var classToConstruct = mappingInfo.From.FullMetadataName;
                            var returnType       = mappingInfo.To.FullMetadataName;
                            var mostSatisfiedConstructionInfo =
                                GetMostSatisfiedConstructionInfo(mappingInfo, knownDependencies);
                            var parameterFactoryAccessInfos = mostSatisfiedConstructionInfo.Parameters.Select(
                                parameterInfo =>
                            {
                                var(nameSpace, fullMetadataName) = knownDependencies.First(knownDependency =>
                                                                                           knownDependency.FullMetadataname == parameterInfo.FullMetadataName);
                                return(FactoryAccessInfo.Create(nameSpace,
                                                                CreateFactoryClassName(fullMetadataName)));
                            })
                                                              .ToList();
                            var factory = FactoryInfo.Create(factoryClassName,
                                                             moduleFullName,
                                                             classToConstruct,
                                                             returnType,
                                                             parameterFactoryAccessInfos);
                            factoryFile.AddFactory(factory);
                        }
                    }

                    factoryFiles.Add(factoryFile);
                }
            }

            return(ConstructionPlanInfo.Create(factoryFiles));
        }
Example #2
0
        public async Task Write(ConstructionPlanInfo constructionPlan)
        {
            var filesToWrite = constructionPlan.FactoryFiles
                               .Select(factoryFile =>
                                       new
            {
                factoryFile.FilePath,
                code = _codeGenerator.Generate(factoryFile.NameSpace, factoryFile.Factories)
            })
                               .Select(t => (t.code, t.FilePath)).ToList();

            foreach (var(code, filePath) in filesToWrite)
            {
                using (var outputFile = new StreamWriter(filePath))
                {
                    await outputFile.WriteAsync(code);
                }
            }
        }