lowering of generic args in AssocTyConstraint
This commit is contained in:
parent
16af7bf3d9
commit
760a6654fb
2 changed files with 37 additions and 9 deletions
|
@ -1076,16 +1076,40 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
fn lower_assoc_ty_constraint(
|
fn lower_assoc_ty_constraint(
|
||||||
&mut self,
|
&mut self,
|
||||||
constraint: &AssocTyConstraint,
|
constraint: &AssocTyConstraint,
|
||||||
itctx: ImplTraitContext<'_, 'hir>,
|
mut itctx: ImplTraitContext<'_, 'hir>,
|
||||||
) -> hir::TypeBinding<'hir> {
|
) -> hir::TypeBinding<'hir> {
|
||||||
debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
|
debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
|
||||||
|
|
||||||
if let Some(ref gen_args) = constraint.gen_args {
|
// lower generic arguments of identifier in constraint
|
||||||
self.sess.span_fatal(
|
let gen_args = if let Some(ref gen_args) = constraint.gen_args {
|
||||||
gen_args.span(),
|
let gen_args_ctor = match gen_args {
|
||||||
"generic associated types in trait paths are currently not implemented",
|
GenericArgs::AngleBracketed(ref data) => {
|
||||||
);
|
self.lower_angle_bracketed_parameter_data(
|
||||||
}
|
data,
|
||||||
|
ParamMode::Explicit,
|
||||||
|
itctx.reborrow(),
|
||||||
|
)
|
||||||
|
.0
|
||||||
|
}
|
||||||
|
GenericArgs::Parenthesized(ref data) => {
|
||||||
|
let mut err = self.sess.struct_span_err(
|
||||||
|
gen_args.span(),
|
||||||
|
"parenthesized generic arguments cannot be used in associated type constraints"
|
||||||
|
);
|
||||||
|
// FIXME: try to write a suggestion here
|
||||||
|
err.emit();
|
||||||
|
self.lower_angle_bracketed_parameter_data(
|
||||||
|
&data.as_angle_bracketed_args(),
|
||||||
|
ParamMode::Explicit,
|
||||||
|
itctx.reborrow(),
|
||||||
|
)
|
||||||
|
.0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
self.arena.alloc(gen_args_ctor.into_generic_args(&self.arena))
|
||||||
|
} else {
|
||||||
|
self.arena.alloc(hir::GenericArgs::none())
|
||||||
|
};
|
||||||
|
|
||||||
let kind = match constraint.kind {
|
let kind = match constraint.kind {
|
||||||
AssocTyConstraintKind::Equality { ref ty } => {
|
AssocTyConstraintKind::Equality { ref ty } => {
|
||||||
|
@ -1182,6 +1206,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
hir::TypeBinding {
|
hir::TypeBinding {
|
||||||
hir_id: self.lower_node_id(constraint.id),
|
hir_id: self.lower_node_id(constraint.id),
|
||||||
ident: constraint.ident,
|
ident: constraint.ident,
|
||||||
|
gen_args,
|
||||||
kind,
|
kind,
|
||||||
span: constraint.span,
|
span: constraint.span,
|
||||||
}
|
}
|
||||||
|
|
|
@ -362,7 +362,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_angle_bracketed_parameter_data(
|
pub(crate) fn lower_angle_bracketed_parameter_data(
|
||||||
&mut self,
|
&mut self,
|
||||||
data: &AngleBracketedArgs,
|
data: &AngleBracketedArgs,
|
||||||
param_mode: ParamMode,
|
param_mode: ParamMode,
|
||||||
|
@ -426,6 +426,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
) -> hir::TypeBinding<'hir> {
|
) -> hir::TypeBinding<'hir> {
|
||||||
let ident = Ident::with_dummy_span(hir::FN_OUTPUT_NAME);
|
let ident = Ident::with_dummy_span(hir::FN_OUTPUT_NAME);
|
||||||
let kind = hir::TypeBindingKind::Equality { ty };
|
let kind = hir::TypeBindingKind::Equality { ty };
|
||||||
hir::TypeBinding { hir_id: self.next_id(), span, ident, kind }
|
let args = arena_vec![self;];
|
||||||
|
let bindings = arena_vec![self;];
|
||||||
|
let gen_args = self.arena.alloc(hir::GenericArgs { args, bindings, parenthesized: false });
|
||||||
|
hir::TypeBinding { hir_id: self.next_id(), gen_args, span, ident, kind }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue