Skip to content

Commit 8d786dc

Browse files
committed
Replace Range<usize> usage with TextRange
1 parent c43359b commit 8d786dc

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

crates/hir_def/src/attr.rs

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! A higher level attributes based on TokenTree, with also some shortcuts.
22
33
use std::{
4-
cmp::Ordering,
5-
ops::{self, Range},
4+
convert::{TryFrom, TryInto},
5+
ops,
66
sync::Arc,
77
};
88

@@ -479,16 +479,17 @@ impl AttrsWithOwner {
479479
if !doc.is_empty() {
480480
for line in doc.split('\n') {
481481
let line = line.trim_end();
482+
let line_len = line.len();
482483
let (offset, line) = match line.char_indices().nth(indent) {
483484
Some((offset, _)) => (offset, &line[offset..]),
484485
None => (0, line),
485486
};
486487
let buf_offset = buf.len();
487488
buf.push_str(line);
488489
mapping.push((
489-
Range { start: buf_offset, end: buf.len() },
490+
TextRange::new(buf_offset.try_into().ok()?, buf.len().try_into().ok()?),
490491
idx,
491-
Range { start: offset, end: line.len() },
492+
TextRange::new(offset.try_into().ok()?, line_len.try_into().ok()?),
492493
));
493494
buf.push('\n');
494495
}
@@ -565,31 +566,18 @@ pub struct DocsRangeMap {
565566
// (docstring-line-range, attr_index, attr-string-range)
566567
// a mapping from the text range of a line of the [`Documentation`] to the attribute index and
567568
// the original (untrimmed) syntax doc line
568-
mapping: Vec<(Range<usize>, u32, Range<usize>)>,
569+
mapping: Vec<(TextRange, u32, TextRange)>,
569570
}
570571

571572
impl DocsRangeMap {
572-
pub fn map(&self, range: Range<usize>) -> Option<InFile<TextRange>> {
573-
let found = self
574-
.mapping
575-
.binary_search_by(|(probe, ..)| {
576-
if probe.contains(&range.start) {
577-
Ordering::Equal
578-
} else {
579-
probe.start.cmp(&range.end)
580-
}
581-
})
582-
.ok()?;
573+
pub fn map(&self, range: TextRange) -> Option<InFile<TextRange>> {
574+
let found = self.mapping.binary_search_by(|(probe, ..)| probe.ordering(range)).ok()?;
583575
let (line_docs_range, idx, original_line_src_range) = self.mapping[found].clone();
584-
if range.end > line_docs_range.end {
576+
if !line_docs_range.contains_range(range) {
585577
return None;
586578
}
587579

588-
let relative_range = Range {
589-
start: range.start - line_docs_range.start,
590-
end: range.end - line_docs_range.start,
591-
};
592-
let range_len = TextSize::from((range.end - range.start) as u32);
580+
let relative_range = range - line_docs_range.start();
593581

594582
let &InFile { file_id, value: ref source } = &self.source[idx as usize];
595583
match source {
@@ -599,12 +587,10 @@ impl DocsRangeMap {
599587
let text_range = comment.syntax().text_range();
600588
let range = TextRange::at(
601589
text_range.start()
602-
+ TextSize::from(
603-
(comment.prefix().len()
604-
+ original_line_src_range.start
605-
+ relative_range.start) as u32,
606-
),
607-
text_range.len().min(range_len),
590+
+ TextSize::try_from(comment.prefix().len()).ok()?
591+
+ original_line_src_range.start()
592+
+ relative_range.start(),
593+
text_range.len().min(range.len()),
608594
);
609595
Some(InFile { file_id, value: range })
610596
}

crates/ide/src/doc_links.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! Extracts, resolves and rewrites links and intra-doc links in markdown documentation.
22
3-
use std::{convert::TryFrom, iter::once, ops::Range};
3+
use std::{
4+
convert::{TryFrom, TryInto},
5+
iter::once,
6+
};
47

58
use itertools::Itertools;
69
use pulldown_cmark::{BrokenLink, CowStr, Event, InlineStr, LinkType, Options, Parser, Tag};
@@ -15,7 +18,9 @@ use ide_db::{
1518
defs::{Definition, NameClass, NameRefClass},
1619
RootDatabase,
1720
};
18-
use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxNode, SyntaxToken, TokenAtOffset, T};
21+
use syntax::{
22+
ast, match_ast, AstNode, SyntaxKind::*, SyntaxNode, SyntaxToken, TextRange, TokenAtOffset, T,
23+
};
1924

2025
use crate::{FilePosition, Semantics};
2126

@@ -115,7 +120,7 @@ pub(crate) fn external_docs(
115120
/// Extracts all links from a given markdown text.
116121
pub(crate) fn extract_definitions_from_markdown(
117122
markdown: &str,
118-
) -> Vec<(Range<usize>, String, Option<hir::Namespace>)> {
123+
) -> Vec<(TextRange, String, Option<hir::Namespace>)> {
119124
Parser::new_with_broken_link_callback(
120125
markdown,
121126
Options::empty(),
@@ -126,7 +131,11 @@ pub(crate) fn extract_definitions_from_markdown(
126131
if let Event::Start(Tag::Link(_, target, title)) = event {
127132
let link = if target.is_empty() { title } else { target };
128133
let (link, ns) = parse_intra_doc_link(&link);
129-
Some((range, link.to_string(), ns))
134+
Some((
135+
TextRange::new(range.start.try_into().ok()?, range.end.try_into().ok()?),
136+
link.to_string(),
137+
ns,
138+
))
130139
} else {
131140
None
132141
}

0 commit comments

Comments
 (0)