@@ -55,6 +55,9 @@ enum QueryModifier {
55
55
56
56
/// Always evaluate the query, ignoring its dependencies
57
57
EvalAlways ( Ident ) ,
58
+
59
+ /// Use a separate query provider for local and extern crates
60
+ SeparateProvideExtern ( Ident ) ,
58
61
}
59
62
60
63
impl Parse for QueryModifier {
@@ -118,6 +121,8 @@ impl Parse for QueryModifier {
118
121
Ok ( QueryModifier :: Anon ( modifier) )
119
122
} else if modifier == "eval_always" {
120
123
Ok ( QueryModifier :: EvalAlways ( modifier) )
124
+ } else if modifier == "separate_provide_extern" {
125
+ Ok ( QueryModifier :: SeparateProvideExtern ( modifier) )
121
126
} else {
122
127
Err ( Error :: new ( modifier. span ( ) , "unknown query modifier" ) )
123
128
}
@@ -214,6 +219,9 @@ struct QueryModifiers {
214
219
215
220
// Always evaluate the query, ignoring its dependencies
216
221
eval_always : Option < Ident > ,
222
+
223
+ /// Use a separate query provider for local and extern crates
224
+ separate_provide_extern : Option < Ident > ,
217
225
}
218
226
219
227
/// Process query modifiers into a struct, erroring on duplicates
@@ -227,6 +235,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
227
235
let mut no_hash = None ;
228
236
let mut anon = None ;
229
237
let mut eval_always = None ;
238
+ let mut separate_provide_extern = None ;
230
239
for modifier in query. modifiers . 0 . drain ( ..) {
231
240
match modifier {
232
241
QueryModifier :: LoadCached ( tcx, id, block) => {
@@ -317,6 +326,15 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
317
326
}
318
327
eval_always = Some ( ident) ;
319
328
}
329
+ QueryModifier :: SeparateProvideExtern ( ident) => {
330
+ if separate_provide_extern. is_some ( ) {
331
+ panic ! (
332
+ "duplicate modifier `separate_provide_extern` for query `{}`" ,
333
+ query. name
334
+ ) ;
335
+ }
336
+ separate_provide_extern = Some ( ident) ;
337
+ }
320
338
}
321
339
}
322
340
let desc = desc. unwrap_or_else ( || {
@@ -332,6 +350,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
332
350
no_hash,
333
351
anon,
334
352
eval_always,
353
+ separate_provide_extern,
335
354
}
336
355
}
337
356
@@ -462,6 +481,10 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
462
481
if let Some ( eval_always) = & modifiers. eval_always {
463
482
attributes. push ( quote ! { ( #eval_always) } ) ;
464
483
} ;
484
+ // Pass on the separate_provide_extern modifier
485
+ if let Some ( separate_provide_extern) = & modifiers. separate_provide_extern {
486
+ attributes. push ( quote ! { ( #separate_provide_extern) } ) ;
487
+ }
465
488
466
489
// This uses the span of the query definition for the commas,
467
490
// which can be important if we later encounter any ambiguity
0 commit comments