diff options
Diffstat (limited to 'crates/ide/src/syntax_highlighting/inject.rs')
-rw-r--r-- | crates/ide/src/syntax_highlighting/inject.rs | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs index e6dbd307e..f359eacf2 100644 --- a/crates/ide/src/syntax_highlighting/inject.rs +++ b/crates/ide/src/syntax_highlighting/inject.rs | |||
@@ -4,7 +4,7 @@ use std::{mem, ops::Range}; | |||
4 | 4 | ||
5 | use either::Either; | 5 | use either::Either; |
6 | use hir::{HasAttrs, InFile, Semantics}; | 6 | use hir::{HasAttrs, InFile, Semantics}; |
7 | use ide_db::{call_info::ActiveParameter, defs::Definition}; | 7 | use ide_db::{call_info::ActiveParameter, defs::Definition, SymbolKind}; |
8 | use syntax::{ | 8 | use syntax::{ |
9 | ast::{self, AstNode, AttrsOwner, DocCommentsOwner}, | 9 | ast::{self, AstNode, AttrsOwner, DocCommentsOwner}, |
10 | match_ast, AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize, | 10 | match_ast, AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize, |
@@ -225,13 +225,16 @@ pub(super) fn doc_comment( | |||
225 | intra_doc_links.extend( | 225 | intra_doc_links.extend( |
226 | extract_definitions_from_markdown(line) | 226 | extract_definitions_from_markdown(line) |
227 | .into_iter() | 227 | .into_iter() |
228 | .filter(|(link, ns, _)| { | 228 | .filter_map(|(link, ns, range)| { |
229 | validate_intra_doc_link(sema.db, &def, link, *ns) | 229 | validate_intra_doc_link(sema.db, &def, &link, ns).zip(Some(range)) |
230 | }) | 230 | }) |
231 | .map(|(.., Range { start, end })| { | 231 | .map(|(def, Range { start, end })| { |
232 | TextRange::at( | 232 | ( |
233 | prev_range_start + TextSize::from(start as u32), | 233 | def, |
234 | TextSize::from((end - start) as u32), | 234 | TextRange::at( |
235 | prev_range_start + TextSize::from(start as u32), | ||
236 | TextSize::from((end - start) as u32), | ||
237 | ), | ||
235 | ) | 238 | ) |
236 | }), | 239 | }), |
237 | ); | 240 | ); |
@@ -255,10 +258,13 @@ pub(super) fn doc_comment( | |||
255 | } | 258 | } |
256 | } | 259 | } |
257 | 260 | ||
258 | for range in intra_doc_links { | 261 | for (def, range) in intra_doc_links { |
259 | hl.add(HlRange { | 262 | hl.add(HlRange { |
260 | range, | 263 | range, |
261 | highlight: HlTag::IntraDocLink | HlMod::Documentation, | 264 | highlight: module_def_to_hl_tag(def) |
265 | | HlMod::Documentation | ||
266 | | HlMod::Injected | ||
267 | | HlMod::IntraDocLink, | ||
262 | binding_hash: None, | 268 | binding_hash: None, |
263 | }); | 269 | }); |
264 | } | 270 | } |
@@ -317,7 +323,7 @@ fn validate_intra_doc_link( | |||
317 | def: &Definition, | 323 | def: &Definition, |
318 | link: &str, | 324 | link: &str, |
319 | ns: Option<hir::Namespace>, | 325 | ns: Option<hir::Namespace>, |
320 | ) -> bool { | 326 | ) -> Option<hir::ModuleDef> { |
321 | match def { | 327 | match def { |
322 | Definition::ModuleDef(def) => match def { | 328 | Definition::ModuleDef(def) => match def { |
323 | hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), | 329 | hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), |
@@ -337,5 +343,21 @@ fn validate_intra_doc_link( | |||
337 | | Definition::GenericParam(_) | 343 | | Definition::GenericParam(_) |
338 | | Definition::Label(_) => None, | 344 | | Definition::Label(_) => None, |
339 | } | 345 | } |
340 | .is_some() | 346 | } |
347 | |||
348 | fn module_def_to_hl_tag(def: hir::ModuleDef) -> HlTag { | ||
349 | let symbol = match def { | ||
350 | hir::ModuleDef::Module(_) => SymbolKind::Module, | ||
351 | hir::ModuleDef::Function(_) => SymbolKind::Function, | ||
352 | hir::ModuleDef::Adt(hir::Adt::Struct(_)) => SymbolKind::Struct, | ||
353 | hir::ModuleDef::Adt(hir::Adt::Enum(_)) => SymbolKind::Enum, | ||
354 | hir::ModuleDef::Adt(hir::Adt::Union(_)) => SymbolKind::Union, | ||
355 | hir::ModuleDef::Variant(_) => SymbolKind::Variant, | ||
356 | hir::ModuleDef::Const(_) => SymbolKind::Const, | ||
357 | hir::ModuleDef::Static(_) => SymbolKind::Static, | ||
358 | hir::ModuleDef::Trait(_) => SymbolKind::Trait, | ||
359 | hir::ModuleDef::TypeAlias(_) => SymbolKind::TypeAlias, | ||
360 | hir::ModuleDef::BuiltinType(_) => return HlTag::BuiltinType, | ||
361 | }; | ||
362 | HlTag::Symbol(symbol) | ||
341 | } | 363 | } |