@@ -86,6 +86,8 @@ pub enum ProjectWorkspace {
86
86
toolchain : Option < Version > ,
87
87
/// The target data layout queried for workspace.
88
88
target_layout : TargetLayoutLoadResult ,
89
+ /// A set of cfg overrides for this workspace.
90
+ cfg_overrides : CfgOverrides ,
89
91
} ,
90
92
// FIXME: The primary limitation of this approach is that the set of detached files needs to be fixed at the beginning.
91
93
// That's not the end user experience we should strive for.
@@ -111,6 +113,8 @@ pub enum ProjectWorkspace {
111
113
toolchain : Option < Version > ,
112
114
/// The target data layout queried for workspace.
113
115
target_layout : TargetLayoutLoadResult ,
116
+ /// A set of cfg overrides for the files.
117
+ cfg_overrides : CfgOverrides ,
114
118
} ,
115
119
}
116
120
@@ -149,6 +153,7 @@ impl fmt::Debug for ProjectWorkspace {
149
153
rustc_cfg,
150
154
toolchain,
151
155
target_layout : data_layout,
156
+ cfg_overrides,
152
157
} => {
153
158
let mut debug_struct = f. debug_struct ( "Json" ) ;
154
159
debug_struct. field ( "n_crates" , & project. n_crates ( ) ) ;
@@ -158,7 +163,8 @@ impl fmt::Debug for ProjectWorkspace {
158
163
debug_struct
159
164
. field ( "n_rustc_cfg" , & rustc_cfg. len ( ) )
160
165
. field ( "toolchain" , & toolchain)
161
- . field ( "data_layout" , & data_layout) ;
166
+ . field ( "data_layout" , & data_layout)
167
+ . field ( "n_cfg_overrides" , & cfg_overrides. len ( ) ) ;
162
168
debug_struct. finish ( )
163
169
}
164
170
ProjectWorkspace :: DetachedFiles {
@@ -167,13 +173,15 @@ impl fmt::Debug for ProjectWorkspace {
167
173
rustc_cfg,
168
174
toolchain,
169
175
target_layout,
176
+ cfg_overrides,
170
177
} => f
171
178
. debug_struct ( "DetachedFiles" )
172
179
. field ( "n_files" , & files. len ( ) )
173
180
. field ( "sysroot" , & sysroot. is_ok ( ) )
174
181
. field ( "n_rustc_cfg" , & rustc_cfg. len ( ) )
175
182
. field ( "toolchain" , & toolchain)
176
183
. field ( "data_layout" , & target_layout)
184
+ . field ( "n_cfg_overrides" , & cfg_overrides. len ( ) )
177
185
. finish ( ) ,
178
186
}
179
187
}
@@ -227,6 +235,7 @@ impl ProjectWorkspace {
227
235
project_json,
228
236
config. target . as_deref ( ) ,
229
237
& config. extra_env ,
238
+ & config. cfg_overrides ,
230
239
)
231
240
}
232
241
ProjectManifest :: CargoToml ( cargo_toml) => {
@@ -368,6 +377,7 @@ impl ProjectWorkspace {
368
377
project_json : ProjectJson ,
369
378
target : Option < & str > ,
370
379
extra_env : & FxHashMap < String , String > ,
380
+ cfg_overrides : & CfgOverrides ,
371
381
) -> ProjectWorkspace {
372
382
let sysroot = match ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) {
373
383
( Some ( sysroot) , Some ( sysroot_src) ) => {
@@ -414,6 +424,7 @@ impl ProjectWorkspace {
414
424
rustc_cfg,
415
425
toolchain,
416
426
target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
427
+ cfg_overrides : cfg_overrides. clone ( ) ,
417
428
}
418
429
}
419
430
@@ -464,6 +475,7 @@ impl ProjectWorkspace {
464
475
rustc_cfg,
465
476
toolchain,
466
477
target_layout : data_layout. map ( Arc :: from) . map_err ( |it| Arc :: from ( it. to_string ( ) ) ) ,
478
+ cfg_overrides : config. cfg_overrides . clone ( ) ,
467
479
} )
468
480
}
469
481
@@ -619,6 +631,7 @@ impl ProjectWorkspace {
619
631
rustc_cfg : _,
620
632
toolchain : _,
621
633
target_layout : _,
634
+ cfg_overrides : _,
622
635
} => project
623
636
. crates ( )
624
637
. map ( |( _, krate) | PackageRoot {
@@ -734,13 +747,15 @@ impl ProjectWorkspace {
734
747
rustc_cfg,
735
748
toolchain : _,
736
749
target_layout : _,
750
+ cfg_overrides,
737
751
} => (
738
752
project_json_to_crate_graph (
739
753
rustc_cfg. clone ( ) ,
740
754
load,
741
755
project,
742
756
sysroot. as_ref ( ) . ok ( ) ,
743
757
extra_env,
758
+ cfg_overrides,
744
759
) ,
745
760
sysroot,
746
761
) ,
@@ -772,12 +787,14 @@ impl ProjectWorkspace {
772
787
rustc_cfg,
773
788
toolchain : _,
774
789
target_layout : _,
790
+ cfg_overrides,
775
791
} => (
776
792
detached_files_to_crate_graph (
777
793
rustc_cfg. clone ( ) ,
778
794
load,
779
795
files,
780
796
sysroot. as_ref ( ) . ok ( ) ,
797
+ cfg_overrides,
781
798
) ,
782
799
sysroot,
783
800
) ,
@@ -828,35 +845,53 @@ impl ProjectWorkspace {
828
845
&& cargo_config_extra_env == o_cargo_config_extra_env
829
846
}
830
847
(
831
- Self :: Json { project, sysroot, rustc_cfg, toolchain, target_layout : _ } ,
848
+ Self :: Json {
849
+ project,
850
+ sysroot,
851
+ rustc_cfg,
852
+ toolchain,
853
+ target_layout : _,
854
+ cfg_overrides,
855
+ } ,
832
856
Self :: Json {
833
857
project : o_project,
834
858
sysroot : o_sysroot,
835
859
rustc_cfg : o_rustc_cfg,
836
860
toolchain : o_toolchain,
837
861
target_layout : _,
862
+ cfg_overrides : o_cfg_overrides,
838
863
} ,
839
864
) => {
840
865
project == o_project
841
866
&& rustc_cfg == o_rustc_cfg
842
867
&& sysroot == o_sysroot
843
868
&& toolchain == o_toolchain
869
+ && cfg_overrides == o_cfg_overrides
844
870
}
845
871
(
846
- Self :: DetachedFiles { files, sysroot, rustc_cfg, toolchain, target_layout } ,
872
+ Self :: DetachedFiles {
873
+ files,
874
+ sysroot,
875
+ rustc_cfg,
876
+ toolchain,
877
+ target_layout,
878
+ cfg_overrides,
879
+ } ,
847
880
Self :: DetachedFiles {
848
881
files : o_files,
849
882
sysroot : o_sysroot,
850
883
rustc_cfg : o_rustc_cfg,
851
884
toolchain : o_toolchain,
852
885
target_layout : o_target_layout,
886
+ cfg_overrides : o_cfg_overrides,
853
887
} ,
854
888
) => {
855
889
files == o_files
856
890
&& sysroot == o_sysroot
857
891
&& rustc_cfg == o_rustc_cfg
858
892
&& toolchain == o_toolchain
859
893
&& target_layout == o_target_layout
894
+ && cfg_overrides == o_cfg_overrides
860
895
}
861
896
_ => false ,
862
897
}
@@ -877,6 +912,7 @@ fn project_json_to_crate_graph(
877
912
project : & ProjectJson ,
878
913
sysroot : Option < & Sysroot > ,
879
914
extra_env : & FxHashMap < String , String > ,
915
+ override_cfg : & CfgOverrides ,
880
916
) -> ( CrateGraph , ProcMacroPaths ) {
881
917
let mut res = ( CrateGraph :: default ( ) , ProcMacroPaths :: default ( ) ) ;
882
918
let ( crate_graph, proc_macros) = & mut res;
@@ -916,19 +952,22 @@ fn project_json_to_crate_graph(
916
952
None => & rustc_cfg,
917
953
} ;
918
954
955
+ let mut cfg_options = target_cfgs
956
+ . iter ( )
957
+ . chain ( cfg. iter ( ) )
958
+ . chain ( iter:: once ( & r_a_cfg_flag) )
959
+ . cloned ( )
960
+ . collect ( ) ;
961
+ override_cfg. apply (
962
+ & mut cfg_options,
963
+ display_name. as_ref ( ) . map ( |it| it. canonical_name ( ) ) . unwrap_or_default ( ) ,
964
+ ) ;
919
965
let crate_graph_crate_id = crate_graph. add_crate_root (
920
966
file_id,
921
967
* edition,
922
968
display_name. clone ( ) ,
923
969
version. clone ( ) ,
924
- Arc :: new (
925
- target_cfgs
926
- . iter ( )
927
- . chain ( cfg. iter ( ) )
928
- . chain ( iter:: once ( & r_a_cfg_flag) )
929
- . cloned ( )
930
- . collect ( ) ,
931
- ) ,
970
+ Arc :: new ( cfg_options) ,
932
971
None ,
933
972
env,
934
973
* is_proc_macro,
@@ -992,7 +1031,7 @@ fn cargo_to_crate_graph(
992
1031
None => ( SysrootPublicDeps :: default ( ) , None ) ,
993
1032
} ;
994
1033
995
- let cfg_options = create_cfg_options ( rustc_cfg) ;
1034
+ let cfg_options = CfgOptions :: from_iter ( rustc_cfg) ;
996
1035
997
1036
// Mapping of a package to its library target
998
1037
let mut pkg_to_lib_crate = FxHashMap :: default ( ) ;
@@ -1168,6 +1207,7 @@ fn detached_files_to_crate_graph(
1168
1207
load : FileLoader < ' _ > ,
1169
1208
detached_files : & [ AbsPathBuf ] ,
1170
1209
sysroot : Option < & Sysroot > ,
1210
+ override_cfg : & CfgOverrides ,
1171
1211
) -> ( CrateGraph , ProcMacroPaths ) {
1172
1212
let _p = tracing:: span!( tracing:: Level :: INFO , "detached_files_to_crate_graph" ) . entered ( ) ;
1173
1213
let mut crate_graph = CrateGraph :: default ( ) ;
@@ -1176,8 +1216,10 @@ fn detached_files_to_crate_graph(
1176
1216
None => ( SysrootPublicDeps :: default ( ) , None ) ,
1177
1217
} ;
1178
1218
1179
- let mut cfg_options = create_cfg_options ( rustc_cfg) ;
1219
+ let mut cfg_options = CfgOptions :: from_iter ( rustc_cfg) ;
1220
+ cfg_options. insert_atom ( "test" . into ( ) ) ;
1180
1221
cfg_options. insert_atom ( "rust_analyzer" . into ( ) ) ;
1222
+ override_cfg. apply ( & mut cfg_options, "" ) ;
1181
1223
let cfg_options = Arc :: new ( cfg_options) ;
1182
1224
1183
1225
for detached_file in detached_files {
@@ -1411,7 +1453,11 @@ fn sysroot_to_crate_graph(
1411
1453
cargo,
1412
1454
None ,
1413
1455
rustc_cfg,
1414
- & CfgOverrides :: default ( ) ,
1456
+ & CfgOverrides {
1457
+ global : CfgDiff :: new ( vec ! [ CfgAtom :: Flag ( "debug_assertions" . into( ) ) ] , vec ! [ ] )
1458
+ . unwrap ( ) ,
1459
+ ..Default :: default ( )
1460
+ } ,
1415
1461
& WorkspaceBuildScripts :: default ( ) ,
1416
1462
) ;
1417
1463
@@ -1469,7 +1515,12 @@ fn sysroot_to_crate_graph(
1469
1515
( SysrootPublicDeps { deps : pub_deps } , libproc_macro)
1470
1516
}
1471
1517
SysrootMode :: Stitched ( stitched) => {
1472
- let cfg_options = Arc :: new ( create_cfg_options ( rustc_cfg) ) ;
1518
+ let cfg_options = Arc :: new ( {
1519
+ let mut cfg_options = CfgOptions :: default ( ) ;
1520
+ cfg_options. extend ( rustc_cfg) ;
1521
+ cfg_options. insert_atom ( "debug_assertions" . into ( ) ) ;
1522
+ cfg_options
1523
+ } ) ;
1473
1524
let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = stitched
1474
1525
. crates ( )
1475
1526
. filter_map ( |krate| {
@@ -1542,10 +1593,3 @@ fn add_dep_inner(graph: &mut CrateGraph, from: CrateId, dep: Dependency) {
1542
1593
tracing:: error!( "{}" , err)
1543
1594
}
1544
1595
}
1545
-
1546
- fn create_cfg_options ( rustc_cfg : Vec < CfgFlag > ) -> CfgOptions {
1547
- let mut cfg_options = CfgOptions :: default ( ) ;
1548
- cfg_options. extend ( rustc_cfg) ;
1549
- cfg_options. insert_atom ( "debug_assertions" . into ( ) ) ;
1550
- cfg_options
1551
- }
0 commit comments