mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 15:32:06 +00:00
Auto merge of #12913 - Veykril:attr-merge, r=Veykril
fix: Fix ast-id up when merging raw attributes Fixes https://github.com/rust-lang/rust-analyzer/issues/12912
This commit is contained in:
commit
e0ff4befda
@ -124,13 +124,24 @@ impl RawAttrs {
|
|||||||
|
|
||||||
pub(crate) fn merge(&self, other: Self) -> Self {
|
pub(crate) fn merge(&self, other: Self) -> Self {
|
||||||
// FIXME: This needs to fixup `AttrId`s
|
// FIXME: This needs to fixup `AttrId`s
|
||||||
match (&self.entries, &other.entries) {
|
match (&self.entries, other.entries) {
|
||||||
(None, None) => Self::EMPTY,
|
(None, None) => Self::EMPTY,
|
||||||
(Some(entries), None) | (None, Some(entries)) => {
|
(None, entries @ Some(_)) => Self { entries },
|
||||||
Self { entries: Some(entries.clone()) }
|
(Some(entries), None) => Self { entries: Some(entries.clone()) },
|
||||||
}
|
|
||||||
(Some(a), Some(b)) => {
|
(Some(a), Some(b)) => {
|
||||||
Self { entries: Some(a.iter().chain(b.iter()).cloned().collect()) }
|
let last_ast_index = a.last().map_or(0, |it| it.id.ast_index + 1);
|
||||||
|
Self {
|
||||||
|
entries: Some(
|
||||||
|
a.iter()
|
||||||
|
.cloned()
|
||||||
|
.chain(b.iter().map(|it| {
|
||||||
|
let mut it = it.clone();
|
||||||
|
it.id.ast_index += last_ast_index;
|
||||||
|
it
|
||||||
|
}))
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ mod html;
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
use hir::{InFile, Name, Semantics};
|
use hir::{Name, Semantics};
|
||||||
use ide_db::{FxHashMap, RootDatabase};
|
use ide_db::{FxHashMap, RootDatabase};
|
||||||
use syntax::{
|
use syntax::{
|
||||||
ast, AstNode, AstToken, NodeOrToken, SyntaxKind::*, SyntaxNode, TextRange, WalkEvent, T,
|
ast, AstNode, AstToken, NodeOrToken, SyntaxKind::*, SyntaxNode, TextRange, WalkEvent, T,
|
||||||
@ -325,7 +325,7 @@ fn traverse(
|
|||||||
Leave(NodeOrToken::Node(node)) => {
|
Leave(NodeOrToken::Node(node)) => {
|
||||||
// Doc comment highlighting injection, we do this when leaving the node
|
// Doc comment highlighting injection, we do this when leaving the node
|
||||||
// so that we overwrite the highlighting of the doc comment itself.
|
// so that we overwrite the highlighting of the doc comment itself.
|
||||||
inject::doc_comment(hl, sema, InFile::new(file_id.into(), &node));
|
inject::doc_comment(hl, sema, file_id, &node);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -5,7 +5,8 @@ use std::mem;
|
|||||||
use either::Either;
|
use either::Either;
|
||||||
use hir::{InFile, Semantics};
|
use hir::{InFile, Semantics};
|
||||||
use ide_db::{
|
use ide_db::{
|
||||||
active_parameter::ActiveParameter, defs::Definition, rust_doc::is_rust_fence, SymbolKind,
|
active_parameter::ActiveParameter, base_db::FileId, defs::Definition, rust_doc::is_rust_fence,
|
||||||
|
SymbolKind,
|
||||||
};
|
};
|
||||||
use syntax::{
|
use syntax::{
|
||||||
ast::{self, AstNode, IsString, QuoteOffsets},
|
ast::{self, AstNode, IsString, QuoteOffsets},
|
||||||
@ -81,16 +82,18 @@ pub(super) fn ra_fixture(
|
|||||||
const RUSTDOC_FENCE_LENGTH: usize = 3;
|
const RUSTDOC_FENCE_LENGTH: usize = 3;
|
||||||
const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
|
const RUSTDOC_FENCES: [&str; 2] = ["```", "~~~"];
|
||||||
|
|
||||||
/// Injection of syntax highlighting of doctests.
|
/// Injection of syntax highlighting of doctests and intra doc links.
|
||||||
pub(super) fn doc_comment(
|
pub(super) fn doc_comment(
|
||||||
hl: &mut Highlights,
|
hl: &mut Highlights,
|
||||||
sema: &Semantics<'_, RootDatabase>,
|
sema: &Semantics<'_, RootDatabase>,
|
||||||
InFile { file_id: src_file_id, value: node }: InFile<&SyntaxNode>,
|
src_file_id: FileId,
|
||||||
|
node: &SyntaxNode,
|
||||||
) {
|
) {
|
||||||
let (attributes, def) = match doc_attributes(sema, node) {
|
let (attributes, def) = match doc_attributes(sema, node) {
|
||||||
Some(it) => it,
|
Some(it) => it,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
let src_file_id = src_file_id.into();
|
||||||
|
|
||||||
// Extract intra-doc links and emit highlights for them.
|
// Extract intra-doc links and emit highlights for them.
|
||||||
if let Some((docs, doc_mapping)) = attributes.docs_with_rangemap(sema.db) {
|
if let Some((docs, doc_mapping)) = attributes.docs_with_rangemap(sema.db) {
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
<style>
|
||||||
|
body { margin: 0; }
|
||||||
|
pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
|
||||||
|
|
||||||
|
.lifetime { color: #DFAF8F; font-style: italic; }
|
||||||
|
.label { color: #DFAF8F; font-style: italic; }
|
||||||
|
.comment { color: #7F9F7F; }
|
||||||
|
.documentation { color: #629755; }
|
||||||
|
.intra_doc_link { font-style: italic; }
|
||||||
|
.injected { opacity: 0.65 ; }
|
||||||
|
.struct, .enum { color: #7CB8BB; }
|
||||||
|
.enum_variant { color: #BDE0F3; }
|
||||||
|
.string_literal { color: #CC9393; }
|
||||||
|
.field { color: #94BFF3; }
|
||||||
|
.function { color: #93E0E3; }
|
||||||
|
.function.unsafe { color: #BC8383; }
|
||||||
|
.trait.unsafe { color: #BC8383; }
|
||||||
|
.operator.unsafe { color: #BC8383; }
|
||||||
|
.mutable.unsafe { color: #BC8383; text-decoration: underline; }
|
||||||
|
.keyword.unsafe { color: #BC8383; font-weight: bold; }
|
||||||
|
.macro.unsafe { color: #BC8383; }
|
||||||
|
.parameter { color: #94BFF3; }
|
||||||
|
.text { color: #DCDCCC; }
|
||||||
|
.type { color: #7CB8BB; }
|
||||||
|
.builtin_type { color: #8CD0D3; }
|
||||||
|
.type_param { color: #DFAF8F; }
|
||||||
|
.attribute { color: #94BFF3; }
|
||||||
|
.numeric_literal { color: #BFEBBF; }
|
||||||
|
.bool_literal { color: #BFE6EB; }
|
||||||
|
.macro { color: #94BFF3; }
|
||||||
|
.derive { color: #94BFF3; font-style: italic; }
|
||||||
|
.module { color: #AFD8AF; }
|
||||||
|
.value_param { color: #DCDCCC; }
|
||||||
|
.variable { color: #DCDCCC; }
|
||||||
|
.format_specifier { color: #CC696B; }
|
||||||
|
.mutable { text-decoration: underline; }
|
||||||
|
.escape_sequence { color: #94BFF3; }
|
||||||
|
.keyword { color: #F0DFAF; font-weight: bold; }
|
||||||
|
.control { font-style: italic; }
|
||||||
|
.reference { font-style: italic; font-weight: bold; }
|
||||||
|
|
||||||
|
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
|
||||||
|
</style>
|
||||||
|
<pre><code><span class="comment documentation">//! </span><span class="struct documentation injected intra_doc_link">[Struct]</span>
|
||||||
|
<span class="comment documentation">//! This is an intra doc injection test for modules</span>
|
||||||
|
<span class="comment documentation">//! </span><span class="struct documentation injected intra_doc_link">[Struct]</span>
|
||||||
|
<span class="comment documentation">//! This is an intra doc injection test for modules</span>
|
||||||
|
|
||||||
|
<span class="keyword">pub</span> <span class="keyword">struct</span> <span class="struct declaration public">Struct</span><span class="semicolon">;</span>
|
||||||
|
</code></pre>
|
@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
<style>
|
||||||
|
body { margin: 0; }
|
||||||
|
pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
|
||||||
|
|
||||||
|
.lifetime { color: #DFAF8F; font-style: italic; }
|
||||||
|
.label { color: #DFAF8F; font-style: italic; }
|
||||||
|
.comment { color: #7F9F7F; }
|
||||||
|
.documentation { color: #629755; }
|
||||||
|
.intra_doc_link { font-style: italic; }
|
||||||
|
.injected { opacity: 0.65 ; }
|
||||||
|
.struct, .enum { color: #7CB8BB; }
|
||||||
|
.enum_variant { color: #BDE0F3; }
|
||||||
|
.string_literal { color: #CC9393; }
|
||||||
|
.field { color: #94BFF3; }
|
||||||
|
.function { color: #93E0E3; }
|
||||||
|
.function.unsafe { color: #BC8383; }
|
||||||
|
.trait.unsafe { color: #BC8383; }
|
||||||
|
.operator.unsafe { color: #BC8383; }
|
||||||
|
.mutable.unsafe { color: #BC8383; text-decoration: underline; }
|
||||||
|
.keyword.unsafe { color: #BC8383; font-weight: bold; }
|
||||||
|
.macro.unsafe { color: #BC8383; }
|
||||||
|
.parameter { color: #94BFF3; }
|
||||||
|
.text { color: #DCDCCC; }
|
||||||
|
.type { color: #7CB8BB; }
|
||||||
|
.builtin_type { color: #8CD0D3; }
|
||||||
|
.type_param { color: #DFAF8F; }
|
||||||
|
.attribute { color: #94BFF3; }
|
||||||
|
.numeric_literal { color: #BFEBBF; }
|
||||||
|
.bool_literal { color: #BFE6EB; }
|
||||||
|
.macro { color: #94BFF3; }
|
||||||
|
.derive { color: #94BFF3; font-style: italic; }
|
||||||
|
.module { color: #AFD8AF; }
|
||||||
|
.value_param { color: #DCDCCC; }
|
||||||
|
.variable { color: #DCDCCC; }
|
||||||
|
.format_specifier { color: #CC696B; }
|
||||||
|
.mutable { text-decoration: underline; }
|
||||||
|
.escape_sequence { color: #94BFF3; }
|
||||||
|
.keyword { color: #F0DFAF; font-weight: bold; }
|
||||||
|
.control { font-style: italic; }
|
||||||
|
.reference { font-style: italic; font-weight: bold; }
|
||||||
|
|
||||||
|
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
|
||||||
|
</style>
|
||||||
|
<pre><code><span class="comment documentation">/// </span><span class="struct documentation injected intra_doc_link">[crate::foo::Struct]</span>
|
||||||
|
<span class="comment documentation">/// This is an intra doc injection test for modules</span>
|
||||||
|
<span class="comment documentation">/// </span><span class="struct documentation injected intra_doc_link">[crate::foo::Struct]</span>
|
||||||
|
<span class="comment documentation">/// This is an intra doc injection test for modules</span>
|
||||||
|
<span class="keyword">mod</span> <span class="module declaration">foo</span><span class="semicolon">;</span>
|
||||||
|
</code></pre>
|
@ -914,6 +914,48 @@ fn main() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_mod_hl_injection() {
|
||||||
|
check_highlighting(
|
||||||
|
r##"
|
||||||
|
//- /foo.rs
|
||||||
|
//! [Struct]
|
||||||
|
//! This is an intra doc injection test for modules
|
||||||
|
//! [Struct]
|
||||||
|
//! This is an intra doc injection test for modules
|
||||||
|
|
||||||
|
pub struct Struct;
|
||||||
|
//- /lib.rs crate:foo
|
||||||
|
/// [crate::foo::Struct]
|
||||||
|
/// This is an intra doc injection test for modules
|
||||||
|
/// [crate::foo::Struct]
|
||||||
|
/// This is an intra doc injection test for modules
|
||||||
|
mod foo;
|
||||||
|
"##,
|
||||||
|
expect_file!["./test_data/highlight_module_docs_inline.html"],
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
check_highlighting(
|
||||||
|
r##"
|
||||||
|
//- /lib.rs crate:foo
|
||||||
|
/// [crate::foo::Struct]
|
||||||
|
/// This is an intra doc injection test for modules
|
||||||
|
/// [crate::foo::Struct]
|
||||||
|
/// This is an intra doc injection test for modules
|
||||||
|
mod foo;
|
||||||
|
//- /foo.rs
|
||||||
|
//! [Struct]
|
||||||
|
//! This is an intra doc injection test for modules
|
||||||
|
//! [Struct]
|
||||||
|
//! This is an intra doc injection test for modules
|
||||||
|
|
||||||
|
pub struct Struct;
|
||||||
|
"##,
|
||||||
|
expect_file!["./test_data/highlight_module_docs_outline.html"],
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
all(unix, not(target_pointer_width = "64")),
|
all(unix, not(target_pointer_width = "64")),
|
||||||
|
Loading…
Reference in New Issue
Block a user