private async Task AnalyzeProject(Project project, ImmutableArray <DiagnosticAnalyzer> analyzers,
                                          AnalyzerReport report)
        {
            try
            {
                var compilation = await project.GetCompilationAsync();

                var diagnosticResults = await compilation.WithAnalyzers(analyzers).GetAnalyzerDiagnosticsAsync();

                report.AppendDiagnostics(diagnosticResults);
            }
            catch (Exception exception)
            {
                report.NotifyException(exception);
            }
        }
Esempio n. 2
0
        public static void Main(string[] args)
        {
            try
            {
                Parser.Default.ParseArguments <Options>(args).WithParsed <Options>(options =>
                {
                    var unityVersionResolver = new UnityVersionResolver();
                    options.Version          = unityVersionResolver.ResolveVersion(options);

                    var startTime = DateTime.Now;

                    var fileName        = options.ProjectFile;
                    var projectFileInfo = new FileInfo(fileName);

                    //NOTE: This could be configurable via the CLI at some point
                    var report = new AnalyzerReport();

                    if (options.Exporters != null)
                    {
                        foreach (var exporter in options.Exporters)
                        {
                            if (AvailableExporters.ContainsKey(exporter))
                            {
                                var exporterInstance = Activator.CreateInstance(AvailableExporters[exporter]);
                                report.AddExporter(exporterInstance as IAnalyzerExporter);
                            }
                        }
                    }

                    if (report.GetExporterCount() == 0)
                    {
                        //It's generally a good idea to make sure that the Console Exporter is last since it is interactive
                        report.AddExporter(new JsonAnalyzerExporter(options));
                        report.AddExporter(new ConsoleAnalyzerExporter(options));
                    }

                    report.InitializeReport(options);

                    var tasks = new List <Task>();
                    if (projectFileInfo.Exists)
                    {
                        FileInfo configFileInfo = null;

                        if (options.ConfigurationFile != null)
                        {
                            configFileInfo = new FileInfo(options.ConfigurationFile);
                        }

                        var solutionAnalyzer = new SolutionAnalyzer();
                        var analyzeTask      = solutionAnalyzer.LoadAndAnalyzeProjectAsync(projectFileInfo, configFileInfo, report);
                        tasks.Add(analyzeTask);
                    }

                    Task.WaitAll(tasks.ToArray());

                    var endTime  = DateTime.Now;
                    var duration = endTime - startTime;

                    report.FinalizeReport(duration);
                });
            }
            catch (Exception generalException)
            {
                Console.WriteLine("There was an exception running the analysis");
                Console.WriteLine(generalException.ToString());
            }
        }
        public async Task LoadAndAnalyzeProjectAsync(FileInfo projectFile, FileInfo configFileInfo, AnalyzerReport report)
        {
            AnalyzerManager manager  = new AnalyzerManager();
            ProjectAnalyzer analyzer = manager.GetProject(projectFile.FullName);

            AdhocWorkspace workspace = new AdhocWorkspace();
            Project        project   = analyzer.AddToWorkspace(workspace);

            var analyzerDictionary = LoadConfigFile(configFileInfo);
            var analyzers          = this.GetAnalyzers(analyzerDictionary);

            await AnalyzeProject(project, analyzers, report);
        }