// For proj. cache, we just keep a list of all def-ids, since it is
// not a hotspot.
ProjectionCache { def_ids: Vec<D> },
+
+ // Depnodes for MetaData
+ DescribeDef(D),
+ DefSpan(D),
}
impl<D: Clone + Debug> DepNode<D> {
let def_ids: Option<Vec<E>> = def_ids.iter().map(op).collect();
def_ids.map(|d| ProjectionCache { def_ids: d })
}
+ DescribeDef(ref d) => op(d).map(MetaData),
+ DefSpan(ref d) => op(d).map(MetaData),
}
}
}
}
// FIXME(eddyb) Get more valid Span's on queries.
+ // def_span guard is necesary to prevent a recursive loop,
+ // default_span calls def_span query internally.
if span == DUMMY_SP && stringify!($name) != "def_span" {
span = key.default_span(tcx)
}
[] def_symbol_name: SymbolName(DefId) -> ty::SymbolName,
[] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName,
-
- [] describe_def: MetaData(DefId) -> Option<Def>,
- [] def_span: MetaData(DefId) -> Span
+ [] describe_def: describe_def(DefId) -> Option<Def>,
+ [] def_span: def_span(DefId) -> Span
}
fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode<DefId> {
fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode<DefId> {
DepNode::ConstEval(def_id)
}
+
+fn describe_def(def_id: DefId) -> DepNode<DefId> {
+ DepNode::DescribeDef(def_id)
+}
+
+fn def_span(def_id: DefId) -> DepNode<DefId> {
+ DepNode::DefSpan(def_id)
+}