From b5cf3b1258431dccf1691bbf1258539da1489d9f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 23 Oct 2024 10:40:24 -0700 Subject: [PATCH] Consolidate styles by token type length --- codegen/src/css.rs | 41 +++- src/gen/token.css | 519 +++++++++++---------------------------------- 2 files changed, 155 insertions(+), 405 deletions(-) diff --git a/codegen/src/css.rs b/codegen/src/css.rs index eae2d9cb6..66e4dbee7 100644 --- a/codegen/src/css.rs +++ b/codegen/src/css.rs @@ -2,6 +2,7 @@ use crate::workspace_path; use anyhow::Result; use indoc::{formatdoc, indoc}; use std::cmp::Ordering; +use std::collections::BTreeMap; use std::fs; use syn_codegen::Definitions; @@ -30,17 +31,19 @@ pub fn generate(defs: &Definitions) -> Result<()> { \twidth: 0; } "}; + let mut shrink = BTreeMap::new(); + let mut grow = BTreeMap::new(); for (ty, repr) in &defs.tokens { let macro_len = "Token![]".len() + repr.len(); let ty_len = ty.len(); styles.push('\n'); styles += &match Ord::cmp(¯o_len, &ty_len) { Ordering::Less => { + shrink + .entry((macro_len, ty_len)) + .or_insert_with(Vec::new) + .push(ty); formatdoc! {" - a.struct[title=\"struct syn::token::{ty}\"] {{ - \tfont-size: calc(100% * {macro_len} / {ty_len}); - }} - a.struct[title=\"struct syn::token::{ty}\"]::before {{ \tcontent: \"Token![{repr}]\"; \tfont-size: calc(100% * {ty_len} / {macro_len}); @@ -49,19 +52,39 @@ pub fn generate(defs: &Definitions) -> Result<()> { } Ordering::Equal => unreachable!(), Ordering::Greater => { - let padding = ".".repeat(macro_len.saturating_sub(ty.len())); + let padding = macro_len.saturating_sub(ty.len()); + grow.entry(padding).or_insert_with(Vec::new).push(ty); formatdoc! {" a.struct[title=\"struct syn::token::{ty}\"]::before {{ \tcontent: \"Token![{repr}]\"; }} - - a.struct[title=\"struct syn::token::{ty}\"]::after {{ - \tcontent: \"{padding}\"; - }} "} } }; } + for ((macro_len, ty_len), types) in shrink { + for ty in types { + styles += &format!("\na.struct[title=\"struct syn::token::{ty}\"],"); + } + styles.truncate(styles.len() - 1); + styles += &formatdoc! {" + {{ + \tfont-size: calc(100% * {macro_len} / {ty_len}); + }} + "}; + } + for (padding, types) in grow { + for ty in types { + styles += &format!("\na.struct[title=\"struct syn::token::{ty}\"]::after,"); + } + styles.truncate(styles.len() - 1); + let padding = ".".repeat(padding); + styles += &formatdoc! {" + {{ + \tcontent: \"{padding}\"; + }} + "}; + } let css_path = workspace_path::get("src/gen/token.css"); fs::write(css_path, styles)?; diff --git a/src/gen/token.css b/src/gen/token.css index 7eb2cd673..ed82ae150 100644 --- a/src/gen/token.css +++ b/src/gen/token.css @@ -212,734 +212,366 @@ a.struct[title="struct syn::token::Abstract"]::before { content: "Token![abstract]"; } -a.struct[title="struct syn::token::Abstract"]::after { - content: "........"; -} - a.struct[title="struct syn::token::And"]::before { content: "Token![&]"; } -a.struct[title="struct syn::token::And"]::after { - content: "......"; -} - a.struct[title="struct syn::token::AndAnd"]::before { content: "Token![&&]"; } -a.struct[title="struct syn::token::AndAnd"]::after { - content: "...."; -} - a.struct[title="struct syn::token::AndEq"]::before { content: "Token![&=]"; } -a.struct[title="struct syn::token::AndEq"]::after { - content: "....."; -} - a.struct[title="struct syn::token::As"]::before { content: "Token![as]"; } -a.struct[title="struct syn::token::As"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Async"]::before { content: "Token![async]"; } -a.struct[title="struct syn::token::Async"]::after { - content: "........"; -} - a.struct[title="struct syn::token::At"]::before { content: "Token![@]"; } -a.struct[title="struct syn::token::At"]::after { - content: "......."; -} - a.struct[title="struct syn::token::Auto"]::before { content: "Token![auto]"; } -a.struct[title="struct syn::token::Auto"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Await"]::before { content: "Token![await]"; } -a.struct[title="struct syn::token::Await"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Become"]::before { content: "Token![become]"; } -a.struct[title="struct syn::token::Become"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Box"]::before { content: "Token![box]"; } -a.struct[title="struct syn::token::Box"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Break"]::before { content: "Token![break]"; } -a.struct[title="struct syn::token::Break"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Caret"]::before { content: "Token![^]"; } -a.struct[title="struct syn::token::Caret"]::after { - content: "...."; -} - a.struct[title="struct syn::token::CaretEq"]::before { content: "Token![^=]"; } -a.struct[title="struct syn::token::CaretEq"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Colon"]::before { content: "Token![:]"; } -a.struct[title="struct syn::token::Colon"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Comma"]::before { content: "Token![,]"; } -a.struct[title="struct syn::token::Comma"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Const"]::before { content: "Token![const]"; } -a.struct[title="struct syn::token::Const"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Continue"]::before { content: "Token![continue]"; } -a.struct[title="struct syn::token::Continue"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Crate"]::before { content: "Token![crate]"; } -a.struct[title="struct syn::token::Crate"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Default"]::before { content: "Token![default]"; } -a.struct[title="struct syn::token::Default"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Do"]::before { content: "Token![do]"; } -a.struct[title="struct syn::token::Do"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Dollar"]::before { content: "Token![$]"; } -a.struct[title="struct syn::token::Dollar"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Dot"]::before { content: "Token![.]"; } -a.struct[title="struct syn::token::Dot"]::after { - content: "......"; -} - a.struct[title="struct syn::token::DotDot"]::before { content: "Token![..]"; } -a.struct[title="struct syn::token::DotDot"]::after { - content: "...."; -} - a.struct[title="struct syn::token::DotDotDot"]::before { content: "Token![...]"; } -a.struct[title="struct syn::token::DotDotDot"]::after { - content: ".."; -} - a.struct[title="struct syn::token::DotDotEq"]::before { content: "Token![..=]"; } -a.struct[title="struct syn::token::DotDotEq"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Dyn"]::before { content: "Token![dyn]"; } -a.struct[title="struct syn::token::Dyn"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Else"]::before { content: "Token![else]"; } -a.struct[title="struct syn::token::Else"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Enum"]::before { content: "Token![enum]"; } -a.struct[title="struct syn::token::Enum"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Eq"]::before { content: "Token![=]"; } -a.struct[title="struct syn::token::Eq"]::after { - content: "......."; -} - a.struct[title="struct syn::token::EqEq"]::before { content: "Token![==]"; } -a.struct[title="struct syn::token::EqEq"]::after { - content: "......"; -} - a.struct[title="struct syn::token::Extern"]::before { content: "Token![extern]"; } -a.struct[title="struct syn::token::Extern"]::after { - content: "........"; -} - a.struct[title="struct syn::token::FatArrow"]::before { content: "Token![=>]"; } -a.struct[title="struct syn::token::FatArrow"]::after { - content: ".."; -} - a.struct[title="struct syn::token::Final"]::before { content: "Token![final]"; } -a.struct[title="struct syn::token::Final"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Fn"]::before { content: "Token![fn]"; } -a.struct[title="struct syn::token::Fn"]::after { - content: "........"; -} - a.struct[title="struct syn::token::For"]::before { content: "Token![for]"; } -a.struct[title="struct syn::token::For"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Ge"]::before { content: "Token![>=]"; } -a.struct[title="struct syn::token::Ge"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Gt"]::before { content: "Token![>]"; } -a.struct[title="struct syn::token::Gt"]::after { - content: "......."; -} - a.struct[title="struct syn::token::If"]::before { content: "Token![if]"; } -a.struct[title="struct syn::token::If"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Impl"]::before { content: "Token![impl]"; } -a.struct[title="struct syn::token::Impl"]::after { - content: "........"; -} - a.struct[title="struct syn::token::In"]::before { content: "Token![in]"; } -a.struct[title="struct syn::token::In"]::after { - content: "........"; -} - a.struct[title="struct syn::token::LArrow"]::before { content: "Token![<-]"; } -a.struct[title="struct syn::token::LArrow"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Le"]::before { content: "Token![<=]"; } -a.struct[title="struct syn::token::Le"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Let"]::before { content: "Token![let]"; } -a.struct[title="struct syn::token::Let"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Loop"]::before { content: "Token![loop]"; } -a.struct[title="struct syn::token::Loop"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Lt"]::before { content: "Token![<]"; } -a.struct[title="struct syn::token::Lt"]::after { - content: "......."; -} - a.struct[title="struct syn::token::Macro"]::before { content: "Token![macro]"; } -a.struct[title="struct syn::token::Macro"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Match"]::before { content: "Token![match]"; } -a.struct[title="struct syn::token::Match"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Minus"]::before { content: "Token![-]"; } -a.struct[title="struct syn::token::Minus"]::after { - content: "...."; -} - a.struct[title="struct syn::token::MinusEq"]::before { content: "Token![-=]"; } -a.struct[title="struct syn::token::MinusEq"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Mod"]::before { content: "Token![mod]"; } -a.struct[title="struct syn::token::Mod"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Move"]::before { content: "Token![move]"; } -a.struct[title="struct syn::token::Move"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Mut"]::before { content: "Token![mut]"; } -a.struct[title="struct syn::token::Mut"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Ne"]::before { content: "Token![!=]"; } -a.struct[title="struct syn::token::Ne"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Not"]::before { content: "Token![!]"; } -a.struct[title="struct syn::token::Not"]::after { - content: "......"; -} - a.struct[title="struct syn::token::Or"]::before { content: "Token![|]"; } -a.struct[title="struct syn::token::Or"]::after { - content: "......."; -} - a.struct[title="struct syn::token::OrEq"]::before { content: "Token![|=]"; } -a.struct[title="struct syn::token::OrEq"]::after { - content: "......"; -} - a.struct[title="struct syn::token::OrOr"]::before { content: "Token![||]"; } -a.struct[title="struct syn::token::OrOr"]::after { - content: "......"; -} - a.struct[title="struct syn::token::Override"]::before { content: "Token![override]"; } -a.struct[title="struct syn::token::Override"]::after { - content: "........"; -} - a.struct[title="struct syn::token::PathSep"]::before { content: "Token![::]"; } -a.struct[title="struct syn::token::PathSep"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Percent"]::before { content: "Token![%]"; } -a.struct[title="struct syn::token::Percent"]::after { - content: ".."; -} - a.struct[title="struct syn::token::PercentEq"]::before { content: "Token![%=]"; } -a.struct[title="struct syn::token::PercentEq"]::after { - content: "."; -} - a.struct[title="struct syn::token::Plus"]::before { content: "Token![+]"; } -a.struct[title="struct syn::token::Plus"]::after { - content: "....."; -} - a.struct[title="struct syn::token::PlusEq"]::before { content: "Token![+=]"; } -a.struct[title="struct syn::token::PlusEq"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Pound"]::before { content: "Token![#]"; } -a.struct[title="struct syn::token::Pound"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Priv"]::before { content: "Token![priv]"; } -a.struct[title="struct syn::token::Priv"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Pub"]::before { content: "Token![pub]"; } -a.struct[title="struct syn::token::Pub"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Question"]::before { content: "Token![?]"; } -a.struct[title="struct syn::token::Question"]::after { - content: "."; -} - a.struct[title="struct syn::token::RArrow"]::before { content: "Token![->]"; } -a.struct[title="struct syn::token::RArrow"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Raw"]::before { content: "Token![raw]"; } -a.struct[title="struct syn::token::Raw"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Ref"]::before { content: "Token![ref]"; } -a.struct[title="struct syn::token::Ref"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Return"]::before { content: "Token![return]"; } -a.struct[title="struct syn::token::Return"]::after { - content: "........"; -} - a.struct[title="struct syn::token::SelfType"]::before { content: "Token![Self]"; } -a.struct[title="struct syn::token::SelfType"]::after { - content: "...."; -} - a.struct[title="struct syn::token::SelfValue"]::before { content: "Token![self]"; } -a.struct[title="struct syn::token::SelfValue"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Semi"]::before { content: "Token![;]"; } -a.struct[title="struct syn::token::Semi"]::after { - content: "....."; -} - a.struct[title="struct syn::token::Shl"]::before { content: "Token![<<]"; } -a.struct[title="struct syn::token::Shl"]::after { - content: "......."; -} - a.struct[title="struct syn::token::ShlEq"]::before { content: "Token![<<=]"; } -a.struct[title="struct syn::token::ShlEq"]::after { - content: "......"; -} - a.struct[title="struct syn::token::Shr"]::before { content: "Token![>>]"; } -a.struct[title="struct syn::token::Shr"]::after { - content: "......."; -} - a.struct[title="struct syn::token::ShrEq"]::before { content: "Token![>>=]"; } -a.struct[title="struct syn::token::ShrEq"]::after { - content: "......"; -} - a.struct[title="struct syn::token::Slash"]::before { content: "Token![/]"; } -a.struct[title="struct syn::token::Slash"]::after { - content: "...."; -} - a.struct[title="struct syn::token::SlashEq"]::before { content: "Token![/=]"; } -a.struct[title="struct syn::token::SlashEq"]::after { - content: "..."; -} - a.struct[title="struct syn::token::Star"]::before { content: "Token![*]"; } -a.struct[title="struct syn::token::Star"]::after { - content: "....."; -} - a.struct[title="struct syn::token::StarEq"]::before { content: "Token![*=]"; } -a.struct[title="struct syn::token::StarEq"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Static"]::before { content: "Token![static]"; } -a.struct[title="struct syn::token::Static"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Struct"]::before { content: "Token![struct]"; } -a.struct[title="struct syn::token::Struct"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Super"]::before { content: "Token![super]"; } -a.struct[title="struct syn::token::Super"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Tilde"]::before { content: "Token![~]"; } -a.struct[title="struct syn::token::Tilde"]::after { - content: "...."; -} - a.struct[title="struct syn::token::Trait"]::before { content: "Token![trait]"; } -a.struct[title="struct syn::token::Trait"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Try"]::before { content: "Token![try]"; } -a.struct[title="struct syn::token::Try"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Type"]::before { content: "Token![type]"; } -a.struct[title="struct syn::token::Type"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Typeof"]::before { content: "Token![typeof]"; } -a.struct[title="struct syn::token::Typeof"]::after { - content: "........"; -} - -a.struct[title="struct syn::token::Underscore"] { - font-size: calc(100% * 9 / 10); -} - a.struct[title="struct syn::token::Underscore"]::before { content: "Token![_]"; font-size: calc(100% * 10 / 9); @@ -949,62 +581,157 @@ a.struct[title="struct syn::token::Union"]::before { content: "Token![union]"; } -a.struct[title="struct syn::token::Union"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Unsafe"]::before { content: "Token![unsafe]"; } -a.struct[title="struct syn::token::Unsafe"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Unsized"]::before { content: "Token![unsized]"; } -a.struct[title="struct syn::token::Unsized"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Use"]::before { content: "Token![use]"; } -a.struct[title="struct syn::token::Use"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Virtual"]::before { content: "Token![virtual]"; } -a.struct[title="struct syn::token::Virtual"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Where"]::before { content: "Token![where]"; } -a.struct[title="struct syn::token::Where"]::after { - content: "........"; -} - a.struct[title="struct syn::token::While"]::before { content: "Token![while]"; } -a.struct[title="struct syn::token::While"]::after { - content: "........"; -} - a.struct[title="struct syn::token::Yield"]::before { content: "Token![yield]"; } +a.struct[title="struct syn::token::Underscore"] { + font-size: calc(100% * 9 / 10); +} + +a.struct[title="struct syn::token::PercentEq"]::after, +a.struct[title="struct syn::token::Question"]::after { + content: "."; +} + +a.struct[title="struct syn::token::DotDotDot"]::after, +a.struct[title="struct syn::token::FatArrow"]::after, +a.struct[title="struct syn::token::Percent"]::after { + content: ".."; +} + +a.struct[title="struct syn::token::CaretEq"]::after, +a.struct[title="struct syn::token::Dollar"]::after, +a.struct[title="struct syn::token::DotDotEq"]::after, +a.struct[title="struct syn::token::MinusEq"]::after, +a.struct[title="struct syn::token::PathSep"]::after, +a.struct[title="struct syn::token::SelfValue"]::after, +a.struct[title="struct syn::token::SlashEq"]::after { + content: "..."; +} + +a.struct[title="struct syn::token::AndAnd"]::after, +a.struct[title="struct syn::token::Caret"]::after, +a.struct[title="struct syn::token::Colon"]::after, +a.struct[title="struct syn::token::Comma"]::after, +a.struct[title="struct syn::token::DotDot"]::after, +a.struct[title="struct syn::token::LArrow"]::after, +a.struct[title="struct syn::token::Minus"]::after, +a.struct[title="struct syn::token::PlusEq"]::after, +a.struct[title="struct syn::token::Pound"]::after, +a.struct[title="struct syn::token::RArrow"]::after, +a.struct[title="struct syn::token::SelfType"]::after, +a.struct[title="struct syn::token::Slash"]::after, +a.struct[title="struct syn::token::StarEq"]::after, +a.struct[title="struct syn::token::Tilde"]::after { + content: "...."; +} + +a.struct[title="struct syn::token::AndEq"]::after, +a.struct[title="struct syn::token::Plus"]::after, +a.struct[title="struct syn::token::Semi"]::after, +a.struct[title="struct syn::token::Star"]::after { + content: "....."; +} + +a.struct[title="struct syn::token::And"]::after, +a.struct[title="struct syn::token::Dot"]::after, +a.struct[title="struct syn::token::EqEq"]::after, +a.struct[title="struct syn::token::Not"]::after, +a.struct[title="struct syn::token::OrEq"]::after, +a.struct[title="struct syn::token::OrOr"]::after, +a.struct[title="struct syn::token::ShlEq"]::after, +a.struct[title="struct syn::token::ShrEq"]::after { + content: "......"; +} + +a.struct[title="struct syn::token::At"]::after, +a.struct[title="struct syn::token::Eq"]::after, +a.struct[title="struct syn::token::Gt"]::after, +a.struct[title="struct syn::token::Lt"]::after, +a.struct[title="struct syn::token::Or"]::after, +a.struct[title="struct syn::token::Shl"]::after, +a.struct[title="struct syn::token::Shr"]::after { + content: "......."; +} + +a.struct[title="struct syn::token::Abstract"]::after, +a.struct[title="struct syn::token::As"]::after, +a.struct[title="struct syn::token::Async"]::after, +a.struct[title="struct syn::token::Auto"]::after, +a.struct[title="struct syn::token::Await"]::after, +a.struct[title="struct syn::token::Become"]::after, +a.struct[title="struct syn::token::Box"]::after, +a.struct[title="struct syn::token::Break"]::after, +a.struct[title="struct syn::token::Const"]::after, +a.struct[title="struct syn::token::Continue"]::after, +a.struct[title="struct syn::token::Crate"]::after, +a.struct[title="struct syn::token::Default"]::after, +a.struct[title="struct syn::token::Do"]::after, +a.struct[title="struct syn::token::Dyn"]::after, +a.struct[title="struct syn::token::Else"]::after, +a.struct[title="struct syn::token::Enum"]::after, +a.struct[title="struct syn::token::Extern"]::after, +a.struct[title="struct syn::token::Final"]::after, +a.struct[title="struct syn::token::Fn"]::after, +a.struct[title="struct syn::token::For"]::after, +a.struct[title="struct syn::token::Ge"]::after, +a.struct[title="struct syn::token::If"]::after, +a.struct[title="struct syn::token::Impl"]::after, +a.struct[title="struct syn::token::In"]::after, +a.struct[title="struct syn::token::Le"]::after, +a.struct[title="struct syn::token::Let"]::after, +a.struct[title="struct syn::token::Loop"]::after, +a.struct[title="struct syn::token::Macro"]::after, +a.struct[title="struct syn::token::Match"]::after, +a.struct[title="struct syn::token::Mod"]::after, +a.struct[title="struct syn::token::Move"]::after, +a.struct[title="struct syn::token::Mut"]::after, +a.struct[title="struct syn::token::Ne"]::after, +a.struct[title="struct syn::token::Override"]::after, +a.struct[title="struct syn::token::Priv"]::after, +a.struct[title="struct syn::token::Pub"]::after, +a.struct[title="struct syn::token::Raw"]::after, +a.struct[title="struct syn::token::Ref"]::after, +a.struct[title="struct syn::token::Return"]::after, +a.struct[title="struct syn::token::Static"]::after, +a.struct[title="struct syn::token::Struct"]::after, +a.struct[title="struct syn::token::Super"]::after, +a.struct[title="struct syn::token::Trait"]::after, +a.struct[title="struct syn::token::Try"]::after, +a.struct[title="struct syn::token::Type"]::after, +a.struct[title="struct syn::token::Typeof"]::after, +a.struct[title="struct syn::token::Union"]::after, +a.struct[title="struct syn::token::Unsafe"]::after, +a.struct[title="struct syn::token::Unsized"]::after, +a.struct[title="struct syn::token::Use"]::after, +a.struct[title="struct syn::token::Virtual"]::after, +a.struct[title="struct syn::token::Where"]::after, +a.struct[title="struct syn::token::While"]::after, a.struct[title="struct syn::token::Yield"]::after { content: "........"; }