Lower closure binders to hir & properly check them
This commit is contained in:
parent
f89ef3cf66
commit
c2dbd62c7c
16 changed files with 214 additions and 103 deletions
|
@ -6,6 +6,7 @@ use rustc_ast_pretty::pp::Breaks::{Consistent, Inconsistent};
|
|||
use rustc_ast_pretty::pp::{self, Breaks};
|
||||
use rustc_ast_pretty::pprust::{Comments, PrintState};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::LifetimeParamKind;
|
||||
use rustc_hir::{GenericArg, GenericParam, GenericParamKind, Node, Term};
|
||||
use rustc_hir::{GenericBound, PatKind, RangeEnd, TraitBoundModifier};
|
||||
use rustc_span::source_map::SourceMap;
|
||||
|
@ -1441,6 +1442,7 @@ impl<'a> State<'a> {
|
|||
self.bclose(expr.span);
|
||||
}
|
||||
hir::ExprKind::Closure {
|
||||
binder,
|
||||
capture_clause,
|
||||
bound_generic_params,
|
||||
fn_decl,
|
||||
|
@ -1448,7 +1450,7 @@ impl<'a> State<'a> {
|
|||
fn_decl_span: _,
|
||||
movability: _,
|
||||
} => {
|
||||
self.print_formal_generic_params(bound_generic_params);
|
||||
self.print_closure_binder(binder, bound_generic_params);
|
||||
self.print_capture_clause(capture_clause);
|
||||
|
||||
self.print_closure_params(fn_decl, body);
|
||||
|
@ -2033,6 +2035,42 @@ impl<'a> State<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn print_closure_binder(
|
||||
&mut self,
|
||||
binder: &hir::ClosureBinder,
|
||||
generic_params: &[GenericParam<'_>],
|
||||
) {
|
||||
let generic_params = generic_params
|
||||
.iter()
|
||||
.filter(|p| {
|
||||
matches!(
|
||||
p,
|
||||
GenericParam {
|
||||
kind: GenericParamKind::Lifetime { kind: LifetimeParamKind::Explicit },
|
||||
..
|
||||
}
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
match binder {
|
||||
hir::ClosureBinder::Default => {}
|
||||
// we need to distinguish `|...| {}` from `for<> |...| {}` as `for<>` adds additional restrictions
|
||||
hir::ClosureBinder::For { .. } if generic_params.is_empty() => self.word("for<>"),
|
||||
hir::ClosureBinder::For { .. } => {
|
||||
self.word("for");
|
||||
self.word("<");
|
||||
|
||||
self.commasep(Inconsistent, &generic_params, |s, param| {
|
||||
s.print_generic_param(param)
|
||||
});
|
||||
|
||||
self.word(">");
|
||||
self.nbsp();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn print_bounds<'b>(
|
||||
&mut self,
|
||||
prefix: &'static str,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue