in src/Analysis/Codelyzer.Analysis.Build/ProjectBuildHandler.cs [436:477]
public async Task<ProjectBuildResult> IncrementalBuild(string filePath, ProjectBuildResult projectBuildResult)
{
await Task.Run(() =>
{
var languageVersion = LanguageVersion.Default;
if (projectBuildResult.Compilation is CSharpCompilation compilation)
{
languageVersion = compilation.LanguageVersion;
}
var fileContents = File.ReadAllText(filePath);
var updatedTree = CSharpSyntaxTree.ParseText(SourceText.From(fileContents), path: filePath, options: new CSharpParseOptions(languageVersion));
var syntaxTree = Compilation.SyntaxTrees.FirstOrDefault(syntaxTree => syntaxTree.FilePath == filePath);
var preportSyntaxTree = Compilation.SyntaxTrees.FirstOrDefault(syntaxTree => syntaxTree.FilePath == filePath);
Compilation = Compilation.RemoveSyntaxTrees(syntaxTree).AddSyntaxTrees(updatedTree);
PrePortCompilation = PrePortCompilation?.RemoveSyntaxTrees(preportSyntaxTree).AddSyntaxTrees(updatedTree);
var oldSourceFileBuildResult = projectBuildResult.SourceFileBuildResults.FirstOrDefault(sourceFile => sourceFile.SourceFileFullPath == filePath);
projectBuildResult.SourceFileBuildResults.Remove(oldSourceFileBuildResult);
var sourceFilePath = Path.GetRelativePath(projectBuildResult.ProjectRootPath, filePath);
var preportTree = PrePortCompilation?.SyntaxTrees?.FirstOrDefault(s => s.FilePath == syntaxTree.FilePath);
var fileResult = new SourceFileBuildResult
{
SyntaxTree = updatedTree,
PrePortSemanticModel = preportTree != null ? PrePortCompilation?.GetSemanticModel(preportTree) : null,
SemanticModel = Compilation.GetSemanticModel(updatedTree),
SourceFileFullPath = syntaxTree.FilePath,
SyntaxGenerator = SyntaxGenerator.GetGenerator(Project),
SourceFilePath = sourceFilePath
};
projectBuildResult.SourceFileBuildResults.Add(fileResult);
projectBuildResult.Compilation = Compilation;
projectBuildResult.PrePortCompilation = PrePortCompilation;
});
return projectBuildResult;
}