aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/ast
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-07-09 18:21:41 +0100
committerAleksey Kladov <[email protected]>2020-07-09 18:21:41 +0100
commit68706b59c9177db2a6dd276e1ce599d8fe5942c1 (patch)
tree9cc123ba4b246b2c6f150bee3e39d8d6fd35505c /crates/ra_syntax/src/ast
parent1fb92d791e44d3b225f73d9160de173f255ab881 (diff)
Don't mess with cursor position when adding hashes
Diffstat (limited to 'crates/ra_syntax/src/ast')
-rw-r--r--crates/ra_syntax/src/ast/tokens.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/crates/ra_syntax/src/ast/tokens.rs b/crates/ra_syntax/src/ast/tokens.rs
index 2e72d4927..045f69133 100644
--- a/crates/ra_syntax/src/ast/tokens.rs
+++ b/crates/ra_syntax/src/ast/tokens.rs
@@ -1,6 +1,9 @@
1//! There are many AstNodes, but only a few tokens, so we hand-write them here. 1//! There are many AstNodes, but only a few tokens, so we hand-write them here.
2 2
3use std::convert::{TryFrom, TryInto}; 3use std::{
4 borrow::Cow,
5 convert::{TryFrom, TryInto},
6};
4 7
5use crate::{ 8use crate::{
6 ast::{AstToken, Comment, RawString, String, Whitespace}, 9 ast::{AstToken, Comment, RawString, String, Whitespace},
@@ -138,11 +141,11 @@ impl HasQuotes for String {}
138impl HasQuotes for RawString {} 141impl HasQuotes for RawString {}
139 142
140pub trait HasStringValue: HasQuotes { 143pub trait HasStringValue: HasQuotes {
141 fn value(&self) -> Option<std::string::String>; 144 fn value(&self) -> Option<Cow<'_, str>>;
142} 145}
143 146
144impl HasStringValue for String { 147impl HasStringValue for String {
145 fn value(&self) -> Option<std::string::String> { 148 fn value(&self) -> Option<Cow<'_, str>> {
146 let text = self.text().as_str(); 149 let text = self.text().as_str();
147 let text = &text[self.text_range_between_quotes()? - self.syntax().text_range().start()]; 150 let text = &text[self.text_range_between_quotes()? - self.syntax().text_range().start()];
148 151
@@ -156,15 +159,17 @@ impl HasStringValue for String {
156 if has_error { 159 if has_error {
157 return None; 160 return None;
158 } 161 }
159 Some(buf) 162 // FIXME: don't actually allocate for borrowed case
163 let res = if buf == text { Cow::Borrowed(text) } else { Cow::Owned(buf) };
164 Some(res)
160 } 165 }
161} 166}
162 167
163impl HasStringValue for RawString { 168impl HasStringValue for RawString {
164 fn value(&self) -> Option<std::string::String> { 169 fn value(&self) -> Option<Cow<'_, str>> {
165 let text = self.text().as_str(); 170 let text = self.text().as_str();
166 let text = &text[self.text_range_between_quotes()? - self.syntax().text_range().start()]; 171 let text = &text[self.text_range_between_quotes()? - self.syntax().text_range().start()];
167 Some(text.to_string()) 172 Some(Cow::Borrowed(text))
168 } 173 }
169} 174}
170 175