Auto merge of #14284 - Veykril:sem-derive-unresolved, r=Veykril

fix: Highlight unresolved derives as being unresolved

Fixes https://github.com/rust-lang/rust-analyzer/issues/11350
This commit is contained in:
bors 2023-03-08 12:51:40 +00:00
commit c9510933a5
4 changed files with 6 additions and 4 deletions

View file

@ -538,8 +538,8 @@ impl<'db> SemanticsImpl<'db> {
} }
fn expand_derive_as_pseudo_attr_macro(&self, attr: &ast::Attr) -> Option<SyntaxNode> { fn expand_derive_as_pseudo_attr_macro(&self, attr: &ast::Attr) -> Option<SyntaxNode> {
let src = self.wrap_node_infile(attr.clone());
let adt = attr.syntax().parent().and_then(ast::Adt::cast)?; let adt = attr.syntax().parent().and_then(ast::Adt::cast)?;
let src = self.wrap_node_infile(attr.clone());
let call_id = self.with_ctx(|ctx| { let call_id = self.with_ctx(|ctx| {
ctx.attr_to_derive_macro_call(src.with_value(&adt), src).map(|(_, it, _)| it) ctx.attr_to_derive_macro_call(src.with_value(&adt), src).map(|(_, it, _)| it)
})?; })?;

View file

@ -217,7 +217,9 @@ fn highlight_name_ref(
// to anything when used. // to anything when used.
// We can fix this for derive attributes since derive helpers are recorded, but not for // We can fix this for derive attributes since derive helpers are recorded, but not for
// general attributes. // general attributes.
None if name_ref.syntax().ancestors().any(|it| it.kind() == ATTR) => { None if name_ref.syntax().ancestors().any(|it| it.kind() == ATTR)
&& !sema.hir_file_for(name_ref.syntax()).is_derive_attr_pseudo_expansion(sema.db) =>
{
return HlTag::Symbol(SymbolKind::Attribute).into(); return HlTag::Symbol(SymbolKind::Attribute).into();
} }
None => return HlTag::UnresolvedReference.into(), None => return HlTag::UnresolvedReference.into(),

View file

@ -53,6 +53,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
<span class="comment">// This is another normal comment</span> <span class="comment">// This is another normal comment</span>
<span class="comment documentation">/// This is another doc comment</span> <span class="comment documentation">/// This is another doc comment</span>
<span class="comment">// This is another normal comment</span> <span class="comment">// This is another normal comment</span>
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="attribute attribute default_library library">derive</span><span class="parenthesis attribute">(</span><span class="derive attribute default_library library">Copy</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span> <span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="attribute attribute default_library library">derive</span><span class="parenthesis attribute">(</span><span class="derive attribute default_library library">Copy</span><span class="comma attribute">,</span> <span class="unresolved_reference attribute">Unresolved</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
<span class="comment">// The reason for these being here is to test AttrIds</span> <span class="comment">// The reason for these being here is to test AttrIds</span>
<span class="keyword">struct</span> <span class="struct declaration">Foo</span><span class="semicolon">;</span></code></pre> <span class="keyword">struct</span> <span class="struct declaration">Foo</span><span class="semicolon">;</span></code></pre>

View file

@ -34,7 +34,7 @@ fn attributes() {
// This is another normal comment // This is another normal comment
/// This is another doc comment /// This is another doc comment
// This is another normal comment // This is another normal comment
#[derive(Copy)] #[derive(Copy, Unresolved)]
// The reason for these being here is to test AttrIds // The reason for these being here is to test AttrIds
struct Foo; struct Foo;
"#, "#,