in src/Analysis/Codelyzer.Analysis.Build/WorkspaceBuilderHelper.cs [191:300]
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));
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());
}