Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.net.URI;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
Expand All @@ -23,8 +26,13 @@

import com.google.gson.Gson;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.lsp4j.WorkspaceFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand Down Expand Up @@ -193,4 +201,21 @@ void testOnDidChangePolicy_publishesAutoModelPolicyEventOnlyWhenValueChanges() t
eventBroker.unsubscribe(eventHandler);
}
}

@Test
void testWorkspaceFolders_withProjects_returnsOnlyWorkspaceRoot() throws Exception {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject("WorkspaceFoldersTestProject");
project.create(new NullProgressMonitor());
project.open(new NullProgressMonitor());

try {
List<WorkspaceFolder> folders = client.workspaceFolders().get(5, TimeUnit.SECONDS);

assertEquals(1, folders.size());
assertEquals(root.getLocation().toFile().toPath(), Path.of(URI.create(folders.get(0).getUri())));
} finally {
project.delete(true, true, new NullProgressMonitor());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.concurrent.ExecutionException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
Expand All @@ -23,6 +24,7 @@
import org.eclipse.lsp4j.ProgressParams;
import org.eclipse.lsp4j.ShowDocumentParams;
import org.eclipse.lsp4j.ShowDocumentResult;
import org.eclipse.lsp4j.WorkspaceFolder;
import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
Expand Down Expand Up @@ -181,6 +183,19 @@ public CompletableFuture<Object[]> confirmClientTool(InvokeClientToolConfirmatio
});
}

/**
* Announces only the workspace root instead of every project. The language server processes each announced folder
* separately, which keeps it busy for minutes in workspaces with many projects. Chat requests pass their relevant
* project folders explicitly.
*/
@Override
public CompletableFuture<List<WorkspaceFolder>> workspaceFolders() {
WorkspaceFolder folder = new WorkspaceFolder();
folder.setUri(FileUtils.getResourceUri(ResourcesPlugin.getWorkspace().getRoot()));
folder.setName("workspace-root"); //$NON-NLS-1$
return CompletableFuture.completedFuture(List.of(folder));
}

@Override
public CompletableFuture<List<Object>> configuration(ConfigurationParams params) {
return CompletableFuture.supplyAsync(() -> {
Expand Down