about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-06-16 07:58:15 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-06-16 07:58:15 +0000
commitce9ea0939a1ae94a83d56ddafc7aeb757dcda776 (patch)
tree3a82994adcb0cadcfc1da9ea651879f734b14144
parent41c56c8a0d01d395e49cd199e6050b02a91cff1d (diff)
parent774537fb01a8839d3cb933017067541bd0fd542b (diff)
downloadrust-ce9ea0939a1ae94a83d56ddafc7aeb757dcda776.tar.gz
rust-ce9ea0939a1ae94a83d56ddafc7aeb757dcda776.zip
Merge #1407
1407: Skip attrs in `ast::Literal::token` r=matklad a=sinkuu

`ast::Literal::token` panics on literals containing attributes. rust-analyzer crashed on the `rust-lang/rust` repository by parsing [a test containing this](https://github.com/rust-lang/rust/blob/9ebf47851a357faa4cd97f4b1dc7835f6376e639/src/test/run-pass/proc-macro/attr-stmt-expr.rs#L22-L25).

Co-authored-by: Shotaro Yamada <sinkuu@sinkuu.xyz>
-rw-r--r--crates/ra_syntax/src/ast/expr_extensions.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs
index 17763809da9..d88671d45e0 100644
--- a/crates/ra_syntax/src/ast/expr_extensions.rs
+++ b/crates/ra_syntax/src/ast/expr_extensions.rs
@@ -229,8 +229,12 @@ pub enum LiteralKind {
 
 impl ast::Literal {
     pub fn token(&self) -> SyntaxToken {
-        match self.syntax().first_child_or_token().unwrap() {
-            SyntaxElement::Token(token) => token,
+        let elem = self
+            .syntax()
+            .children_with_tokens()
+            .find(|e| e.kind() != ATTR && !e.kind().is_trivia());
+        match elem {
+            Some(SyntaxElement::Token(token)) => token,
             _ => unreachable!(),
         }
     }
@@ -268,6 +272,13 @@ impl ast::Literal {
     }
 }
 
+#[test]
+fn test_literal_with_attr() {
+    let parse = ast::SourceFile::parse(r#"const _: &str = { #[attr] "Hello" };"#);
+    let lit = parse.tree.syntax().descendants().find_map(ast::Literal::cast).unwrap();
+    assert_eq!(lit.token().text(), r#""Hello""#);
+}
+
 impl ast::NamedField {
     pub fn parent_struct_lit(&self) -> &ast::StructLit {
         self.syntax().ancestors().find_map(ast::StructLit::cast).unwrap()