예제 #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));
        }
예제 #2
0
        public async Task <AnalyzerResultInfo> AnalyzeSolution(string solutionPath)
        {
            using (var workspace = MSBuildWorkspace.Create())
            {
                workspace.WorkspaceFailed += (sender, eventArgs) =>
                {
                    Console.WriteLine(eventArgs.Diagnostic.Message);
                };
                var solution = await workspace.OpenSolutionAsync(solutionPath);

                var projectInfos = new List <ProjectInfo>();
                foreach (var project in solution.Projects)
                {
                    var projectPath   = project.FilePath;
                    var documentInfos = await AnalyzeProject(project);

                    projectInfos.Add(ProjectInfo.Create(projectPath, documentInfos));
                }

                return(AnalyzerResultInfo.Create(projectInfos));
            }
        }