@@ -15,7 +15,7 @@ use ra_flycheck::{Flycheck, FlycheckConfig};
1515use ra_ide:: {
1616 Analysis , AnalysisChange , AnalysisHost , CrateGraph , FileId , LibraryData , SourceRootId ,
1717} ;
18- use ra_project_model:: { ProcMacroClient , ProjectWorkspace } ;
18+ use ra_project_model:: { CargoWorkspace , ProcMacroClient , ProjectWorkspace , Target } ;
1919use ra_vfs:: { LineEndings , RootEntry , Vfs , VfsChange , VfsFile , VfsTask , Watch } ;
2020use relative_path:: RelativePathBuf ;
2121use stdx:: format_to;
@@ -28,7 +28,7 @@ use crate::{
2828 vfs_glob:: { Glob , RustPackageFilterBuilder } ,
2929 LspError , Result ,
3030} ;
31- use ra_db:: ExternSourceId ;
31+ use ra_db:: { CrateId , ExternSourceId } ;
3232use rustc_hash:: { FxHashMap , FxHashSet } ;
3333
3434fn create_flycheck ( workspaces : & [ ProjectWorkspace ] , config : & FlycheckConfig ) -> Option < Flycheck > {
@@ -290,10 +290,6 @@ impl GlobalStateSnapshot {
290290 file_id_to_url ( & self . vfs . read ( ) , id)
291291 }
292292
293- pub fn file_id_to_path ( & self , id : FileId ) -> PathBuf {
294- self . vfs . read ( ) . file2path ( VfsFile ( id. 0 ) )
295- }
296-
297293 pub fn file_line_endings ( & self , id : FileId ) -> LineEndings {
298294 self . vfs . read ( ) . file_line_endings ( VfsFile ( id. 0 ) )
299295 }
@@ -305,6 +301,20 @@ impl GlobalStateSnapshot {
305301 url_from_abs_path ( & path)
306302 }
307303
304+ pub ( crate ) fn cargo_target_for_crate_root (
305+ & self ,
306+ crate_id : CrateId ,
307+ ) -> Option < ( & CargoWorkspace , Target ) > {
308+ let file_id = self . analysis ( ) . crate_root ( crate_id) . ok ( ) ?;
309+ let path = self . vfs . read ( ) . file2path ( VfsFile ( file_id. 0 ) ) ;
310+ self . workspaces . iter ( ) . find_map ( |ws| match ws {
311+ ProjectWorkspace :: Cargo { cargo, .. } => {
312+ cargo. target_by_root ( & path) . map ( |it| ( cargo, it) )
313+ }
314+ ProjectWorkspace :: Json { .. } => None ,
315+ } )
316+ }
317+
308318 pub fn status ( & self ) -> String {
309319 let mut buf = String :: new ( ) ;
310320 if self . workspaces . is_empty ( ) {
0 commit comments