Skip to content

Commit d0e7bfd

Browse files
committed
Render implicit self with their shorthand syntax in HIR pretty printing
1 parent 46154c9 commit d0e7bfd

File tree

4 files changed

+75
-14
lines changed

4 files changed

+75
-14
lines changed

compiler/rustc_hir_pretty/src/lib.rs

+42-13
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use rustc_ast_pretty::pprust::state::MacHeader;
1818
use rustc_ast_pretty::pprust::{Comments, PrintState};
1919
use rustc_hir::{
2020
BindingMode, ByRef, ConstArgKind, GenericArg, GenericBound, GenericParam, GenericParamKind,
21-
HirId, LifetimeParamKind, Node, PatKind, PreciseCapturingArg, RangeEnd, Term, TyPatKind,
21+
HirId, ImplicitSelfKind, LifetimeParamKind, Node, PatKind, PreciseCapturingArg, RangeEnd, Term,
22+
TyPatKind,
2223
};
2324
use rustc_span::source_map::SourceMap;
2425
use rustc_span::{FileName, Ident, Span, Symbol, kw};
@@ -2086,6 +2087,28 @@ impl<'a> State<'a> {
20862087
self.print_pat(arg.pat);
20872088
}
20882089

2090+
fn print_implicit_self(&mut self, implicit_self_kind: &hir::ImplicitSelfKind) {
2091+
match implicit_self_kind {
2092+
ImplicitSelfKind::Imm => {
2093+
self.word("self");
2094+
}
2095+
ImplicitSelfKind::Mut => {
2096+
self.print_mutability(hir::Mutability::Mut, false);
2097+
self.word("self");
2098+
}
2099+
ImplicitSelfKind::RefImm => {
2100+
self.word("&");
2101+
self.word("self");
2102+
}
2103+
ImplicitSelfKind::RefMut => {
2104+
self.word("&");
2105+
self.print_mutability(hir::Mutability::Mut, false);
2106+
self.word("self");
2107+
}
2108+
ImplicitSelfKind::None => unreachable!(),
2109+
}
2110+
}
2111+
20892112
fn print_arm(&mut self, arm: &hir::Arm<'_>) {
20902113
// I have no idea why this check is necessary, but here it
20912114
// is :(
@@ -2151,27 +2174,33 @@ impl<'a> State<'a> {
21512174
// Make sure we aren't supplied *both* `arg_names` and `body_id`.
21522175
assert!(arg_names.is_empty() || body_id.is_none());
21532176
let mut i = 0;
2154-
let mut print_arg = |s: &mut Self| {
2155-
if let Some(arg_name) = arg_names.get(i) {
2156-
s.word(arg_name.to_string());
2157-
s.word(":");
2158-
s.space();
2159-
} else if let Some(body_id) = body_id {
2160-
s.ann.nested(s, Nested::BodyParamPat(body_id, i));
2161-
s.word(":");
2162-
s.space();
2177+
let mut print_arg = |s: &mut Self, ty: Option<&hir::Ty<'_>>| {
2178+
if i == 0 && decl.implicit_self.has_implicit_self() {
2179+
s.print_implicit_self(&decl.implicit_self);
2180+
} else {
2181+
if let Some(arg_name) = arg_names.get(i) {
2182+
s.word(arg_name.to_string());
2183+
s.word(":");
2184+
s.space();
2185+
} else if let Some(body_id) = body_id {
2186+
s.ann.nested(s, Nested::BodyParamPat(body_id, i));
2187+
s.word(":");
2188+
s.space();
2189+
}
2190+
if let Some(ty) = ty {
2191+
s.print_type(ty);
2192+
}
21632193
}
21642194
i += 1;
21652195
};
21662196
self.commasep(Inconsistent, decl.inputs, |s, ty| {
21672197
s.ibox(INDENT_UNIT);
2168-
print_arg(s);
2169-
s.print_type(ty);
2198+
print_arg(s, Some(ty));
21702199
s.end();
21712200
});
21722201
if decl.c_variadic {
21732202
self.word(", ");
2174-
print_arg(self);
2203+
print_arg(self, None);
21752204
self.word("...");
21762205
}
21772206
self.pclose();

tests/ui/unpretty/debug-fmt-hir.stdout

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct Bar {
1313
}
1414

1515
impl fmt::Debug for Bar {
16-
fn fmt(self: &'_ Self, f: &'_ mut fmt::Formatter<'_>)
16+
fn fmt(&self, f: &'_ mut fmt::Formatter<'_>)
1717
->
1818
fmt::Result {
1919
debug_struct_field2_finish(f, "Bar", "a", &self.a, "b", &&self.b)

tests/ui/unpretty/self-hir.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//@ compile-flags: -Zunpretty=hir
2+
//@ check-pass
3+
4+
pub struct Bar {
5+
a: String,
6+
b: u8,
7+
}
8+
9+
impl Bar {
10+
fn imm_self(self) {}
11+
fn mut_self(mut self) {}
12+
fn refimm_self(&self) {}
13+
fn refmut_self(&mut self) {}
14+
}

tests/ui/unpretty/self-hir.stdout

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#[prelude_import]
2+
use ::std::prelude::rust_2015::*;
3+
#[macro_use]
4+
extern crate std;
5+
//@ compile-flags: -Zunpretty=hir
6+
//@ check-pass
7+
8+
struct Bar {
9+
a: String,
10+
b: u8,
11+
}
12+
13+
impl Bar {
14+
fn imm_self(self) { }
15+
fn mut_self(mut self) { }
16+
fn refimm_self(&self) { }
17+
fn refmut_self(&mut self) { }
18+
}

0 commit comments

Comments
 (0)