|
1 | 1 | //! Conversion of rust-analyzer specific types to return_types equivalents.
|
2 |
| -use crate::return_types; |
| 2 | +use crate::{return_types, semantic_tokens}; |
3 | 3 |
|
4 | 4 | pub(crate) fn text_range(
|
5 | 5 | range: ide::TextRange,
|
@@ -229,3 +229,123 @@ fn markdown_string(s: &str) -> return_types::MarkdownString {
|
229 | 229 |
|
230 | 230 | return_types::MarkdownString { value: processed_lines.join("\n") }
|
231 | 231 | }
|
| 232 | + |
| 233 | +pub(crate) type SemanticTokens = Vec<u32>; |
| 234 | + |
| 235 | +pub(crate) fn semantic_tokens( |
| 236 | + text: &str, |
| 237 | + line_index: &ide::LineIndex, |
| 238 | + highlights: Vec<ide::HlRange>, |
| 239 | +) -> SemanticTokens { |
| 240 | + let mut builder = semantic_tokens::SemanticTokensBuilder::new(); |
| 241 | + |
| 242 | + for highlight_range in highlights { |
| 243 | + if highlight_range.highlight.is_empty() { |
| 244 | + continue; |
| 245 | + } |
| 246 | + let (ty, mods) = semantic_token_type_and_modifiers(highlight_range.highlight); |
| 247 | + let token_index = semantic_tokens::type_index(ty); |
| 248 | + let modifier_bitset = mods.0; |
| 249 | + |
| 250 | + for mut text_range in line_index.lines(highlight_range.range) { |
| 251 | + if text[text_range].ends_with('\n') { |
| 252 | + text_range = ide::TextRange::new( |
| 253 | + text_range.start(), |
| 254 | + text_range.end() - ide::TextSize::of('\n'), |
| 255 | + ); |
| 256 | + } |
| 257 | + let range = self::text_range(text_range, line_index); |
| 258 | + |
| 259 | + builder.push(range, token_index, modifier_bitset); |
| 260 | + } |
| 261 | + } |
| 262 | + |
| 263 | + builder.build() |
| 264 | +} |
| 265 | + |
| 266 | +fn semantic_token_type_and_modifiers( |
| 267 | + highlight: ide::Highlight, |
| 268 | +) -> (semantic_tokens::SemanticTokenType, semantic_tokens::ModifierSet) { |
| 269 | + use ide::{HlMod, HlTag, SymbolKind}; |
| 270 | + use semantic_tokens::*; |
| 271 | + let mut mods = ModifierSet::default(); |
| 272 | + let type_ = match highlight.tag { |
| 273 | + HlTag::Symbol(symbol) => match symbol { |
| 274 | + SymbolKind::Module => SemanticTokenType::NAMESPACE, |
| 275 | + SymbolKind::Impl => SemanticTokenType::TYPE, |
| 276 | + SymbolKind::Field => SemanticTokenType::PROPERTY, |
| 277 | + SymbolKind::TypeParam => SemanticTokenType::TYPE_PARAMETER, |
| 278 | + SymbolKind::ConstParam => SemanticTokenType::PARAMETER, |
| 279 | + SymbolKind::LifetimeParam => SemanticTokenType::TYPE_PARAMETER, |
| 280 | + SymbolKind::Label => SemanticTokenType::LABEL, |
| 281 | + SymbolKind::ValueParam => SemanticTokenType::PARAMETER, |
| 282 | + SymbolKind::SelfParam => SemanticTokenType::KEYWORD, |
| 283 | + SymbolKind::Local => SemanticTokenType::VARIABLE, |
| 284 | + SymbolKind::Function => { |
| 285 | + if highlight.mods.contains(HlMod::Associated) { |
| 286 | + SemanticTokenType::MEMBER |
| 287 | + } else { |
| 288 | + SemanticTokenType::FUNCTION |
| 289 | + } |
| 290 | + } |
| 291 | + SymbolKind::Const => { |
| 292 | + mods |= SemanticTokenModifier::CONSTANT; |
| 293 | + mods |= SemanticTokenModifier::STATIC; |
| 294 | + SemanticTokenType::VARIABLE |
| 295 | + } |
| 296 | + SymbolKind::Static => { |
| 297 | + mods |= SemanticTokenModifier::STATIC; |
| 298 | + SemanticTokenType::VARIABLE |
| 299 | + } |
| 300 | + SymbolKind::Struct => SemanticTokenType::TYPE, |
| 301 | + SymbolKind::Enum => SemanticTokenType::TYPE, |
| 302 | + SymbolKind::Variant => SemanticTokenType::MEMBER, |
| 303 | + SymbolKind::Union => SemanticTokenType::TYPE, |
| 304 | + SymbolKind::TypeAlias => SemanticTokenType::TYPE, |
| 305 | + SymbolKind::Trait => SemanticTokenType::INTERFACE, |
| 306 | + SymbolKind::Macro => SemanticTokenType::MACRO, |
| 307 | + }, |
| 308 | + HlTag::Attribute => SemanticTokenType::UNSUPPORTED, |
| 309 | + HlTag::BoolLiteral => SemanticTokenType::NUMBER, |
| 310 | + HlTag::BuiltinAttr => SemanticTokenType::UNSUPPORTED, |
| 311 | + HlTag::BuiltinType => SemanticTokenType::TYPE, |
| 312 | + HlTag::ByteLiteral | HlTag::NumericLiteral => SemanticTokenType::NUMBER, |
| 313 | + HlTag::CharLiteral => SemanticTokenType::STRING, |
| 314 | + HlTag::Comment => SemanticTokenType::COMMENT, |
| 315 | + HlTag::EscapeSequence => SemanticTokenType::NUMBER, |
| 316 | + HlTag::FormatSpecifier => SemanticTokenType::MACRO, |
| 317 | + HlTag::Keyword => SemanticTokenType::KEYWORD, |
| 318 | + HlTag::None => SemanticTokenType::UNSUPPORTED, |
| 319 | + HlTag::Operator(_op) => SemanticTokenType::OPERATOR, |
| 320 | + HlTag::StringLiteral => SemanticTokenType::STRING, |
| 321 | + HlTag::UnresolvedReference => SemanticTokenType::UNSUPPORTED, |
| 322 | + HlTag::Punctuation(_punct) => SemanticTokenType::OPERATOR, |
| 323 | + }; |
| 324 | + |
| 325 | + for modifier in highlight.mods.iter() { |
| 326 | + let modifier = match modifier { |
| 327 | + HlMod::Associated => continue, |
| 328 | + HlMod::Async => SemanticTokenModifier::ASYNC, |
| 329 | + HlMod::Attribute => SemanticTokenModifier::ATTRIBUTE_MODIFIER, |
| 330 | + HlMod::Callable => SemanticTokenModifier::CALLABLE, |
| 331 | + HlMod::Consuming => SemanticTokenModifier::CONSUMING, |
| 332 | + HlMod::ControlFlow => SemanticTokenModifier::CONTROL_FLOW, |
| 333 | + HlMod::CrateRoot => SemanticTokenModifier::CRATE_ROOT, |
| 334 | + HlMod::DefaultLibrary => SemanticTokenModifier::DEFAULT_LIBRARY, |
| 335 | + HlMod::Definition => SemanticTokenModifier::DECLARATION, |
| 336 | + HlMod::Documentation => SemanticTokenModifier::DOCUMENTATION, |
| 337 | + HlMod::Injected => SemanticTokenModifier::INJECTED, |
| 338 | + HlMod::IntraDocLink => SemanticTokenModifier::INTRA_DOC_LINK, |
| 339 | + HlMod::Library => SemanticTokenModifier::LIBRARY, |
| 340 | + HlMod::Mutable => SemanticTokenModifier::MUTABLE, |
| 341 | + HlMod::Public => SemanticTokenModifier::PUBLIC, |
| 342 | + HlMod::Reference => SemanticTokenModifier::REFERENCE, |
| 343 | + HlMod::Static => SemanticTokenModifier::STATIC, |
| 344 | + HlMod::Trait => SemanticTokenModifier::TRAIT_MODIFIER, |
| 345 | + HlMod::Unsafe => SemanticTokenModifier::UNSAFE, |
| 346 | + }; |
| 347 | + mods |= modifier; |
| 348 | + } |
| 349 | + |
| 350 | + (type_, mods) |
| 351 | +} |
0 commit comments