frontend 0.4.0

rustc's frontend with no LLVM and no std: parsing through MIR, as a library
use crate::rustc_data_structures::fx::FxIndexMap;
use crate::rustc_middle::ty::TyCtxt;

use crate::rustc_passes::diagnostics::GlobOrListDelegationUnusedTargetExpr;

pub fn check_glob_and_list_delegations_target_expr(tcx: TyCtxt<'_>) {
    let mut delegations_by_group_id = FxIndexMap::default();

    for &id in tcx.resolutions(()).delegation_infos.keys() {
        if let Some(info) = tcx.hir_opt_delegation_info(id)
            && let Some((group_id, unused_target_expr)) = info.group_id
        {
            delegations_by_group_id
                .entry(group_id)
                .or_insert_with(|| (true, tcx.def_span(id)))
                .0 &= unused_target_expr;
        }
    }

    for (_, (unused_target_expr, span)) in delegations_by_group_id {
        if unused_target_expr {
            tcx.dcx().emit_err(GlobOrListDelegationUnusedTargetExpr { span });
        }
    }
}