From 14d40d4896ad740007b6d7395f0e29e9badbc5af Mon Sep 17 00:00:00 2001 From: Saransh Saini Date: Wed, 29 Jan 2025 22:59:04 -0800 Subject: [PATCH] wip --- CodeiumVS/LanguageServer/LanguageServer.cs | 101 +++++++++++---------- CodeiumVS/source.extension.vsixmanifest | 2 +- 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/CodeiumVS/LanguageServer/LanguageServer.cs b/CodeiumVS/LanguageServer/LanguageServer.cs index 216a5d6..c371379 100644 --- a/CodeiumVS/LanguageServer/LanguageServer.cs +++ b/CodeiumVS/LanguageServer/LanguageServer.cs @@ -1,4 +1,5 @@ using CodeiumVS.Packets; +using Community.VisualStudio.Toolkit; using EnvDTE; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Imaging; @@ -21,6 +22,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.Windows.Controls; using System.Xml.Linq; namespace CodeiumVS; @@ -745,17 +747,27 @@ private async Task InitializeTrackedWorkspaceAsync() await _package.LogAsync($"Number of top-level projects: {dte.Solution.Projects.Count}"); var documents = dte.Documents; - var openFilePaths = new HashSet(); + // var openFilePaths = new HashSet(); + var openFileProjects = new HashSet(); if (_package.SettingsPage.IndexOpenFiles) { foreach (EnvDTE.Document doc in documents) { - await _package.LogAsync($"Open File: {doc.Path}"); - openFilePaths.Add(doc.Path); + ProjectItem projectItem = doc.ProjectItem; + await _package.LogAsync($"projectITEM: {projectItem}"); + if (projectItem != null) + { + EnvDTE.Project project = projectItem.ContainingProject; + if (project != null && !openFileProjects.Contains(project)) + { + openFileProjects.Add(project); + await _package.LogAsync($"Open File FOUNDD: {project}, {project.FullName}, {project.Name}"); + } + } } } - var inputFilesToIndex = new HashSet(StringComparer.OrdinalIgnoreCase); + var inputDirectoriesToIndex = new HashSet(StringComparer.OrdinalIgnoreCase); string projectListPath = _package.SettingsPage.IndexingFilesListPath.Trim(); try { @@ -770,11 +782,11 @@ private async Task InitializeTrackedWorkspaceAsync() { if (Path.IsPathRooted(trimmedLine)) { - inputFilesToIndex.Add(trimmedLine); + inputDirectoriesToIndex.Add(trimmedLine); } } } - await _package.LogAsync($"Loaded from {inputFilesToIndex.Count} files"); + await _package.LogAsync($"Loaded from {inputDirectoriesToIndex.Count} directories"); } } catch (Exception ex) @@ -782,9 +794,9 @@ private async Task InitializeTrackedWorkspaceAsync() await _package.LogAsync($"Error reading project list: {ex.Message}"); } - List projectsToIndex = new List(inputFilesToIndex); + List projectsToIndex = new List(inputDirectoriesToIndex); int maxToIndex = 10; - projectsToIndex.AddRange(await GetFilesToIndex(inputFilesToIndex, openFilePaths, maxToIndex - projectsToIndex.Count, dte)); + projectsToIndex.AddRange(await GetDirectoriesToIndex(inputDirectoriesToIndex, openFileProjects, maxToIndex - projectsToIndex.Count, dte)); await _package.LogAsync($"Number of projects to index: {projectsToIndex.Count}"); for (int i = 0; i < Math.Min(maxToIndex, projectsToIndex.Count); i++) @@ -805,28 +817,22 @@ private async Task InitializeTrackedWorkspaceAsync() } } - private async Task> GetFilesToIndex(HashSet processedProjects, HashSet openFilePaths, int remainingToFind, DTE dte) + private async Task> GetDirectoriesToIndex(HashSet processedProjects, HashSet openFileProjects, int remainingToFind, DTE dte) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); - HashSet openFilesProjectsToIndexPath = new HashSet(); HashSet remainingProjectsToIndexPath = new HashSet(); - // Safeguard against any edge case - int maxRecursiveCalls = 25; async Task AddFilesToIndexLists(EnvDTE.Project project) { - maxRecursiveCalls--; - if (remainingToFind <= 0 || (openFilePaths.Count == 0 && remainingProjectsToIndexPath.Count >= remainingToFind) || maxRecursiveCalls == 0) + if (remainingToFind <= 0) { return; } string projectFullName = project.FullName; string projectName = Path.GetFileNameWithoutExtension(projectFullName); - IEnumerable commonDirs; + IEnumerable commonDirs = Enumerable.Empty(); + if (!string.IsNullOrEmpty(projectFullName) && !processedProjects.Any(p => projectFullName.StartsWith(p))) { - string projectDir = Path.GetDirectoryName(projectFullName); - string projectCommonRoot = projectDir; - // Parse the csproj file to find all source directories if (File.Exists(projectFullName) && (projectFullName.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) || projectFullName.EndsWith(".vcxproj", StringComparison.OrdinalIgnoreCase))) { @@ -858,7 +864,7 @@ async Task AddFilesToIndexLists(EnvDTE.Project project) fullPaths.Add(fullPath); } - commonDirs = FileUtilities.FindMinimumEncompassingDirectories(fullPaths); + commonDirs = Utilities.FileUtilities.FindMinimumEncompassingDirectories(fullPaths); } catch (Exception ex) { @@ -866,34 +872,14 @@ async Task AddFilesToIndexLists(EnvDTE.Project project) } } - if (openFilePaths.Count != 0) - { - List matchingFiles = new List(); - foreach (var filePath in openFilePaths) - { - var matchingDir = commonDirs.FirstOrDefault(dir => filePath.StartsWith(dir, StringComparison.OrdinalIgnoreCase)); - if (matchingDir != null) - { - await _package.LogAsync($"Found in open files {filePath}, {matchingDir}"); - openFilesProjectsToIndexPath.Add(matchingDir); - matchingFiles.Add(filePath); - } - } - if (matchingFiles.Any()) - { - remainingToFind--; - openFilePaths.ExceptWith(matchingFiles); - } - } - else + await _package.LogAsync($"Found set-covering directories for {projectName}: {commonDirs.Count()}"); + foreach (var dir in commonDirs) { - await _package.LogAsync($"Found in remaining {commondDirs.Count}"); - foreach (var dir in commonDirs) - { - remainingProjectsToIndexPath.Add(dir); - } + remainingToFind -= 1; + remainingProjectsToIndexPath.Add(dir); } - processedProjects.Add(projectFullName); + + processedProjects.Add(project.Name); } foreach (EnvDTE.ProjectItem item in project.ProjectItems) @@ -913,8 +899,24 @@ async Task AddFilesToIndexLists(EnvDTE.Project project) } } + foreach (EnvDTE.Project project in openFileProjects) + { + try + { + await AddFilesToIndexLists(project); + } + catch (Exception ex) + { + await _package.LogAsync($"Failed to process project: {ex.Message}"); + continue; + } + } foreach (EnvDTE.Project project in dte.Solution.Projects) { + if (openFileProjects.Contains(project)) + { + continue; + } try { await AddFilesToIndexLists(project); @@ -924,11 +926,12 @@ async Task AddFilesToIndexLists(EnvDTE.Project project) await _package.LogAsync($"Failed to process project: {ex.Message}"); continue; } + if (remainingToFind <=0) + { + break; + } } - List result = new List(); - result.AddRange(openFilesProjectsToIndexPath); - result.AddRange(remainingProjectsToIndexPath); - return result; + return remainingProjectsToIndexPath.ToList(); } diff --git a/CodeiumVS/source.extension.vsixmanifest b/CodeiumVS/source.extension.vsixmanifest index d36d913..5b32d4a 100644 --- a/CodeiumVS/source.extension.vsixmanifest +++ b/CodeiumVS/source.extension.vsixmanifest @@ -1,7 +1,7 @@ - + Codeium The modern coding superpower: free AI code acceleration plugin for your favorite languages. Type less. Code more. Ship faster. https://www.codeium.com