config.rs 22.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

11
use dep_graph::SerializedDepNodeIndex;
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
use hir::def_id::{CrateNum, DefId, DefIndex};
use ty::{self, Ty, TyCtxt};
use ty::maps::queries;
use ty::subst::Substs;

use std::hash::Hash;
use syntax_pos::symbol::InternedString;

/// Query configuration and description traits.

pub trait QueryConfig {
    type Key: Eq + Hash + Clone;
    type Value;
}

27
pub(super) trait QueryDescription<'tcx>: QueryConfig {
28
    fn describe(tcx: TyCtxt, key: Self::Key) -> String;
29

30
    #[inline]
31 32 33 34
    fn cache_on_disk(_: Self::Key) -> bool {
        false
    }

35 36 37
    fn try_load_from_disk(_: TyCtxt<'_, 'tcx, 'tcx>,
                          _: SerializedDepNodeIndex)
                          -> Option<Self::Value> {
38
        bug!("QueryDescription::load_from_disk() called for an unsupported query.")
39
    }
40 41
}

42
impl<'tcx, M: QueryConfig<Key=DefId>> QueryDescription<'tcx> for M {
43
    default fn describe(tcx: TyCtxt, def_id: DefId) -> String {
44 45 46 47 48 49
        if !tcx.sess.verbose() {
            format!("processing `{}`", tcx.item_path_str(def_id))
        } else {
            let name = unsafe { ::std::intrinsics::type_name::<M>() };
            format!("processing `{}` applied to `{:?}`", name, def_id)
        }
50 51 52
    }
}

53
impl<'tcx> QueryDescription<'tcx> for queries::is_copy_raw<'tcx> {
54 55 56 57 58
    fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
        format!("computing whether `{}` is `Copy`", env.value)
    }
}

59
impl<'tcx> QueryDescription<'tcx> for queries::is_sized_raw<'tcx> {
60 61 62 63 64
    fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
        format!("computing whether `{}` is `Sized`", env.value)
    }
}

65
impl<'tcx> QueryDescription<'tcx> for queries::is_freeze_raw<'tcx> {
66 67 68 69 70
    fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
        format!("computing whether `{}` is freeze", env.value)
    }
}

71
impl<'tcx> QueryDescription<'tcx> for queries::needs_drop_raw<'tcx> {
72 73 74 75 76
    fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
        format!("computing whether `{}` needs drop", env.value)
    }
}

77
impl<'tcx> QueryDescription<'tcx> for queries::layout_raw<'tcx> {
78 79 80 81 82
    fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
        format!("computing layout of `{}`", env.value)
    }
}

83
impl<'tcx> QueryDescription<'tcx> for queries::super_predicates_of<'tcx> {
84 85 86 87 88 89
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("computing the supertraits of `{}`",
                tcx.item_path_str(def_id))
    }
}

90
impl<'tcx> QueryDescription<'tcx> for queries::erase_regions_ty<'tcx> {
91 92 93 94 95
    fn describe(_tcx: TyCtxt, ty: Ty<'tcx>) -> String {
        format!("erasing regions from `{:?}`", ty)
    }
}

96
impl<'tcx> QueryDescription<'tcx> for queries::type_param_predicates<'tcx> {
97 98 99 100 101 102 103
    fn describe(tcx: TyCtxt, (_, def_id): (DefId, DefId)) -> String {
        let id = tcx.hir.as_local_node_id(def_id).unwrap();
        format!("computing the bounds for type parameter `{}`",
                tcx.hir.ty_param_name(id))
    }
}

104
impl<'tcx> QueryDescription<'tcx> for queries::coherent_trait<'tcx> {
105
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
106 107 108 109 110
        format!("coherence checking all impls of trait `{}`",
                tcx.item_path_str(def_id))
    }
}

111
impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls<'tcx> {
112 113 114 115 116
    fn describe(_: TyCtxt, k: CrateNum) -> String {
        format!("all inherent impls defined in crate `{:?}`", k)
    }
}

117
impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls_overlap_check<'tcx> {
118 119 120 121 122
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        format!("check for overlap between inherent impls defined in this crate")
    }
}

123
impl<'tcx> QueryDescription<'tcx> for queries::crate_variances<'tcx> {
124 125 126 127 128
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("computing the variances for items in this crate")
    }
}

129
impl<'tcx> QueryDescription<'tcx> for queries::mir_shims<'tcx> {
130 131 132 133 134 135
    fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
        format!("generating MIR shim for `{}`",
                tcx.item_path_str(def.def_id()))
    }
}

136
impl<'tcx> QueryDescription<'tcx> for queries::privacy_access_levels<'tcx> {
137 138 139 140 141
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        format!("privacy access levels")
    }
}

142
impl<'tcx> QueryDescription<'tcx> for queries::typeck_item_bodies<'tcx> {
143 144 145 146 147
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        format!("type-checking all item bodies")
    }
}

148
impl<'tcx> QueryDescription<'tcx> for queries::reachable_set<'tcx> {
149 150 151 152 153
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        format!("reachability")
    }
}

154
impl<'tcx> QueryDescription<'tcx> for queries::const_eval<'tcx> {
155 156 157 158 159
    fn describe(tcx: TyCtxt, key: ty::ParamEnvAnd<'tcx, (DefId, &'tcx Substs<'tcx>)>) -> String {
        format!("const-evaluating `{}`", tcx.item_path_str(key.value.0))
    }
}

160
impl<'tcx> QueryDescription<'tcx> for queries::mir_keys<'tcx> {
161 162 163 164 165
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        format!("getting a list of all mir_keys")
    }
}

166
impl<'tcx> QueryDescription<'tcx> for queries::symbol_name<'tcx> {
167 168 169
    fn describe(_tcx: TyCtxt, instance: ty::Instance<'tcx>) -> String {
        format!("computing the symbol for `{}`", instance)
    }
170 171 172 173 174 175 176 177 178 179 180 181

    #[inline]
    fn cache_on_disk(_: Self::Key) -> bool {
        true
    }

    #[inline]
    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              id: SerializedDepNodeIndex)
                              -> Option<Self::Value> {
        tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
    }
182 183
}

184
impl<'tcx> QueryDescription<'tcx> for queries::describe_def<'tcx> {
185 186 187 188 189
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("describe_def")
    }
}

190
impl<'tcx> QueryDescription<'tcx> for queries::def_span<'tcx> {
191 192 193 194 195 196
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("def_span")
    }
}


197
impl<'tcx> QueryDescription<'tcx> for queries::lookup_stability<'tcx> {
198 199 200 201 202
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("stability")
    }
}

203
impl<'tcx> QueryDescription<'tcx> for queries::lookup_deprecation_entry<'tcx> {
204 205 206 207 208
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("deprecation")
    }
}

209
impl<'tcx> QueryDescription<'tcx> for queries::item_attrs<'tcx> {
210 211 212 213 214
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("item_attrs")
    }
}

215
impl<'tcx> QueryDescription<'tcx> for queries::is_exported_symbol<'tcx> {
216 217 218 219 220
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("is_exported_symbol")
    }
}

221
impl<'tcx> QueryDescription<'tcx> for queries::fn_arg_names<'tcx> {
222 223 224 225 226
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("fn_arg_names")
    }
}

227
impl<'tcx> QueryDescription<'tcx> for queries::impl_parent<'tcx> {
228 229 230 231 232
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("impl_parent")
    }
}

233
impl<'tcx> QueryDescription<'tcx> for queries::trait_of_item<'tcx> {
234 235 236 237 238
    fn describe(_: TyCtxt, _: DefId) -> String {
        bug!("trait_of_item")
    }
}

239
impl<'tcx> QueryDescription<'tcx> for queries::item_body_nested_bodies<'tcx> {
240 241 242 243 244
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("nested item bodies of `{}`", tcx.item_path_str(def_id))
    }
}

245
impl<'tcx> QueryDescription<'tcx> for queries::const_is_rvalue_promotable_to_static<'tcx> {
246 247 248 249
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("const checking if rvalue is promotable to static `{}`",
            tcx.item_path_str(def_id))
    }
250 251 252 253 254 255 256 257 258 259 260 261

    #[inline]
    fn cache_on_disk(_: Self::Key) -> bool {
        true
    }

    #[inline]
    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                          id: SerializedDepNodeIndex)
                          -> Option<Self::Value> {
        tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
    }
262 263
}

264
impl<'tcx> QueryDescription<'tcx> for queries::rvalue_promotable_map<'tcx> {
265 266 267 268 269 270
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("checking which parts of `{}` are promotable to static",
                tcx.item_path_str(def_id))
    }
}

271
impl<'tcx> QueryDescription<'tcx> for queries::is_mir_available<'tcx> {
272 273 274 275 276 277
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("checking if item is mir available: `{}`",
            tcx.item_path_str(def_id))
    }
}

278
impl<'tcx> QueryDescription<'tcx> for queries::trans_fulfill_obligation<'tcx> {
279 280 281
    fn describe(tcx: TyCtxt, key: (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>)) -> String {
        format!("checking if `{}` fulfills its obligations", tcx.item_path_str(key.1.def_id()))
    }
282 283 284 285 286 287 288 289 290 291 292 293

    #[inline]
    fn cache_on_disk(_: Self::Key) -> bool {
        true
    }

    #[inline]
    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              id: SerializedDepNodeIndex)
                              -> Option<Self::Value> {
        tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
    }
294 295
}

296
impl<'tcx> QueryDescription<'tcx> for queries::trait_impls_of<'tcx> {
297 298 299 300 301
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("trait impls of `{}`", tcx.item_path_str(def_id))
    }
}

302
impl<'tcx> QueryDescription<'tcx> for queries::is_object_safe<'tcx> {
303 304 305 306 307
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("determine object safety of trait `{}`", tcx.item_path_str(def_id))
    }
}

308
impl<'tcx> QueryDescription<'tcx> for queries::is_const_fn<'tcx> {
309 310 311 312 313
    fn describe(tcx: TyCtxt, def_id: DefId) -> String {
        format!("checking if item is const fn: `{}`", tcx.item_path_str(def_id))
    }
}

314
impl<'tcx> QueryDescription<'tcx> for queries::dylib_dependency_formats<'tcx> {
315 316 317 318 319
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        "dylib dependency formats of crate".to_string()
    }
}

320
impl<'tcx> QueryDescription<'tcx> for queries::is_panic_runtime<'tcx> {
321 322 323 324 325
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        "checking if the crate is_panic_runtime".to_string()
    }
}

326
impl<'tcx> QueryDescription<'tcx> for queries::is_compiler_builtins<'tcx> {
327 328 329 330 331
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        "checking if the crate is_compiler_builtins".to_string()
    }
}

332
impl<'tcx> QueryDescription<'tcx> for queries::has_global_allocator<'tcx> {
333 334 335 336 337
    fn describe(_: TyCtxt, _: CrateNum) -> String {
        "checking if the crate has_global_allocator".to_string()
    }
}

338
impl<'tcx> QueryDescription<'tcx> for queries::extern_crate<'tcx> {
339 340 341 342 343
    fn describe(_: TyCtxt, _: DefId) -> String {
        "getting crate's ExternCrateData".to_string()
    }
}

344
impl<'tcx> QueryDescription<'tcx> for queries::lint_levels<'tcx> {
345 346 347 348 349
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("computing the lint levels for items in this crate")
    }
}

350
impl<'tcx> QueryDescription<'tcx> for queries::specializes<'tcx> {
351 352 353 354 355
    fn describe(_tcx: TyCtxt, _: (DefId, DefId)) -> String {
        format!("computing whether impls specialize one another")
    }
}

356
impl<'tcx> QueryDescription<'tcx> for queries::in_scope_traits_map<'tcx> {
357 358 359 360 361
    fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
        format!("traits in scope at a block")
    }
}

362
impl<'tcx> QueryDescription<'tcx> for queries::is_no_builtins<'tcx> {
363 364 365 366 367
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("test whether a crate has #![no_builtins]")
    }
}

368
impl<'tcx> QueryDescription<'tcx> for queries::panic_strategy<'tcx> {
369 370 371 372 373
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("query a crate's configured panic strategy")
    }
}

374
impl<'tcx> QueryDescription<'tcx> for queries::is_profiler_runtime<'tcx> {
375 376 377 378 379
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("query a crate is #![profiler_runtime]")
    }
}

380
impl<'tcx> QueryDescription<'tcx> for queries::is_sanitizer_runtime<'tcx> {
381 382 383 384 385
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("query a crate is #![sanitizer_runtime]")
    }
}

386
impl<'tcx> QueryDescription<'tcx> for queries::exported_symbol_ids<'tcx> {
387 388 389 390 391
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the exported symbols of a crate")
    }
}

392
impl<'tcx> QueryDescription<'tcx> for queries::native_libraries<'tcx> {
393 394 395 396 397
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the native libraries of a linked crate")
    }
}

398
impl<'tcx> QueryDescription<'tcx> for queries::plugin_registrar_fn<'tcx> {
399 400 401 402 403
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the plugin registrar for a crate")
    }
}

404
impl<'tcx> QueryDescription<'tcx> for queries::derive_registrar_fn<'tcx> {
405 406 407 408 409
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the derive registrar for a crate")
    }
}

410
impl<'tcx> QueryDescription<'tcx> for queries::crate_disambiguator<'tcx> {
411 412 413 414 415
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the disambiguator a crate")
    }
}

416
impl<'tcx> QueryDescription<'tcx> for queries::crate_hash<'tcx> {
417 418 419 420 421
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the hash a crate")
    }
}

422
impl<'tcx> QueryDescription<'tcx> for queries::original_crate_name<'tcx> {
423 424 425 426 427
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the original name a crate")
    }
}

428
impl<'tcx> QueryDescription<'tcx> for queries::implementations_of_trait<'tcx> {
429 430 431 432 433
    fn describe(_tcx: TyCtxt, _: (CrateNum, DefId)) -> String {
        format!("looking up implementations of a trait in a crate")
    }
}

434
impl<'tcx> QueryDescription<'tcx> for queries::all_trait_implementations<'tcx> {
435 436 437 438 439
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up all (?) trait implementations")
    }
}

440
impl<'tcx> QueryDescription<'tcx> for queries::link_args<'tcx> {
441 442 443 444 445
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up link arguments for a crate")
    }
}

446 447 448 449 450 451
impl<'tcx> QueryDescription<'tcx> for queries::resolve_lifetimes<'tcx> {
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("resolving lifetimes")
    }
}

452
impl<'tcx> QueryDescription<'tcx> for queries::named_region_map<'tcx> {
453 454 455 456 457
    fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
        format!("looking up a named region")
    }
}

458
impl<'tcx> QueryDescription<'tcx> for queries::is_late_bound_map<'tcx> {
459 460 461 462 463
    fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
        format!("testing if a region is late boudn")
    }
}

464
impl<'tcx> QueryDescription<'tcx> for queries::object_lifetime_defaults_map<'tcx> {
465 466 467 468 469
    fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
        format!("looking up lifetime defaults for a region")
    }
}

470
impl<'tcx> QueryDescription<'tcx> for queries::dep_kind<'tcx> {
471 472 473 474 475
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("fetching what a dependency looks like")
    }
}

476
impl<'tcx> QueryDescription<'tcx> for queries::crate_name<'tcx> {
477 478 479 480 481
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("fetching what a crate is named")
    }
}

482
impl<'tcx> QueryDescription<'tcx> for queries::get_lang_items<'tcx> {
483 484 485 486 487
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("calculating the lang items map")
    }
}

488
impl<'tcx> QueryDescription<'tcx> for queries::defined_lang_items<'tcx> {
489 490 491 492 493
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("calculating the lang items defined in a crate")
    }
}

494
impl<'tcx> QueryDescription<'tcx> for queries::missing_lang_items<'tcx> {
495 496 497 498 499
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("calculating the missing lang items in a crate")
    }
}

500
impl<'tcx> QueryDescription<'tcx> for queries::visible_parent_map<'tcx> {
501 502 503 504 505
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("calculating the visible parent map")
    }
}

506
impl<'tcx> QueryDescription<'tcx> for queries::missing_extern_crate_item<'tcx> {
507 508 509 510 511
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("seeing if we're missing an `extern crate` item for this crate")
    }
}

512
impl<'tcx> QueryDescription<'tcx> for queries::used_crate_source<'tcx> {
513 514 515 516 517
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking at the source for a crate")
    }
}

518
impl<'tcx> QueryDescription<'tcx> for queries::postorder_cnums<'tcx> {
519 520 521 522 523
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("generating a postorder list of CrateNums")
    }
}

524
impl<'tcx> QueryDescription<'tcx> for queries::maybe_unused_extern_crates<'tcx> {
525 526 527 528 529
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up all possibly unused extern crates")
    }
}

530
impl<'tcx> QueryDescription<'tcx> for queries::stability_index<'tcx> {
531 532 533 534 535
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("calculating the stability index for the local crate")
    }
}

536
impl<'tcx> QueryDescription<'tcx> for queries::all_crate_nums<'tcx> {
537 538 539 540 541
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("fetching all foreign CrateNum instances")
    }
}

542
impl<'tcx> QueryDescription<'tcx> for queries::exported_symbols<'tcx> {
543 544 545 546 547
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("exported_symbols")
    }
}

548
impl<'tcx> QueryDescription<'tcx> for queries::collect_and_partition_translation_items<'tcx> {
549 550 551 552 553
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("collect_and_partition_translation_items")
    }
}

554
impl<'tcx> QueryDescription<'tcx> for queries::codegen_unit<'tcx> {
555 556 557 558 559
    fn describe(_tcx: TyCtxt, _: InternedString) -> String {
        format!("codegen_unit")
    }
}

560
impl<'tcx> QueryDescription<'tcx> for queries::compile_codegen_unit<'tcx> {
561 562 563 564 565
    fn describe(_tcx: TyCtxt, _: InternedString) -> String {
        format!("compile_codegen_unit")
    }
}

566
impl<'tcx> QueryDescription<'tcx> for queries::output_filenames<'tcx> {
567 568 569 570
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("output_filenames")
    }
}
S
Fix ICE  
scalexm 已提交
571

572
impl<'tcx> QueryDescription<'tcx> for queries::has_clone_closures<'tcx> {
S
Fix ICE  
scalexm 已提交
573 574 575 576 577
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("seeing if the crate has enabled `Clone` closures")
    }
}

578
impl<'tcx> QueryDescription<'tcx> for queries::vtable_methods<'tcx> {
579 580 581 582 583
    fn describe(tcx: TyCtxt, key: ty::PolyTraitRef<'tcx> ) -> String {
        format!("finding all methods for trait {}", tcx.item_path_str(key.def_id()))
    }
}

584
impl<'tcx> QueryDescription<'tcx> for queries::has_copy_closures<'tcx> {
S
Fix ICE  
scalexm 已提交
585 586 587 588
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("seeing if the crate has enabled `Copy` closures")
    }
}
589

590
impl<'tcx> QueryDescription<'tcx> for queries::fully_normalize_monormophic_ty<'tcx> {
591
    fn describe(_tcx: TyCtxt, _: Ty) -> String {
592
        format!("normalizing types")
593
    }
594
}
595

596 597 598 599 600 601
impl<'tcx> QueryDescription<'tcx> for queries::features_query<'tcx> {
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up enabled feature gates")
    }
}

602 603 604 605 606 607
impl<'tcx> QueryDescription<'tcx> for queries::typeck_tables_of<'tcx> {
    #[inline]
    fn cache_on_disk(def_id: Self::Key) -> bool {
        def_id.is_local()
    }

608 609 610
    fn try_load_from_disk(tcx: TyCtxt<'_, 'tcx, 'tcx>,
                          id: SerializedDepNodeIndex)
                          -> Option<Self::Value> {
611 612 613 614 615
        let typeck_tables: Option<ty::TypeckTables<'tcx>> = tcx
            .on_disk_query_result_cache
            .try_load_query_result(tcx, id);

        typeck_tables.map(|tables| tcx.alloc_tables(tables))
616 617 618
    }
}

619 620 621 622 623 624 625
impl<'tcx> QueryDescription<'tcx> for queries::optimized_mir<'tcx> {
    #[inline]
    fn cache_on_disk(def_id: Self::Key) -> bool {
        def_id.is_local()
    }

    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
626 627
                              id: SerializedDepNodeIndex)
                              -> Option<Self::Value> {
628 629 630 631 632 633
        let mir: Option<::mir::Mir<'tcx>> = tcx.on_disk_query_result_cache
                                               .try_load_query_result(tcx, id);
        mir.map(|x| tcx.alloc_mir(x))
    }
}

634 635 636 637 638 639
impl<'tcx> QueryDescription<'tcx> for queries::substitute_normalize_and_test_predicates<'tcx> {
    fn describe(tcx: TyCtxt, key: (DefId, &'tcx Substs<'tcx>)) -> String {
        format!("testing substituted normalized predicates:`{}`", tcx.item_path_str(key.0))
    }
}

640 641 642 643 644 645
impl<'tcx> QueryDescription<'tcx> for queries::target_features_whitelist<'tcx> {
    fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
        format!("looking up the whitelist of target features")
    }
}

V
varkor 已提交
646 647 648 649 650 651
impl<'tcx> QueryDescription<'tcx> for queries::instance_def_size_estimate<'tcx> {
    fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
        format!("estimating size for `{}`", tcx.item_path_str(def.def_id()))
    }
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
impl<'tcx> QueryDescription<'tcx> for queries::generics_of<'tcx> {
    #[inline]
    fn cache_on_disk(def_id: Self::Key) -> bool {
        def_id.is_local()
    }

    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              id: SerializedDepNodeIndex)
                              -> Option<Self::Value> {
        let generics: Option<ty::Generics> = tcx.on_disk_query_result_cache
                                                .try_load_query_result(tcx, id);
        generics.map(|x| tcx.alloc_generics(x))
    }
}

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
macro_rules! impl_disk_cacheable_query(
    ($query_name:ident, |$key:tt| $cond:expr) => {
        impl<'tcx> QueryDescription<'tcx> for queries::$query_name<'tcx> {
            #[inline]
            fn cache_on_disk($key: Self::Key) -> bool {
                $cond
            }

            #[inline]
            fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                                      id: SerializedDepNodeIndex)
                                      -> Option<Self::Value> {
                tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
            }
        }
    }
);

impl_disk_cacheable_query!(unsafety_check_result, |def_id| def_id.is_local());
impl_disk_cacheable_query!(borrowck, |def_id| def_id.is_local());
impl_disk_cacheable_query!(mir_borrowck, |def_id| def_id.is_local());
impl_disk_cacheable_query!(mir_const_qualif, |def_id| def_id.is_local());
689
impl_disk_cacheable_query!(check_match, |def_id| def_id.is_local());
690 691
impl_disk_cacheable_query!(contains_extern_indicator, |_| true);
impl_disk_cacheable_query!(def_symbol_name, |_| true);
692 693 694
impl_disk_cacheable_query!(type_of, |def_id| def_id.is_local());
impl_disk_cacheable_query!(predicates_of, |def_id| def_id.is_local());
impl_disk_cacheable_query!(used_trait_imports, |def_id| def_id.is_local());