@@ -64,6 +64,8 @@ pub struct ProjectWorkspace {
6464 pub cfg_overrides : CfgOverrides ,
6565 /// Additional includes to add for the VFS.
6666 pub extra_includes : Vec < AbsPathBuf > ,
67+ /// Set `cfg(test)` for local crates
68+ pub set_test : bool ,
6769}
6870
6971#[ derive( Clone ) ]
@@ -79,7 +81,6 @@ pub enum ProjectWorkspaceKind {
7981 /// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been
8082 /// disabled or was otherwise not requested.
8183 rustc : Result < Box < ( CargoWorkspace , WorkspaceBuildScripts ) > , Option < String > > ,
82- set_test : bool ,
8384 } ,
8485 /// Project workspace was specified using a `rust-project.json` file.
8586 Json ( ProjectJson ) ,
@@ -98,7 +99,6 @@ pub enum ProjectWorkspaceKind {
9899 file : ManifestPath ,
99100 /// Is this file a cargo script file?
100101 cargo : Option < ( CargoWorkspace , WorkspaceBuildScripts , Option < Arc < anyhow:: Error > > ) > ,
101- set_test : bool ,
102102 } ,
103103}
104104
@@ -113,9 +113,10 @@ impl fmt::Debug for ProjectWorkspace {
113113 target_layout,
114114 cfg_overrides,
115115 extra_includes,
116+ set_test,
116117 } = self ;
117118 match kind {
118- ProjectWorkspaceKind :: Cargo { cargo, error : _, build_scripts, rustc, set_test } => f
119+ ProjectWorkspaceKind :: Cargo { cargo, error : _, build_scripts, rustc } => f
119120 . debug_struct ( "Cargo" )
120121 . field ( "root" , & cargo. workspace_root ( ) . file_name ( ) )
121122 . field ( "n_packages" , & cargo. packages ( ) . len ( ) )
@@ -141,11 +142,12 @@ impl fmt::Debug for ProjectWorkspace {
141142 . field ( "toolchain" , & toolchain)
142143 . field ( "data_layout" , & target_layout)
143144 . field ( "n_cfg_overrides" , & cfg_overrides. len ( ) )
144- . field ( "n_extra_includes" , & extra_includes. len ( ) ) ;
145+ . field ( "n_extra_includes" , & extra_includes. len ( ) )
146+ . field ( "set_test" , set_test) ;
145147
146148 debug_struct. finish ( )
147149 }
148- ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, set_test } => f
150+ ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script } => f
149151 . debug_struct ( "DetachedFiles" )
150152 . field ( "file" , & file)
151153 . field ( "cargo_script" , & cargo_script. is_some ( ) )
@@ -386,14 +388,14 @@ impl ProjectWorkspace {
386388 build_scripts : WorkspaceBuildScripts :: default ( ) ,
387389 rustc,
388390 error : error. map ( Arc :: new) ,
389- set_test : * set_test,
390391 } ,
391392 sysroot,
392393 rustc_cfg,
393394 cfg_overrides : cfg_overrides. clone ( ) ,
394395 toolchain,
395396 target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
396397 extra_includes : extra_includes. clone ( ) ,
398+ set_test : * set_test,
397399 } )
398400 }
399401
@@ -449,6 +451,7 @@ impl ProjectWorkspace {
449451 target_layout : target_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
450452 cfg_overrides : config. cfg_overrides . clone ( ) ,
451453 extra_includes : config. extra_includes . clone ( ) ,
454+ set_test : config. set_test ,
452455 }
453456 }
454457
@@ -504,14 +507,14 @@ impl ProjectWorkspace {
504507 kind : ProjectWorkspaceKind :: DetachedFile {
505508 file : detached_file. to_owned ( ) ,
506509 cargo : cargo_script,
507- set_test : config. set_test ,
508510 } ,
509511 sysroot,
510512 rustc_cfg,
511513 toolchain,
512514 target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
513515 cfg_overrides : config. cfg_overrides . clone ( ) ,
514516 extra_includes : config. extra_includes . clone ( ) ,
517+ set_test : config. set_test ,
515518 } )
516519 }
517520
@@ -696,7 +699,7 @@ impl ProjectWorkspace {
696699 . into_iter ( )
697700 . chain ( mk_sysroot ( ) )
698701 . collect :: < Vec < _ > > ( ) ,
699- ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _, set_test : _ } => {
702+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
700703 cargo
701704 . packages ( )
702705 . map ( |pkg| {
@@ -831,8 +834,9 @@ impl ProjectWorkspace {
831834 sysroot,
832835 extra_env,
833836 cfg_overrides,
837+ self . set_test ,
834838 ) ,
835- ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _, set_test } => {
839+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
836840 cargo_to_crate_graph (
837841 load,
838842 rustc. as_ref ( ) . map ( |a| a. as_ref ( ) ) . ok ( ) ,
@@ -841,10 +845,10 @@ impl ProjectWorkspace {
841845 rustc_cfg. clone ( ) ,
842846 cfg_overrides,
843847 build_scripts,
844- * set_test,
848+ self . set_test ,
845849 )
846850 }
847- ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, set_test , .. } => {
851+ ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, .. } => {
848852 if let Some ( ( cargo, build_scripts, _) ) = cargo_script {
849853 cargo_to_crate_graph (
850854 & mut |path| load ( path) ,
@@ -854,7 +858,7 @@ impl ProjectWorkspace {
854858 rustc_cfg. clone ( ) ,
855859 cfg_overrides,
856860 build_scripts,
857- * set_test,
861+ self . set_test ,
858862 )
859863 } else {
860864 detached_file_to_crate_graph (
@@ -863,7 +867,7 @@ impl ProjectWorkspace {
863867 file,
864868 sysroot,
865869 cfg_overrides,
866- * set_test,
870+ self . set_test ,
867871 )
868872 }
869873 }
@@ -885,34 +889,22 @@ impl ProjectWorkspace {
885889 } = other;
886890 ( match ( kind, o_kind) {
887891 (
888- ProjectWorkspaceKind :: Cargo {
889- cargo,
890- rustc,
891- build_scripts : _,
892- error : _,
893- set_test : _,
894- } ,
892+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts : _, error : _ } ,
895893 ProjectWorkspaceKind :: Cargo {
896894 cargo : o_cargo,
897895 rustc : o_rustc,
898896 build_scripts : _,
899897 error : _,
900- set_test : _,
901898 } ,
902899 ) => cargo == o_cargo && rustc == o_rustc,
903900 ( ProjectWorkspaceKind :: Json ( project) , ProjectWorkspaceKind :: Json ( o_project) ) => {
904901 project == o_project
905902 }
906903 (
907- ProjectWorkspaceKind :: DetachedFile {
908- file,
909- cargo : Some ( ( cargo_script, _, _) ) ,
910- set_test : _,
911- } ,
904+ ProjectWorkspaceKind :: DetachedFile { file, cargo : Some ( ( cargo_script, _, _) ) } ,
912905 ProjectWorkspaceKind :: DetachedFile {
913906 file : o_file,
914907 cargo : Some ( ( o_cargo_script, _, _) ) ,
915- set_test : _,
916908 } ,
917909 ) => file == o_file && cargo_script == o_cargo_script,
918910 _ => return false ,
@@ -940,13 +932,13 @@ fn project_json_to_crate_graph(
940932 sysroot : & Sysroot ,
941933 extra_env : & FxHashMap < String , String > ,
942934 override_cfg : & CfgOverrides ,
935+ set_test : bool ,
943936) -> ( CrateGraph , ProcMacroPaths ) {
944937 let mut res = ( CrateGraph :: default ( ) , ProcMacroPaths :: default ( ) ) ;
945938 let ( crate_graph, proc_macros) = & mut res;
946939 let ( public_deps, libproc_macro) =
947940 sysroot_to_crate_graph ( crate_graph, sysroot, rustc_cfg. clone ( ) , load) ;
948941
949- let r_a_cfg_flag = CfgAtom :: Flag ( sym:: rust_analyzer. clone ( ) ) ;
950942 let mut cfg_cache: FxHashMap < & str , Vec < CfgAtom > > = FxHashMap :: default ( ) ;
951943
952944 let idx_to_crate_id: FxHashMap < CrateArrayIdx , CrateId > = project
@@ -965,6 +957,7 @@ fn project_json_to_crate_graph(
965957 proc_macro_dylib_path,
966958 is_proc_macro,
967959 repository,
960+ is_workspace_member,
968961 ..
969962 } ,
970963 file_id,
@@ -982,19 +975,28 @@ fn project_json_to_crate_graph(
982975 None => & rustc_cfg,
983976 } ;
984977
985- let mut cfg_options = target_cfgs
986- . iter ( )
987- . chain ( cfg. iter ( ) )
988- . chain ( iter:: once ( & r_a_cfg_flag) )
989- . cloned ( )
990- . collect ( ) ;
991- override_cfg. apply (
992- & mut cfg_options,
993- display_name
994- . as_ref ( )
995- . map ( |it| it. canonical_name ( ) . as_str ( ) )
996- . unwrap_or_default ( ) ,
997- ) ;
978+ let cfg_options = {
979+ let mut cfg_options: CfgOptions =
980+ target_cfgs. iter ( ) . chain ( cfg. iter ( ) ) . cloned ( ) . collect ( ) ;
981+
982+ if * is_workspace_member {
983+ if set_test {
984+ // Add test cfg for local crates
985+ cfg_options. insert_atom ( sym:: test. clone ( ) ) ;
986+ }
987+ cfg_options. insert_atom ( sym:: rust_analyzer. clone ( ) ) ;
988+ }
989+
990+ override_cfg. apply (
991+ & mut cfg_options,
992+ display_name
993+ . as_ref ( )
994+ . map ( |it| it. canonical_name ( ) . as_str ( ) )
995+ . unwrap_or_default ( ) ,
996+ ) ;
997+ cfg_options
998+ } ;
999+
9981000 let crate_graph_crate_id = crate_graph. add_crate_root (
9991001 file_id,
10001002 * edition,
0 commit comments