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(); } }
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(); } }