Skip to content

Commit 6b98e55

Browse files
committed
Add Static and Const highlighting token types
1 parent 91659da commit 6b98e55

File tree

6 files changed

+107
-95
lines changed

6 files changed

+107
-95
lines changed

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,6 @@ pub(super) fn highlight_def(
444444
Definition::Variant(_) => Highlight::new(HlTag::Symbol(SymbolKind::Variant)),
445445
Definition::Const(konst) => {
446446
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Const)) | HlMod::Const;
447-
448447
if let Some(item) = konst.as_assoc_item(db) {
449448
h |= HlMod::Associated;
450449
h |= HlMod::Static;

crates/ide/src/syntax_highlighting/tags.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ pub enum HlMod {
7777
Library,
7878
/// Used to differentiate individual elements within macro calls.
7979
Macro,
80+
/// Used to differentiate individual elements within proc-macro calls.
8081
ProcMacro,
8182
/// Mutable binding.
8283
Mutable,
@@ -262,6 +263,7 @@ impl HlMod {
262263
}
263264

264265
fn mask(self) -> u32 {
266+
debug_assert!(Self::ALL.len() <= 32, "HlMod::mask is not enough to cover all variants");
265267
1 << (self as u32)
266268
}
267269
}

crates/ide/src/syntax_highlighting/test_data/highlight_general.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@
218218
<span class="bool_literal">true</span>
219219
<span class="brace">}</span>
220220
<span class="brace">}</span>
221-
<span class="keyword const">const</span> <span class="constant const declaration">USAGE_OF_BOOL</span><span class="colon">:</span><span class="builtin_type">bool</span> <span class="operator">=</span> <span class="enum public">Bool</span><span class="operator">::</span><span class="enum_variant public">True</span><span class="operator">.</span><span class="method consuming public">to_primitive</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
221+
<span class="keyword const">const</span> <span class="constant const declaration">USAGE_OF_BOOL</span><span class="colon">:</span> <span class="builtin_type">bool</span> <span class="operator">=</span> <span class="enum public">Bool</span><span class="operator">::</span><span class="enum_variant public">True</span><span class="operator">.</span><span class="method consuming public">to_primitive</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
222222

223223
<span class="keyword">trait</span> <span class="trait declaration">Baz</span> <span class="brace">{</span>
224224
<span class="keyword">type</span> <span class="type_alias associated declaration static trait">Qux</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ impl Bool {
300300
true
301301
}
302302
}
303-
const USAGE_OF_BOOL:bool = Bool::True.to_primitive();
303+
const USAGE_OF_BOOL: bool = Bool::True.to_primitive();
304304
305305
trait Baz {
306306
type Qux;

crates/rust-analyzer/src/lsp/semantic_tokens.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,19 @@ macro_rules! define_semantic_token_types {
1717
}
1818

1919
) => {
20-
$(pub(crate) const $standard: SemanticTokenType = SemanticTokenType::$standard;)*
21-
$(pub(crate) const $custom: SemanticTokenType = SemanticTokenType::new($string);)*
20+
pub(crate) mod types {
21+
use super::SemanticTokenType;
22+
$(pub(crate) const $standard: SemanticTokenType = SemanticTokenType::$standard;)*
23+
$(pub(crate) const $custom: SemanticTokenType = SemanticTokenType::new($string);)*
24+
}
2225

2326
pub(crate) const SUPPORTED_TYPES: &[SemanticTokenType] = &[
2427
$(SemanticTokenType::$standard,)*
25-
$($custom),*
28+
$(self::types::$custom),*
2629
];
2730

2831
pub(crate) fn standard_fallback_type(token: SemanticTokenType) -> Option<SemanticTokenType> {
32+
use self::types::*;
2933
$(
3034
if token == $custom {
3135
None $(.or(Some(SemanticTokenType::$fallback)))?
@@ -61,8 +65,8 @@ define_semantic_token_types![
6165
custom {
6266
(ANGLE, "angle"),
6367
(ARITHMETIC, "arithmetic") => OPERATOR,
64-
(ATTRIBUTE, "attribute") => DECORATOR,
6568
(ATTRIBUTE_BRACKET, "attributeBracket") => DECORATOR,
69+
(ATTRIBUTE, "attribute") => DECORATOR,
6670
(BITWISE, "bitwise") => OPERATOR,
6771
(BOOLEAN, "boolean"),
6872
(BRACE, "brace"),
@@ -74,26 +78,28 @@ define_semantic_token_types![
7478
(COMMA, "comma"),
7579
(COMPARISON, "comparison") => OPERATOR,
7680
(CONST_PARAMETER, "constParameter"),
77-
(DERIVE, "derive") => DECORATOR,
81+
(CONST, "const") => VARIABLE,
7882
(DERIVE_HELPER, "deriveHelper") => DECORATOR,
83+
(DERIVE, "derive") => DECORATOR,
7984
(DOT, "dot"),
8085
(ESCAPE_SEQUENCE, "escapeSequence") => STRING,
81-
(INVALID_ESCAPE_SEQUENCE, "invalidEscapeSequence") => STRING,
8286
(FORMAT_SPECIFIER, "formatSpecifier") => STRING,
8387
(GENERIC, "generic") => TYPE_PARAMETER,
88+
(INVALID_ESCAPE_SEQUENCE, "invalidEscapeSequence") => STRING,
8489
(LABEL, "label"),
8590
(LIFETIME, "lifetime"),
8691
(LOGICAL, "logical") => OPERATOR,
8792
(MACRO_BANG, "macroBang") => MACRO,
88-
(PROC_MACRO, "procMacro") => MACRO,
8993
(PARENTHESIS, "parenthesis"),
94+
(PROC_MACRO, "procMacro") => MACRO,
9095
(PUNCTUATION, "punctuation"),
9196
(SELF_KEYWORD, "selfKeyword") => KEYWORD,
9297
(SELF_TYPE_KEYWORD, "selfTypeKeyword") => KEYWORD,
9398
(SEMICOLON, "semicolon"),
94-
(TYPE_ALIAS, "typeAlias"),
99+
(STATIC, "static") => VARIABLE,
95100
(TOOL_MODULE, "toolModule") => DECORATOR,
96-
(UNION, "union"),
101+
(TYPE_ALIAS, "typeAlias") => TYPE,
102+
(UNION, "union") => STRUCT,
97103
(UNRESOLVED_REFERENCE, "unresolvedReference"),
98104
}
99105
];
@@ -112,13 +118,16 @@ macro_rules! define_semantic_token_modifiers {
112118
}
113119

114120
) => {
121+
pub(crate) mod modifiers {
122+
use super::SemanticTokenModifier;
115123

116-
$(pub(crate) const $standard: SemanticTokenModifier = SemanticTokenModifier::$standard;)*
117-
$(pub(crate) const $custom: SemanticTokenModifier = SemanticTokenModifier::new($string);)*
124+
$(pub(crate) const $standard: SemanticTokenModifier = SemanticTokenModifier::$standard;)*
125+
$(pub(crate) const $custom: SemanticTokenModifier = SemanticTokenModifier::new($string);)*
126+
}
118127

119128
pub(crate) const SUPPORTED_MODIFIERS: &[SemanticTokenModifier] = &[
120129
$(SemanticTokenModifier::$standard,)*
121-
$($custom),*
130+
$(self::modifiers::$custom),*
122131
];
123132

124133
const LAST_STANDARD_MOD: usize = count_tts!($($standard)*);
@@ -145,8 +154,8 @@ define_semantic_token_modifiers![
145154
(INTRA_DOC_LINK, "intraDocLink"),
146155
(LIBRARY, "library"),
147156
(MACRO_MODIFIER, "macro"),
148-
(PROC_MACRO_MODIFIER, "proc_macro"),
149157
(MUTABLE, "mutable"),
158+
(PROC_MACRO_MODIFIER, "proc_macro"),
150159
(PUBLIC, "public"),
151160
(REFERENCE, "reference"),
152161
(TRAIT_MODIFIER, "trait"),

crates/rust-analyzer/src/lsp/to_proto.rs

Lines changed: 81 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -654,97 +654,99 @@ pub(crate) fn semantic_token_delta(
654654
fn semantic_token_type_and_modifiers(
655655
highlight: Highlight,
656656
) -> (lsp_types::SemanticTokenType, semantic_tokens::ModifierSet) {
657+
use semantic_tokens::{modifiers as mods, types};
658+
657659
let ty = match highlight.tag {
658660
HlTag::Symbol(symbol) => match symbol {
659-
SymbolKind::Attribute => semantic_tokens::DECORATOR,
660-
SymbolKind::Derive => semantic_tokens::DERIVE,
661-
SymbolKind::DeriveHelper => semantic_tokens::DERIVE_HELPER,
662-
SymbolKind::Module => semantic_tokens::NAMESPACE,
663-
SymbolKind::Impl => semantic_tokens::TYPE_ALIAS,
664-
SymbolKind::Field => semantic_tokens::PROPERTY,
665-
SymbolKind::TypeParam => semantic_tokens::TYPE_PARAMETER,
666-
SymbolKind::ConstParam => semantic_tokens::CONST_PARAMETER,
667-
SymbolKind::LifetimeParam => semantic_tokens::LIFETIME,
668-
SymbolKind::Label => semantic_tokens::LABEL,
669-
SymbolKind::ValueParam => semantic_tokens::PARAMETER,
670-
SymbolKind::SelfParam => semantic_tokens::SELF_KEYWORD,
671-
SymbolKind::SelfType => semantic_tokens::SELF_TYPE_KEYWORD,
672-
SymbolKind::Local => semantic_tokens::VARIABLE,
673-
SymbolKind::Method => semantic_tokens::METHOD,
674-
SymbolKind::Function => semantic_tokens::FUNCTION,
675-
SymbolKind::Const => semantic_tokens::VARIABLE,
676-
SymbolKind::Static => semantic_tokens::VARIABLE,
677-
SymbolKind::Struct => semantic_tokens::STRUCT,
678-
SymbolKind::Enum => semantic_tokens::ENUM,
679-
SymbolKind::Variant => semantic_tokens::ENUM_MEMBER,
680-
SymbolKind::Union => semantic_tokens::UNION,
681-
SymbolKind::TypeAlias => semantic_tokens::TYPE_ALIAS,
682-
SymbolKind::Trait => semantic_tokens::INTERFACE,
683-
SymbolKind::TraitAlias => semantic_tokens::INTERFACE,
684-
SymbolKind::Macro => semantic_tokens::MACRO,
685-
SymbolKind::ProcMacro => semantic_tokens::PROC_MACRO,
686-
SymbolKind::BuiltinAttr => semantic_tokens::BUILTIN_ATTRIBUTE,
687-
SymbolKind::ToolModule => semantic_tokens::TOOL_MODULE,
661+
SymbolKind::Attribute => types::DECORATOR,
662+
SymbolKind::Derive => types::DERIVE,
663+
SymbolKind::DeriveHelper => types::DERIVE_HELPER,
664+
SymbolKind::Module => types::NAMESPACE,
665+
SymbolKind::Impl => types::TYPE_ALIAS,
666+
SymbolKind::Field => types::PROPERTY,
667+
SymbolKind::TypeParam => types::TYPE_PARAMETER,
668+
SymbolKind::ConstParam => types::CONST_PARAMETER,
669+
SymbolKind::LifetimeParam => types::LIFETIME,
670+
SymbolKind::Label => types::LABEL,
671+
SymbolKind::ValueParam => types::PARAMETER,
672+
SymbolKind::SelfParam => types::SELF_KEYWORD,
673+
SymbolKind::SelfType => types::SELF_TYPE_KEYWORD,
674+
SymbolKind::Local => types::VARIABLE,
675+
SymbolKind::Method => types::METHOD,
676+
SymbolKind::Function => types::FUNCTION,
677+
SymbolKind::Const => types::CONST,
678+
SymbolKind::Static => types::STATIC,
679+
SymbolKind::Struct => types::STRUCT,
680+
SymbolKind::Enum => types::ENUM,
681+
SymbolKind::Variant => types::ENUM_MEMBER,
682+
SymbolKind::Union => types::UNION,
683+
SymbolKind::TypeAlias => types::TYPE_ALIAS,
684+
SymbolKind::Trait => types::INTERFACE,
685+
SymbolKind::TraitAlias => types::INTERFACE,
686+
SymbolKind::Macro => types::MACRO,
687+
SymbolKind::ProcMacro => types::PROC_MACRO,
688+
SymbolKind::BuiltinAttr => types::BUILTIN_ATTRIBUTE,
689+
SymbolKind::ToolModule => types::TOOL_MODULE,
688690
},
689-
HlTag::AttributeBracket => semantic_tokens::ATTRIBUTE_BRACKET,
690-
HlTag::BoolLiteral => semantic_tokens::BOOLEAN,
691-
HlTag::BuiltinType => semantic_tokens::BUILTIN_TYPE,
692-
HlTag::ByteLiteral | HlTag::NumericLiteral => semantic_tokens::NUMBER,
693-
HlTag::CharLiteral => semantic_tokens::CHAR,
694-
HlTag::Comment => semantic_tokens::COMMENT,
695-
HlTag::EscapeSequence => semantic_tokens::ESCAPE_SEQUENCE,
696-
HlTag::InvalidEscapeSequence => semantic_tokens::INVALID_ESCAPE_SEQUENCE,
697-
HlTag::FormatSpecifier => semantic_tokens::FORMAT_SPECIFIER,
698-
HlTag::Keyword => semantic_tokens::KEYWORD,
699-
HlTag::None => semantic_tokens::GENERIC,
691+
HlTag::AttributeBracket => types::ATTRIBUTE_BRACKET,
692+
HlTag::BoolLiteral => types::BOOLEAN,
693+
HlTag::BuiltinType => types::BUILTIN_TYPE,
694+
HlTag::ByteLiteral | HlTag::NumericLiteral => types::NUMBER,
695+
HlTag::CharLiteral => types::CHAR,
696+
HlTag::Comment => types::COMMENT,
697+
HlTag::EscapeSequence => types::ESCAPE_SEQUENCE,
698+
HlTag::InvalidEscapeSequence => types::INVALID_ESCAPE_SEQUENCE,
699+
HlTag::FormatSpecifier => types::FORMAT_SPECIFIER,
700+
HlTag::Keyword => types::KEYWORD,
701+
HlTag::None => types::GENERIC,
700702
HlTag::Operator(op) => match op {
701-
HlOperator::Bitwise => semantic_tokens::BITWISE,
702-
HlOperator::Arithmetic => semantic_tokens::ARITHMETIC,
703-
HlOperator::Logical => semantic_tokens::LOGICAL,
704-
HlOperator::Comparison => semantic_tokens::COMPARISON,
705-
HlOperator::Other => semantic_tokens::OPERATOR,
703+
HlOperator::Bitwise => types::BITWISE,
704+
HlOperator::Arithmetic => types::ARITHMETIC,
705+
HlOperator::Logical => types::LOGICAL,
706+
HlOperator::Comparison => types::COMPARISON,
707+
HlOperator::Other => types::OPERATOR,
706708
},
707-
HlTag::StringLiteral => semantic_tokens::STRING,
708-
HlTag::UnresolvedReference => semantic_tokens::UNRESOLVED_REFERENCE,
709+
HlTag::StringLiteral => types::STRING,
710+
HlTag::UnresolvedReference => types::UNRESOLVED_REFERENCE,
709711
HlTag::Punctuation(punct) => match punct {
710-
HlPunct::Bracket => semantic_tokens::BRACKET,
711-
HlPunct::Brace => semantic_tokens::BRACE,
712-
HlPunct::Parenthesis => semantic_tokens::PARENTHESIS,
713-
HlPunct::Angle => semantic_tokens::ANGLE,
714-
HlPunct::Comma => semantic_tokens::COMMA,
715-
HlPunct::Dot => semantic_tokens::DOT,
716-
HlPunct::Colon => semantic_tokens::COLON,
717-
HlPunct::Semi => semantic_tokens::SEMICOLON,
718-
HlPunct::Other => semantic_tokens::PUNCTUATION,
719-
HlPunct::MacroBang => semantic_tokens::MACRO_BANG,
712+
HlPunct::Bracket => types::BRACKET,
713+
HlPunct::Brace => types::BRACE,
714+
HlPunct::Parenthesis => types::PARENTHESIS,
715+
HlPunct::Angle => types::ANGLE,
716+
HlPunct::Comma => types::COMMA,
717+
HlPunct::Dot => types::DOT,
718+
HlPunct::Colon => types::COLON,
719+
HlPunct::Semi => types::SEMICOLON,
720+
HlPunct::Other => types::PUNCTUATION,
721+
HlPunct::MacroBang => types::MACRO_BANG,
720722
},
721723
};
722724

723725
let mut mods = semantic_tokens::ModifierSet::default();
724726
for modifier in highlight.mods.iter() {
725727
let modifier = match modifier {
726-
HlMod::Associated => semantic_tokens::ASSOCIATED,
727-
HlMod::Async => semantic_tokens::ASYNC,
728-
HlMod::Attribute => semantic_tokens::ATTRIBUTE_MODIFIER,
729-
HlMod::Callable => semantic_tokens::CALLABLE,
730-
HlMod::Const => semantic_tokens::CONSTANT,
731-
HlMod::Consuming => semantic_tokens::CONSUMING,
732-
HlMod::ControlFlow => semantic_tokens::CONTROL_FLOW,
733-
HlMod::CrateRoot => semantic_tokens::CRATE_ROOT,
734-
HlMod::DefaultLibrary => semantic_tokens::DEFAULT_LIBRARY,
735-
HlMod::Definition => semantic_tokens::DECLARATION,
736-
HlMod::Documentation => semantic_tokens::DOCUMENTATION,
737-
HlMod::Injected => semantic_tokens::INJECTED,
738-
HlMod::IntraDocLink => semantic_tokens::INTRA_DOC_LINK,
739-
HlMod::Library => semantic_tokens::LIBRARY,
740-
HlMod::Macro => semantic_tokens::MACRO_MODIFIER,
741-
HlMod::ProcMacro => semantic_tokens::PROC_MACRO_MODIFIER,
742-
HlMod::Mutable => semantic_tokens::MUTABLE,
743-
HlMod::Public => semantic_tokens::PUBLIC,
744-
HlMod::Reference => semantic_tokens::REFERENCE,
745-
HlMod::Static => semantic_tokens::STATIC,
746-
HlMod::Trait => semantic_tokens::TRAIT_MODIFIER,
747-
HlMod::Unsafe => semantic_tokens::UNSAFE,
728+
HlMod::Associated => mods::ASSOCIATED,
729+
HlMod::Async => mods::ASYNC,
730+
HlMod::Attribute => mods::ATTRIBUTE_MODIFIER,
731+
HlMod::Callable => mods::CALLABLE,
732+
HlMod::Const => mods::CONSTANT,
733+
HlMod::Consuming => mods::CONSUMING,
734+
HlMod::ControlFlow => mods::CONTROL_FLOW,
735+
HlMod::CrateRoot => mods::CRATE_ROOT,
736+
HlMod::DefaultLibrary => mods::DEFAULT_LIBRARY,
737+
HlMod::Definition => mods::DECLARATION,
738+
HlMod::Documentation => mods::DOCUMENTATION,
739+
HlMod::Injected => mods::INJECTED,
740+
HlMod::IntraDocLink => mods::INTRA_DOC_LINK,
741+
HlMod::Library => mods::LIBRARY,
742+
HlMod::Macro => mods::MACRO_MODIFIER,
743+
HlMod::ProcMacro => mods::PROC_MACRO_MODIFIER,
744+
HlMod::Mutable => mods::MUTABLE,
745+
HlMod::Public => mods::PUBLIC,
746+
HlMod::Reference => mods::REFERENCE,
747+
HlMod::Static => mods::STATIC,
748+
HlMod::Trait => mods::TRAIT_MODIFIER,
749+
HlMod::Unsafe => mods::UNSAFE,
748750
};
749751
mods |= modifier;
750752
}

0 commit comments

Comments
 (0)