diff --git a/.gitignore b/.gitignore index b205bf3fb680..29eeba1981f0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ crates/*/target generated_assists.adoc generated_features.adoc generated_diagnostic.adoc +**/.DS_Store diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 049c583a42cb..9920e7fbcbe8 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -1315,6 +1315,29 @@ pub(crate) fn handle_open_docs( Ok(remote.and_then(|remote| Url::parse(&remote).ok())) } +pub(crate) fn handle_open_cargo_toml( + snap: GlobalStateSnapshot, + params: lsp_ext::OpenCargoTomlParams, +) -> Result> { + let _p = profile::span("handle_open_cargo_toml"); + let file_id = from_proto::file_id(&snap, ¶ms.text_document.uri)?; + let maybe_cargo_spec = CargoTargetSpec::for_file(&snap, file_id)?; + if maybe_cargo_spec.is_none() { + return Ok(None); + } + + let cargo_spec = maybe_cargo_spec.unwrap(); + let cargo_toml_path = cargo_spec.workspace_root.join("Cargo.toml"); + if !cargo_toml_path.exists() { + return Ok(None); + } + let cargo_toml_url = to_proto::url_from_abs_path(&cargo_toml_path.clone()); + let cargo_toml_location = + Location::new(cargo_toml_url.clone(), Range::new(Position::new(0, 0), Position::new(0, 0))); + let res = lsp_types::GotoDefinitionResponse::from(cargo_toml_location); + Ok(Some(res)) +} + fn implementation_title(count: usize) -> String { if count == 1 { "1 implementation".into() diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs index f31f8d9001b7..5d1a203062fc 100644 --- a/crates/rust-analyzer/src/lsp_ext.rs +++ b/crates/rust-analyzer/src/lsp_ext.rs @@ -355,3 +355,17 @@ impl Request for ExternalDocs { type Result = Option; const METHOD: &'static str = "experimental/externalDocs"; } + +pub enum OpenCargoToml {} + +impl Request for OpenCargoToml { + type Params = OpenCargoTomlParams; + type Result = Option; + const METHOD: &'static str = "experimental/openCargoToml"; +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct OpenCargoTomlParams { + pub text_document: TextDocumentIdentifier, +} diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index d504572a83ee..2657479112f9 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -438,6 +438,7 @@ impl GlobalState { .on::(handlers::handle_resolve_code_action) .on::(handlers::handle_hover) .on::(handlers::handle_open_docs) + .on::(handlers::handle_open_cargo_toml) .on::(handlers::handle_on_type_formatting) .on::(handlers::handle_document_symbol) .on::(handlers::handle_workspace_symbol) diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md index 780f5cb91fb4..32c91c7fd781 100644 --- a/docs/dev/lsp-extensions.md +++ b/docs/dev/lsp-extensions.md @@ -1,5 +1,5 @@