mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-18 02:38:38 +00:00
Merge #8574
8574: Check for rust doc code attributes like rustdoc does r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
3f1a220f32
5 changed files with 40 additions and 41 deletions
|
@ -4,7 +4,7 @@ use std::mem;
|
|||
|
||||
use either::Either;
|
||||
use hir::{InFile, Semantics};
|
||||
use ide_db::{call_info::ActiveParameter, SymbolKind};
|
||||
use ide_db::{call_info::ActiveParameter, helpers::rust_doc::is_rust_fence, SymbolKind};
|
||||
use syntax::{
|
||||
ast::{self, AstNode},
|
||||
AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize,
|
||||
|
@ -78,24 +78,6 @@ pub(super) fn ra_fixture(
|
|||
}
|
||||
|
||||
const RUSTDOC_FENCE: &'static str = "```";
|
||||
const RUSTDOC_FENCE_TOKENS: &[&'static str] = &[
|
||||
"",
|
||||
"rust",
|
||||
"should_panic",
|
||||
"ignore",
|
||||
"no_run",
|
||||
"compile_fail",
|
||||
"edition2015",
|
||||
"edition2018",
|
||||
"edition2021",
|
||||
];
|
||||
|
||||
fn is_rustdoc_fence_token(token: &str) -> bool {
|
||||
if RUSTDOC_FENCE_TOKENS.contains(&token) {
|
||||
return true;
|
||||
}
|
||||
token.starts_with('E') && token.len() == 5 && token[1..].parse::<u32>().is_ok()
|
||||
}
|
||||
|
||||
/// Injection of syntax highlighting of doctests.
|
||||
pub(super) fn doc_comment(
|
||||
|
@ -181,7 +163,7 @@ pub(super) fn doc_comment(
|
|||
is_codeblock = !is_codeblock;
|
||||
// Check whether code is rust by inspecting fence guards
|
||||
let guards = &line[idx + RUSTDOC_FENCE.len()..];
|
||||
let is_rust = guards.split(',').all(|sub| is_rustdoc_fence_token(sub.trim()));
|
||||
let is_rust = is_rust_fence(guards);
|
||||
is_doctest = is_codeblock && is_rust;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -307,7 +307,7 @@ fn benchmark_syntax_highlighting_parser() {
|
|||
.filter(|it| it.highlight.tag == HlTag::Symbol(SymbolKind::Function))
|
||||
.count()
|
||||
};
|
||||
assert_eq!(hash, 1629);
|
||||
assert_eq!(hash, 1632);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
//! A module with ide helpers for high-level ide features.
|
||||
pub mod insert_use;
|
||||
pub mod import_assets;
|
||||
pub mod rust_doc;
|
||||
|
||||
use std::collections::VecDeque;
|
||||
|
||||
|
|
34
crates/ide_db/src/helpers/rust_doc.rs
Normal file
34
crates/ide_db/src/helpers/rust_doc.rs
Normal file
|
@ -0,0 +1,34 @@
|
|||
//! Rustdoc specific doc comment handling
|
||||
|
||||
// stripped down version of https://github.com/rust-lang/rust/blob/392ba2ba1a7d6c542d2459fb8133bebf62a4a423/src/librustdoc/html/markdown.rs#L810-L933
|
||||
pub fn is_rust_fence(s: &str) -> bool {
|
||||
let mut seen_rust_tags = false;
|
||||
let mut seen_other_tags = false;
|
||||
|
||||
let tokens = s
|
||||
.trim()
|
||||
.split(|c| c == ',' || c == ' ' || c == '\t')
|
||||
.map(str::trim)
|
||||
.filter(|t| !t.is_empty());
|
||||
|
||||
for token in tokens {
|
||||
match token {
|
||||
"should_panic" | "no_run" | "ignore" | "allow_fail" => {
|
||||
seen_rust_tags = !seen_other_tags
|
||||
}
|
||||
"rust" => seen_rust_tags = true,
|
||||
"test_harness" | "compile_fail" => seen_rust_tags = !seen_other_tags || seen_rust_tags,
|
||||
x if x.starts_with("edition") => {}
|
||||
x if x.starts_with('E') && x.len() == 5 => {
|
||||
if x[1..].parse::<u32>().is_ok() {
|
||||
seen_rust_tags = !seen_other_tags || seen_rust_tags;
|
||||
} else {
|
||||
seen_other_tags = true;
|
||||
}
|
||||
}
|
||||
_ => seen_other_tags = true,
|
||||
}
|
||||
}
|
||||
|
||||
!seen_other_tags || seen_rust_tags
|
||||
}
|
|
@ -1,17 +1,7 @@
|
|||
//! Transforms markdown
|
||||
use ide_db::helpers::rust_doc::is_rust_fence;
|
||||
|
||||
const RUSTDOC_FENCE: &str = "```";
|
||||
const RUSTDOC_CODE_BLOCK_ATTRIBUTES_RUST_SPECIFIC: &[&str] = &[
|
||||
"",
|
||||
"rust",
|
||||
"should_panic",
|
||||
"ignore",
|
||||
"no_run",
|
||||
"compile_fail",
|
||||
"edition2015",
|
||||
"edition2018",
|
||||
"edition2021",
|
||||
];
|
||||
|
||||
pub(crate) fn format_docs(src: &str) -> String {
|
||||
let mut processed_lines = Vec::new();
|
||||
|
@ -27,8 +17,7 @@ pub(crate) fn format_docs(src: &str) -> String {
|
|||
in_code_block ^= true;
|
||||
|
||||
if in_code_block {
|
||||
is_rust =
|
||||
header.split(',').all(|sub| is_rust_specific_code_block_attribute(sub.trim()));
|
||||
is_rust = is_rust_fence(header);
|
||||
|
||||
if is_rust {
|
||||
line = "```rust";
|
||||
|
@ -41,13 +30,6 @@ pub(crate) fn format_docs(src: &str) -> String {
|
|||
processed_lines.join("\n")
|
||||
}
|
||||
|
||||
fn is_rust_specific_code_block_attribute(attr: &str) -> bool {
|
||||
if RUSTDOC_CODE_BLOCK_ATTRIBUTES_RUST_SPECIFIC.contains(&attr) {
|
||||
return true;
|
||||
}
|
||||
attr.starts_with('E') && attr.len() == 5 && attr[1..].parse::<u32>().is_ok()
|
||||
}
|
||||
|
||||
fn code_line_ignored_by_rustdoc(line: &str) -> bool {
|
||||
let trimmed = line.trim();
|
||||
trimmed == "#" || trimmed.starts_with("# ") || trimmed.starts_with("#\t")
|
||||
|
|
Loading…
Reference in a new issue