1 //! Defines token tags we use for syntax highlighting.
2 //! A tag is not unlike a CSS class.
8 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
10 pub tag: HighlightTag,
11 pub modifiers: HighlightModifiers,
14 #[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
15 pub struct HighlightModifiers(u32);
17 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
18 pub enum HighlightTag {
36 // For things which don't have proper Tag, but want to use modifiers.
40 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
42 pub enum HighlightModifier {
43 /// Used to differentiate individual elements within attributes.
45 /// Used with keywords like `if` and `break`.
47 /// `foo` in `fn foo(x: i32)` is a definition, `foo` in `foo(90 + 2)` is
55 /// Used for associated functions
57 /// Used for items in impls&traits.
65 fn as_str(self) -> &'static str {
67 HighlightTag::Symbol(symbol) => match symbol {
68 SymbolKind::Const => "constant",
69 SymbolKind::Static => "static",
70 SymbolKind::Enum => "enum",
71 SymbolKind::Variant => "enum_variant",
72 SymbolKind::Struct => "struct",
73 SymbolKind::Union => "union",
74 SymbolKind::Field => "field",
75 SymbolKind::Module => "module",
76 SymbolKind::Trait => "trait",
77 SymbolKind::Function => "function",
78 SymbolKind::TypeAlias => "type_alias",
79 SymbolKind::TypeParam => "type_param",
80 SymbolKind::ConstParam => "const_param",
81 SymbolKind::LifetimeParam => "lifetime",
82 SymbolKind::Macro => "macro",
83 SymbolKind::Local => "variable",
84 SymbolKind::Label => "label",
85 SymbolKind::ValueParam => "value_param",
86 SymbolKind::SelfParam => "self_keyword",
87 SymbolKind::Impl => "self_type",
89 HighlightTag::Attribute => "attribute",
90 HighlightTag::BoolLiteral => "bool_literal",
91 HighlightTag::BuiltinType => "builtin_type",
92 HighlightTag::ByteLiteral => "byte_literal",
93 HighlightTag::CharLiteral => "char_literal",
94 HighlightTag::Comment => "comment",
95 HighlightTag::EscapeSequence => "escape_sequence",
96 HighlightTag::FormatSpecifier => "format_specifier",
97 HighlightTag::Keyword => "keyword",
98 HighlightTag::Punctuation => "punctuation",
99 HighlightTag::NumericLiteral => "numeric_literal",
100 HighlightTag::Operator => "operator",
101 HighlightTag::StringLiteral => "string_literal",
102 HighlightTag::UnresolvedReference => "unresolved_reference",
103 HighlightTag::Dummy => "dummy",
108 impl fmt::Display for HighlightTag {
109 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
110 fmt::Display::fmt(self.as_str(), f)
114 impl HighlightModifier {
115 const ALL: &'static [HighlightModifier; HighlightModifier::Unsafe as u8 as usize + 1] = &[
116 HighlightModifier::Attribute,
117 HighlightModifier::ControlFlow,
118 HighlightModifier::Definition,
119 HighlightModifier::Documentation,
120 HighlightModifier::Injected,
121 HighlightModifier::Mutable,
122 HighlightModifier::Consuming,
123 HighlightModifier::Callable,
124 HighlightModifier::Static,
125 HighlightModifier::Associated,
126 HighlightModifier::Unsafe,
129 fn as_str(self) -> &'static str {
131 HighlightModifier::Attribute => "attribute",
132 HighlightModifier::ControlFlow => "control",
133 HighlightModifier::Definition => "declaration",
134 HighlightModifier::Documentation => "documentation",
135 HighlightModifier::Injected => "injected",
136 HighlightModifier::Mutable => "mutable",
137 HighlightModifier::Consuming => "consuming",
138 HighlightModifier::Unsafe => "unsafe",
139 HighlightModifier::Callable => "callable",
140 HighlightModifier::Static => "static",
141 HighlightModifier::Associated => "associated",
145 fn mask(self) -> u32 {
150 impl fmt::Display for HighlightModifier {
151 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
152 fmt::Display::fmt(self.as_str(), f)
156 impl fmt::Display for Highlight {
157 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
158 write!(f, "{}", self.tag)?;
159 for modifier in self.modifiers.iter() {
160 write!(f, ".{}", modifier)?
166 impl From<HighlightTag> for Highlight {
167 fn from(tag: HighlightTag) -> Highlight {
173 pub(crate) fn new(tag: HighlightTag) -> Highlight {
174 Highlight { tag, modifiers: HighlightModifiers::default() }
176 pub fn is_empty(&self) -> bool {
177 self.tag == HighlightTag::Dummy && self.modifiers == HighlightModifiers::default()
181 impl ops::BitOr<HighlightModifier> for HighlightTag {
182 type Output = Highlight;
184 fn bitor(self, rhs: HighlightModifier) -> Highlight {
185 Highlight::new(self) | rhs
189 impl ops::BitOrAssign<HighlightModifier> for HighlightModifiers {
190 fn bitor_assign(&mut self, rhs: HighlightModifier) {
191 self.0 |= rhs.mask();
195 impl ops::BitOrAssign<HighlightModifier> for Highlight {
196 fn bitor_assign(&mut self, rhs: HighlightModifier) {
197 self.modifiers |= rhs;
201 impl ops::BitOr<HighlightModifier> for Highlight {
202 type Output = Highlight;
204 fn bitor(mut self, rhs: HighlightModifier) -> Highlight {
210 impl HighlightModifiers {
211 pub fn contains(self, m: HighlightModifier) -> bool {
212 self.0 & m.mask() == m.mask()
215 pub fn iter(self) -> impl Iterator<Item = HighlightModifier> {
216 HighlightModifier::ALL.iter().copied().filter(move |it| self.0 & it.mask() == it.mask())