@@ -55,6 +55,9 @@ enum QueryModifier {
5555
5656 /// Always evaluate the query, ignoring its dependencies
5757 EvalAlways ( Ident ) ,
58+
59+ /// Use a separate query provider for local and extern crates
60+ SeparateProvideExtern ( Ident ) ,
5861}
5962
6063impl Parse for QueryModifier {
@@ -118,6 +121,8 @@ impl Parse for QueryModifier {
118121 Ok ( QueryModifier :: Anon ( modifier) )
119122 } else if modifier == "eval_always" {
120123 Ok ( QueryModifier :: EvalAlways ( modifier) )
124+ } else if modifier == "separate_provide_extern" {
125+ Ok ( QueryModifier :: SeparateProvideExtern ( modifier) )
121126 } else {
122127 Err ( Error :: new ( modifier. span ( ) , "unknown query modifier" ) )
123128 }
@@ -214,6 +219,9 @@ struct QueryModifiers {
214219
215220 // Always evaluate the query, ignoring its dependencies
216221 eval_always : Option < Ident > ,
222+
223+ /// Use a separate query provider for local and extern crates
224+ separate_provide_extern : Option < Ident > ,
217225}
218226
219227/// Process query modifiers into a struct, erroring on duplicates
@@ -227,6 +235,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
227235 let mut no_hash = None ;
228236 let mut anon = None ;
229237 let mut eval_always = None ;
238+ let mut separate_provide_extern = None ;
230239 for modifier in query. modifiers . 0 . drain ( ..) {
231240 match modifier {
232241 QueryModifier :: LoadCached ( tcx, id, block) => {
@@ -317,6 +326,15 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
317326 }
318327 eval_always = Some ( ident) ;
319328 }
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+ }
320338 }
321339 }
322340 let desc = desc. unwrap_or_else ( || {
@@ -332,6 +350,7 @@ fn process_modifiers(query: &mut Query) -> QueryModifiers {
332350 no_hash,
333351 anon,
334352 eval_always,
353+ separate_provide_extern,
335354 }
336355}
337356
@@ -462,6 +481,10 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
462481 if let Some ( eval_always) = & modifiers. eval_always {
463482 attributes. push ( quote ! { ( #eval_always) } ) ;
464483 } ;
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+ }
465488
466489 // This uses the span of the query definition for the commas,
467490 // which can be important if we later encounter any ambiguity
0 commit comments