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)); }
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); } } }