2

fix: don't suggest existing `#[derive]`s in completion by XFFXFF · Pull Request...

 2 years ago
source link: https://github.com/rust-lang/rust-analyzer/pull/12024
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Copy link

Contributor

XFFXFF commented 4 days ago

fixes #12019

The immediate reason is that when we are doing derive completion, ctx.existing_derives 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.

#[derive(PartialEq, Eq, Or$0)]
struct S;

The ancestors of the token to be completed above.

    [email protected]
      [email protected] "Or"
    ,
    [email protected]
      [email protected]
        [email protected] "Or"
    ,
    [email protected]
      [email protected]
        [email protected]
          [email protected] "Or"
    ,
    [email protected]
      [email protected]
        [email protected]
          [email protected]
            [email protected] "Or"
    ,
    [email protected]
      [email protected] "#"
      [email protected] " "
      [email protected] "["
      [email protected]
        [email protected]
          [email protected]
            [email protected]
              [email protected] "Or"
      [email protected] "]"
      [email protected] " "
    ,
    [email protected]
      [email protected]
        [email protected] "#"
        [email protected] " "
        [email protected] "["
        [email protected]
          [email protected]
            [email protected]
              [email protected]
                [email protected] "PartialEq"
        [email protected] "]"
        [email protected] " "
      [email protected]
        [email protected] "#"
        [email protected] " "
        [email protected] "["
        [email protected]
          [email protected]
            [email protected]
              [email protected]
                [email protected] "Eq"
        [email protected] "]"
        [email protected] " "
      [email protected]
        [email protected] "#"
        [email protected] " "
        [email protected] "["
        [email protected]
          [email protected]
            [email protected]
              [email protected]
                [email protected] "Or"
        [email protected] "]"
        [email protected] " "
      [email protected] "("
      [email protected] " "
      [email protected] ")"
      [email protected] " "
...

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)].

    [email protected]
      [email protected] "("
      [email protected] "PartialEq"
      [email protected] ","
      [email protected] " "
      [email protected] "Eq"
      [email protected] ","
      [email protected] " "
      [email protected] ")"
    ,
    [email protected]
      [email protected]
        [email protected]
          [email protected]
            [email protected] "derive"
      [email protected]
        [email protected] "("
        [email protected] "PartialEq"
        [email protected] ","
        [email protected] " "
        [email protected] "Eq"
        [email protected] ","
        [email protected] " "
        [email protected] ")"
    ,
    [email protected]
      [email protected] "#"
      [email protected] "["
      [email protected]
        [email protected]
          [email protected]
            [email protected]
              [email protected] "derive"
        [email protected]
          [email protected] "("
          [email protected] "PartialEq"
          [email protected] ","
          [email protected] " "
          [email protected] "Eq"
          [email protected] ","
          [email protected] " "
          [email protected] ")"
      [email protected] "]"
    ,
    [email protected]
      [email protected]
        [email protected] "#"
        [email protected] "["
        [email protected]
          [email protected]
            [email protected]
              [email protected]
                [email protected] "derive"
          [email protected]
            [email protected] "("
            [email protected] "PartialEq"
            [email protected] ","
            [email protected] " "
            [email protected] "Eq"
            [email protected] ","
            [email protected] " "
            [email protected] ")"
        [email protected] "]"
      [email protected] " "
      [email protected] "struct"
      [email protected] " "
      [email protected]
        [email protected] "Test"
      [email protected] ";"
...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK