|
|
|
|
@@ -122,7 +122,7 @@ pub trait AstConv<'tcx> {
|
|
|
|
|
&self,
|
|
|
|
|
span: Span,
|
|
|
|
|
item_def_id: DefId,
|
|
|
|
|
item_segment: &hir::PathSegment<'_>,
|
|
|
|
|
item_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
poly_trait_ref: ty::PolyTraitRef<'tcx>,
|
|
|
|
|
) -> Ty<'tcx>;
|
|
|
|
|
|
|
|
|
|
@@ -156,14 +156,14 @@ struct ConvertedBinding<'a, 'tcx> {
|
|
|
|
|
hir_id: hir::HirId,
|
|
|
|
|
item_name: Ident,
|
|
|
|
|
kind: ConvertedBindingKind<'a, 'tcx>,
|
|
|
|
|
gen_args: &'a GenericArgs<'a>,
|
|
|
|
|
gen_args: &'tcx GenericArgs<'tcx>,
|
|
|
|
|
span: Span,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
enum ConvertedBindingKind<'a, 'tcx> {
|
|
|
|
|
Equality(Spanned<ty::Term<'tcx>>),
|
|
|
|
|
Constraint(&'a [hir::GenericBound<'a>]),
|
|
|
|
|
Constraint(&'a [hir::GenericBound<'tcx>]),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// New-typed boolean indicating whether explicit late-bound lifetimes
|
|
|
|
|
@@ -215,12 +215,12 @@ pub struct GenericArgCountResult {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub trait CreateSubstsForGenericArgsCtxt<'a, 'tcx> {
|
|
|
|
|
fn args_for_def_id(&mut self, def_id: DefId) -> (Option<&'a GenericArgs<'a>>, bool);
|
|
|
|
|
fn args_for_def_id(&mut self, def_id: DefId) -> (Option<&'a GenericArgs<'tcx>>, bool);
|
|
|
|
|
|
|
|
|
|
fn provided_kind(
|
|
|
|
|
&mut self,
|
|
|
|
|
param: &ty::GenericParamDef,
|
|
|
|
|
arg: &GenericArg<'_>,
|
|
|
|
|
arg: &GenericArg<'tcx>,
|
|
|
|
|
) -> ty::GenericArg<'tcx>;
|
|
|
|
|
|
|
|
|
|
fn inferred_kind(
|
|
|
|
|
@@ -294,7 +294,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
&self,
|
|
|
|
|
span: Span,
|
|
|
|
|
def_id: DefId,
|
|
|
|
|
item_segment: &hir::PathSegment<'_>,
|
|
|
|
|
item_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
) -> GenericArgsRef<'tcx> {
|
|
|
|
|
let (args, _) = self.create_args_for_ast_path(
|
|
|
|
|
span,
|
|
|
|
|
@@ -351,7 +351,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
def_id: DefId,
|
|
|
|
|
parent_args: &[ty::GenericArg<'tcx>],
|
|
|
|
|
seg: &hir::PathSegment<'_>,
|
|
|
|
|
generic_args: &'a hir::GenericArgs<'_>,
|
|
|
|
|
generic_args: &'a hir::GenericArgs<'tcx>,
|
|
|
|
|
infer_args: bool,
|
|
|
|
|
self_ty: Option<Ty<'tcx>>,
|
|
|
|
|
constness: ty::BoundConstness,
|
|
|
|
|
@@ -406,14 +406,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
struct SubstsForAstPathCtxt<'a, 'tcx> {
|
|
|
|
|
astconv: &'a (dyn AstConv<'tcx> + 'a),
|
|
|
|
|
def_id: DefId,
|
|
|
|
|
generic_args: &'a GenericArgs<'a>,
|
|
|
|
|
generic_args: &'a GenericArgs<'tcx>,
|
|
|
|
|
span: Span,
|
|
|
|
|
inferred_params: Vec<Span>,
|
|
|
|
|
infer_args: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'a, 'tcx> CreateSubstsForGenericArgsCtxt<'a, 'tcx> for SubstsForAstPathCtxt<'a, 'tcx> {
|
|
|
|
|
fn args_for_def_id(&mut self, did: DefId) -> (Option<&'a GenericArgs<'a>>, bool) {
|
|
|
|
|
fn args_for_def_id(&mut self, did: DefId) -> (Option<&'a GenericArgs<'tcx>>, bool) {
|
|
|
|
|
if did == self.def_id {
|
|
|
|
|
(Some(self.generic_args), self.infer_args)
|
|
|
|
|
} else {
|
|
|
|
|
@@ -425,11 +425,11 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
fn provided_kind(
|
|
|
|
|
&mut self,
|
|
|
|
|
param: &ty::GenericParamDef,
|
|
|
|
|
arg: &GenericArg<'_>,
|
|
|
|
|
arg: &GenericArg<'tcx>,
|
|
|
|
|
) -> ty::GenericArg<'tcx> {
|
|
|
|
|
let tcx = self.astconv.tcx();
|
|
|
|
|
|
|
|
|
|
let mut handle_ty_args = |has_default, ty: &hir::Ty<'_>| {
|
|
|
|
|
let mut handle_ty_args = |has_default, ty: &hir::Ty<'tcx>| {
|
|
|
|
|
if has_default {
|
|
|
|
|
tcx.check_optional_stability(
|
|
|
|
|
param.def_id,
|
|
|
|
|
@@ -592,7 +592,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
|
|
|
|
|
fn create_assoc_bindings_for_generic_args<'a>(
|
|
|
|
|
&self,
|
|
|
|
|
generic_args: &'a hir::GenericArgs<'_>,
|
|
|
|
|
generic_args: &'a hir::GenericArgs<'tcx>,
|
|
|
|
|
) -> Vec<ConvertedBinding<'a, 'tcx>> {
|
|
|
|
|
// Convert associated-type bindings or constraints into a separate vector.
|
|
|
|
|
// Example: Given this:
|
|
|
|
|
@@ -640,7 +640,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
&self,
|
|
|
|
|
span: Span,
|
|
|
|
|
item_def_id: DefId,
|
|
|
|
|
item_segment: &hir::PathSegment<'_>,
|
|
|
|
|
item_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
parent_args: GenericArgsRef<'tcx>,
|
|
|
|
|
) -> GenericArgsRef<'tcx> {
|
|
|
|
|
debug!(
|
|
|
|
|
@@ -673,7 +673,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
/// are disallowed. Otherwise, they are pushed onto the vector given.
|
|
|
|
|
pub fn instantiate_mono_trait_ref(
|
|
|
|
|
&self,
|
|
|
|
|
trait_ref: &hir::TraitRef<'_>,
|
|
|
|
|
trait_ref: &hir::TraitRef<'tcx>,
|
|
|
|
|
self_ty: Ty<'tcx>,
|
|
|
|
|
) -> ty::TraitRef<'tcx> {
|
|
|
|
|
self.prohibit_generics(trait_ref.path.segments.split_last().unwrap().1.iter(), |_| {});
|
|
|
|
|
@@ -710,7 +710,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
#[instrument(level = "debug", skip(self, span, constness, bounds, speculative))]
|
|
|
|
|
pub(crate) fn instantiate_poly_trait_ref(
|
|
|
|
|
&self,
|
|
|
|
|
trait_ref: &hir::TraitRef<'_>,
|
|
|
|
|
trait_ref: &hir::TraitRef<'tcx>,
|
|
|
|
|
span: Span,
|
|
|
|
|
constness: ty::BoundConstness,
|
|
|
|
|
polarity: ty::ImplPolarity,
|
|
|
|
|
@@ -788,7 +788,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
span: Span,
|
|
|
|
|
trait_def_id: DefId,
|
|
|
|
|
self_ty: Ty<'tcx>,
|
|
|
|
|
trait_segment: &hir::PathSegment<'_>,
|
|
|
|
|
trait_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
is_impl: bool,
|
|
|
|
|
// FIXME(effects) move all host param things in astconv to hir lowering
|
|
|
|
|
constness: ty::BoundConstness,
|
|
|
|
|
@@ -813,7 +813,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
span: Span,
|
|
|
|
|
trait_def_id: DefId,
|
|
|
|
|
self_ty: Ty<'tcx>,
|
|
|
|
|
trait_segment: &'a hir::PathSegment<'a>,
|
|
|
|
|
trait_segment: &'a hir::PathSegment<'tcx>,
|
|
|
|
|
is_impl: bool,
|
|
|
|
|
constness: ty::BoundConstness,
|
|
|
|
|
) -> (GenericArgsRef<'tcx>, GenericArgCountResult) {
|
|
|
|
|
@@ -847,7 +847,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
&self,
|
|
|
|
|
span: Span,
|
|
|
|
|
did: DefId,
|
|
|
|
|
item_segment: &hir::PathSegment<'_>,
|
|
|
|
|
item_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
) -> Ty<'tcx> {
|
|
|
|
|
let tcx = self.tcx();
|
|
|
|
|
let args = self.ast_path_args_for_ty(span, did, item_segment);
|
|
|
|
|
@@ -1153,7 +1153,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
span: Span,
|
|
|
|
|
qself_ty: Ty<'tcx>,
|
|
|
|
|
qself: &hir::Ty<'_>,
|
|
|
|
|
assoc_segment: &hir::PathSegment<'_>,
|
|
|
|
|
assoc_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
permit_variants: bool,
|
|
|
|
|
) -> Result<(Ty<'tcx>, DefKind, DefId), ErrorGuaranteed> {
|
|
|
|
|
let tcx = self.tcx();
|
|
|
|
|
@@ -1428,7 +1428,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
fn lookup_inherent_assoc_ty(
|
|
|
|
|
&self,
|
|
|
|
|
name: Ident,
|
|
|
|
|
segment: &hir::PathSegment<'_>,
|
|
|
|
|
segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
adt_did: DefId,
|
|
|
|
|
self_ty: Ty<'tcx>,
|
|
|
|
|
block: hir::HirId,
|
|
|
|
|
@@ -1702,8 +1702,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
span: Span,
|
|
|
|
|
opt_self_ty: Option<Ty<'tcx>>,
|
|
|
|
|
item_def_id: DefId,
|
|
|
|
|
trait_segment: &hir::PathSegment<'_>,
|
|
|
|
|
item_segment: &hir::PathSegment<'_>,
|
|
|
|
|
trait_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
item_segment: &hir::PathSegment<'tcx>,
|
|
|
|
|
constness: ty::BoundConstness,
|
|
|
|
|
) -> Ty<'tcx> {
|
|
|
|
|
let tcx = self.tcx();
|
|
|
|
|
@@ -2021,7 +2021,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
pub fn res_to_ty(
|
|
|
|
|
&self,
|
|
|
|
|
opt_self_ty: Option<Ty<'tcx>>,
|
|
|
|
|
path: &hir::Path<'_>,
|
|
|
|
|
path: &hir::Path<'tcx>,
|
|
|
|
|
hir_id: hir::HirId,
|
|
|
|
|
permit_variants: bool,
|
|
|
|
|
) -> Ty<'tcx> {
|
|
|
|
|
@@ -2311,13 +2311,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
|
|
|
|
|
/// Parses the programmer's textual representation of a type into our
|
|
|
|
|
/// internal notion of a type.
|
|
|
|
|
pub fn ast_ty_to_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> {
|
|
|
|
|
pub fn ast_ty_to_ty(&self, ast_ty: &hir::Ty<'tcx>) -> Ty<'tcx> {
|
|
|
|
|
self.ast_ty_to_ty_inner(ast_ty, false, false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Parses the programmer's textual representation of a type into our
|
|
|
|
|
/// internal notion of a type. This is meant to be used within a path.
|
|
|
|
|
pub fn ast_ty_to_ty_in_path(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> {
|
|
|
|
|
pub fn ast_ty_to_ty_in_path(&self, ast_ty: &hir::Ty<'tcx>) -> Ty<'tcx> {
|
|
|
|
|
self.ast_ty_to_ty_inner(ast_ty, false, true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2432,7 +2432,12 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
/// Turns a `hir::Ty` into a `Ty`. For diagnostics' purposes we keep track of whether trait
|
|
|
|
|
/// objects are borrowed like `&dyn Trait` to avoid emitting redundant errors.
|
|
|
|
|
#[instrument(level = "debug", skip(self), ret)]
|
|
|
|
|
fn ast_ty_to_ty_inner(&self, ast_ty: &hir::Ty<'_>, borrowed: bool, in_path: bool) -> Ty<'tcx> {
|
|
|
|
|
fn ast_ty_to_ty_inner(
|
|
|
|
|
&self,
|
|
|
|
|
ast_ty: &hir::Ty<'tcx>,
|
|
|
|
|
borrowed: bool,
|
|
|
|
|
in_path: bool,
|
|
|
|
|
) -> Ty<'tcx> {
|
|
|
|
|
let tcx = self.tcx();
|
|
|
|
|
|
|
|
|
|
let result_ty = match &ast_ty.kind {
|
|
|
|
|
@@ -2609,7 +2614,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn ty_of_arg(&self, ty: &hir::Ty<'_>, expected_ty: Option<Ty<'tcx>>) -> Ty<'tcx> {
|
|
|
|
|
pub fn ty_of_arg(&self, ty: &hir::Ty<'tcx>, expected_ty: Option<Ty<'tcx>>) -> Ty<'tcx> {
|
|
|
|
|
match ty.kind {
|
|
|
|
|
hir::TyKind::Infer if expected_ty.is_some() => {
|
|
|
|
|
self.record_ty(ty.hir_id, expected_ty.unwrap(), ty.span);
|
|
|
|
|
@@ -2625,7 +2630,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|
|
|
|
hir_id: hir::HirId,
|
|
|
|
|
unsafety: hir::Unsafety,
|
|
|
|
|
abi: abi::Abi,
|
|
|
|
|
decl: &hir::FnDecl<'_>,
|
|
|
|
|
decl: &hir::FnDecl<'tcx>,
|
|
|
|
|
generics: Option<&hir::Generics<'_>>,
|
|
|
|
|
hir_ty: Option<&hir::Ty<'_>>,
|
|
|
|
|
) -> ty::PolyFnSig<'tcx> {
|
|
|
|
|
|