(
w: &mut W,
decl: &decl::Decl,
name: &String,
span_map: &HashMap<usize, pr::Span>,
)
| 467 | } |
| 468 | |
| 469 | fn write_decl<W: Write>( |
| 470 | w: &mut W, |
| 471 | decl: &decl::Decl, |
| 472 | name: &String, |
| 473 | span_map: &HashMap<usize, pr::Span>, |
| 474 | ) -> Result { |
| 475 | let open = if name != "std" { " open" } else { "" }; |
| 476 | write!(w, r#"<details class="ast-node" {open} tabindex=2>"#)?; |
| 477 | |
| 478 | // header |
| 479 | { |
| 480 | write!(w, "<summary class=header>")?; |
| 481 | write!(w, r#"<h2 class="clickable blue">{name}</h2>"#)?; |
| 482 | |
| 483 | let span = decl.declared_at.as_ref().and_then(|id| span_map.get(id)); |
| 484 | if let Some(span) = span { |
| 485 | write!(w, r#"<span class="span">{span:?}</span>"#)?; |
| 486 | } |
| 487 | write!(w, "</summary>")?; // header |
| 488 | } |
| 489 | |
| 490 | { |
| 491 | write!(w, r#"<content class="contents indent">"#)?; |
| 492 | match &decl.kind { |
| 493 | decl::DeclKind::Module(m) => { |
| 494 | for (name, decl) in m.names.iter().sorted_by_key(|x| x.0.as_str()) { |
| 495 | write_decl(w, decl, name, span_map)?; |
| 496 | } |
| 497 | } |
| 498 | decl::DeclKind::Expr(expr) => { |
| 499 | let json = serde_json::to_string(expr).unwrap(); |
| 500 | let json_node: serde_json::Value = serde_json::from_str(&json).unwrap(); |
| 501 | write_json_ast_node(w, json_node, false)?; |
| 502 | } |
| 503 | decl::DeclKind::Ty(ty) => { |
| 504 | writeln!(w, r#"<span>{}</span>"#, escape_html(&codegen::write_ty(ty)))?; |
| 505 | } |
| 506 | decl::DeclKind::TableDecl(table_decl) => { |
| 507 | let json = serde_json::to_string(table_decl).unwrap(); |
| 508 | let json_node: serde_json::Value = serde_json::from_str(&json).unwrap(); |
| 509 | write_json_ast_node(w, json_node, false)?; |
| 510 | } |
| 511 | _ => { |
| 512 | write!(w, r#"<div>{}</div>"#, decl.kind)?; |
| 513 | } |
| 514 | } |
| 515 | write!(w, "</content>")?; |
| 516 | } |
| 517 | |
| 518 | write!(w, "</details>") |
| 519 | } |
| 520 | |
| 521 | fn escape_html(text: &str) -> String { |
| 522 | text.replace('&', "&") |
no test coverage detected