internal static async Task <ImmutableDictionary <string, DesignerAttributeDocumentData> > TryAnalyzeProjectInCurrentProcessAsync(
            Project project, CancellationToken cancellationToken)
        {
            var projectVersion = await project.GetDependentVersionAsync(cancellationToken).ConfigureAwait(false);

            var semanticVersion = await project.GetDependentSemanticVersionAsync(cancellationToken).ConfigureAwait(false);

            // Get whatever data we've current persisted.
            var designerAttributeData = await DesignerAttributeProjectData.ReadAsync(
                project, cancellationToken).ConfigureAwait(false);

            // If we have no persisted data, or the persisted data is for a previous version of
            // the project, then compute the results for the current project snapshot.
            if (designerAttributeData == null ||
                !VersionStamp.CanReusePersistedVersion(semanticVersion, designerAttributeData.SemanticVersion))
            {
                designerAttributeData = await ComputeAndPersistDesignerAttributeProjectDataAsync(
                    project, semanticVersion, cancellationToken).ConfigureAwait(false);
            }

            return(designerAttributeData.PathToDocumentData);
        }
        private static async Task <DesignerAttributeProjectData> ComputeAndPersistDesignerAttributeProjectDataAsync(
            Project project, VersionStamp semanticVersion, CancellationToken cancellationToken)
        {
            var service = project.LanguageServices.GetService <IDesignerAttributeService>();

            var tasks = project.Documents.Select(
                d => service.ScanDesignerAttributesAsync(d, cancellationToken)).ToArray();

            await Task.WhenAll(tasks).ConfigureAwait(false);

            var builder = ImmutableDictionary.CreateBuilder <string, DesignerAttributeDocumentData>();

            foreach (var task in tasks)
            {
                var result = await task.ConfigureAwait(false);

                builder[result.FilePath] = result;
            }

            var data = new DesignerAttributeProjectData(semanticVersion, builder.ToImmutable());
            await data.PersistAsync(project, cancellationToken).ConfigureAwait(false);

            return(data);
        }