feat: allow attributes on all expressions

Attrs are syntactically valid on any expression, even if they are not
allowed semantically everywhere yet.
This commit is contained in:
Aleksey Kladov 2021-09-25 19:51:54 +03:00
parent 7dc331faef
commit 56964c9bd3
20 changed files with 303 additions and 335 deletions

View file

@ -26,9 +26,8 @@ SOURCE_FILE@0..43
PATH_SEGMENT@23..24
NAME_REF@23..24
IDENT@23..24 "f"
EXPR_STMT@24..25
ERROR@24..25
COLON@24..25 ":"
ERROR@24..25
COLON@24..25 ":"
WHITESPACE@25..26 " "
PATH_EXPR@26..29
PATH@26..29
@ -55,4 +54,3 @@ error 15..15: expected an item
error 17..17: expected an item
error 24..24: expected SEMICOLON
error 24..24: expected expression
error 25..25: expected SEMICOLON

View file

@ -24,9 +24,8 @@ SOURCE_FILE@0..112
WHITESPACE@15..16 " "
ERROR@16..17
AT@16..17 "@"
EXPR_STMT@17..18
ERROR@17..18
COMMA@17..18 ","
ERROR@17..18
COMMA@17..18 ","
WHITESPACE@18..19 " "
STRUCT@19..26
STRUCT_KW@19..25 "struct"
@ -71,15 +70,13 @@ SOURCE_FILE@0..112
WHITESPACE@52..53 " "
ERROR@53..54
AT@53..54 "@"
EXPR_STMT@54..55
ERROR@54..55
COMMA@54..55 ","
ERROR@54..55
COMMA@54..55 ","
WHITESPACE@55..56 " "
IMPL@56..60
IMPL_KW@56..60 "impl"
EXPR_STMT@60..61
ERROR@60..61
COMMA@60..61 ","
ERROR@60..61
COMMA@60..61 ","
WHITESPACE@61..62 " "
LET_STMT@62..65
LET_KW@62..65 "let"
@ -122,16 +119,13 @@ SOURCE_FILE@0..112
WHITESPACE@91..92 " "
ERROR@92..93
AT@92..93 "@"
EXPR_STMT@93..94
ERROR@93..94
COMMA@93..94 ","
ERROR@93..94
COMMA@93..94 ","
WHITESPACE@94..95 " "
EXPR_STMT@95..96
ERROR@95..96
R_BRACK@95..96 "]"
EXPR_STMT@96..97
ERROR@96..97
COMMA@96..97 ","
ERROR@95..96
R_BRACK@95..96 "]"
ERROR@96..97
COMMA@96..97 ","
WHITESPACE@97..98 " "
TRAIT@98..104
TRAIT_KW@98..103 "trait"
@ -149,7 +143,6 @@ error 16..16: expected expression
error 17..17: expected R_BRACK
error 17..17: expected SEMICOLON
error 17..17: expected expression
error 18..18: expected SEMICOLON
error 25..25: expected a name
error 26..26: expected `;`, `{`, or `(`
error 30..30: expected pattern
@ -157,22 +150,17 @@ error 31..31: expected SEMICOLON
error 53..53: expected expression
error 54..54: expected SEMICOLON
error 54..54: expected expression
error 55..55: expected SEMICOLON
error 60..60: expected type
error 60..60: expected `{`
error 60..60: expected expression
error 61..61: expected SEMICOLON
error 65..65: expected pattern
error 65..65: expected SEMICOLON
error 65..65: expected expression
error 92..92: expected expression
error 93..93: expected SEMICOLON
error 93..93: expected expression
error 94..94: expected SEMICOLON
error 95..95: expected expression
error 96..96: expected SEMICOLON
error 96..96: expected expression
error 97..97: expected SEMICOLON
error 103..103: expected a name
error 104..104: expected `{`
error 108..108: expected pattern

View file

@ -143,10 +143,9 @@ SOURCE_FILE@0..240
LIFETIME_IDENT@117..119 "'a"
R_ANGLE@119..120 ">"
R_PAREN@120..121 ")"
EXPR_STMT@121..123
ERROR@121..122
R_ANGLE@121..122 ">"
SEMICOLON@122..123 ";"
ERROR@121..122
R_ANGLE@121..122 ">"
SEMICOLON@122..123 ";"
WHITESPACE@123..128 "\n "
LET_STMT@128..141
LET_KW@128..131 "let"
@ -173,13 +172,11 @@ SOURCE_FILE@0..240
PATH_SEGMENT@141..146
NAME_REF@141..146
IDENT@141..146 "Sized"
EXPR_STMT@146..147
ERROR@146..147
R_PAREN@146..147 ")"
ERROR@146..147
R_PAREN@146..147 ")"
WHITESPACE@147..148 " "
EXPR_STMT@148..149
ERROR@148..149
PLUS@148..149 "+"
ERROR@148..149
PLUS@148..149 "+"
WHITESPACE@149..150 " "
EXPR_STMT@150..180
TUPLE_EXPR@150..180
@ -288,10 +285,9 @@ SOURCE_FILE@0..240
NAME_REF@229..234
IDENT@229..234 "Sized"
R_PAREN@234..235 ")"
EXPR_STMT@235..237
ERROR@235..236
R_ANGLE@235..236 ">"
SEMICOLON@236..237 ";"
ERROR@235..236
R_ANGLE@235..236 ">"
SEMICOLON@236..237 ";"
WHITESPACE@237..238 "\n"
R_CURLY@238..239 "}"
WHITESPACE@239..240 "\n"
@ -306,9 +302,7 @@ error 141..141: expected R_ANGLE
error 141..141: expected SEMICOLON
error 146..146: expected SEMICOLON
error 146..146: expected expression
error 147..147: expected SEMICOLON
error 148..148: expected expression
error 149..149: expected SEMICOLON
error 155..155: expected type
error 158..158: expected IN_KW
error 165..165: expected expression

View file

@ -51,12 +51,11 @@ SOURCE_FILE@0..83
BLOCK_EXPR@66..80
L_CURLY@66..67 "{"
WHITESPACE@67..68 " "
EXPR_STMT@68..75
ERROR@68..75
LABEL@68..75
LIFETIME@68..74
LIFETIME_IDENT@68..74 "'label"
COLON@74..75 ":"
ERROR@68..75
LABEL@68..75
LIFETIME@68..74
LIFETIME_IDENT@68..74 "'label"
COLON@74..75 ":"
WHITESPACE@75..76 " "
LITERAL@76..78
INT_NUMBER@76..78 "92"
@ -69,4 +68,3 @@ error 24..24: expected existential, fn, trait or impl
error 41..41: expected existential, fn, trait or impl
error 56..56: expected a block
error 75..75: expected a loop
error 75..75: expected SEMICOLON

View file

@ -11,12 +11,11 @@ SOURCE_FILE@0..30
BLOCK_EXPR@10..29
L_CURLY@10..11 "{"
WHITESPACE@11..16 "\n "
EXPR_STMT@16..22
ERROR@16..22
LABEL@16..22
LIFETIME@16..21
LIFETIME_IDENT@16..21 "'loop"
COLON@21..22 ":"
ERROR@16..22
LABEL@16..22
LIFETIME@16..21
LIFETIME_IDENT@16..21 "'loop"
COLON@21..22 ":"
WHITESPACE@22..23 " "
IMPL@23..27
IMPL_KW@23..27 "impl"
@ -24,6 +23,5 @@ SOURCE_FILE@0..30
R_CURLY@28..29 "}"
WHITESPACE@29..30 "\n"
error 22..22: expected a loop
error 22..22: expected SEMICOLON
error 27..27: expected type
error 27..27: expected `{`

View file

@ -1,60 +0,0 @@
SOURCE_FILE@0..48
FN@0..47
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
NAME@3..6
IDENT@3..6 "foo"
PARAM_LIST@6..8
L_PAREN@6..7 "("
R_PAREN@7..8 ")"
WHITESPACE@8..9 " "
BLOCK_EXPR@9..47
L_CURLY@9..10 "{"
WHITESPACE@10..14 "\n "
EXPR_STMT@14..25
ATTR@14..18
POUND@14..15 "#"
L_BRACK@15..16 "["
META@16..17
PATH@16..17
PATH_SEGMENT@16..17
NAME_REF@16..17
IDENT@16..17 "A"
R_BRACK@17..18 "]"
WHITESPACE@18..19 " "
BIN_EXPR@19..24
LITERAL@19..20
INT_NUMBER@19..20 "1"
WHITESPACE@20..21 " "
PLUS@21..22 "+"
WHITESPACE@22..23 " "
LITERAL@23..24
INT_NUMBER@23..24 "2"
SEMICOLON@24..25 ";"
WHITESPACE@25..29 "\n "
EXPR_STMT@29..45
ATTR@29..33
POUND@29..30 "#"
L_BRACK@30..31 "["
META@31..32
PATH@31..32
PATH_SEGMENT@31..32
NAME_REF@31..32
IDENT@31..32 "B"
R_BRACK@32..33 "]"
WHITESPACE@33..34 " "
IF_EXPR@34..44
IF_KW@34..36 "if"
WHITESPACE@36..37 " "
CONDITION@37..41
LITERAL@37..41
TRUE_KW@37..41 "true"
WHITESPACE@41..42 " "
BLOCK_EXPR@42..44
L_CURLY@42..43 "{"
R_CURLY@43..44 "}"
SEMICOLON@44..45 ";"
WHITESPACE@45..46 "\n"
R_CURLY@46..47 "}"
WHITESPACE@47..48 "\n"
error 24..24: attributes are not allowed on BIN_EXPR

View file

@ -1,4 +0,0 @@
fn foo() {
#[A] 1 + 2;
#[B] if true {};
}

View file

@ -12,17 +12,17 @@ SOURCE_FILE@0..82
L_CURLY@9..10 "{"
WHITESPACE@10..15 "\n "
EXPR_STMT@15..26
ATTR@15..19
POUND@15..16 "#"
L_BRACK@16..17 "["
META@17..18
PATH@17..18
PATH_SEGMENT@17..18
NAME_REF@17..18
IDENT@17..18 "A"
R_BRACK@18..19 "]"
WHITESPACE@19..20 " "
CALL_EXPR@20..25
CALL_EXPR@15..25
ATTR@15..19
POUND@15..16 "#"
L_BRACK@16..17 "["
META@17..18
PATH@17..18
PATH_SEGMENT@17..18
NAME_REF@17..18
IDENT@17..18 "A"
R_BRACK@18..19 "]"
WHITESPACE@19..20 " "
PATH_EXPR@20..23
PATH@20..23
PATH_SEGMENT@20..23
@ -34,17 +34,17 @@ SOURCE_FILE@0..82
SEMICOLON@25..26 ";"
WHITESPACE@26..31 "\n "
EXPR_STMT@31..42
ATTR@31..35
POUND@31..32 "#"
L_BRACK@32..33 "["
META@33..34
PATH@33..34
PATH_SEGMENT@33..34
NAME_REF@33..34
IDENT@33..34 "B"
R_BRACK@34..35 "]"
WHITESPACE@35..36 " "
MACRO_CALL@36..42
MACRO_CALL@31..42
ATTR@31..35
POUND@31..32 "#"
L_BRACK@32..33 "["
META@33..34
PATH@33..34
PATH_SEGMENT@33..34
NAME_REF@33..34
IDENT@33..34 "B"
R_BRACK@34..35 "]"
WHITESPACE@35..36 " "
PATH@36..39
PATH_SEGMENT@36..39
NAME_REF@36..39
@ -55,42 +55,42 @@ SOURCE_FILE@0..82
R_CURLY@41..42 "}"
WHITESPACE@42..47 "\n "
EXPR_STMT@47..59
ATTR@47..51
POUND@47..48 "#"
L_BRACK@48..49 "["
META@49..50
PATH@49..50
PATH_SEGMENT@49..50
NAME_REF@49..50
IDENT@49..50 "C"
R_BRACK@50..51 "]"
WHITESPACE@51..52 " "
ATTR@52..56
POUND@52..53 "#"
L_BRACK@53..54 "["
META@54..55
PATH@54..55
PATH_SEGMENT@54..55
NAME_REF@54..55
IDENT@54..55 "D"
R_BRACK@55..56 "]"
WHITESPACE@56..57 " "
BLOCK_EXPR@57..59
BLOCK_EXPR@47..59
ATTR@47..51
POUND@47..48 "#"
L_BRACK@48..49 "["
META@49..50
PATH@49..50
PATH_SEGMENT@49..50
NAME_REF@49..50
IDENT@49..50 "C"
R_BRACK@50..51 "]"
WHITESPACE@51..52 " "
ATTR@52..56
POUND@52..53 "#"
L_BRACK@53..54 "["
META@54..55
PATH@54..55
PATH_SEGMENT@54..55
NAME_REF@54..55
IDENT@54..55 "D"
R_BRACK@55..56 "]"
WHITESPACE@56..57 " "
L_CURLY@57..58 "{"
R_CURLY@58..59 "}"
WHITESPACE@59..64 "\n "
EXPR_STMT@64..79
ATTR@64..68
POUND@64..65 "#"
L_BRACK@65..66 "["
META@66..67
PATH@66..67
PATH_SEGMENT@66..67
NAME_REF@66..67
IDENT@66..67 "D"
R_BRACK@67..68 "]"
WHITESPACE@68..69 " "
RETURN_EXPR@69..78
RETURN_EXPR@64..78
ATTR@64..68
POUND@64..65 "#"
L_BRACK@65..66 "["
META@66..67
PATH@66..67
PATH_SEGMENT@66..67
NAME_REF@66..67
IDENT@66..67 "D"
R_BRACK@67..68 "]"
WHITESPACE@68..69 " "
RETURN_KW@69..75 "return"
WHITESPACE@75..76 " "
TUPLE_EXPR@76..78

View file

@ -1,59 +0,0 @@
SOURCE_FILE@0..47
FN@0..46
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
NAME@3..6
IDENT@3..6 "foo"
PARAM_LIST@6..8
L_PAREN@6..7 "("
R_PAREN@7..8 ")"
WHITESPACE@8..9 " "
BLOCK_EXPR@9..46
L_CURLY@9..10 "{"
WHITESPACE@10..15 "\n "
EXPR_STMT@15..31
BLOCK_EXPR@15..31
L_CURLY@15..16 "{"
WHITESPACE@16..17 " "
TRY_EXPR@17..29
ATTR@17..21
POUND@17..18 "#"
L_BRACK@18..19 "["
META@19..20
PATH@19..20
PATH_SEGMENT@19..20
NAME_REF@19..20
IDENT@19..20 "A"
R_BRACK@20..21 "]"
WHITESPACE@21..22 " "
MACRO_CALL@22..28
PATH@22..25
PATH_SEGMENT@22..25
NAME_REF@22..25
IDENT@22..25 "bar"
BANG@25..26 "!"
TOKEN_TREE@26..28
L_PAREN@26..27 "("
R_PAREN@27..28 ")"
QUESTION@28..29 "?"
WHITESPACE@29..30 " "
R_CURLY@30..31 "}"
WHITESPACE@31..36 "\n "
REF_EXPR@36..44
ATTR@36..40
POUND@36..37 "#"
L_BRACK@37..38 "["
META@38..39
PATH@38..39
PATH_SEGMENT@38..39
NAME_REF@38..39
IDENT@38..39 "B"
R_BRACK@39..40 "]"
WHITESPACE@40..41 " "
AMP@41..42 "&"
TUPLE_EXPR@42..44
L_PAREN@42..43 "("
R_PAREN@43..44 ")"
WHITESPACE@44..45 "\n"
R_CURLY@45..46 "}"
WHITESPACE@46..47 "\n"

View file

@ -1,4 +0,0 @@
fn foo() {
{ #[A] bar!()? }
#[B] &()
}

View file

@ -0,0 +1,58 @@
SOURCE_FILE@0..44
FN@0..43
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
NAME@3..4
IDENT@3..4 "f"
PARAM_LIST@4..6
L_PAREN@4..5 "("
R_PAREN@5..6 ")"
WHITESPACE@6..7 " "
BLOCK_EXPR@7..43
L_CURLY@7..8 "{"
WHITESPACE@8..13 "\n "
PAREN_EXPR@13..41
L_PAREN@13..14 "("
BIN_EXPR@14..40
TRY_EXPR@14..23
ATTR@14..18
POUND@14..15 "#"
L_BRACK@15..16 "["
META@16..17
PATH@16..17
PATH_SEGMENT@16..17
NAME_REF@16..17
IDENT@16..17 "a"
R_BRACK@17..18 "]"
WHITESPACE@18..19 " "
PATH_EXPR@19..22
PATH@19..22
PATH_SEGMENT@19..22
NAME_REF@19..22
IDENT@19..22 "lhs"
QUESTION@22..23 "?"
WHITESPACE@23..24 " "
PLUS@24..25 "+"
WHITESPACE@25..26 " "
AWAIT_EXPR@26..40
ATTR@26..30
POUND@26..27 "#"
L_BRACK@27..28 "["
META@28..29
PATH@28..29
PATH_SEGMENT@28..29
NAME_REF@28..29
IDENT@28..29 "b"
R_BRACK@29..30 "]"
WHITESPACE@30..31 " "
PATH_EXPR@31..34
PATH@31..34
PATH_SEGMENT@31..34
NAME_REF@31..34
IDENT@31..34 "rhs"
DOT@34..35 "."
AWAIT_KW@35..40 "await"
R_PAREN@40..41 ")"
WHITESPACE@41..42 "\n"
R_CURLY@42..43 "}"
WHITESPACE@43..44 "\n"

View file

@ -0,0 +1,3 @@
fn f() {
(#[a] lhs? + #[b] rhs.await)
}

View file

@ -0,0 +1,69 @@
SOURCE_FILE@0..52
FN@0..51
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
NAME@3..6
IDENT@3..6 "foo"
PARAM_LIST@6..8
L_PAREN@6..7 "("
R_PAREN@7..8 ")"
WHITESPACE@8..9 " "
BLOCK_EXPR@9..51
L_CURLY@9..10 "{"
WHITESPACE@10..15 "\n "
EXPR_STMT@15..36
BLOCK_EXPR@15..36
ATTR@15..19
POUND@15..16 "#"
L_BRACK@16..17 "["
META@17..18
PATH@17..18
PATH_SEGMENT@17..18
NAME_REF@17..18
IDENT@17..18 "A"
R_BRACK@18..19 "]"
WHITESPACE@19..20 " "
L_CURLY@20..21 "{"
WHITESPACE@21..22 " "
TRY_EXPR@22..34
ATTR@22..26
POUND@22..23 "#"
L_BRACK@23..24 "["
META@24..25
PATH@24..25
PATH_SEGMENT@24..25
NAME_REF@24..25
IDENT@24..25 "B"
R_BRACK@25..26 "]"
WHITESPACE@26..27 " "
MACRO_CALL@27..33
PATH@27..30
PATH_SEGMENT@27..30
NAME_REF@27..30
IDENT@27..30 "bar"
BANG@30..31 "!"
TOKEN_TREE@31..33
L_PAREN@31..32 "("
R_PAREN@32..33 ")"
QUESTION@33..34 "?"
WHITESPACE@34..35 " "
R_CURLY@35..36 "}"
WHITESPACE@36..41 "\n "
REF_EXPR@41..49
ATTR@41..45
POUND@41..42 "#"
L_BRACK@42..43 "["
META@43..44
PATH@43..44
PATH_SEGMENT@43..44
NAME_REF@43..44
IDENT@43..44 "C"
R_BRACK@44..45 "]"
WHITESPACE@45..46 " "
AMP@46..47 "&"
TUPLE_EXPR@47..49
L_PAREN@47..48 "("
R_PAREN@48..49 ")"
WHITESPACE@49..50 "\n"
R_CURLY@50..51 "}"
WHITESPACE@51..52 "\n"

View file

@ -0,0 +1,4 @@
fn foo() {
#[A] { #[B] bar!()? }
#[C] &()
}