Beispiel #1
0
        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;
        }
Beispiel #2
0
 public Analysis(Document document, AsyncLazy<DocumentAnalysisResults> results)
 {
     this.Document = document;
     this.Results = results;
 }
Beispiel #3
0
 public AsyncLazy<DocumentAnalysisResults> GetDocumentAnalysis(Document document)
 {
     lock (_analysesGuard)
     {
         return GetDocumentAnalysisNoLock(document);
     }
 }