]> git.lizzy.rs Git - rust.git/commitdiff
Open Cargo.toml opens more specific manifest
authorAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 8 Dec 2020 13:28:21 +0000 (16:28 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 8 Dec 2020 13:28:21 +0000 (16:28 +0300)
crates/rust-analyzer/src/cargo_target_spec.rs
crates/rust-analyzer/src/handlers.rs

index 1ab72bd9158a4c3dd50eb458c7e25bf3871003ac..8a8b4a32cb4f416a41f44cd5e4566292703f3a28 100644 (file)
@@ -14,6 +14,7 @@
 #[derive(Clone)]
 pub(crate) struct CargoTargetSpec {
     pub(crate) workspace_root: AbsPathBuf,
+    pub(crate) cargo_toml: AbsPathBuf,
     pub(crate) package: String,
     pub(crate) target: String,
     pub(crate) target_kind: TargetKind,
@@ -115,12 +116,17 @@ pub(crate) fn for_file(
             Some(it) => it,
             None => return Ok(None),
         };
+
+        let target_data = &cargo_ws[target];
+        let package_data = &cargo_ws[target_data.package];
         let res = CargoTargetSpec {
             workspace_root: cargo_ws.workspace_root().to_path_buf(),
-            package: cargo_ws.package_flag(&cargo_ws[cargo_ws[target].package]),
-            target: cargo_ws[target].name.clone(),
-            target_kind: cargo_ws[target].kind,
+            cargo_toml: package_data.manifest.clone(),
+            package: cargo_ws.package_flag(&package_data),
+            target: target_data.name.clone(),
+            target_kind: target_data.kind,
         };
+
         Ok(Some(res))
     }
 
index 7bfbc61037bfda0d97a5de548e76e84d81965173..6250171bab1cecb9509887f9c15aca025f9ffe2b 100644 (file)
@@ -1342,13 +1342,9 @@ pub(crate) fn handle_open_cargo_toml(
         None => return Ok(None),
     };
 
-    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);
-    let cargo_toml_location = Location::new(cargo_toml_url, Range::default());
-    let res = lsp_types::GotoDefinitionResponse::from(cargo_toml_location);
+    let cargo_toml_url = to_proto::url_from_abs_path(&cargo_spec.cargo_toml);
+    let res: lsp_types::GotoDefinitionResponse =
+        Location::new(cargo_toml_url, Range::default()).into();
     Ok(Some(res))
 }