Skip to content

Commit 6b8358d

Browse files
committed
Remove code duplication in highlight injection
1 parent 5dd6b93 commit 6b8358d

File tree

2 files changed

+35
-60
lines changed

2 files changed

+35
-60
lines changed

crates/ide/src/doc_links.rs

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,29 @@ pub(crate) fn remove_links(markdown: &str) -> String {
9898
out
9999
}
100100

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.
101124
pub(crate) fn extract_definitions_from_markdown(
102125
markdown: &str,
103126
) -> Vec<(Range<usize>, String, Option<hir::Namespace>)> {
@@ -178,15 +201,15 @@ pub(crate) fn resolve_doc_path_for_def(
178201
) -> Option<hir::ModuleDef> {
179202
match def {
180203
Definition::ModuleDef(def) => match def {
181-
ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns),
182-
ModuleDef::Function(it) => it.resolve_doc_path(db, &link, ns),
183-
ModuleDef::Adt(it) => it.resolve_doc_path(db, &link, ns),
184-
ModuleDef::Variant(it) => it.resolve_doc_path(db, &link, ns),
185-
ModuleDef::Const(it) => it.resolve_doc_path(db, &link, ns),
186-
ModuleDef::Static(it) => it.resolve_doc_path(db, &link, ns),
187-
ModuleDef::Trait(it) => it.resolve_doc_path(db, &link, ns),
188-
ModuleDef::TypeAlias(it) => it.resolve_doc_path(db, &link, ns),
189-
ModuleDef::BuiltinType(_) => None,
204+
hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns),
205+
hir::ModuleDef::Function(it) => it.resolve_doc_path(db, &link, ns),
206+
hir::ModuleDef::Adt(it) => it.resolve_doc_path(db, &link, ns),
207+
hir::ModuleDef::Variant(it) => it.resolve_doc_path(db, &link, ns),
208+
hir::ModuleDef::Const(it) => it.resolve_doc_path(db, &link, ns),
209+
hir::ModuleDef::Static(it) => it.resolve_doc_path(db, &link, ns),
210+
hir::ModuleDef::Trait(it) => it.resolve_doc_path(db, &link, ns),
211+
hir::ModuleDef::TypeAlias(it) => it.resolve_doc_path(db, &link, ns),
212+
hir::ModuleDef::BuiltinType(_) => None,
190213
},
191214
Definition::Macro(it) => it.resolve_doc_path(db, &link, ns),
192215
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
328351
.map(|url| url.into_string())
329352
}
330353

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-
353354
/// Rewrites a markdown document, applying 'callback' to each link.
354355
fn map_links<'e>(
355356
events: impl Iterator<Item = Event<'e>>,

crates/ide/src/syntax_highlighting/inject.rs

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ use syntax::{
1111
};
1212

1313
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,
1516
};
1617

1718
use super::{highlights::Highlights, injector::Injector};
@@ -190,7 +191,7 @@ pub(super) fn doc_comment(
190191
extract_definitions_from_markdown(line)
191192
.into_iter()
192193
.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))
194195
})
195196
.map(|(Range { start, end }, def)| {
196197
(
@@ -283,33 +284,6 @@ fn find_doc_string_in_attr(attr: &hir::Attr, it: &ast::Attr) -> Option<ast::Stri
283284
}
284285
}
285286

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-
313287
fn module_def_to_hl_tag(def: hir::ModuleDef) -> HlTag {
314288
let symbol = match def {
315289
hir::ModuleDef::Module(_) => SymbolKind::Module,

0 commit comments

Comments
 (0)