in src/Analysis/Codelyzer.Analysis.Build/WorkspaceBuilderHelper.cs [358:433]
private void BuildSolution(IAnalyzerManager manager)
{
var options = new ParallelOptions() { MaxDegreeOfParallelism = _analyzerConfiguration.ConcurrentThreads };
BlockingCollection<IAnalyzerResult> concurrentResults = new BlockingCollection<IAnalyzerResult>();
Parallel.ForEach(manager.Projects.Values, options, p =>
{
Logger.LogDebug("Building the project : " + p.ProjectFile.Path);
if(IsProjectFile(p.ProjectInSolution))
{
var buildResult = BuildProject(p);
if (buildResult != null)
{
concurrentResults.Add(buildResult);
Logger.LogDebug("Building complete for {0} - {1}", p.ProjectFile.Path, buildResult.Succeeded ? "Success" : "Fail");
}
else
{
FailedProjects.Add(new ProjectAnalysisResult()
{
ProjectAnalyzer = p
});
Logger.LogDebug("Building complete for {0} - {1}", p.ProjectFile.Path, "Fail");
}
}
else
{
Logger.LogDebug("Building skipped for {0} - {1}", p.ProjectFile.Path, "Skipped");
}
});
List<IAnalyzerResult> results = concurrentResults.ToList();
var dict = new Dictionary<Guid, IAnalyzerResult>();
// Add each result to a new workspace
using (AdhocWorkspace workspace = new AdhocWorkspace())
{
foreach (var result in results)
{
try
{
result.AddToWorkspace(workspace);
dict[result.ProjectGuid] = result;
}
catch (Exception ex)
{
Logger.LogDebug("Exception : " + result.ProjectFilePath);
Logger.LogDebug(ex.StackTrace);
}
}
foreach (var project in workspace.CurrentSolution.Projects)
{
try
{
var result = dict[project.Id.Id];
var projectAnalyzer = manager.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);
}
}
}
}