Skip to content

Commit 50225fe

Browse files
bors[bot]moreal
andauthored
Merge #11869
11869: fix: code blocks with tilde also works like code block r=Veykril a=moreal The `rustdoc` uses the `pulldown_cmark` package to parse *doc_comment* and the package also treat triple `~` characters also as code block fences. So when we run `cargo doc`, they will be placed also. <img width="965" alt="image" src="https://user-images.githubusercontent.com/26626194/161208072-5a09a209-57fc-4a52-b190-b0a9be9ffcd6.png"> But `rust-analyzer` doesn't support it so it doesn't have any injected code highlights and any `Run doctest` hint. This pull request tries to allow also them. 🙇🏻‍♂️ Before: <img width="224" alt="image" src="https://user-images.githubusercontent.com/26626194/161207405-b1d6cfda-82b1-4f60-8e42-c51d0ed98f38.png"> After: <img width="161" alt="image" src="https://user-images.githubusercontent.com/26626194/161207693-8e39997c-9ca6-4e69-8c65-e9b70899f7db.png"> Co-authored-by: Lee Dogeon <[email protected]>
2 parents 244ee65 + e3f32d1 commit 50225fe

File tree

5 files changed

+21
-7
lines changed

5 files changed

+21
-7
lines changed

crates/ide/src/runnables.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ impl TestAttr {
474474
}
475475
}
476476

477-
const RUSTDOC_FENCE: &str = "```";
477+
const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
478478
const RUSTDOC_CODE_BLOCK_ATTRIBUTES_RUNNABLE: &[&str] =
479479
&["", "rust", "should_panic", "edition2015", "edition2018", "edition2021"];
480480

@@ -483,7 +483,9 @@ fn has_runnable_doc_test(attrs: &hir::Attrs) -> bool {
483483
let mut in_code_block = false;
484484

485485
for line in String::from(doc).lines() {
486-
if let Some(header) = line.strip_prefix(RUSTDOC_FENCE) {
486+
if let Some(header) =
487+
RUSTDOC_FENCES.into_iter().find_map(|fence| line.strip_prefix(fence))
488+
{
487489
in_code_block = !in_code_block;
488490

489491
if in_code_block

crates/ide/src/syntax_highlighting/inject.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ pub(super) fn ra_fixture(
7878
Some(())
7979
}
8080

81-
const RUSTDOC_FENCE: &str = "```";
81+
const RUSTDOC_FENCE_LENGTH: usize = 3;
82+
const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
8283

8384
/// Injection of syntax highlighting of doctests.
8485
pub(super) fn doc_comment(
@@ -166,11 +167,11 @@ pub(super) fn doc_comment(
166167
};
167168
let mut pos = TextSize::from(0);
168169

169-
match line.find(RUSTDOC_FENCE) {
170+
match RUSTDOC_FENCES.into_iter().find_map(|fence| line.find(fence)) {
170171
Some(idx) => {
171172
is_codeblock = !is_codeblock;
172173
// Check whether code is rust by inspecting fence guards
173-
let guards = &line[idx + RUSTDOC_FENCE.len()..];
174+
let guards = &line[idx + RUSTDOC_FENCE_LENGTH..];
174175
let is_rust = is_rust_fence(guards);
175176
is_doctest = is_codeblock && is_rust;
176177
continue;

crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@
110110
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="variable declaration injected">foobar</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="operator injected">.</span><span class="function injected">bar</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
111111
<span class="comment documentation">/// ```</span>
112112
<span class="comment documentation">///</span>
113+
<span class="comment documentation">/// ~~~rust,no_run</span>
114+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="comment injected">// code block with tilde.</span>
115+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="variable declaration injected">foobar</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="operator injected">.</span><span class="function injected">bar</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
116+
<span class="comment documentation">/// ~~~</span>
117+
<span class="comment documentation">///</span>
113118
<span class="comment documentation">/// ```</span>
114119
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="comment injected">// functions</span>
115120
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">fn</span><span class="none injected"> </span><span class="function declaration injected">foo</span><span class="angle injected">&lt;</span><span class="type_param declaration injected">T</span><span class="comma injected">,</span><span class="none injected"> </span><span class="keyword injected">const</span><span class="none injected"> </span><span class="const_param declaration injected">X</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">usize</span><span class="angle injected">&gt;</span><span class="parenthesis injected">(</span><span class="value_param declaration injected">arg</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">i32</span><span class="parenthesis injected">)</span><span class="none injected"> </span><span class="brace injected">{</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,11 @@ impl Foo {
644644
/// let foobar = Foo::new().bar();
645645
/// ```
646646
///
647+
/// ~~~rust,no_run
648+
/// // code block with tilde.
649+
/// let foobar = Foo::new().bar();
650+
/// ~~~
651+
///
647652
/// ```
648653
/// // functions
649654
/// fn foo<T, const X: usize>(arg: i32) {

crates/rust-analyzer/src/markdown.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Transforms markdown
22
use ide_db::rust_doc::is_rust_fence;
33

4-
const RUSTDOC_FENCE: &str = "```";
4+
const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
55

66
pub(crate) fn format_docs(src: &str) -> String {
77
let mut processed_lines = Vec::new();
@@ -13,7 +13,8 @@ pub(crate) fn format_docs(src: &str) -> String {
1313
continue;
1414
}
1515

16-
if let Some(header) = line.strip_prefix(RUSTDOC_FENCE) {
16+
if let Some(header) = RUSTDOC_FENCES.into_iter().find_map(|fence| line.strip_prefix(fence))
17+
{
1718
in_code_block ^= true;
1819

1920
if in_code_block {

0 commit comments

Comments
 (0)