1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! Module for inferring the variance of type and lifetime
12 //! parameters. See README.md for details.
15 use rustc
::dep_graph
::DepKind
;
17 use rustc
::hir
::def_id
::{CrateNum, DefId, LOCAL_CRATE}
;
18 use rustc
::ty
::{self, CrateVariancesMap, TyCtxt}
;
19 use rustc
::ty
::maps
::Providers
;
22 /// Defines the `TermsContext` basically houses an arena where we can
26 /// Code to gather up constraints.
29 /// Code to solve constraints and write out the results.
32 /// Code to write unit tests of variance.
35 /// Code for transforming variances.
38 pub fn provide(providers
: &mut Providers
) {
39 *providers
= Providers
{
46 fn crate_variances
<'a
, 'tcx
>(tcx
: TyCtxt
<'a
, 'tcx
, 'tcx
>, crate_num
: CrateNum
)
47 -> Rc
<CrateVariancesMap
> {
48 assert_eq
!(crate_num
, LOCAL_CRATE
);
49 let mut arena
= arena
::TypedArena
::new();
50 let terms_cx
= terms
::determine_parameters_to_be_inferred(tcx
, &mut arena
);
51 let constraints_cx
= constraints
::add_constraints_from_crate(terms_cx
);
52 Rc
::new(solve
::solve_constraints(constraints_cx
))
55 fn variances_of
<'a
, 'tcx
>(tcx
: TyCtxt
<'a
, 'tcx
, 'tcx
>, item_def_id
: DefId
)
56 -> Rc
<Vec
<ty
::Variance
>> {
57 let id
= tcx
.hir
.as_local_node_id(item_def_id
).expect("expected local def-id");
58 let unsupported
= || {
59 // Variance not relevant.
60 span_bug
!(tcx
.hir
.span(id
), "asked to compute variance for wrong kind of item")
62 match tcx
.hir
.get(id
) {
63 hir
::map
::NodeItem(item
) => match item
.node
{
72 hir
::map
::NodeTraitItem(item
) => match item
.node
{
73 hir
::TraitItemKind
::Method(..) => {}
78 hir
::map
::NodeImplItem(item
) => match item
.node
{
79 hir
::ImplItemKind
::Method(..) => {}
84 hir
::map
::NodeForeignItem(item
) => match item
.node
{
85 hir
::ForeignItemFn(..) => {}
90 hir
::map
::NodeVariant(_
) | hir
::map
::NodeStructCtor(_
) => {}
95 // Everything else must be inferred.
97 let crate_map
= tcx
.crate_variances(LOCAL_CRATE
);
98 let dep_node
= item_def_id
.to_dep_node(tcx
, DepKind
::ItemVarianceConstraints
);
99 tcx
.dep_graph
.read(dep_node
);
101 crate_map
.variances
.get(&item_def_id
)
102 .unwrap_or(&crate_map
.empty_variance
)