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 {
44 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
46 pub enum HighlightModifier {
47 /// Used with keywords like `if` and `break`.
49 /// `foo` in `fn foo(x: i32)` is a definition, `foo` in `foo(90 + 2)` is
57 fn as_str(self) -> &'static str {
59 HighlightTag::Attribute => "attribute",
60 HighlightTag::BuiltinType => "builtin_type",
61 HighlightTag::ByteLiteral => "byte_literal",
62 HighlightTag::CharLiteral => "char_literal",
63 HighlightTag::Comment => "comment",
64 HighlightTag::Constant => "constant",
65 HighlightTag::Enum => "enum",
66 HighlightTag::EnumVariant => "enum_variant",
67 HighlightTag::Field => "field",
68 HighlightTag::Function => "function",
69 HighlightTag::Keyword => "keyword",
70 HighlightTag::Lifetime => "lifetime",
71 HighlightTag::Macro => "macro",
72 HighlightTag::Module => "module",
73 HighlightTag::NumericLiteral => "numeric_literal",
74 HighlightTag::SelfType => "self_type",
75 HighlightTag::Static => "static",
76 HighlightTag::StringLiteral => "string_literal",
77 HighlightTag::Struct => "struct",
78 HighlightTag::Trait => "trait",
79 HighlightTag::TypeAlias => "type_alias",
80 HighlightTag::TypeParam => "type_param",
81 HighlightTag::Union => "union",
82 HighlightTag::Local => "variable",
83 HighlightTag::UnresolvedReference => "unresolved_reference",
88 impl fmt::Display for HighlightTag {
89 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
90 fmt::Display::fmt(self.as_str(), f)
94 impl HighlightModifier {
95 const ALL: &'static [HighlightModifier] = &[
96 HighlightModifier::ControlFlow,
97 HighlightModifier::Definition,
98 HighlightModifier::Mutable,
99 HighlightModifier::Unsafe,
102 fn as_str(self) -> &'static str {
104 HighlightModifier::ControlFlow => "control",
105 HighlightModifier::Definition => "declaration",
106 HighlightModifier::Mutable => "mutable",
107 HighlightModifier::Unsafe => "unsafe",
111 fn mask(self) -> u32 {
116 impl fmt::Display for HighlightModifier {
117 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
118 fmt::Display::fmt(self.as_str(), f)
122 impl fmt::Display for Highlight {
123 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
124 write!(f, "{}", self.tag)?;
125 for modifier in self.modifiers.iter() {
126 write!(f, ".{}", modifier)?
132 impl From<HighlightTag> for Highlight {
133 fn from(tag: HighlightTag) -> Highlight {
139 pub(crate) fn new(tag: HighlightTag) -> Highlight {
140 Highlight { tag, modifiers: HighlightModifiers::default() }
144 impl ops::BitOr<HighlightModifier> for HighlightTag {
145 type Output = Highlight;
147 fn bitor(self, rhs: HighlightModifier) -> Highlight {
148 Highlight::new(self) | rhs
152 impl ops::BitOrAssign<HighlightModifier> for HighlightModifiers {
153 fn bitor_assign(&mut self, rhs: HighlightModifier) {
154 self.0 |= rhs.mask();
158 impl ops::BitOrAssign<HighlightModifier> for Highlight {
159 fn bitor_assign(&mut self, rhs: HighlightModifier) {
160 self.modifiers |= rhs;
164 impl ops::BitOr<HighlightModifier> for Highlight {
165 type Output = Highlight;
167 fn bitor(mut self, rhs: HighlightModifier) -> Highlight {
173 impl HighlightModifiers {
174 pub fn iter(self) -> impl Iterator<Item = HighlightModifier> {
175 HighlightModifier::ALL.iter().copied().filter(move |it| self.0 & it.mask() == it.mask())