]> git.lizzy.rs Git - rust.git/commitdiff
Fix go-to-def for `#[doc = include_str!("path")]`
authorMaybe Waffle <waffle.lapkin@gmail.com>
Fri, 7 Oct 2022 09:04:41 +0000 (09:04 +0000)
committerMaybe Waffle <waffle.lapkin@gmail.com>
Fri, 7 Oct 2022 09:04:41 +0000 (09:04 +0000)
crates/ide/src/doc_links.rs
crates/ide/src/goto_definition.rs

index 92ce26b422e1dab0f13af86930c8c62e674fd7fd..d96827326cfd8a322d5234b6f6765a90271d57c5 100644 (file)
@@ -232,8 +232,13 @@ pub(crate) fn token_as_doc_comment(doc_token: &SyntaxToken) -> Option<DocComment
     (match_ast! {
         match doc_token {
             ast::Comment(comment) => TextSize::try_from(comment.prefix().len()).ok(),
-            ast::String(string) => doc_token.parent_ancestors().find_map(ast::Attr::cast)
-                .filter(|attr| attr.simple_name().as_deref() == Some("doc")).and_then(|_| string.open_quote_text_range().map(|it| it.len())),
+            ast::String(string) => {
+                doc_token.parent_ancestors().find_map(ast::Attr::cast).filter(|attr| attr.simple_name().as_deref() == Some("doc"))?;
+                if doc_token.parent_ancestors().find_map(ast::MacroCall::cast).filter(|mac| mac.path().and_then(|p| p.segment()?.name_ref()).as_ref().map(|n| n.text()).as_deref() == Some("include_str")).is_some() {
+                    return None;
+                }
+                string.open_quote_text_range().map(|it| it.len())
+            },
             _ => None,
         }
     }).map(|prefix_len| DocCommentToken { prefix_len, doc_token: doc_token.clone() })
index 7d8ef7ab9dc2f1e16bb9aea3d9a1bca596c45bf5..f86ea61d1586febd45d96994b91eb179eddde5f9 100644 (file)
@@ -1367,6 +1367,24 @@ fn main() {
         );
     }
 
+    #[test]
+    fn goto_doc_include_str() {
+        check(
+            r#"
+//- /main.rs
+#[rustc_builtin_macro]
+macro_rules! include_str {}
+
+#[doc = include_str!("docs.md$0")]
+struct Item;
+
+//- /docs.md
+// docs
+//^file
+"#,
+        );
+    }
+
     #[test]
     fn goto_shadow_include() {
         check(