Skip to content

Commit 12f803d

Browse files
bors[bot]lnicola
andauthored
Merge #11925
11925: internal: Add and use `HirFormatter::write_{str,char}` r=Veykril a=lnicola Saves slightly over 3 KB of `text`, but comparing the total with that from two weeks ago in #11776, this is a losing battle (we're 951 KB larger). ``` text data bss dec hex filename 24693512 1542704 4424 26240640 1906680 rust-analyzer-baseline 24690216 1542112 4424 26236752 1905750 rust-analyzer-pr ``` Co-authored-by: Laurențiu Nicola <[email protected]>
2 parents c9d1105 + bd57090 commit 12f803d

File tree

2 files changed

+64
-55
lines changed

2 files changed

+64
-55
lines changed

crates/hir/src/display.rs

Lines changed: 54 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ impl HirDisplay for Function {
2727
let data = f.db.function_data(self.id);
2828
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
2929
if data.is_default() {
30-
write!(f, "default ")?;
30+
f.write_str("default ")?;
3131
}
3232
if data.is_const() {
33-
write!(f, "const ")?;
33+
f.write_str("const ")?;
3434
}
3535
if data.is_async() {
36-
write!(f, "async ")?;
36+
f.write_str("async ")?;
3737
}
3838
if data.is_unsafe() {
39-
write!(f, "unsafe ")?;
39+
f.write_str("unsafe ")?;
4040
}
4141
if let Some(abi) = &data.abi {
4242
// FIXME: String escape?
@@ -46,31 +46,31 @@ impl HirDisplay for Function {
4646

4747
write_generic_params(GenericDefId::FunctionId(self.id), f)?;
4848

49-
write!(f, "(")?;
49+
f.write_char('(')?;
5050

5151
let write_self_param = |ty: &TypeRef, f: &mut HirFormatter| match ty {
52-
TypeRef::Path(p) if p.is_self_type() => write!(f, "self"),
52+
TypeRef::Path(p) if p.is_self_type() => f.write_str("self"),
5353
TypeRef::Reference(inner, lifetime, mut_) if matches!(&**inner,TypeRef::Path(p) if p.is_self_type()) =>
5454
{
55-
write!(f, "&")?;
55+
f.write_char('&')?;
5656
if let Some(lifetime) = lifetime {
5757
write!(f, "{} ", lifetime.name)?;
5858
}
5959
if let hir_def::type_ref::Mutability::Mut = mut_ {
60-
write!(f, "mut ")?;
60+
f.write_str("mut ")?;
6161
}
62-
write!(f, "self")
62+
f.write_str("self")
6363
}
6464
_ => {
65-
write!(f, "self: ")?;
65+
f.write_str("self: ")?;
6666
ty.hir_fmt(f)
6767
}
6868
};
6969

7070
let mut first = true;
7171
for (name, type_ref) in &data.params {
7272
if !first {
73-
write!(f, ", ")?;
73+
f.write_str(", ")?;
7474
} else {
7575
first = false;
7676
if data.has_self_param() {
@@ -80,18 +80,18 @@ impl HirDisplay for Function {
8080
}
8181
match name {
8282
Some(name) => write!(f, "{}: ", name)?,
83-
None => write!(f, "_: ")?,
83+
None => f.write_str("_: ")?,
8484
}
8585
// FIXME: Use resolved `param.ty` or raw `type_ref`?
8686
// The former will ignore lifetime arguments currently.
8787
type_ref.hir_fmt(f)?;
8888
}
8989

9090
if data.is_varargs() {
91-
write!(f, ", ...")?;
91+
f.write_str(", ...")?;
9292
}
9393

94-
write!(f, ")")?;
94+
f.write_char(')')?;
9595

9696
// `FunctionData::ret_type` will be `::core::future::Future<Output = ...>` for async fns.
9797
// Use ugly pattern match to strip the Future trait.
@@ -117,7 +117,7 @@ impl HirDisplay for Function {
117117
match ret_type {
118118
TypeRef::Tuple(tup) if tup.is_empty() => {}
119119
ty => {
120-
write!(f, " -> ")?;
120+
f.write_str(" -> ")?;
121121
ty.hir_fmt(f)?;
122122
}
123123
}
@@ -141,7 +141,7 @@ impl HirDisplay for Adt {
141141
impl HirDisplay for Struct {
142142
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
143143
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
144-
write!(f, "struct ")?;
144+
f.write_str("struct ")?;
145145
write!(f, "{}", self.name(f.db))?;
146146
let def_id = GenericDefId::AdtId(AdtId::StructId(self.id));
147147
write_generic_params(def_id, f)?;
@@ -153,7 +153,7 @@ impl HirDisplay for Struct {
153153
impl HirDisplay for Enum {
154154
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
155155
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
156-
write!(f, "enum ")?;
156+
f.write_str("enum ")?;
157157
write!(f, "{}", self.name(f.db))?;
158158
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
159159
write_generic_params(def_id, f)?;
@@ -165,7 +165,7 @@ impl HirDisplay for Enum {
165165
impl HirDisplay for Union {
166166
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
167167
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
168-
write!(f, "union ")?;
168+
f.write_str("union ")?;
169169
write!(f, "{}", self.name(f.db))?;
170170
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
171171
write_generic_params(def_id, f)?;
@@ -189,34 +189,34 @@ impl HirDisplay for Variant {
189189
match &*data {
190190
VariantData::Unit => {}
191191
VariantData::Tuple(fields) => {
192-
write!(f, "(")?;
192+
f.write_char('(')?;
193193
let mut first = true;
194194
for (_, field) in fields.iter() {
195195
if first {
196196
first = false;
197197
} else {
198-
write!(f, ", ")?;
198+
f.write_str(", ")?;
199199
}
200200
// Enum variant fields must be pub.
201201
field.type_ref.hir_fmt(f)?;
202202
}
203-
write!(f, ")")?;
203+
f.write_char(')')?;
204204
}
205205
VariantData::Record(fields) => {
206-
write!(f, " {{")?;
206+
f.write_str(" {{")?;
207207
let mut first = true;
208208
for (_, field) in fields.iter() {
209209
if first {
210210
first = false;
211-
write!(f, " ")?;
211+
f.write_char(' ')?;
212212
} else {
213-
write!(f, ", ")?;
213+
f.write_str(", ")?;
214214
}
215215
// Enum variant fields must be pub.
216216
write!(f, "{}: ", field.name)?;
217217
field.type_ref.hir_fmt(f)?;
218218
}
219-
write!(f, " }}")?;
219+
f.write_str(" }}")?;
220220
}
221221
}
222222
Ok(())
@@ -301,15 +301,15 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
301301
{
302302
return Ok(());
303303
}
304-
write!(f, "<")?;
304+
f.write_char('<')?;
305305

306306
let mut first = true;
307307
let mut delim = |f: &mut HirFormatter| {
308308
if first {
309309
first = false;
310310
Ok(())
311311
} else {
312-
write!(f, ", ")
312+
f.write_str(", ")
313313
}
314314
};
315315
for (_, lifetime) in params.lifetimes.iter() {
@@ -326,7 +326,7 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
326326
delim(f)?;
327327
write!(f, "{}", name)?;
328328
if let Some(default) = &ty.default {
329-
write!(f, " = ")?;
329+
f.write_str(" = ")?;
330330
default.hir_fmt(f)?;
331331
}
332332
}
@@ -339,7 +339,7 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
339339
}
340340
}
341341

342-
write!(f, ">")?;
342+
f.write_char('>')?;
343343
Ok(())
344344
}
345345

@@ -370,31 +370,30 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
370370
WherePredicateTypeTarget::TypeOrConstParam(id) => {
371371
match &params.type_or_consts[*id].name() {
372372
Some(name) => write!(f, "{}", name),
373-
None => write!(f, "{{unnamed}}"),
373+
None => f.write_str("{{unnamed}}"),
374374
}
375375
}
376376
};
377377

378-
write!(f, "\nwhere")?;
378+
f.write_str("\nwhere")?;
379379

380380
for (pred_idx, pred) in params.where_predicates.iter().enumerate() {
381381
let prev_pred =
382382
if pred_idx == 0 { None } else { Some(&params.where_predicates[pred_idx - 1]) };
383383

384-
let new_predicate = |f: &mut HirFormatter| {
385-
write!(f, "{}", if pred_idx == 0 { "\n " } else { ",\n " })
386-
};
384+
let new_predicate =
385+
|f: &mut HirFormatter| f.write_str(if pred_idx == 0 { "\n " } else { ",\n " });
387386

388387
match pred {
389388
WherePredicate::TypeBound { target, .. } if is_unnamed_type_target(target) => {}
390389
WherePredicate::TypeBound { target, bound } => {
391390
if matches!(prev_pred, Some(WherePredicate::TypeBound { target: target_, .. }) if target_ == target)
392391
{
393-
write!(f, " + ")?;
392+
f.write_str(" + ")?;
394393
} else {
395394
new_predicate(f)?;
396395
write_target(target, f)?;
397-
write!(f, ": ")?;
396+
f.write_str(": ")?;
398397
}
399398
bound.hir_fmt(f)?;
400399
}
@@ -413,27 +412,27 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
413412
Some(WherePredicate::ForLifetime { lifetimes: lifetimes_, target: target_, .. })
414413
if lifetimes_ == lifetimes && target_ == target,
415414
) {
416-
write!(f, " + ")?;
415+
f.write_str(" + ")?;
417416
} else {
418417
new_predicate(f)?;
419-
write!(f, "for<")?;
418+
f.write_str("for<")?;
420419
for (idx, lifetime) in lifetimes.iter().enumerate() {
421420
if idx != 0 {
422-
write!(f, ", ")?;
421+
f.write_str(", ")?;
423422
}
424423
write!(f, "{}", lifetime)?;
425424
}
426-
write!(f, "> ")?;
425+
f.write_str("> ")?;
427426
write_target(target, f)?;
428-
write!(f, ": ")?;
427+
f.write_str(": ")?;
429428
}
430429
bound.hir_fmt(f)?;
431430
}
432431
}
433432
}
434433

435434
// End of final predicate. There must be at least one predicate here.
436-
write!(f, ",")?;
435+
f.write_char(',')?;
437436

438437
Ok(())
439438
}
@@ -442,10 +441,10 @@ impl HirDisplay for Const {
442441
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
443442
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
444443
let data = f.db.const_data(self.id);
445-
write!(f, "const ")?;
444+
f.write_str("const ")?;
446445
match &data.name {
447446
Some(name) => write!(f, "{}: ", name)?,
448-
None => write!(f, "_: ")?,
447+
None => f.write_str("_: ")?,
449448
}
450449
data.type_ref.hir_fmt(f)?;
451450
Ok(())
@@ -456,9 +455,9 @@ impl HirDisplay for Static {
456455
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
457456
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
458457
let data = f.db.static_data(self.id);
459-
write!(f, "static ")?;
458+
f.write_str("static ")?;
460459
if data.mutable {
461-
write!(f, "mut ")?;
460+
f.write_str("mut ")?;
462461
}
463462
write!(f, "{}: ", &data.name)?;
464463
data.type_ref.hir_fmt(f)?;
@@ -471,10 +470,10 @@ impl HirDisplay for Trait {
471470
write_visibility(self.module(f.db).id, self.visibility(f.db), f)?;
472471
let data = f.db.trait_data(self.id);
473472
if data.is_unsafe {
474-
write!(f, "unsafe ")?;
473+
f.write_str("unsafe ")?;
475474
}
476475
if data.is_auto {
477-
write!(f, "auto ")?;
476+
f.write_str("auto ")?;
478477
}
479478
write!(f, "trait {}", data.name)?;
480479
let def_id = GenericDefId::TraitId(self.id);
@@ -490,11 +489,11 @@ impl HirDisplay for TypeAlias {
490489
let data = f.db.type_alias_data(self.id);
491490
write!(f, "type {}", data.name)?;
492491
if !data.bounds.is_empty() {
493-
write!(f, ": ")?;
492+
f.write_str(": ")?;
494493
f.write_joined(&data.bounds, " + ")?;
495494
}
496495
if let Some(ty) = &data.type_ref {
497-
write!(f, " = ")?;
496+
f.write_str(" = ")?;
498497
ty.hir_fmt(f)?;
499498
}
500499
Ok(())
@@ -508,19 +507,19 @@ impl HirDisplay for Module {
508507
Some(name) => write!(f, "mod {}", name),
509508
None if self.is_crate_root(f.db) => match self.krate().display_name(f.db) {
510509
Some(name) => write!(f, "extern crate {}", name),
511-
None => write!(f, "extern crate {{unknown}}"),
510+
None => f.write_str("extern crate {{unknown}}"),
512511
},
513-
None => write!(f, "mod {{unnamed}}"),
512+
None => f.write_str("mod {{unnamed}}"),
514513
}
515514
}
516515
}
517516

518517
impl HirDisplay for Macro {
519518
fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
520519
match self.id {
521-
hir_def::MacroId::Macro2Id(_) => write!(f, "macro"),
522-
hir_def::MacroId::MacroRulesId(_) => write!(f, "macro_rules!"),
523-
hir_def::MacroId::ProcMacroId(_) => write!(f, "proc_macro"),
520+
hir_def::MacroId::Macro2Id(_) => f.write_str("macro"),
521+
hir_def::MacroId::MacroRulesId(_) => f.write_str("macro_rules!"),
522+
hir_def::MacroId::ProcMacroId(_) => f.write_str("proc_macro"),
524523
}?;
525524
write!(f, " {}", self.name(f.db))
526525
}

crates/hir_ty/src/display.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,16 @@ impl<'a> HirFormatter<'a> {
172172
self.fmt.write_str(&self.buf).map_err(HirDisplayError::from)
173173
}
174174

175+
pub fn write_str(&mut self, s: &str) -> Result<(), HirDisplayError> {
176+
self.fmt.write_str(s)?;
177+
Ok(())
178+
}
179+
180+
pub fn write_char(&mut self, c: char) -> Result<(), HirDisplayError> {
181+
self.fmt.write_char(c)?;
182+
Ok(())
183+
}
184+
175185
pub fn should_truncate(&self) -> bool {
176186
match self.max_size {
177187
Some(max_size) => self.curr_size >= max_size,

0 commit comments

Comments
 (0)