mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-14 08:57:34 +00:00
code: expose workspaces to other extensions; remove addProject
command
This commit is contained in:
parent
bae9c084e9
commit
0cd68bfed3
4 changed files with 23 additions and 41 deletions
|
@ -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",
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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") {
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
Loading…
Reference in a new issue