SOURCE_FILE
  FN
    FN_KW "fn"
    WHITESPACE " "
    NAME
      IDENT "inner"
    PARAM_LIST
      L_PAREN "("
      R_PAREN ")"
    WHITESPACE " "
    BLOCK_EXPR
      STMT_LIST
        L_CURLY "{"
        WHITESPACE "\n    "
        ATTR
          POUND "#"
          BANG "!"
          L_BRACK "["
          META
            PATH
              PATH_SEGMENT
                NAME_REF
                  IDENT "doc"
            TOKEN_TREE
              L_PAREN "("
              STRING "\"Inner attributes allowed here\""
              R_PAREN ")"
          R_BRACK "]"
        WHITESPACE "\n    "
        COMMENT "//! As are ModuleDoc style comments"
        WHITESPACE "\n    "
        EXPR_STMT
          BLOCK_EXPR
            STMT_LIST
              L_CURLY "{"
              WHITESPACE "\n        "
              ATTR
                POUND "#"
                BANG "!"
                L_BRACK "["
                META
                  PATH
                    PATH_SEGMENT
                      NAME_REF
                        IDENT "doc"
                  TOKEN_TREE
                    L_PAREN "("
                    STRING "\"Inner attributes are allowed in blocks used as statements\""
                    R_PAREN ")"
                R_BRACK "]"
              WHITESPACE "\n        "
              ATTR
                POUND "#"
                BANG "!"
                L_BRACK "["
                META
                  PATH
                    PATH_SEGMENT
                      NAME_REF
                        IDENT "doc"
                  TOKEN_TREE
                    L_PAREN "("
                    STRING "\"Being validated is not affected by duplcates\""
                    R_PAREN ")"
                R_BRACK "]"
              WHITESPACE "\n        "
              COMMENT "//! As are ModuleDoc style comments"
              WHITESPACE "\n    "
              R_CURLY "}"
          SEMICOLON ";"
        WHITESPACE "\n    "
        BLOCK_EXPR
          STMT_LIST
            L_CURLY "{"
            WHITESPACE "\n        "
            ATTR
              POUND "#"
              BANG "!"
              L_BRACK "["
              META
                PATH
                  PATH_SEGMENT
                    NAME_REF
                      IDENT "doc"
                TOKEN_TREE
                  L_PAREN "("
                  STRING "\"Inner attributes are allowed in blocks when they are the last statement of another block\""
                  R_PAREN ")"
              R_BRACK "]"
            WHITESPACE "\n        "
            COMMENT "//! As are ModuleDoc style comments"
            WHITESPACE "\n    "
            R_CURLY "}"
        WHITESPACE "\n"
        R_CURLY "}"
  WHITESPACE "\n\n"
  FN
    FN_KW "fn"
    WHITESPACE " "
    NAME
      IDENT "outer"
    PARAM_LIST
      L_PAREN "("
      R_PAREN ")"
    WHITESPACE " "
    BLOCK_EXPR
      STMT_LIST
        L_CURLY "{"
        WHITESPACE "\n    "
        LET_STMT
          LET_KW "let"
          WHITESPACE " "
          WILDCARD_PAT
            UNDERSCORE "_"
          WHITESPACE " "
          EQ "="
          WHITESPACE " "
          BLOCK_EXPR
            ATTR
              POUND "#"
              L_BRACK "["
              META
                PATH
                  PATH_SEGMENT
                    NAME_REF
                      IDENT "doc"
                TOKEN_TREE
                  L_PAREN "("
                  STRING "\"Outer attributes are always allowed\""
                  R_PAREN ")"
              R_BRACK "]"
            WHITESPACE " "
            STMT_LIST
              L_CURLY "{"
              R_CURLY "}"
          SEMICOLON ";"
        WHITESPACE "\n"
        R_CURLY "}"
  WHITESPACE "\n\n"
  IMPL
    COMMENT "// https://github.com/rust-analyzer/rust-analyzer/issues/689"
    WHITESPACE "\n"
    IMPL_KW "impl"
    WHITESPACE " "
    PATH_TYPE
      PATH
        PATH_SEGMENT
          NAME_REF
            IDENT "Whatever"
    WHITESPACE " "
    ASSOC_ITEM_LIST
      L_CURLY "{"
      WHITESPACE "\n    "
      FN
        FN_KW "fn"
        WHITESPACE " "
        NAME
          IDENT "salsa_event"
        PARAM_LIST
          L_PAREN "("
          SELF_PARAM
            AMP "&"
            NAME
              SELF_KW "self"
          COMMA ","
          WHITESPACE " "
          PARAM
            IDENT_PAT
              NAME
                IDENT "event_fn"
            COLON ":"
            WHITESPACE " "
            IMPL_TRAIT_TYPE
              IMPL_KW "impl"
              WHITESPACE " "
              TYPE_BOUND_LIST
                TYPE_BOUND
                  PATH_TYPE
                    PATH
                      PATH_SEGMENT
                        NAME_REF
                          IDENT "Fn"
                        PARAM_LIST
                          L_PAREN "("
                          R_PAREN ")"
                        WHITESPACE " "
                        RET_TYPE
                          THIN_ARROW "->"
                          WHITESPACE " "
                          PATH_TYPE
                            PATH
                              PATH_SEGMENT
                                NAME_REF
                                  IDENT "Event"
                                GENERIC_ARG_LIST
                                  L_ANGLE "<"
                                  TYPE_ARG
                                    PATH_TYPE
                                      PATH
                                        PATH_SEGMENT
                                          NAME_REF
                                            IDENT "Self"
                                  R_ANGLE ">"
          R_PAREN ")"
        WHITESPACE " "
        BLOCK_EXPR
          STMT_LIST
            L_CURLY "{"
            WHITESPACE "\n        "
            ATTR
              POUND "#"
              BANG "!"
              L_BRACK "["
              META
                PATH
                  PATH_SEGMENT
                    NAME_REF
                      IDENT "allow"
                TOKEN_TREE
                  L_PAREN "("
                  IDENT "unused_variables"
                  R_PAREN ")"
              R_BRACK "]"
            WHITESPACE " "
            COMMENT "// this is  `inner_attr` of the block"
            WHITESPACE "\n    "
            R_CURLY "}"
      WHITESPACE "\n"
      R_CURLY "}"
  WHITESPACE "\n"
