149 lines
4.7 KiB
Rust
149 lines
4.7 KiB
Rust
|
use {
|
||
|
crate::TypeDict,
|
||
|
crate::sugar::SugaredTypeTerm,
|
||
|
tiny_ansi::TinyAnsi
|
||
|
};
|
||
|
|
||
|
impl SugaredTypeTerm {
|
||
|
pub fn pretty(&self, dict: &TypeDict, indent: u64) -> String {
|
||
|
let indent_width = 4;
|
||
|
match self {
|
||
|
SugaredTypeTerm::TypeID(id) => {
|
||
|
format!("{}", dict.get_typename(id).unwrap_or("??".bright_red())).bright_blue()
|
||
|
},
|
||
|
|
||
|
SugaredTypeTerm::Num(n) => {
|
||
|
format!("{}", n).bright_cyan()
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Char(c) => {
|
||
|
format!("'{}'", c)
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Univ(t) => {
|
||
|
format!("{} {} . {}",
|
||
|
"∀".yellow().bold(),
|
||
|
dict.get_varname(0).unwrap_or("??".into()).bright_blue(),
|
||
|
t.pretty(dict,indent)
|
||
|
)
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Spec(args) => {
|
||
|
let mut s = String::new();
|
||
|
s.push_str(&"<".yellow().bold());
|
||
|
for i in 0..args.len() {
|
||
|
let arg = &args[i];
|
||
|
if i > 0 {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str( &arg.pretty(dict,indent+1) );
|
||
|
}
|
||
|
s.push_str(&">".yellow().bold());
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Struct(args) => {
|
||
|
let mut s = String::new();
|
||
|
s.push_str(&"{".yellow().bold());
|
||
|
for arg in args {
|
||
|
s.push('\n');
|
||
|
for x in 0..(indent+1)*indent_width {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&arg.pretty(dict, indent + 1));
|
||
|
s.push_str(&";\n".bright_yellow());
|
||
|
}
|
||
|
|
||
|
s.push('\n');
|
||
|
for x in 0..indent*indent_width {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&"}".yellow().bold());
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Enum(args) => {
|
||
|
let mut s = String::new();
|
||
|
s.push_str(&"(".yellow().bold());
|
||
|
for i in 0..args.len() {
|
||
|
let arg = &args[i];
|
||
|
s.push('\n');
|
||
|
for x in 0..(indent+1)*indent_width {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
if i > 0 {
|
||
|
s.push_str(&"| ".yellow().bold());
|
||
|
}
|
||
|
s.push_str(&arg.pretty(dict, indent + 1));
|
||
|
}
|
||
|
|
||
|
s.push('\n');
|
||
|
for x in 0..indent*indent_width {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&")".yellow().bold());
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Seq(args) => {
|
||
|
let mut s = String::new();
|
||
|
s.push_str(&"[ ".yellow().bold());
|
||
|
for i in 0..args.len() {
|
||
|
let arg = &args[i];
|
||
|
if i > 0 {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&arg.pretty(dict, indent+1));
|
||
|
}
|
||
|
s.push_str(&" ]".yellow().bold());
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Morph(args) => {
|
||
|
let mut s = String::new();
|
||
|
for arg in args {
|
||
|
s.push_str(&" ~~morph~~> ".bright_yellow());
|
||
|
s.push_str(&arg.pretty(dict, indent));
|
||
|
}
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Func(args) => {
|
||
|
let mut s = String::new();
|
||
|
for i in 0..args.len() {
|
||
|
let arg = &args[i];
|
||
|
if i > 0{
|
||
|
s.push('\n');
|
||
|
for x in 0..(indent*indent_width) {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&"--> ".bright_yellow());
|
||
|
} else {
|
||
|
// s.push_str(" ");
|
||
|
}
|
||
|
s.push_str(&arg.pretty(dict, indent));
|
||
|
}
|
||
|
s
|
||
|
}
|
||
|
|
||
|
SugaredTypeTerm::Ladder(rungs) => {
|
||
|
let mut s = String::new();
|
||
|
for i in 0..rungs.len() {
|
||
|
let rung = &rungs[i];
|
||
|
if i > 0{
|
||
|
s.push('\n');
|
||
|
for x in 0..(indent*indent_width) {
|
||
|
s.push(' ');
|
||
|
}
|
||
|
s.push_str(&"~ ".yellow());
|
||
|
}
|
||
|
s.push_str(&rung.pretty(dict, indent));
|
||
|
}
|
||
|
s
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|