aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/display.rs
blob: 60fa72f1bb1f163d09b987f3d2b91e30833bdce9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use super::*;
use std::fmt::{self, Display};

impl Display for FunctionSignature {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        if let Some(t) = &self.visibility {
            write!(f, "{} ", t)?;
        }

        if let Some(name) = &self.name {
            write!(f, "fn {}", name)?;
        }

        if !self.generic_parameters.is_empty() {
            write!(f, "<")?;
            write_joined(f, &self.generic_parameters, ", ")?;
            write!(f, ">")?;
        }

        write!(f, "(")?;
        write_joined(f, &self.parameters, ", ")?;
        write!(f, ")")?;

        if let Some(t) = &self.ret_type {
            write!(f, " -> {}", t)?;
        }

        if !self.where_predicates.is_empty() {
            write!(f, "\nwhere ")?;
            write_joined(f, &self.where_predicates, ",\n      ")?;
        }

        Ok(())
    }
}

fn write_joined<T: Display>(
    f: &mut fmt::Formatter,
    items: impl IntoIterator<Item = T>,
    sep: &str,
) -> fmt::Result {
    let mut first = true;
    for e in items {
        if !first {
            write!(f, "{}", sep)?;
        }
        first = false;
        write!(f, "{}", e)?;
    }
    Ok(())
}