derive completions take existing derives into count fixes #12019 The immediate reason is that when we are doing derive completion, [`ctx.existing_derives`](d1f6b4e2a0/crates/ide_completion/src/completions/attribute/derive.rs (L82)
) is empty, this is because we expand the macro when looking for the ancestors of the token to be completed. Take the following code as an example, we find the first `SyntaxNode` with kind `Attr` based on the ancestors of the token, but the parent of `Attr` is not a `Struct` as we [expect](d1f6b4e2a0/crates/hir/src/semantics.rs (L518)
). ```rust #[derive(PartialEq, Eq, Or$0)] struct S; ``` The ancestors of the token to be completed above. ``` NAME_REF@24..26 IDENT@24..26 "Or" , PATH_SEGMENT@24..26 NAME_REF@24..26 IDENT@24..26 "Or" , PATH@24..26 PATH_SEGMENT@24..26 NAME_REF@24..26 IDENT@24..26 "Or" , META@24..26 PATH@24..26 PATH_SEGMENT@24..26 NAME_REF@24..26 IDENT@24..26 "Or" , ATTR@21..28 POUND@21..22 "#" WHITESPACE@22..23 " " L_BRACK@23..24 "[" META@24..26 PATH@24..26 PATH_SEGMENT@24..26 NAME_REF@24..26 IDENT@24..26 "Or" R_BRACK@26..27 "]" WHITESPACE@27..28 " " , TUPLE_EXPR@0..32 ATTR@0..14 POUND@0..1 "#" WHITESPACE@1..2 " " L_BRACK@2..3 "[" META@3..12 PATH@3..12 PATH_SEGMENT@3..12 NAME_REF@3..12 IDENT@3..12 "PartialEq" R_BRACK@12..13 "]" WHITESPACE@13..14 " " ATTR@14..21 POUND@14..15 "#" WHITESPACE@15..16 " " L_BRACK@16..17 "[" META@17..19 PATH@17..19 PATH_SEGMENT@17..19 NAME_REF@17..19 IDENT@17..19 "Eq" R_BRACK@19..20 "]" WHITESPACE@20..21 " " ATTR@21..28 POUND@21..22 "#" WHITESPACE@22..23 " " L_BRACK@23..24 "[" META@24..26 PATH@24..26 PATH_SEGMENT@24..26 NAME_REF@24..26 IDENT@24..26 "Or" R_BRACK@26..27 "]" WHITESPACE@27..28 " " L_PAREN@28..29 "(" WHITESPACE@29..30 " " R_PAREN@30..31 ")" WHITESPACE@31..32 " " ... ``` I make a small change to not do macro expansion when looking up the ancestors of the token. What I don't understand is that `self.sema.token_ancestors_with_macros(self.token.clone())` doesn't seem to expand the macro if the derive completion triggered without any prefix, like `#[derive(PartialEq, Eq, $0)]`. The ancestors of the token with `#[derive(PartialEq, Eq, $0)]`. ``` TOKEN_TREE@8..25 L_PAREN@8..9 "(" IDENT@9..18 "PartialEq" COMMA@18..19 "," WHITESPACE@19..20 " " IDENT@20..22 "Eq" COMMA@22..23 "," WHITESPACE@23..24 " " R_PAREN@24..25 ")" , META@2..25 PATH@2..8 PATH_SEGMENT@2..8 NAME_REF@2..8 IDENT@2..8 "derive" TOKEN_TREE@8..25 L_PAREN@8..9 "(" IDENT@9..18 "PartialEq" COMMA@18..19 "," WHITESPACE@19..20 " " IDENT@20..22 "Eq" COMMA@22..23 "," WHITESPACE@23..24 " " R_PAREN@24..25 ")" , ATTR@0..26 POUND@0..1 "#" L_BRACK@1..2 "[" META@2..25 PATH@2..8 PATH_SEGMENT@2..8 NAME_REF@2..8 IDENT@2..8 "derive" TOKEN_TREE@8..25 L_PAREN@8..9 "(" IDENT@9..18 "PartialEq" COMMA@18..19 "," WHITESPACE@19..20 " " IDENT@20..22 "Eq" COMMA@22..23 "," WHITESPACE@23..24 " " R_PAREN@24..25 ")" R_BRACK@25..26 "]" , STRUCT@0..39 ATTR@0..26 POUND@0..1 "#" L_BRACK@1..2 "[" META@2..25 PATH@2..8 PATH_SEGMENT@2..8 NAME_REF@2..8 IDENT@2..8 "derive" TOKEN_TREE@8..25 L_PAREN@8..9 "(" IDENT@9..18 "PartialEq" COMMA@18..19 "," WHITESPACE@19..20 " " IDENT@20..22 "Eq" COMMA@22..23 "," WHITESPACE@23..24 " " R_PAREN@24..25 ")" R_BRACK@25..26 "]" WHITESPACE@26..27 " " STRUCT_KW@27..33 "struct" WHITESPACE@33..34 " " NAME@34..38 IDENT@34..38 "Test" SEMICOLON@38..39 ";" ... ```
rust-analyzer is a modular compiler frontend for the Rust language. It is a part of a larger rls-2.0 effort to create excellent IDE support for Rust.
Quick Start
https://rust-analyzer.github.io/manual.html#installation
Documentation
If you want to contribute to rust-analyzer or are just curious about how things work under the hood, check the ./docs/dev folder.
If you want to use rust-analyzer's language server with your editor of choice, check the manual folder. It also contains some tips & tricks to help you be more productive when using rust-analyzer.
Security and Privacy
See the corresponding sections of the manual.
Communication
For usage and troubleshooting requests, please use "IDEs and Editors" category of the Rust forum:
https://users.rust-lang.org/c/ide/14
For questions about development and implementation, join rust-analyzer working group on Zulip:
https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer
Quick Links
- Website: https://rust-analyzer.github.io/
- Metrics: https://rust-analyzer.github.io/metrics/
- API docs: https://rust-lang.github.io/rust-analyzer/ide/
- Changelog: https://rust-analyzer.github.io/thisweek
License
Rust analyzer is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT for details.