@@ -64,6 +64,8 @@ pub struct ProjectWorkspace {
64
64
pub cfg_overrides : CfgOverrides ,
65
65
/// Additional includes to add for the VFS.
66
66
pub extra_includes : Vec < AbsPathBuf > ,
67
+ /// Set `cfg(test)` for local crates
68
+ pub set_test : bool ,
67
69
}
68
70
69
71
#[ derive( Clone ) ]
@@ -79,7 +81,6 @@ pub enum ProjectWorkspaceKind {
79
81
/// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been
80
82
/// disabled or was otherwise not requested.
81
83
rustc : Result < Box < ( CargoWorkspace , WorkspaceBuildScripts ) > , Option < String > > ,
82
- set_test : bool ,
83
84
} ,
84
85
/// Project workspace was specified using a `rust-project.json` file.
85
86
Json ( ProjectJson ) ,
@@ -98,7 +99,6 @@ pub enum ProjectWorkspaceKind {
98
99
file : ManifestPath ,
99
100
/// Is this file a cargo script file?
100
101
cargo : Option < ( CargoWorkspace , WorkspaceBuildScripts , Option < Arc < anyhow:: Error > > ) > ,
101
- set_test : bool ,
102
102
} ,
103
103
}
104
104
@@ -113,9 +113,10 @@ impl fmt::Debug for ProjectWorkspace {
113
113
target_layout,
114
114
cfg_overrides,
115
115
extra_includes,
116
+ set_test,
116
117
} = self ;
117
118
match kind {
118
- ProjectWorkspaceKind :: Cargo { cargo, error : _, build_scripts, rustc, set_test } => f
119
+ ProjectWorkspaceKind :: Cargo { cargo, error : _, build_scripts, rustc } => f
119
120
. debug_struct ( "Cargo" )
120
121
. field ( "root" , & cargo. workspace_root ( ) . file_name ( ) )
121
122
. field ( "n_packages" , & cargo. packages ( ) . len ( ) )
@@ -141,11 +142,12 @@ impl fmt::Debug for ProjectWorkspace {
141
142
. field ( "toolchain" , & toolchain)
142
143
. field ( "data_layout" , & target_layout)
143
144
. 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) ;
145
147
146
148
debug_struct. finish ( )
147
149
}
148
- ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, set_test } => f
150
+ ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script } => f
149
151
. debug_struct ( "DetachedFiles" )
150
152
. field ( "file" , & file)
151
153
. field ( "cargo_script" , & cargo_script. is_some ( ) )
@@ -386,14 +388,14 @@ impl ProjectWorkspace {
386
388
build_scripts : WorkspaceBuildScripts :: default ( ) ,
387
389
rustc,
388
390
error : error. map ( Arc :: new) ,
389
- set_test : * set_test,
390
391
} ,
391
392
sysroot,
392
393
rustc_cfg,
393
394
cfg_overrides : cfg_overrides. clone ( ) ,
394
395
toolchain,
395
396
target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
396
397
extra_includes : extra_includes. clone ( ) ,
398
+ set_test : * set_test,
397
399
} )
398
400
}
399
401
@@ -449,6 +451,7 @@ impl ProjectWorkspace {
449
451
target_layout : target_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
450
452
cfg_overrides : config. cfg_overrides . clone ( ) ,
451
453
extra_includes : config. extra_includes . clone ( ) ,
454
+ set_test : config. set_test ,
452
455
}
453
456
}
454
457
@@ -504,14 +507,14 @@ impl ProjectWorkspace {
504
507
kind : ProjectWorkspaceKind :: DetachedFile {
505
508
file : detached_file. to_owned ( ) ,
506
509
cargo : cargo_script,
507
- set_test : config. set_test ,
508
510
} ,
509
511
sysroot,
510
512
rustc_cfg,
511
513
toolchain,
512
514
target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
513
515
cfg_overrides : config. cfg_overrides . clone ( ) ,
514
516
extra_includes : config. extra_includes . clone ( ) ,
517
+ set_test : config. set_test ,
515
518
} )
516
519
}
517
520
@@ -696,7 +699,7 @@ impl ProjectWorkspace {
696
699
. into_iter ( )
697
700
. chain ( mk_sysroot ( ) )
698
701
. collect :: < Vec < _ > > ( ) ,
699
- ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _, set_test : _ } => {
702
+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
700
703
cargo
701
704
. packages ( )
702
705
. map ( |pkg| {
@@ -831,8 +834,9 @@ impl ProjectWorkspace {
831
834
sysroot,
832
835
extra_env,
833
836
cfg_overrides,
837
+ self . set_test ,
834
838
) ,
835
- ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _, set_test } => {
839
+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
836
840
cargo_to_crate_graph (
837
841
load,
838
842
rustc. as_ref ( ) . map ( |a| a. as_ref ( ) ) . ok ( ) ,
@@ -841,10 +845,10 @@ impl ProjectWorkspace {
841
845
rustc_cfg. clone ( ) ,
842
846
cfg_overrides,
843
847
build_scripts,
844
- * set_test,
848
+ self . set_test ,
845
849
)
846
850
}
847
- ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, set_test , .. } => {
851
+ ProjectWorkspaceKind :: DetachedFile { file, cargo : cargo_script, .. } => {
848
852
if let Some ( ( cargo, build_scripts, _) ) = cargo_script {
849
853
cargo_to_crate_graph (
850
854
& mut |path| load ( path) ,
@@ -854,7 +858,7 @@ impl ProjectWorkspace {
854
858
rustc_cfg. clone ( ) ,
855
859
cfg_overrides,
856
860
build_scripts,
857
- * set_test,
861
+ self . set_test ,
858
862
)
859
863
} else {
860
864
detached_file_to_crate_graph (
@@ -863,7 +867,7 @@ impl ProjectWorkspace {
863
867
file,
864
868
sysroot,
865
869
cfg_overrides,
866
- * set_test,
870
+ self . set_test ,
867
871
)
868
872
}
869
873
}
@@ -885,34 +889,22 @@ impl ProjectWorkspace {
885
889
} = other;
886
890
( match ( kind, o_kind) {
887
891
(
888
- ProjectWorkspaceKind :: Cargo {
889
- cargo,
890
- rustc,
891
- build_scripts : _,
892
- error : _,
893
- set_test : _,
894
- } ,
892
+ ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts : _, error : _ } ,
895
893
ProjectWorkspaceKind :: Cargo {
896
894
cargo : o_cargo,
897
895
rustc : o_rustc,
898
896
build_scripts : _,
899
897
error : _,
900
- set_test : _,
901
898
} ,
902
899
) => cargo == o_cargo && rustc == o_rustc,
903
900
( ProjectWorkspaceKind :: Json ( project) , ProjectWorkspaceKind :: Json ( o_project) ) => {
904
901
project == o_project
905
902
}
906
903
(
907
- ProjectWorkspaceKind :: DetachedFile {
908
- file,
909
- cargo : Some ( ( cargo_script, _, _) ) ,
910
- set_test : _,
911
- } ,
904
+ ProjectWorkspaceKind :: DetachedFile { file, cargo : Some ( ( cargo_script, _, _) ) } ,
912
905
ProjectWorkspaceKind :: DetachedFile {
913
906
file : o_file,
914
907
cargo : Some ( ( o_cargo_script, _, _) ) ,
915
- set_test : _,
916
908
} ,
917
909
) => file == o_file && cargo_script == o_cargo_script,
918
910
_ => return false ,
@@ -940,13 +932,13 @@ fn project_json_to_crate_graph(
940
932
sysroot : & Sysroot ,
941
933
extra_env : & FxHashMap < String , String > ,
942
934
override_cfg : & CfgOverrides ,
935
+ set_test : bool ,
943
936
) -> ( CrateGraph , ProcMacroPaths ) {
944
937
let mut res = ( CrateGraph :: default ( ) , ProcMacroPaths :: default ( ) ) ;
945
938
let ( crate_graph, proc_macros) = & mut res;
946
939
let ( public_deps, libproc_macro) =
947
940
sysroot_to_crate_graph ( crate_graph, sysroot, rustc_cfg. clone ( ) , load) ;
948
941
949
- let r_a_cfg_flag = CfgAtom :: Flag ( sym:: rust_analyzer. clone ( ) ) ;
950
942
let mut cfg_cache: FxHashMap < & str , Vec < CfgAtom > > = FxHashMap :: default ( ) ;
951
943
952
944
let idx_to_crate_id: FxHashMap < CrateArrayIdx , CrateId > = project
@@ -965,6 +957,7 @@ fn project_json_to_crate_graph(
965
957
proc_macro_dylib_path,
966
958
is_proc_macro,
967
959
repository,
960
+ is_workspace_member,
968
961
..
969
962
} ,
970
963
file_id,
@@ -982,19 +975,28 @@ fn project_json_to_crate_graph(
982
975
None => & rustc_cfg,
983
976
} ;
984
977
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
+
998
1000
let crate_graph_crate_id = crate_graph. add_crate_root (
999
1001
file_id,
1000
1002
* edition,
0 commit comments