Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions crates/parser/src/grammar/items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,13 @@ pub(super) fn opt_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
// impl T for Foo {
// default async fn foo() {}
// }

// test default_async_unsafe_fn
// impl T for Foo {
// default async unsafe fn foo() {}
// }
T![async] => {
let mut maybe_fn = p.nth(2);
let is_unsafe = if matches!(maybe_fn, T![unsafe]) {
// test default_async_unsafe_fn
// impl T for Foo {
// default async unsafe fn foo() {}
// }
maybe_fn = p.nth(3);
true
} else {
Expand Down Expand Up @@ -400,9 +399,9 @@ fn fn_(p: &mut Parser, m: Marker) {
// fn foo<T>() where T: Copy {}
type_params::opt_where_clause(p);

// test fn_decl
// trait T { fn foo(); }
if p.at(T![;]) {
// test fn_decl
// trait T { fn foo(); }
p.bump(T![;]);
} else {
expressions::block_expr(p)
Expand Down
47 changes: 18 additions & 29 deletions crates/parser/src/grammar/items/adt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
T![where] => {
type_params::opt_where_clause(p);
match p.current() {
T![;] => {
p.bump(T![;]);
}
T![;] => p.bump(T![;]),
T!['{'] => record_field_list(p),
_ => {
//FIXME: special case `(` error message
Expand Down Expand Up @@ -53,7 +51,6 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
}

pub(super) fn enum_(p: &mut Parser, m: Marker) {
assert!(p.at(T![enum]));
p.bump(T![enum]);
name_r(p, ITEM_RECOVERY_SET);
type_params::opt_generic_param_list(p);
Expand All @@ -75,7 +72,16 @@ pub(crate) fn variant_list(p: &mut Parser) {
error_block(p, "expected enum variant");
continue;
}
let var = p.start();
variant(p);
if !p.at(T!['}']) {
p.expect(T![,]);
}
}
p.expect(T!['}']);
m.complete(p, VARIANT_LIST);

fn variant(p: &mut Parser) {
let m = p.start();
attributes::outer_attrs(p);
if p.at(IDENT) {
name(p);
Expand All @@ -90,17 +96,12 @@ pub(crate) fn variant_list(p: &mut Parser) {
if p.eat(T![=]) {
expressions::expr(p);
}
var.complete(p, VARIANT);
m.complete(p, VARIANT);
} else {
var.abandon(p);
m.abandon(p);
p.err_and_bump("expected enum variant");
}
if !p.at(T!['}']) {
p.expect(T![,]);
}
}
p.expect(T!['}']);
m.complete(p, VARIANT_LIST);
}

// test record_field_list
Expand All @@ -114,21 +115,18 @@ pub(crate) fn record_field_list(p: &mut Parser) {
error_block(p, "expected field");
continue;
}
record_field_def(p);
record_field(p);
if !p.at(T!['}']) {
p.expect(T![,]);
}
}
p.expect(T!['}']);
m.complete(p, RECORD_FIELD_LIST);

fn record_field_def(p: &mut Parser) {
fn record_field(p: &mut Parser) {
let m = p.start();
// test record_field_attrs
// struct S {
// #[serde(with = "url_serde")]
// pub uri: Uri,
// }
// struct S { #[attr] f: f32 }
attributes::outer_attrs(p);
opt_visibility(p);
if p.at(IDENT) {
Expand All @@ -146,20 +144,11 @@ pub(crate) fn record_field_list(p: &mut Parser) {
fn tuple_field_list(p: &mut Parser) {
assert!(p.at(T!['(']));
let m = p.start();
if !p.expect(T!['(']) {
return;
}
p.bump(T!['(']);
while !p.at(T![')']) && !p.at(EOF) {
let m = p.start();
// test tuple_field_attrs
// struct S (
// #[serde(with = "url_serde")]
// pub Uri,
// );
//
// enum S {
// Uri(#[serde(with = "url_serde")] Uri),
// }
// struct S (#[attr] f32);
attributes::outer_attrs(p);
opt_visibility(p);
if !p.at_ts(types::TYPE_FIRST) {
Expand Down
29 changes: 16 additions & 13 deletions crates/parser/src/grammar/items/consts.rs
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
use super::*;

pub(super) fn static_(p: &mut Parser, m: Marker) {
const_or_static(p, m, T![static], STATIC)
// test const_item
// const C: u32 = 92;
pub(super) fn konst(p: &mut Parser, m: Marker) {
p.bump(T![const]);
const_or_static(p, m, true)
}

pub(super) fn konst(p: &mut Parser, m: Marker) {
const_or_static(p, m, T![const], CONST)
pub(super) fn static_(p: &mut Parser, m: Marker) {
p.bump(T![static]);
const_or_static(p, m, false)
}

fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
assert!(p.at(kw));
p.bump(kw);
fn const_or_static(p: &mut Parser, m: Marker, is_const: bool) {
p.eat(T![mut]);

// Allow `_` in place of an identifier in a `const`.
let is_const_underscore = kw == T![const] && p.eat(T![_]);
if !is_const_underscore {
if is_const && p.eat(T![_]) {
// test anonymous_const
// const _: u32 = 0;
} else {
// test_err anonymous_static
// static _: i32 = 5;
name(p);
}

// test_err static_underscore
// static _: i32 = 5;
if p.at(T![:]) {
types::ascription(p);
} else {
Expand All @@ -30,5 +33,5 @@ fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
expressions::expr(p);
}
p.expect(T![;]);
m.complete(p, def);
m.complete(p, if is_const { CONST } else { STATIC });
}
Original file line number Diff line number Diff line change
@@ -1,45 +1,33 @@
SOURCE_FILE@0..64
STRUCT@0..63
SOURCE_FILE@0..28
STRUCT@0..27
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "S"
WHITESPACE@8..9 " "
RECORD_FIELD_LIST@9..63
RECORD_FIELD_LIST@9..27
L_CURLY@9..10 "{"
WHITESPACE@10..15 "\n "
RECORD_FIELD@15..60
ATTR@15..43
POUND@15..16 "#"
L_BRACK@16..17 "["
META@17..42
PATH@17..22
PATH_SEGMENT@17..22
NAME_REF@17..22
IDENT@17..22 "serde"
TOKEN_TREE@22..42
L_PAREN@22..23 "("
IDENT@23..27 "with"
WHITESPACE@27..28 " "
EQ@28..29 "="
WHITESPACE@29..30 " "
STRING@30..41 "\"url_serde\""
R_PAREN@41..42 ")"
R_BRACK@42..43 "]"
WHITESPACE@43..48 "\n "
VISIBILITY@48..51
PUB_KW@48..51 "pub"
WHITESPACE@51..52 " "
NAME@52..55
IDENT@52..55 "uri"
COLON@55..56 ":"
WHITESPACE@56..57 " "
PATH_TYPE@57..60
PATH@57..60
PATH_SEGMENT@57..60
NAME_REF@57..60
IDENT@57..60 "Uri"
COMMA@60..61 ","
WHITESPACE@61..62 "\n"
R_CURLY@62..63 "}"
WHITESPACE@63..64 "\n"
WHITESPACE@10..11 " "
RECORD_FIELD@11..25
ATTR@11..18
POUND@11..12 "#"
L_BRACK@12..13 "["
META@13..17
PATH@13..17
PATH_SEGMENT@13..17
NAME_REF@13..17
IDENT@13..17 "attr"
R_BRACK@17..18 "]"
WHITESPACE@18..19 " "
NAME@19..20
IDENT@19..20 "f"
COLON@20..21 ":"
WHITESPACE@21..22 " "
PATH_TYPE@22..25
PATH@22..25
PATH_SEGMENT@22..25
NAME_REF@22..25
IDENT@22..25 "f32"
WHITESPACE@25..26 " "
R_CURLY@26..27 "}"
WHITESPACE@27..28 "\n"
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
struct S {
#[serde(with = "url_serde")]
pub uri: Uri,
}
struct S { #[attr] f: f32 }
101 changes: 22 additions & 79 deletions crates/syntax/test_data/parser/inline/ok/0115_tuple_field_attrs.rast
Original file line number Diff line number Diff line change
@@ -1,85 +1,28 @@
SOURCE_FILE@0..115
STRUCT@0..59
SOURCE_FILE@0..24
STRUCT@0..23
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "S"
WHITESPACE@8..9 " "
TUPLE_FIELD_LIST@9..58
TUPLE_FIELD_LIST@9..22
L_PAREN@9..10 "("
WHITESPACE@10..15 "\n "
TUPLE_FIELD@15..55
ATTR@15..43
POUND@15..16 "#"
L_BRACK@16..17 "["
META@17..42
PATH@17..22
PATH_SEGMENT@17..22
NAME_REF@17..22
IDENT@17..22 "serde"
TOKEN_TREE@22..42
L_PAREN@22..23 "("
IDENT@23..27 "with"
WHITESPACE@27..28 " "
EQ@28..29 "="
WHITESPACE@29..30 " "
STRING@30..41 "\"url_serde\""
R_PAREN@41..42 ")"
R_BRACK@42..43 "]"
WHITESPACE@43..48 "\n "
VISIBILITY@48..51
PUB_KW@48..51 "pub"
WHITESPACE@51..52 " "
PATH_TYPE@52..55
PATH@52..55
PATH_SEGMENT@52..55
NAME_REF@52..55
IDENT@52..55 "Uri"
COMMA@55..56 ","
WHITESPACE@56..57 "\n"
R_PAREN@57..58 ")"
SEMICOLON@58..59 ";"
WHITESPACE@59..61 "\n\n"
ENUM@61..114
ENUM_KW@61..65 "enum"
WHITESPACE@65..66 " "
NAME@66..67
IDENT@66..67 "S"
WHITESPACE@67..68 " "
VARIANT_LIST@68..114
L_CURLY@68..69 "{"
WHITESPACE@69..74 "\n "
VARIANT@74..111
NAME@74..77
IDENT@74..77 "Uri"
TUPLE_FIELD_LIST@77..111
L_PAREN@77..78 "("
TUPLE_FIELD@78..110
ATTR@78..106
POUND@78..79 "#"
L_BRACK@79..80 "["
META@80..105
PATH@80..85
PATH_SEGMENT@80..85
NAME_REF@80..85
IDENT@80..85 "serde"
TOKEN_TREE@85..105
L_PAREN@85..86 "("
IDENT@86..90 "with"
WHITESPACE@90..91 " "
EQ@91..92 "="
WHITESPACE@92..93 " "
STRING@93..104 "\"url_serde\""
R_PAREN@104..105 ")"
R_BRACK@105..106 "]"
WHITESPACE@106..107 " "
PATH_TYPE@107..110
PATH@107..110
PATH_SEGMENT@107..110
NAME_REF@107..110
IDENT@107..110 "Uri"
R_PAREN@110..111 ")"
COMMA@111..112 ","
WHITESPACE@112..113 "\n"
R_CURLY@113..114 "}"
WHITESPACE@114..115 "\n"
TUPLE_FIELD@10..21
ATTR@10..17
POUND@10..11 "#"
L_BRACK@11..12 "["
META@12..16
PATH@12..16
PATH_SEGMENT@12..16
NAME_REF@12..16
IDENT@12..16 "attr"
R_BRACK@16..17 "]"
WHITESPACE@17..18 " "
PATH_TYPE@18..21
PATH@18..21
PATH_SEGMENT@18..21
NAME_REF@18..21
IDENT@18..21 "f32"
R_PAREN@21..22 ")"
SEMICOLON@22..23 ";"
WHITESPACE@23..24 "\n"
Original file line number Diff line number Diff line change
@@ -1,8 +1 @@
struct S (
#[serde(with = "url_serde")]
pub Uri,
);

enum S {
Uri(#[serde(with = "url_serde")] Uri),
}
struct S (#[attr] f32);
Loading