Ejemplo n.º 1
0
        public bool TryGetCachedItems(Project p, MonoDevelopMetadataReferenceManager provider, MonoDevelopWorkspace.ProjectDataMap projectMap,
                                      out ImmutableArray <ProjectFile> files,
                                      out ImmutableArray <FilePath> analyzers,
                                      out ImmutableArray <MonoDevelopMetadataReference> metadataReferences,
                                      out ImmutableArray <Microsoft.CodeAnalysis.ProjectReference> projectReferences)
        {
            files              = ImmutableArray <ProjectFile> .Empty;
            analyzers          = ImmutableArray <FilePath> .Empty;
            metadataReferences = ImmutableArray <MonoDevelopMetadataReference> .Empty;
            projectReferences  = ImmutableArray <Microsoft.CodeAnalysis.ProjectReference> .Empty;

            ProjectCache cachedData;

            lock (cachedItems) {
                if (!cachedItems.TryGetValue(p.FileName, out cachedData))
                {
                    return(false);
                }
            }

            var filesBuilder = ImmutableArray.CreateBuilder <ProjectFile> (cachedData.Files.Length);

            for (int i = 0; i < cachedData.Files.Length; ++i)
            {
                filesBuilder.Add(new ProjectFile(cachedData.Files [i], cachedData.BuildActions [i])
                {
                    Project = p,
                });
            }

            files = filesBuilder.MoveToImmutable();

            var analyzersBuilder = ImmutableArray.CreateBuilder <FilePath> (cachedData.Analyzers.Length);

            foreach (var analyzer in cachedData.Analyzers)
            {
                analyzersBuilder.Add(analyzer);
            }
            analyzers = analyzersBuilder.MoveToImmutable();

            var mrBuilder = ImmutableArray.CreateBuilder <MonoDevelopMetadataReference> (cachedData.MetadataReferences.Length);

            foreach (var item in cachedData.MetadataReferences)
            {
                var aliases = item.Aliases != null?item.Aliases.ToImmutableArray() : default;

                var reference = provider.GetOrCreateMetadataReference(item.FilePath, new Microsoft.CodeAnalysis.MetadataReferenceProperties(aliases: aliases));
                mrBuilder.Add(reference);
            }
            metadataReferences = mrBuilder.MoveToImmutable();

            var sol         = p.ParentSolution;
            var solConfig   = sol.GetConfiguration(IdeServices.Workspace.ActiveConfiguration);
            var allProjects = sol.GetAllProjects().ToDictionary(x => x.FileName, x => x);

            var prBuilder = ImmutableArray.CreateBuilder <Microsoft.CodeAnalysis.ProjectReference> (cachedData.ProjectReferences.Length);

            foreach (var item in cachedData.ProjectReferences)
            {
                if (!allProjects.TryGetValue(item.FilePath, out var mdProject))
                {
                    return(false);
                }

                var aliases = item.Aliases != null?item.Aliases.ToImmutableArray() : default;

                var pr = new Microsoft.CodeAnalysis.ProjectReference(projectMap.GetOrCreateId(mdProject, null), aliases.ToImmutableArray());
                prBuilder.Add(pr);
            }
            projectReferences = prBuilder.MoveToImmutable();
            return(true);
        }
Ejemplo n.º 2
0
        public bool TryGetCachedItems(Project p, MonoDevelopMetadataReferenceManager provider, MonoDevelopWorkspace.ProjectDataMap projectMap, string framework,
                                      out ProjectCacheInfo info)
        {
            info = new ProjectCacheInfo();

            List <ProjectCache> cachedDataList;

            lock (cachedItems) {
                if (!cachedItems.TryGetValue(p.FileName, out cachedDataList))
                {
                    return(false);
                }
            }

            ProjectCache cachedData = cachedDataList.FirstOrDefault(cache => cache.Framework == framework);

            if (cachedData == null)
            {
                return(false);
            }

            var filesBuilder = ImmutableArray.CreateBuilder <ProjectFile> (cachedData.Files.Length);

            for (int i = 0; i < cachedData.Files.Length; ++i)
            {
                filesBuilder.Add(new ProjectFile(cachedData.Files [i], cachedData.BuildActions [i])
                {
                    Project = p,
                });
            }

            info.SourceFiles = filesBuilder.MoveToImmutable();

            info.AdditionalFiles   = ToImmutableFilePathArray(cachedData.AdditionalFiles);
            info.AnalyzerFiles     = ToImmutableFilePathArray(cachedData.Analyzers);
            info.EditorConfigFiles = ToImmutableFilePathArray(cachedData.EditorConfigFiles);

            var mrBuilder = ImmutableArray.CreateBuilder <MonoDevelopMetadataReference> (cachedData.MetadataReferences.Length);

            foreach (var item in cachedData.MetadataReferences)
            {
                var aliases = item.Aliases != null?item.Aliases.ToImmutableArray() : default;

                var reference = provider.GetOrCreateMetadataReference(item.FilePath, new Microsoft.CodeAnalysis.MetadataReferenceProperties(aliases: aliases));
                mrBuilder.Add(reference);
            }
            info.References = mrBuilder.MoveToImmutable();

            var sol         = p.ParentSolution;
            var solConfig   = sol.GetConfiguration(IdeServices.Workspace.ActiveConfiguration);
            var allProjects = sol.GetAllProjects().ToDictionary(x => x.FileName, x => x);

            var prBuilder = ImmutableArray.CreateBuilder <Microsoft.CodeAnalysis.ProjectReference> (cachedData.ProjectReferences.Length);

            foreach (var item in cachedData.ProjectReferences)
            {
                if (!allProjects.TryGetValue(item.FilePath, out var mdProject))
                {
                    return(false);
                }

                var aliases = item.Aliases != null?item.Aliases.ToImmutableArray() : default;

                var pr = new Microsoft.CodeAnalysis.ProjectReference(projectMap.GetOrCreateId(mdProject, null, item.Framework), aliases.ToImmutableArray());
                prBuilder.Add(pr);
            }
            info.ProjectReferences = prBuilder.MoveToImmutable();
            return(true);
        }