in src/Analysis/Codelyzer.Analysis.Build/WorkspaceBuilderHelper.cs [130:188]
private ProjectAnalysisResult BuildIncremental(string WorkspacePath)
{
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;
}
IAnalyzerResult analyzerResult = projectAnalyzer.Build(GetEnvironmentOptions(requiresNetFramework)).FirstOrDefault();
if (analyzerResult == null)
{
Logger.LogDebug("Building complete for {0} - {1}", path, "Fail");
return new ProjectAnalysisResult()
{
ProjectAnalyzer = projectAnalyzer
};
}
if(!DictAnalysisResult.ContainsKey(analyzerResult.ProjectGuid))
{
DictAnalysisResult[analyzerResult.ProjectGuid] = analyzerResult;
projectAnalyzer.AddToWorkspace(_workspaceIncremental);
foreach (var pref in analyzerResult.ProjectReferences)
{
if (!existing.Contains(pref))
{
existing.Add(pref);
queue.Enqueue(pref);
}
}
}
}
Project project = _workspaceIncremental.CurrentSolution?.Projects.FirstOrDefault(x => x.FilePath.Equals(WorkspacePath));
Logger.LogDebug("Building complete for {0} - {1}", WorkspacePath, DictAnalysisResult[project.Id.Id].Succeeded ? "Success" : "Fail");
return new ProjectAnalysisResult()
{
Project = project,
AnalyzerResult = DictAnalysisResult[project.Id.Id],
ProjectAnalyzer = _analyzerManager.Projects.Values.FirstOrDefault(p => p.ProjectGuid.Equals(project.Id.Id))
};
}