]> git.lizzy.rs Git - rust.git/commitdiff
More correct raw ident handling
authorJosh Robson Chase <josh@robsonchase.com>
Wed, 23 Jan 2019 18:55:31 +0000 (13:55 -0500)
committerJosh Robson Chase <josh@robsonchase.com>
Wed, 23 Jan 2019 18:57:17 +0000 (13:57 -0500)
crates/ra_syntax/src/lexer.rs
crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.rs [new file with mode: 0644]
crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.txt [new file with mode: 0644]

index 0c3847120f17fedb12c3222f80d8bb1c396e7333..f9362120e1491e6755e2468e938b0e14a2e8d6dc 100644 (file)
@@ -190,16 +190,19 @@ fn next_token_inner(c: char, ptr: &mut Ptr) -> SyntaxKind {
 }
 
 fn scan_ident(c: char, ptr: &mut Ptr) -> SyntaxKind {
-    match (c, ptr.current()) {
+    let is_raw = match (c, ptr.current()) {
         ('r', Some('#')) => {
             ptr.bump();
+            true
         }
         ('_', Some(c)) if !is_ident_continue(c) => return UNDERSCORE,
-        _ => {}
-    }
+        _ => false,
+    };
     ptr.bump_while(is_ident_continue);
-    if let Some(kind) = SyntaxKind::from_keyword(ptr.current_token_text()) {
-        return kind;
+    if !is_raw {
+        if let Some(kind) = SyntaxKind::from_keyword(ptr.current_token_text()) {
+            return kind;
+        }
     }
     IDENT
 }
diff --git a/crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.rs b/crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.rs
new file mode 100644 (file)
index 0000000..d59a6d3
--- /dev/null
@@ -0,0 +1 @@
+fn foo() { let r#struct = 92; let r#trait = r#struct * 2; }
\ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.txt b/crates/ra_syntax/tests/data/parser/ok/0041_raw_keywords.txt
new file mode 100644 (file)
index 0000000..f03ed17
--- /dev/null
@@ -0,0 +1,49 @@
+SOURCE_FILE@[0; 59)
+  FN_DEF@[0; 59)
+    FN_KW@[0; 2)
+    WHITESPACE@[2; 3)
+    NAME@[3; 6)
+      IDENT@[3; 6) "foo"
+    PARAM_LIST@[6; 8)
+      L_PAREN@[6; 7)
+      R_PAREN@[7; 8)
+    WHITESPACE@[8; 9)
+    BLOCK@[9; 59)
+      L_CURLY@[9; 10)
+      WHITESPACE@[10; 11)
+      LET_STMT@[11; 29)
+        LET_KW@[11; 14)
+        WHITESPACE@[14; 15)
+        BIND_PAT@[15; 23)
+          NAME@[15; 23)
+            IDENT@[15; 23) "r#struct"
+        WHITESPACE@[23; 24)
+        EQ@[24; 25)
+        WHITESPACE@[25; 26)
+        LITERAL@[26; 28)
+          INT_NUMBER@[26; 28) "92"
+        SEMI@[28; 29)
+      WHITESPACE@[29; 30)
+      LET_STMT@[30; 57)
+        LET_KW@[30; 33)
+        WHITESPACE@[33; 34)
+        BIND_PAT@[34; 41)
+          NAME@[34; 41)
+            IDENT@[34; 41) "r#trait"
+        WHITESPACE@[41; 42)
+        EQ@[42; 43)
+        WHITESPACE@[43; 44)
+        BIN_EXPR@[44; 56)
+          PATH_EXPR@[44; 52)
+            PATH@[44; 52)
+              PATH_SEGMENT@[44; 52)
+                NAME_REF@[44; 52)
+                  IDENT@[44; 52) "r#struct"
+          WHITESPACE@[52; 53)
+          STAR@[53; 54)
+          WHITESPACE@[54; 55)
+          LITERAL@[55; 56)
+            INT_NUMBER@[55; 56) "2"
+        SEMI@[56; 57)
+      WHITESPACE@[57; 58)
+      R_CURLY@[58; 59)