@@ -18,7 +18,7 @@ use parking_lot::{
1818 RwLockWriteGuard ,
1919} ;
2020use proc_macro_api:: ProcMacroServer ;
21- use project_model:: { CargoWorkspace , ProjectWorkspace , Target , WorkspaceBuildScripts } ;
21+ use project_model:: { ProjectWorkspace , WorkspaceBuildScripts } ;
2222use rustc_hash:: { FxHashMap , FxHashSet } ;
2323use triomphe:: Arc ;
2424use vfs:: { AnchoredPathBuf , ChangedFile , Vfs } ;
@@ -33,6 +33,7 @@ use crate::{
3333 mem_docs:: MemDocs ,
3434 op_queue:: OpQueue ,
3535 reload,
36+ target_spec:: { CargoTargetSpec , TargetSpec } ,
3637 task_pool:: { TaskPool , TaskQueue } ,
3738} ;
3839
@@ -500,20 +501,38 @@ impl GlobalStateSnapshot {
500501 self . vfs_read ( ) . file_path ( file_id) . clone ( )
501502 }
502503
503- pub ( crate ) fn cargo_target_for_crate_root (
504- & self ,
505- crate_id : CrateId ,
506- ) -> Option < ( & CargoWorkspace , Target ) > {
504+ pub ( crate ) fn target_spec_for_crate ( & self , crate_id : CrateId ) -> Option < TargetSpec > {
507505 let file_id = self . analysis . crate_root ( crate_id) . ok ( ) ?;
508506 let path = self . vfs_read ( ) . file_path ( file_id) . clone ( ) ;
509507 let path = path. as_path ( ) ?;
510- self . workspaces . iter ( ) . find_map ( |ws| match ws {
511- ProjectWorkspace :: Cargo { cargo, .. } => {
512- cargo. target_by_root ( path) . map ( |it| ( cargo, it) )
508+
509+ for workspace in self . workspaces . iter ( ) {
510+ match workspace {
511+ ProjectWorkspace :: Cargo { cargo, .. } => {
512+ let Some ( target_idx) = cargo. target_by_root ( path) else {
513+ continue ;
514+ } ;
515+
516+ let target_data = & cargo[ target_idx] ;
517+ let package_data = & cargo[ target_data. package ] ;
518+
519+ return Some ( TargetSpec :: Cargo ( CargoTargetSpec {
520+ workspace_root : cargo. workspace_root ( ) . to_path_buf ( ) ,
521+ cargo_toml : package_data. manifest . clone ( ) ,
522+ crate_id,
523+ package : cargo. package_flag ( package_data) ,
524+ target : target_data. name . clone ( ) ,
525+ target_kind : target_data. kind ,
526+ required_features : target_data. required_features . clone ( ) ,
527+ features : package_data. features . keys ( ) . cloned ( ) . collect ( ) ,
528+ } ) ) ;
529+ }
530+ ProjectWorkspace :: Json { .. } => { }
531+ ProjectWorkspace :: DetachedFiles { .. } => { }
513532 }
514- ProjectWorkspace :: Json { .. } => None ,
515- ProjectWorkspace :: DetachedFiles { .. } => None ,
516- } )
533+ }
534+
535+ None
517536 }
518537
519538 pub ( crate ) fn file_exists ( & self , file_id : FileId ) -> bool {
0 commit comments