Skip to content

Feature request: support #![feature(if_let_guard)] #9876

@lf-

Description

@lf-

Currently the parser and rest of the rust-analyzer doesn't know about if_let_guard. The feature currently has a PR on rustc to unmark it as incomplete.

This is not a high priority issue as it is probably not going to be stabilized super soon but it would be good to have rust-analyzer able to parse code with this in it.

These can do things like introduce bindings into the scope of the match arm:

#![feature(if_let_guard)]
fn main() {
    let somevar = Some(4);
    match 2 {
        2 if let Some(v) = somevar =>  println!("2 {}", v), 
        _ => println!("not 2")
    }
}

Parse tree:

Parse tree

jade/play-7qw63xe5 » ~/dev/rust-analyzer/target/release/rust-analyzer parse < src/main.rs
SOURCE_FILE@0..179
  ATTR@0..25
    POUND@0..1 "#"
    BANG@1..2 "!"
    L_BRACK@2..3 "["
    META@3..24
      PATH@3..10
        PATH_SEGMENT@3..10
          NAME_REF@3..10
            IDENT@3..10 "feature"
      TOKEN_TREE@10..24
        L_PAREN@10..11 "("
        IDENT@11..23 "if_let_guard"
        R_PAREN@23..24 ")"
    R_BRACK@24..25 "]"
  WHITESPACE@25..26 "\n"
  FN@26..178
    FN_KW@26..28 "fn"
    WHITESPACE@28..29 " "
    NAME@29..33
      IDENT@29..33 "main"
    PARAM_LIST@33..35
      L_PAREN@33..34 "("
      R_PAREN@34..35 ")"
    WHITESPACE@35..36 " "
    BLOCK_EXPR@36..178
      L_CURLY@36..37 "{"
      WHITESPACE@37..42 "\n    "
      LET_STMT@42..64
        LET_KW@42..45 "let"
        WHITESPACE@45..46 " "
        IDENT_PAT@46..53
          NAME@46..53
            IDENT@46..53 "somevar"
        WHITESPACE@53..54 " "
        EQ@54..55 "="
        WHITESPACE@55..56 " "
        CALL_EXPR@56..63
          PATH_EXPR@56..60
            PATH@56..60
              PATH_SEGMENT@56..60
                NAME_REF@56..60
                  IDENT@56..60 "Some"
          ARG_LIST@60..63
            L_PAREN@60..61 "("
            LITERAL@61..62
              INT_NUMBER@61..62 "4"
            R_PAREN@62..63 ")"
        SEMICOLON@63..64 ";"
      WHITESPACE@64..69 "\n    "
      MATCH_EXPR@69..176
        MATCH_KW@69..74 "match"
        WHITESPACE@74..75 " "
        LITERAL@75..76
          INT_NUMBER@75..76 "2"
        WHITESPACE@76..77 " "
        MATCH_ARM_LIST@77..176
          L_CURLY@77..78 "{"
          WHITESPACE@78..87 "\n        "
          MATCH_ARM@87..91
            LITERAL_PAT@87..88
              LITERAL@87..88
                INT_NUMBER@87..88 "2"
            WHITESPACE@88..89 " "
            MATCH_GUARD@89..91
              IF_KW@89..91 "if"
          WHITESPACE@91..92 " "
          MATCH_ARM@92..113
            ERROR@92..95
              LET_KW@92..95 "let"
            WHITESPACE@95..96 " "
            BIN_EXPR@96..113
              CALL_EXPR@96..103
                PATH_EXPR@96..100
                  PATH@96..100
                    PATH_SEGMENT@96..100
                      NAME_REF@96..100
                        IDENT@96..100 "Some"
                ARG_LIST@100..103
                  L_PAREN@100..101 "("
                  PATH_EXPR@101..102
                    PATH@101..102
                      PATH_SEGMENT@101..102
                        NAME_REF@101..102
                          IDENT@101..102 "v"
                  R_PAREN@102..103 ")"
              WHITESPACE@103..104 " "
              EQ@104..105 "="
              WHITESPACE@105..106 " "
              PATH_EXPR@106..113
                PATH@106..113
                  PATH_SEGMENT@106..113
                    NAME_REF@106..113
                      IDENT@106..113 "somevar"
          WHITESPACE@113..114 " "
          MATCH_ARM@114..116
            ERROR@114..115
              EQ@114..115 "="
            ERROR@115..116
              R_ANGLE@115..116 ">"
          WHITESPACE@116..118 "  "
          MATCH_ARM@118..138
            MACRO_PAT@118..137
              MACRO_CALL@118..137
                PATH@118..125
                  PATH_SEGMENT@118..125
                    NAME_REF@118..125
                      IDENT@118..125 "println"
                BANG@125..126 "!"
                TOKEN_TREE@126..137
                  L_PAREN@126..127 "("
                  STRING@127..133 "\"2 {}\""
                  COMMA@133..134 ","
                  WHITESPACE@134..135 " "
                  IDENT@135..136 "v"
                  R_PAREN@136..137 ")"
            ERROR@137..138
              COMMA@137..138 ","
          WHITESPACE@138..148 " \n        "
          MATCH_ARM@148..170
            WILDCARD_PAT@148..149
              UNDERSCORE@148..149 "_"
            WHITESPACE@149..150 " "
            FAT_ARROW@150..152 "=>"
            WHITESPACE@152..153 " "
            MACRO_CALL@153..170
              PATH@153..160
                PATH_SEGMENT@153..160
                  NAME_REF@153..160
                    IDENT@153..160 "println"
              BANG@160..161 "!"
              TOKEN_TREE@161..170
                L_PAREN@161..162 "("
                STRING@162..169 "\"not 2\""
                R_PAREN@169..170 ")"
          WHITESPACE@170..175 "\n    "
          R_CURLY@175..176 "}"
      WHITESPACE@176..177 "\n"
      R_CURLY@177..178 "}"
  WHITESPACE@178..179 "\n"

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions