aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-01-22 11:23:21 +0000
committerGitHub <[email protected]>2020-01-22 11:23:21 +0000
commita5407ddc05826b208ed8a0026b2ae566bf0a8b70 (patch)
treed9041707f979ed46fdb05a62a3875feee504a06b
parentb982d60a4d512602b54f79b39119bde0f7e50f87 (diff)
parentfa31841f1f497f84ceb15c0a8636a2bf836705da (diff)
Merge #2891
2891: ra_syntax: removed code duplication and token reevaluation r=Veetaha a=Veetaha Just a small refactoring along the way of reading the codebase Co-authored-by: Veetaha <[email protected]>
-rw-r--r--crates/ra_parser/src/lib.rs4
-rw-r--r--crates/ra_syntax/src/ast/expr_extensions.rs49
2 files changed, 24 insertions, 29 deletions
diff --git a/crates/ra_parser/src/lib.rs b/crates/ra_parser/src/lib.rs
index 65134277e..81055746b 100644
--- a/crates/ra_parser/src/lib.rs
+++ b/crates/ra_parser/src/lib.rs
@@ -27,7 +27,7 @@ pub use syntax_kind::SyntaxKind;
27#[derive(Debug, Clone, PartialEq, Eq, Hash)] 27#[derive(Debug, Clone, PartialEq, Eq, Hash)]
28pub struct ParseError(pub String); 28pub struct ParseError(pub String);
29 29
30/// `TokenSource` abstracts the source of the tokens parser operates one. 30/// `TokenSource` abstracts the source of the tokens parser operates on.
31/// 31///
32/// Hopefully this will allow us to treat text and token trees in the same way! 32/// Hopefully this will allow us to treat text and token trees in the same way!
33pub trait TokenSource { 33pub trait TokenSource {
@@ -43,7 +43,7 @@ pub trait TokenSource {
43 fn is_keyword(&self, kw: &str) -> bool; 43 fn is_keyword(&self, kw: &str) -> bool;
44} 44}
45 45
46/// `TokenCursor` abstracts the cursor of `TokenSource` operates one. 46/// `Token` abstracts the cursor of `TokenSource` operates on.
47#[derive(Debug, Copy, Clone, Eq, PartialEq)] 47#[derive(Debug, Copy, Clone, Eq, PartialEq)]
48pub struct Token { 48pub struct Token {
49 /// What is the current token? 49 /// What is the current token?
diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs
index 6da4b1309..539759450 100644
--- a/crates/ra_syntax/src/ast/expr_extensions.rs
+++ b/crates/ra_syntax/src/ast/expr_extensions.rs
@@ -305,44 +305,39 @@ impl ast::Literal {
305 .unwrap() 305 .unwrap()
306 } 306 }
307 307
308 fn find_suffix(text: &str, possible_suffixes: &[&str]) -> Option<SmolStr> {
309 possible_suffixes
310 .iter()
311 .find(|&suffix| text.ends_with(suffix))
312 .map(|&suffix| SmolStr::new(suffix))
313 }
314
308 pub fn kind(&self) -> LiteralKind { 315 pub fn kind(&self) -> LiteralKind {
309 match self.token().kind() { 316 const INT_SUFFIXES: [&'static str; 12] = [
310 INT_NUMBER => { 317 "u64", "u32", "u16", "u8", "usize", "isize", "i64", "i32", "i16", "i8", "u128", "i128",
311 let int_suffix_list = [ 318 ];
312 "isize", "i128", "i64", "i32", "i16", "i8", "usize", "u128", "u64", "u32", 319 const FLOAT_SUFFIXES: [&'static str; 2] = ["f32", "f64"];
313 "u16", "u8",
314 ];
315 320
321 let token = self.token();
322
323 match token.kind() {
324 INT_NUMBER => {
325 // FYI: there was a bug here previously, thus an if statement bellow is necessary.
316 // The lexer treats e.g. `1f64` as an integer literal. See 326 // The lexer treats e.g. `1f64` as an integer literal. See
317 // https://github.com/rust-analyzer/rust-analyzer/issues/1592 327 // https://github.com/rust-analyzer/rust-analyzer/issues/1592
318 // and the comments on the linked PR. 328 // and the comments on the linked PR.
319 let float_suffix_list = ["f32", "f64"];
320
321 let text = self.token().text().to_string();
322 329
323 let float_suffix = float_suffix_list 330 let text = token.text();
324 .iter()
325 .find(|&s| text.ends_with(s))
326 .map(|&suf| SmolStr::new(suf));
327 331
328 if float_suffix.is_some() { 332 if let suffix @ Some(_) = Self::find_suffix(&text, &FLOAT_SUFFIXES) {
329 LiteralKind::FloatNumber { suffix: float_suffix } 333 LiteralKind::FloatNumber { suffix }
330 } else { 334 } else {
331 let suffix = int_suffix_list 335 LiteralKind::IntNumber { suffix: Self::find_suffix(&text, &INT_SUFFIXES) }
332 .iter()
333 .find(|&s| text.ends_with(s))
334 .map(|&suf| SmolStr::new(suf));
335 LiteralKind::IntNumber { suffix }
336 } 336 }
337 } 337 }
338 FLOAT_NUMBER => { 338 FLOAT_NUMBER => {
339 let allowed_suffix_list = ["f64", "f32"]; 339 let text = token.text();
340 let text = self.token().text().to_string(); 340 LiteralKind::FloatNumber { suffix: Self::find_suffix(&text, &FLOAT_SUFFIXES) }
341 let suffix = allowed_suffix_list
342 .iter()
343 .find(|&s| text.ends_with(s))
344 .map(|&suf| SmolStr::new(suf));
345 LiteralKind::FloatNumber { suffix }
346 } 341 }
347 STRING | RAW_STRING => LiteralKind::String, 342 STRING | RAW_STRING => LiteralKind::String,
348 T![true] | T![false] => LiteralKind::Bool, 343 T![true] | T![false] => LiteralKind::Bool,