1 //! Defines token tags we use for syntax highlighting.
2 //! A tag is not unlike a CSS class.
6 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
9 pub modifiers: HighlightModifiers,
12 #[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
13 pub struct HighlightModifiers(u32);
15 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
16 pub enum HighlightTag {
45 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
47 pub enum HighlightModifier {
48 /// Used with keywords like `if` and `break`.
50 /// `foo` in `fn foo(x: i32)` is a definition, `foo` in `foo(90 + 2)` is
58 fn as_str(self) -> &'static str {
60 HighlightTag::Attribute => "attribute",
61 HighlightTag::BuiltinType => "builtin_type",
62 HighlightTag::ByteLiteral => "byte_literal",
63 HighlightTag::CharLiteral => "char_literal",
64 HighlightTag::Comment => "comment",
65 HighlightTag::Constant => "constant",
66 HighlightTag::Enum => "enum",
67 HighlightTag::EnumVariant => "enum_variant",
68 HighlightTag::Field => "field",
69 HighlightTag::Function => "function",
70 HighlightTag::Keyword => "keyword",
71 HighlightTag::Lifetime => "lifetime",
72 HighlightTag::Macro => "macro",
73 HighlightTag::Module => "module",
74 HighlightTag::NumericLiteral => "numeric_literal",
75 HighlightTag::SelfType => "self_type",
76 HighlightTag::Static => "static",
77 HighlightTag::StringLiteral => "string_literal",
78 HighlightTag::Struct => "struct",
79 HighlightTag::Trait => "trait",
80 HighlightTag::TypeAlias => "type_alias",
81 HighlightTag::TypeParam => "type_param",
82 HighlightTag::Union => "union",
83 HighlightTag::Local => "variable",
84 HighlightTag::UnresolvedReference => "unresolved_reference",
85 HighlightTag::FormatSpecifier => "format_specifier",
90 impl fmt::Display for HighlightTag {
91 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
92 fmt::Display::fmt(self.as_str(), f)
96 impl HighlightModifier {
97 const ALL: &'static [HighlightModifier] = &[
98 HighlightModifier::ControlFlow,
99 HighlightModifier::Definition,
100 HighlightModifier::Mutable,
101 HighlightModifier::Unsafe,
104 fn as_str(self) -> &'static str {
106 HighlightModifier::ControlFlow => "control",
107 HighlightModifier::Definition => "declaration",
108 HighlightModifier::Mutable => "mutable",
109 HighlightModifier::Unsafe => "unsafe",
113 fn mask(self) -> u32 {
118 impl fmt::Display for HighlightModifier {
119 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
120 fmt::Display::fmt(self.as_str(), f)
124 impl fmt::Display for Highlight {
125 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
126 write!(f, "{}", self.tag)?;
127 for modifier in self.modifiers.iter() {
128 write!(f, ".{}", modifier)?
134 impl From<HighlightTag> for Highlight {
135 fn from(tag: HighlightTag) -> Highlight {
141 pub(crate) fn new(tag: HighlightTag) -> Highlight {
142 Highlight { tag, modifiers: HighlightModifiers::default() }
146 impl ops::BitOr<HighlightModifier> for HighlightTag {
147 type Output = Highlight;
149 fn bitor(self, rhs: HighlightModifier) -> Highlight {
150 Highlight::new(self) | rhs
154 impl ops::BitOrAssign<HighlightModifier> for HighlightModifiers {
155 fn bitor_assign(&mut self, rhs: HighlightModifier) {
156 self.0 |= rhs.mask();
160 impl ops::BitOrAssign<HighlightModifier> for Highlight {
161 fn bitor_assign(&mut self, rhs: HighlightModifier) {
162 self.modifiers |= rhs;
166 impl ops::BitOr<HighlightModifier> for Highlight {
167 type Output = Highlight;
169 fn bitor(mut self, rhs: HighlightModifier) -> Highlight {
175 impl HighlightModifiers {
176 pub fn iter(self) -> impl Iterator<Item = HighlightModifier> {
177 HighlightModifier::ALL.iter().copied().filter(move |it| self.0 & it.mask() == it.mask())