code: expose workspaces to other extensions; remove addProject command

This commit is contained in:
David Barsky 2023-10-17 11:29:11 -04:00
parent bae9c084e9
commit 0cd68bfed3
4 changed files with 23 additions and 41 deletions

View file

@ -209,11 +209,6 @@
"title": "Rebuild proc macros and build scripts", "title": "Rebuild proc macros and build scripts",
"category": "rust-analyzer" "category": "rust-analyzer"
}, },
{
"command": "rust-analyzer.addProject",
"title": "Add current file's crate to workspace",
"category": "rust-analyzer"
},
{ {
"command": "rust-analyzer.restartServer", "command": "rust-analyzer.restartServer",
"title": "Restart server", "title": "Restart server",

View file

@ -870,28 +870,6 @@ export function rebuildProcMacros(ctx: CtxInit): Cmd {
return async () => ctx.client.sendRequest(ra.rebuildProcMacros); return async () => ctx.client.sendRequest(ra.rebuildProcMacros);
} }
export function addProject(ctx: CtxInit): Cmd {
return async () => {
const extensionName = ctx.config.discoverProjectRunner;
// this command shouldn't be enabled in the first place if this isn't set.
if (!extensionName) {
return;
}
const command = `${extensionName}.discoverWorkspaceCommand`;
const project: JsonProject = await vscode.commands.executeCommand(command);
ctx.addToDiscoveredWorkspaces([project]);
// this is a workaround to avoid needing writing the `rust-project.json` into
// a workspace-level VS Code-specific settings folder. We'd like to keep the
// `rust-project.json` entirely in-memory.
await ctx.client?.sendNotification(lc.DidChangeConfigurationNotification.type, {
settings: "",
});
};
}
async function showReferencesImpl( async function showReferencesImpl(
client: LanguageClient | undefined, client: LanguageClient | undefined,
uri: string, uri: string,

View file

@ -1,5 +1,5 @@
import * as vscode from "vscode"; import * as vscode from "vscode";
import type * as lc from "vscode-languageclient/node"; import * as lc from "vscode-languageclient/node";
import * as ra from "./lsp_ext"; import * as ra from "./lsp_ext";
import { Config, prepareVSCodeConfig } from "./config"; import { Config, prepareVSCodeConfig } from "./config";
@ -22,6 +22,7 @@ import {
import { execRevealDependency } from "./commands"; import { execRevealDependency } from "./commands";
import { PersistentState } from "./persistent_state"; import { PersistentState } from "./persistent_state";
import { bootstrap } from "./bootstrap"; import { bootstrap } from "./bootstrap";
import type { RustAnalyzerExtensionApi } from "./main";
// We only support local folders, not eg. Live Share (`vlsl:` scheme), so don't activate if // We only support local folders, not eg. Live Share (`vlsl:` scheme), so don't activate if
// only those are in use. We use "Empty" to represent these scenarios // only those are in use. We use "Empty" to represent these scenarios
@ -64,7 +65,7 @@ export type CtxInit = Ctx & {
readonly client: lc.LanguageClient; readonly client: lc.LanguageClient;
}; };
export class Ctx { export class Ctx implements RustAnalyzerExtensionApi {
readonly statusBar: vscode.StatusBarItem; readonly statusBar: vscode.StatusBarItem;
config: Config; config: Config;
readonly workspace: Workspace; readonly workspace: Workspace;
@ -189,8 +190,11 @@ export class Ctx {
if (this.config.discoverProjectRunner) { if (this.config.discoverProjectRunner) {
const command = `${this.config.discoverProjectRunner}.discoverWorkspaceCommand`; const command = `${this.config.discoverProjectRunner}.discoverWorkspaceCommand`;
log.info(`running command: ${command}`); log.info(`running command: ${command}`);
const project: JsonProject = await vscode.commands.executeCommand(command); const uris = vscode.workspace.textDocuments
this.addToDiscoveredWorkspaces([project]); .filter(isRustDocument)
.map((document) => document.uri);
const projects: JsonProject[] = await vscode.commands.executeCommand(command, uris);
this.setWorkspaces(projects);
} }
if (this.workspace.kind === "Detached Files") { if (this.workspace.kind === "Detached Files") {
@ -342,15 +346,17 @@ export class Ctx {
return this._serverPath; return this._serverPath;
} }
addToDiscoveredWorkspaces(workspaces: JsonProject[]) { setWorkspaces(workspaces: JsonProject[]) {
for (const workspace of workspaces) { this.config.discoveredWorkspaces = workspaces;
const index = this.config.discoveredWorkspaces.indexOf(workspace);
if (~index) {
this.config.discoveredWorkspaces[index] = workspace;
} else {
this.config.discoveredWorkspaces.push(workspace);
}
} }
async notifyRustAnalyzer(): Promise<void> {
// this is a workaround to avoid needing writing the `rust-project.json` into
// a workspace-level VS Code-specific settings folder. We'd like to keep the
// `rust-project.json` entirely in-memory.
await this.client?.sendNotification(lc.DidChangeConfigurationNotification.type, {
settings: "",
});
} }
private updateCommands(forceDisable?: "disable") { private updateCommands(forceDisable?: "disable") {

View file

@ -9,8 +9,12 @@ import { setContextValue } from "./util";
const RUST_PROJECT_CONTEXT_NAME = "inRustProject"; const RUST_PROJECT_CONTEXT_NAME = "inRustProject";
// This API is not stable and may break in between minor releases.
export interface RustAnalyzerExtensionApi { export interface RustAnalyzerExtensionApi {
readonly client?: lc.LanguageClient; readonly client?: lc.LanguageClient;
setWorkspaces(workspaces: JsonProject[]): void;
notifyRustAnalyzer(): Promise<void>;
} }
export async function deactivate() { export async function deactivate() {
@ -152,7 +156,6 @@ function createCommands(): Record<string, CommandFactory> {
shuffleCrateGraph: { enabled: commands.shuffleCrateGraph }, shuffleCrateGraph: { enabled: commands.shuffleCrateGraph },
reloadWorkspace: { enabled: commands.reloadWorkspace }, reloadWorkspace: { enabled: commands.reloadWorkspace },
rebuildProcMacros: { enabled: commands.rebuildProcMacros }, rebuildProcMacros: { enabled: commands.rebuildProcMacros },
addProject: { enabled: commands.addProject },
matchingBrace: { enabled: commands.matchingBrace }, matchingBrace: { enabled: commands.matchingBrace },
joinLines: { enabled: commands.joinLines }, joinLines: { enabled: commands.joinLines },
parentModule: { enabled: commands.parentModule }, parentModule: { enabled: commands.parentModule },