private AsyncLazy<DocumentAnalysisResults> GetDocumentAnalysisNoLock(Document document) { Analysis analysis; if (_analyses.TryGetValue(document.Id, out analysis) && analysis.Document == document) { return analysis.Results; } var analyzer = document.Project.LanguageServices.GetService<IEditAndContinueAnalyzer>(); ImmutableArray<ActiveStatementSpan> activeStatements; if (!_baseActiveStatements.TryGetValue(document.Id, out activeStatements)) { activeStatements = ImmutableArray.Create<ActiveStatementSpan>(); } var lazyResults = new AsyncLazy<DocumentAnalysisResults>( asynchronousComputeFunction: async cancellationToken => { try { var result = await analyzer.AnalyzeDocumentAsync(_baseSolution, activeStatements, document, cancellationToken).ConfigureAwait(false); if (!result.RudeEditErrors.IsDefault) { lock (_documentsWithReportedRudeEditsGuard) { _documentsWithReportedRudeEdits.Add(document.Id); } } return result; } catch (Exception e) when (FatalError.ReportUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }, cacheResult: true); _analyses[document.Id] = new Analysis(document, lazyResults); return lazyResults; }
public Analysis(Document document, AsyncLazy<DocumentAnalysisResults> results) { this.Document = document; this.Results = results; }
public AsyncLazy<DocumentAnalysisResults> GetDocumentAnalysis(Document document) { lock (_analysesGuard) { return GetDocumentAnalysisNoLock(document); } }