diff options
| -rw-r--r-- | crates/ide/src/doc_links.rs | 63 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/inject.rs | 32 |
2 files changed, 35 insertions, 60 deletions
diff --git a/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index 9301cdeff..99276168f 100644 --- a/crates/ide/src/doc_links.rs +++ b/crates/ide/src/doc_links.rs | |||
| @@ -98,6 +98,29 @@ pub(crate) fn remove_links(markdown: &str) -> String { | |||
| 98 | out | 98 | out |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | /// Retrieve a link to documentation for the given symbol. | ||
| 102 | pub(crate) fn external_docs( | ||
| 103 | db: &RootDatabase, | ||
| 104 | position: &FilePosition, | ||
| 105 | ) -> Option<DocumentationLink> { | ||
| 106 | let sema = Semantics::new(db); | ||
| 107 | let file = sema.parse(position.file_id).syntax().clone(); | ||
| 108 | let token = pick_best(file.token_at_offset(position.offset))?; | ||
| 109 | let token = sema.descend_into_macros(token); | ||
| 110 | |||
| 111 | let node = token.parent()?; | ||
| 112 | let definition = match_ast! { | ||
| 113 | match node { | ||
| 114 | ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), | ||
| 115 | ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db)), | ||
| 116 | _ => None, | ||
| 117 | } | ||
| 118 | }; | ||
| 119 | |||
| 120 | get_doc_link(db, definition?) | ||
| 121 | } | ||
| 122 | |||
| 123 | /// Extracts all links from a given markdown text. | ||
| 101 | pub(crate) fn extract_definitions_from_markdown( | 124 | pub(crate) fn extract_definitions_from_markdown( |
| 102 | markdown: &str, | 125 | markdown: &str, |
| 103 | ) -> Vec<(Range<usize>, String, Option<hir::Namespace>)> { | 126 | ) -> Vec<(Range<usize>, String, Option<hir::Namespace>)> { |
| @@ -178,15 +201,15 @@ pub(crate) fn resolve_doc_path_for_def( | |||
| 178 | ) -> Option<hir::ModuleDef> { | 201 | ) -> Option<hir::ModuleDef> { |
| 179 | match def { | 202 | match def { |
| 180 | Definition::ModuleDef(def) => match def { | 203 | Definition::ModuleDef(def) => match def { |
| 181 | ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), | 204 | hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), |
| 182 | ModuleDef::Function(it) => it.resolve_doc_path(db, &link, ns), | 205 | hir::ModuleDef::Function(it) => it.resolve_doc_path(db, &link, ns), |
| 183 | ModuleDef::Adt(it) => it.resolve_doc_path(db, &link, ns), | 206 | hir::ModuleDef::Adt(it) => it.resolve_doc_path(db, &link, ns), |
| 184 | ModuleDef::Variant(it) => it.resolve_doc_path(db, &link, ns), | 207 | hir::ModuleDef::Variant(it) => it.resolve_doc_path(db, &link, ns), |
| 185 | ModuleDef::Const(it) => it.resolve_doc_path(db, &link, ns), | 208 | hir::ModuleDef::Const(it) => it.resolve_doc_path(db, &link, ns), |
| 186 | ModuleDef::Static(it) => it.resolve_doc_path(db, &link, ns), | 209 | hir::ModuleDef::Static(it) => it.resolve_doc_path(db, &link, ns), |
| 187 | ModuleDef::Trait(it) => it.resolve_doc_path(db, &link, ns), | 210 | hir::ModuleDef::Trait(it) => it.resolve_doc_path(db, &link, ns), |
| 188 | ModuleDef::TypeAlias(it) => it.resolve_doc_path(db, &link, ns), | 211 | hir::ModuleDef::TypeAlias(it) => it.resolve_doc_path(db, &link, ns), |
| 189 | ModuleDef::BuiltinType(_) => None, | 212 | hir::ModuleDef::BuiltinType(_) => None, |
| 190 | }, | 213 | }, |
| 191 | Definition::Macro(it) => it.resolve_doc_path(db, &link, ns), | 214 | Definition::Macro(it) => it.resolve_doc_path(db, &link, ns), |
| 192 | Definition::Field(it) => it.resolve_doc_path(db, &link, ns), | 215 | Definition::Field(it) => it.resolve_doc_path(db, &link, ns), |
| @@ -328,28 +351,6 @@ fn rewrite_url_link(db: &RootDatabase, def: ModuleDef, target: &str) -> Option<S | |||
| 328 | .map(|url| url.into_string()) | 351 | .map(|url| url.into_string()) |
| 329 | } | 352 | } |
| 330 | 353 | ||
| 331 | /// Retrieve a link to documentation for the given symbol. | ||
| 332 | pub(crate) fn external_docs( | ||
| 333 | db: &RootDatabase, | ||
| 334 | position: &FilePosition, | ||
| 335 | ) -> Option<DocumentationLink> { | ||
| 336 | let sema = Semantics::new(db); | ||
| 337 | let file = sema.parse(position.file_id).syntax().clone(); | ||
| 338 | let token = pick_best(file.token_at_offset(position.offset))?; | ||
| 339 | let token = sema.descend_into_macros(token); | ||
| 340 | |||
| 341 | let node = token.parent()?; | ||
| 342 | let definition = match_ast! { | ||
| 343 | match node { | ||
| 344 | ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), | ||
| 345 | ast::Name(name) => NameClass::classify(&sema, &name).map(|d| d.referenced_or_defined(sema.db)), | ||
| 346 | _ => None, | ||
| 347 | } | ||
| 348 | }; | ||
| 349 | |||
| 350 | get_doc_link(db, definition?) | ||
| 351 | } | ||
| 352 | |||
| 353 | /// Rewrites a markdown document, applying 'callback' to each link. | 354 | /// Rewrites a markdown document, applying 'callback' to each link. |
| 354 | fn map_links<'e>( | 355 | fn map_links<'e>( |
| 355 | events: impl Iterator<Item = Event<'e>>, | 356 | events: impl Iterator<Item = Event<'e>>, |
diff --git a/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs index 963c3fb59..b62d43256 100644 --- a/crates/ide/src/syntax_highlighting/inject.rs +++ b/crates/ide/src/syntax_highlighting/inject.rs | |||
| @@ -11,7 +11,8 @@ use syntax::{ | |||
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | use crate::{ | 13 | use crate::{ |
| 14 | doc_links::extract_definitions_from_markdown, Analysis, HlMod, HlRange, HlTag, RootDatabase, | 14 | doc_links::{extract_definitions_from_markdown, resolve_doc_path_for_def}, |
| 15 | Analysis, HlMod, HlRange, HlTag, RootDatabase, | ||
| 15 | }; | 16 | }; |
| 16 | 17 | ||
| 17 | use super::{highlights::Highlights, injector::Injector}; | 18 | use super::{highlights::Highlights, injector::Injector}; |
| @@ -190,7 +191,7 @@ pub(super) fn doc_comment( | |||
| 190 | extract_definitions_from_markdown(line) | 191 | extract_definitions_from_markdown(line) |
| 191 | .into_iter() | 192 | .into_iter() |
| 192 | .filter_map(|(range, link, ns)| { | 193 | .filter_map(|(range, link, ns)| { |
| 193 | Some(range).zip(validate_intra_doc_link(sema.db, &def, &link, ns)) | 194 | Some(range).zip(resolve_doc_path_for_def(sema.db, def, &link, ns)) |
| 194 | }) | 195 | }) |
| 195 | .map(|(Range { start, end }, def)| { | 196 | .map(|(Range { start, end }, def)| { |
| 196 | ( | 197 | ( |
| @@ -283,33 +284,6 @@ fn find_doc_string_in_attr(attr: &hir::Attr, it: &ast::Attr) -> Option<ast::Stri | |||
| 283 | } | 284 | } |
| 284 | } | 285 | } |
| 285 | 286 | ||
| 286 | fn validate_intra_doc_link( | ||
| 287 | db: &RootDatabase, | ||
| 288 | def: &Definition, | ||
| 289 | link: &str, | ||
| 290 | ns: Option<hir::Namespace>, | ||
| 291 | ) -> Option<hir::ModuleDef> { | ||
| 292 | match def { | ||
| 293 | Definition::ModuleDef(def) => match def { | ||
| 294 | hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), | ||
| 295 | hir::ModuleDef::Function(it) => it.resolve_doc_path(db, &link, ns), | ||
| 296 | hir::ModuleDef::Adt(it) => it.resolve_doc_path(db, &link, ns), | ||
| 297 | hir::ModuleDef::Variant(it) => it.resolve_doc_path(db, &link, ns), | ||
| 298 | hir::ModuleDef::Const(it) => it.resolve_doc_path(db, &link, ns), | ||
| 299 | hir::ModuleDef::Static(it) => it.resolve_doc_path(db, &link, ns), | ||
| 300 | hir::ModuleDef::Trait(it) => it.resolve_doc_path(db, &link, ns), | ||
| 301 | hir::ModuleDef::TypeAlias(it) => it.resolve_doc_path(db, &link, ns), | ||
| 302 | hir::ModuleDef::BuiltinType(_) => None, | ||
| 303 | }, | ||
| 304 | Definition::Macro(it) => it.resolve_doc_path(db, &link, ns), | ||
| 305 | Definition::Field(it) => it.resolve_doc_path(db, &link, ns), | ||
| 306 | Definition::SelfType(_) | ||
| 307 | | Definition::Local(_) | ||
| 308 | | Definition::GenericParam(_) | ||
| 309 | | Definition::Label(_) => None, | ||
| 310 | } | ||
| 311 | } | ||
| 312 | |||
| 313 | fn module_def_to_hl_tag(def: hir::ModuleDef) -> HlTag { | 287 | fn module_def_to_hl_tag(def: hir::ModuleDef) -> HlTag { |
| 314 | let symbol = match def { | 288 | let symbol = match def { |
| 315 | hir::ModuleDef::Module(_) => SymbolKind::Module, | 289 | hir::ModuleDef::Module(_) => SymbolKind::Module, |
