Basic injections

This commit is contained in:
Aleksey Kladov
2020-02-27 16:05:35 +01:00
parent 8ed7e751b6
commit c6247f74c7
5 changed files with 120 additions and 23 deletions

View File

@@ -171,6 +171,36 @@ impl RawString {
let inside_str = &text[start_of_inside..end_of_inside];
Some(inside_str.to_string())
}
pub fn open_quote_text_range(&self) -> Option<TextRange> {
let text = self.text().as_str();
let usual_string_range = find_usual_string_range(text)?;
let start = self.syntax().text_range().start();
let len = usual_string_range.start() + TextUnit::of_char('"');
Some(TextRange::offset_len(start, len))
}
pub fn close_quote_text_range(&self) -> Option<TextRange> {
let text = self.text().as_str();
let usual_string_range = find_usual_string_range(text)?;
let end = self.syntax().text_range().end();
let len = TextUnit::of_str(text) - usual_string_range.end();
Some(TextRange::from_to(end - len, end))
}
pub fn map_range_up(&self, range: TextRange) -> Option<TextRange> {
// FIXME: handle escapes here properly
let text = self.text().as_str();
let usual_string_range = find_usual_string_range(text)?;
Some(
range
+ self.syntax().text_range().start()
+ TextUnit::of_char('"')
+ usual_string_range.start(),
)
}
}
fn find_usual_string_range(s: &str) -> Option<TextRange> {