aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/syntax_highlighting/inject.rs
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-03-18 14:22:27 +0000
committerLukas Wirth <[email protected]>2021-03-18 21:32:07 +0000
commit8c0f454d115a5ce5fa4a9a0aa7116eac99a292f9 (patch)
treecda6b85e9f08457f016490c551158fc5b59d8cb6 /crates/ide/src/syntax_highlighting/inject.rs
parent5e82d3172282e159e539569b80b3135c17b972f0 (diff)
Use a highlight modifier for intra doc links
Diffstat (limited to 'crates/ide/src/syntax_highlighting/inject.rs')
-rw-r--r--crates/ide/src/syntax_highlighting/inject.rs44
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
5use either::Either; 5use either::Either;
6use hir::{HasAttrs, InFile, Semantics}; 6use hir::{HasAttrs, InFile, Semantics};
7use ide_db::{call_info::ActiveParameter, defs::Definition}; 7use ide_db::{call_info::ActiveParameter, defs::Definition, SymbolKind};
8use syntax::{ 8use 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
348fn 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}