private void Provider_ProjectContextsChanged(object sender, EventArgs e)
        {
            var  contextProvider = (IProjectContextProvider)sender;
            bool discovered      = false;

            if (contextProvider != null)
            {
                // Run through and and get the new interpreters to add...
                HashSet <string>      seen    = new HashSet <string>();
                HashSet <ProjectInfo> added   = new HashSet <ProjectInfo>();
                HashSet <ProjectInfo> removed = new HashSet <ProjectInfo>();
                var contexts = contextProvider.Projects;
                lock (_projects) {
                    foreach (var context in contextProvider.Projects)
                    {
                        var projContext = context as MSBuild.Project;
                        if (projContext == null)
                        {
                            var projectFile = context as string;
                            if (projectFile != null && projectFile.EndsWith(".pyproj", StringComparison.OrdinalIgnoreCase))
                            {
                                projContext = new MSBuild.Project(projectFile);
                            }
                        }

                        if (projContext != null)
                        {
                            if (!_projects.ContainsKey(projContext.FullPath))
                            {
                                var projInfo = new MSBuildProjectInfo(projContext, projContext.FullPath, contextProvider);
                                _projects[projContext.FullPath] = projInfo;
                                added.Add(projInfo);
                            }
                            seen.Add(projContext.FullPath);
                        }

                        var inMemory = context as InMemoryProject;
                        if (inMemory != null)
                        {
                            if (!_projects.ContainsKey(inMemory.FullPath))
                            {
                                var projInfo = new InMemoryProjectInfo(inMemory, inMemory.FullPath, contextProvider);
                                _projects[inMemory.FullPath] = projInfo;
                                added.Add(projInfo);
                            }
                            seen.Add(inMemory.FullPath);
                        }
                    }

                    // Then remove any existing projects that are no longer there
                    var toRemove = _projects
                                   .Where(x => x.Value.ContextProvider == contextProvider && !seen.Contains(x.Key))
                                   .Select(x => x.Key)
                                   .ToArray();

                    foreach (var projInfo in toRemove)
                    {
                        var value = _projects[projInfo];
                        _projects.Remove(projInfo);
                        removed.Add(value);
                        value.Dispose();
                    }
                }

                // apply what we discovered without the projects lock...
                foreach (var projInfo in added)
                {
                    discovered |= DiscoverInterpreters(projInfo);
                }

                foreach (var projInfo in removed)
                {
                    projInfo.Dispose();
                    if (projInfo.Factories.Count > 0)
                    {
                        discovered = true;
                    }
                }
            }

            if (discovered)
            {
                OnInterpreterFactoriesChanged();
            }
        }
        private void Provider_ProjectContextsChanged(object sender, EventArgs e)
        {
            var  contextProvider = (IProjectContextProvider)sender;
            bool discovered      = false;

            if (contextProvider != null)
            {
                // Run through and and get the new interpreters to add...
                HashSet <string>      seen    = new HashSet <string>();
                HashSet <ProjectInfo> added   = new HashSet <ProjectInfo>();
                HashSet <ProjectInfo> removed = new HashSet <ProjectInfo>();
                var contexts = contextProvider.Projects;
                lock (_projects) {
                    foreach (var context in contextProvider.Projects)
                    {
                        if (!_skipMSBuild)
                        {
                            try {
                                HandleMSBuildProject(context, contextProvider, added, seen);
                            } catch (FileNotFoundException) {
                                _skipMSBuild = true;
                            }
                        }

                        var inMemory = context as InMemoryProject;
                        if (inMemory != null)
                        {
                            if (!_projects.ContainsKey(inMemory.FullPath))
                            {
                                var projInfo = new InMemoryProjectInfo(inMemory, inMemory.FullPath, contextProvider);
                                _projects[inMemory.FullPath] = projInfo;
                                added.Add(projInfo);
                            }
                            seen.Add(inMemory.FullPath);
                        }
                    }

                    // Then remove any existing projects that are no longer there
                    var toRemove = _projects
                                   .Where(x => x.Value.ContextProvider == contextProvider && !seen.Contains(x.Key))
                                   .Select(x => x.Key)
                                   .ToArray();

                    foreach (var projInfo in toRemove)
                    {
                        var value = _projects[projInfo];
                        _projects.Remove(projInfo);
                        removed.Add(value);
                        value.Dispose();
                    }
                }

                // apply what we discovered without the projects lock...
                foreach (var projInfo in added)
                {
                    discovered |= DiscoverInterpreters(projInfo);
                }

                foreach (var projInfo in removed)
                {
                    projInfo.Dispose();
                    if (projInfo.Factories.Count > 0)
                    {
                        discovered = true;
                    }
                }
            }

            if (discovered)
            {
                OnInterpreterFactoriesChanged();
            }
        }
Exemplo n.º 3
0
        private void Provider_ProjectContextsChanged(object sender, EventArgs e)
        {
            var contextProvider = (IProjectContextProvider)sender;
            bool discovered = false;
            if (contextProvider != null) {
                // Run through and and get the new interpreters to add...
                HashSet<string> seen = new HashSet<string>();
                HashSet<ProjectInfo> added = new HashSet<ProjectInfo>();
                HashSet<ProjectInfo> removed = new HashSet<ProjectInfo>();
                var contexts = contextProvider.Projects;
                lock (_projects) {
                    foreach (var context in contextProvider.Projects) {
                        if (!_skipMSBuild) {
                            try {
                                HandleMSBuildProject(context, contextProvider, added, seen);
                            } catch (FileNotFoundException) {
                                _skipMSBuild = true;
                            }
                        }

                        var inMemory = context as InMemoryProject;
                        if (inMemory != null) {
                            if (!_projects.ContainsKey(inMemory.FullPath)) {
                                var projInfo = new InMemoryProjectInfo(inMemory, inMemory.FullPath, contextProvider);
                                _projects[inMemory.FullPath] = projInfo;
                                added.Add(projInfo);
                            }
                            seen.Add(inMemory.FullPath);
                        }
                    }

                    // Then remove any existing projects that are no longer there
                    var toRemove = _projects
                        .Where(x => x.Value.ContextProvider == contextProvider && !seen.Contains(x.Key))
                        .Select(x => x.Key)
                        .ToArray();

                    foreach (var projInfo in toRemove) {
                        var value = _projects[projInfo];
                        _projects.Remove(projInfo);
                        removed.Add(value);
                        value.Dispose();
                    }
                }

                // apply what we discovered without the projects lock...
                foreach (var projInfo in added) {
                    discovered |= DiscoverInterpreters(projInfo);
                }

                foreach (var projInfo in removed) {
                    projInfo.Dispose();
                    if (projInfo.Factories.Count > 0) {
                        discovered = true;
                    }
                }
            }

            if (discovered) {
                OnInterpreterFactoriesChanged();
            }
        }