/// <summary> /// Gets a Roslyn workspace for the analyzed results. /// </summary> /// <param name="analyzerResult">The results from building a Buildalyzer project analyzer.</param> /// <param name="addProjectReferences"> /// <c>true</c> to add projects to the workspace for project references that exist in the same <see cref="AnalyzerManager"/>. /// If <c>true</c> this will trigger (re)building all referenced projects. Directly add <see cref="AnalyzerResult"/> instances instead if you already have them available. /// </param> /// <returns>A Roslyn workspace.</returns> public static AdhocWorkspace GetWorkspace(this IAnalyzerResult analyzerResult, bool addProjectReferences = false) { if (analyzerResult == null) { throw new ArgumentNullException(nameof(analyzerResult)); } AdhocWorkspace workspace = new AdhocWorkspace(); analyzerResult.AddToWorkspace(workspace, addProjectReferences); return(workspace); }
public void Build() { /* Uncomment the below code to debug issues with msbuild */ /*var writer = new StreamWriter(Console.OpenStandardOutput()); * writer.AutoFlush = true; * * Console.SetOut(writer); * Console.SetError(writer);*/ if (IsSolutionFile()) { Logger.LogInformation("Loading the Workspace (Solution): " + WorkspacePath); AnalyzerManager analyzerManager = new AnalyzerManager(WorkspacePath, new AnalyzerManagerOptions { LogWriter = _writer }); Logger.LogInformation("Loading the Solution Done: " + WorkspacePath); // AnalyzerManager builds the projects based on their dependencies // After this, code does not depend on Buildalyzer BuildSolution(analyzerManager); } else { AnalyzerManager analyzerManager = new AnalyzerManager(new AnalyzerManagerOptions { LogWriter = _writer }); var dict = new Dictionary <Guid, IAnalyzerResult>(); using (AdhocWorkspace workspace = new AdhocWorkspace()) { Queue <string> queue = new Queue <string>(); ISet <string> existing = new HashSet <string>(); queue.Enqueue(WorkspacePath); existing.Add(WorkspacePath); /* * We need to resolve all the project dependencies to avoid compilation errors. * If we have compilation errors, we might miss some of the semantic values. */ while (queue.Count > 0) { var path = queue.Dequeue(); Logger.LogInformation("Building: " + path); IProjectAnalyzer projectAnalyzer = analyzerManager.GetProject(path); if (!TryGetRequiresNetFramework(projectAnalyzer.ProjectFile, out bool requiresNetFramework)) { continue; } IAnalyzerResults analyzerResults = projectAnalyzer.Build(GetEnvironmentOptions(requiresNetFramework, projectAnalyzer.ProjectFile.ToolsVersion)); IAnalyzerResult analyzerResult = analyzerResults.First(); if (analyzerResult == null) { FailedProjects.Add(new ProjectAnalysisResult() { ProjectAnalyzer = projectAnalyzer }); } dict[analyzerResult.ProjectGuid] = analyzerResult; analyzerResult.AddToWorkspace(workspace); foreach (var pref in analyzerResult.ProjectReferences) { if (!existing.Contains(pref)) { existing.Add(pref); queue.Enqueue(pref); } } } foreach (var project in workspace.CurrentSolution.Projects) { try { var result = dict[project.Id.Id]; var projectAnalyzer = analyzerManager.Projects.Values.FirstOrDefault(p => p.ProjectGuid.Equals(project.Id.Id)); Projects.Add(new ProjectAnalysisResult() { Project = project, AnalyzerResult = result, ProjectAnalyzer = projectAnalyzer }); } catch (Exception ex) { Logger.LogDebug(ex.StackTrace); } } } } Logger.LogDebug(_sb.ToString()); _writer.Flush(); _writer.Close(); ProcessLog(_writer.ToString()); }