10265: internal: parser cleanups r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2021-09-17 19:27:32 +00:00 committed by GitHub
commit 4badd2faf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 545 additions and 498 deletions

View File

@ -12,6 +12,28 @@ pub(super) fn outer_attrs(p: &mut Parser) {
}
}
fn attr(p: &mut Parser, inner: bool) {
assert!(p.at(T![#]));
let attr = p.start();
p.bump(T![#]);
if inner {
p.bump(T![!]);
}
if p.eat(T!['[']) {
meta(p);
if !p.eat(T![']']) {
p.error("expected `]`");
}
} else {
p.error("expected `[`");
}
attr.complete(p, ATTR);
}
pub(super) fn meta(p: &mut Parser) {
let meta = p.start();
paths::use_path(p);
@ -29,25 +51,3 @@ pub(super) fn meta(p: &mut Parser) {
meta.complete(p, META);
}
fn attr(p: &mut Parser, inner: bool) {
let attr = p.start();
assert!(p.at(T![#]));
p.bump(T![#]);
if inner {
assert!(p.at(T![!]));
p.bump(T![!]);
}
if p.eat(T!['[']) {
meta(p);
if !p.eat(T![']']) {
p.error("expected `]`");
}
} else {
p.error("expected `[`");
}
attr.complete(p, ATTR);
}

View File

@ -71,7 +71,7 @@ pub(super) fn stmt(p: &mut Parser, with_semi: StmtWithSemi, prefer_expr: bool) {
// test block_items
// fn a() { fn b() {} }
let m = match items::maybe_item(p, m) {
let m = match items::opt_item(p, m) {
Ok(()) => return,
Err(m) => m,
};

View File

@ -44,7 +44,8 @@ pub(super) const ITEM_RECOVERY_SET: TokenSet = TokenSet::new(&[
pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) {
let m = p.start();
attributes::outer_attrs(p);
let m = match maybe_item(p, m) {
let m = match opt_item(p, m) {
Ok(()) => {
if p.at(T![;]) {
p.err_and_bump(
@ -56,6 +57,7 @@ pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) {
}
Err(m) => m,
};
if paths::is_use_path_start(p) {
match macro_call(p) {
BlockLike::Block => (),
@ -64,30 +66,30 @@ pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) {
}
}
m.complete(p, MACRO_CALL);
} else {
m.abandon(p);
if p.at(T!['{']) {
error_block(p, "expected an item");
} else if p.at(T!['}']) && !stop_on_r_curly {
return;
}
m.abandon(p);
match p.current() {
T!['{'] => error_block(p, "expected an item"),
T!['}'] if !stop_on_r_curly => {
let e = p.start();
p.error("unmatched `}`");
p.bump(T!['}']);
e.complete(p, ERROR);
} else if !p.at(EOF) && !p.at(T!['}']) {
p.err_and_bump("expected an item");
} else {
p.error("expected an item");
}
EOF | T!['}'] => p.error("expected an item"),
_ => p.err_and_bump("expected an item"),
}
}
/// Try to parse an item, completing `m` in case of success.
pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
pub(super) fn opt_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
// test_err pub_expr
// fn foo() { pub 92; }
let has_visibility = opt_visibility(p);
let m = match items_without_modifiers(p, m) {
let m = match opt_item_without_modifiers(p, m) {
Ok(()) => return Ok(()),
Err(m) => m,
};
@ -235,48 +237,20 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
Ok(())
}
fn items_without_modifiers(p: &mut Parser, m: Marker) -> Result<(), Marker> {
fn opt_item_without_modifiers(p: &mut Parser, m: Marker) -> Result<(), Marker> {
let la = p.nth(1);
match p.current() {
// test extern_crate
// extern crate foo;
T![extern] if la == T![crate] => extern_crate(p, m),
T![use] => use_item::use_(p, m),
T![mod] => mod_item(p, m),
T![type] => type_alias(p, m),
T![struct] => {
// test struct_items
// struct Foo;
// struct Foo {}
// struct Foo();
// struct Foo(String, usize);
// struct Foo {
// a: i32,
// b: f32,
// }
adt::strukt(p, m);
}
T![struct] => adt::strukt(p, m),
T![enum] => adt::enum_(p, m),
IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => {
// test union_items
// union Foo {}
// union Foo {
// a: i32,
// b: f32,
// }
adt::union(p, m);
}
IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => adt::union(p, m),
// test pub_macro_def
// pub macro m($:ident) {}
T![macro] => {
macro_def(p, m);
}
IDENT if p.at_contextual_kw("macro_rules") && p.nth(1) == BANG => {
macro_rules(p, m);
}
T![macro] => macro_def(p, m),
IDENT if p.at_contextual_kw("macro_rules") && p.nth(1) == BANG => macro_rules(p, m),
T![const] if (la == IDENT || la == T![_] || la == T![mut]) => consts::konst(p, m),
T![static] => consts::static_(p, m),
@ -286,14 +260,15 @@ fn items_without_modifiers(p: &mut Parser, m: Marker) -> Result<(), Marker> {
Ok(())
}
// test extern_crate
// extern crate foo;
fn extern_crate(p: &mut Parser, m: Marker) {
assert!(p.at(T![extern]));
p.bump(T![extern]);
assert!(p.at(T![crate]));
p.bump(T![crate]);
if p.at(T![self]) {
// test extern_crate_self
// extern crate self;
let m = p.start();
p.bump(T![self]);
m.complete(p, NAME_REF);
@ -301,11 +276,62 @@ fn extern_crate(p: &mut Parser, m: Marker) {
name_ref(p);
}
// test extern_crate_rename
// extern crate foo as bar;
opt_rename(p);
p.expect(T![;]);
m.complete(p, EXTERN_CRATE);
}
// test mod_item
// mod a;
pub(crate) fn mod_item(p: &mut Parser, m: Marker) {
p.bump(T![mod]);
name(p);
if p.at(T!['{']) {
// test mod_item_curly
// mod b { }
item_list(p);
} else if !p.eat(T![;]) {
p.error("expected `;` or `{`");
}
m.complete(p, MODULE);
}
// test type_alias
// type Foo = Bar;
fn type_alias(p: &mut Parser, m: Marker) {
p.bump(T![type]);
name(p);
// test type_item_type_params
// type Result<T> = ();
type_params::opt_generic_param_list(p);
if p.at(T![:]) {
type_params::bounds(p);
}
// test type_item_where_clause
// type Foo where Foo: Copy = ();
type_params::opt_where_clause(p);
if p.eat(T![=]) {
types::type_(p);
}
p.expect(T![;]);
m.complete(p, TYPE_ALIAS);
}
pub(crate) fn item_list(p: &mut Parser) {
assert!(p.at(T!['{']));
let m = p.start();
p.bump(T!['{']);
mod_contents(p, true);
p.expect(T!['}']);
m.complete(p, ITEM_LIST);
}
pub(crate) fn extern_item_list(p: &mut Parser) {
assert!(p.at(T!['{']));
let m = p.start();
@ -347,54 +373,6 @@ fn fn_(p: &mut Parser) {
}
}
// test type_item
// type Foo = Bar;
fn type_alias(p: &mut Parser, m: Marker) {
assert!(p.at(T![type]));
p.bump(T![type]);
name(p);
// test type_item_type_params
// type Result<T> = ();
type_params::opt_generic_param_list(p);
if p.at(T![:]) {
type_params::bounds(p);
}
// test type_item_where_clause
// type Foo where Foo: Copy = ();
type_params::opt_where_clause(p);
if p.eat(T![=]) {
types::type_(p);
}
p.expect(T![;]);
m.complete(p, TYPE_ALIAS);
}
pub(crate) fn mod_item(p: &mut Parser, m: Marker) {
assert!(p.at(T![mod]));
p.bump(T![mod]);
name(p);
if p.at(T!['{']) {
item_list(p);
} else if !p.eat(T![;]) {
p.error("expected `;` or `{`");
}
m.complete(p, MODULE);
}
pub(crate) fn item_list(p: &mut Parser) {
assert!(p.at(T!['{']));
let m = p.start();
p.bump(T!['{']);
mod_contents(p, true);
p.expect(T!['}']);
m.complete(p, ITEM_LIST);
}
fn macro_rules(p: &mut Parser, m: Marker) {
assert!(p.at_contextual_kw("macro_rules"));
p.bump_remap(T![macro_rules]);
@ -429,16 +407,15 @@ fn macro_rules(p: &mut Parser, m: Marker) {
}
// test macro_def
// macro m { ($i:ident) => {} }
// macro m($i:ident) {}
fn macro_def(p: &mut Parser, m: Marker) {
p.expect(T![macro]);
name_r(p, ITEM_RECOVERY_SET);
if p.at(T!['{']) {
// test macro_def_curly
// macro m { ($i:ident) => {} }
token_tree(p);
} else if !p.at(T!['(']) {
p.error("unmatched `(`");
} else {
} else if p.at(T!['(']) {
let m = p.start();
token_tree(p);
match p.current() {
@ -446,6 +423,8 @@ fn macro_def(p: &mut Parser, m: Marker) {
_ => p.error("expected `{`, `[`, `(`"),
}
m.complete(p, TOKEN_TREE);
} else {
p.error("unmatched `(`");
}
m.complete(p, MACRO_DEF);

View File

@ -1,18 +1,21 @@
use super::*;
// test struct_item
// struct S {}
pub(super) fn strukt(p: &mut Parser, m: Marker) {
assert!(p.at(T![struct]));
p.bump(T![struct]);
struct_or_union(p, m, T![struct], STRUCT);
struct_or_union(p, m, true);
}
// test union_item
// struct U { i: i32, f: f32 }
pub(super) fn union(p: &mut Parser, m: Marker) {
assert!(p.at_contextual_kw("union"));
p.bump_remap(T![union]);
struct_or_union(p, m, T![union], UNION);
struct_or_union(p, m, false);
}
fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
name_r(p, ITEM_RECOVERY_SET);
type_params::opt_generic_param_list(p);
match p.current() {
@ -29,26 +32,24 @@ fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
}
}
}
T![;] if kw == T![struct] => {
T!['{'] => record_field_list(p),
// test unit_struct
// struct S;
T![;] if is_struct => {
p.bump(T![;]);
}
T!['{'] => record_field_list(p),
T!['('] if kw == T![struct] => {
// test tuple_struct
// struct S(String, usize);
T!['('] if is_struct => {
tuple_field_list(p);
// test tuple_struct_where
// struct Test<T>(T) where T: Clone;
// struct Test<T>(T);
// struct S<T>(T) where T: Clone;
type_params::opt_where_clause(p);
p.expect(T![;]);
}
_ if kw == T![struct] => {
p.error("expected `;`, `{`, or `(`");
}
_ => {
p.error("expected `{`");
}
_ => p.error(if is_struct { "expected `;`, `{`, or `(`" } else { "expected `{`" }),
}
m.complete(p, def);
m.complete(p, if is_struct { STRUCT } else { UNION });
}
pub(super) fn enum_(p: &mut Parser, m: Marker) {
@ -102,6 +103,8 @@ pub(crate) fn variant_list(p: &mut Parser) {
m.complete(p, VARIANT_LIST);
}
// test record_field_list
// struct S { a: i32, b: f32 }
pub(crate) fn record_field_list(p: &mut Parser) {
assert!(p.at(T!['{']));
let m = p.start();

View File

@ -1,46 +0,0 @@
SOURCE_FILE@0..51
UNION@0..12
UNION_KW@0..5 "union"
WHITESPACE@5..6 " "
NAME@6..9
IDENT@6..9 "Foo"
WHITESPACE@9..10 " "
RECORD_FIELD_LIST@10..12
L_CURLY@10..11 "{"
R_CURLY@11..12 "}"
WHITESPACE@12..13 "\n"
UNION@13..50
UNION_KW@13..18 "union"
WHITESPACE@18..19 " "
NAME@19..22
IDENT@19..22 "Foo"
WHITESPACE@22..23 " "
RECORD_FIELD_LIST@23..50
L_CURLY@23..24 "{"
WHITESPACE@24..29 "\n "
RECORD_FIELD@29..35
NAME@29..30
IDENT@29..30 "a"
COLON@30..31 ":"
WHITESPACE@31..32 " "
PATH_TYPE@32..35
PATH@32..35
PATH_SEGMENT@32..35
NAME_REF@32..35
IDENT@32..35 "i32"
COMMA@35..36 ","
WHITESPACE@36..41 "\n "
RECORD_FIELD@41..47
NAME@41..42
IDENT@41..42 "b"
COLON@42..43 ":"
WHITESPACE@43..44 " "
PATH_TYPE@44..47
PATH@44..47
PATH_SEGMENT@44..47
NAME_REF@44..47
IDENT@44..47 "f32"
COMMA@47..48 ","
WHITESPACE@48..49 "\n"
R_CURLY@49..50 "}"
WHITESPACE@50..51 "\n"

View File

@ -1,5 +0,0 @@
union Foo {}
union Foo {
a: i32,
b: f32,
}

View File

@ -1,8 +0,0 @@
struct Foo;
struct Foo {}
struct Foo();
struct Foo(String, usize);
struct Foo {
a: i32,
b: f32,
}

View File

@ -1,64 +1,42 @@
SOURCE_FILE@0..53
STRUCT@0..33
SOURCE_FILE@0..31
STRUCT@0..30
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..11
IDENT@7..11 "Test"
GENERIC_PARAM_LIST@11..14
L_ANGLE@11..12 "<"
TYPE_PARAM@12..13
NAME@12..13
IDENT@12..13 "T"
R_ANGLE@13..14 ">"
TUPLE_FIELD_LIST@14..17
L_PAREN@14..15 "("
TUPLE_FIELD@15..16
PATH_TYPE@15..16
PATH@15..16
PATH_SEGMENT@15..16
NAME_REF@15..16
IDENT@15..16 "T"
R_PAREN@16..17 ")"
WHITESPACE@17..18 " "
WHERE_CLAUSE@18..32
WHERE_KW@18..23 "where"
WHITESPACE@23..24 " "
WHERE_PRED@24..32
PATH_TYPE@24..25
PATH@24..25
PATH_SEGMENT@24..25
NAME_REF@24..25
IDENT@24..25 "T"
COLON@25..26 ":"
WHITESPACE@26..27 " "
TYPE_BOUND_LIST@27..32
TYPE_BOUND@27..32
PATH_TYPE@27..32
PATH@27..32
PATH_SEGMENT@27..32
NAME_REF@27..32
IDENT@27..32 "Clone"
SEMICOLON@32..33 ";"
WHITESPACE@33..34 "\n"
STRUCT@34..52
STRUCT_KW@34..40 "struct"
WHITESPACE@40..41 " "
NAME@41..45
IDENT@41..45 "Test"
GENERIC_PARAM_LIST@45..48
L_ANGLE@45..46 "<"
TYPE_PARAM@46..47
NAME@46..47
IDENT@46..47 "T"
R_ANGLE@47..48 ">"
TUPLE_FIELD_LIST@48..51
L_PAREN@48..49 "("
TUPLE_FIELD@49..50
PATH_TYPE@49..50
PATH@49..50
PATH_SEGMENT@49..50
NAME_REF@49..50
IDENT@49..50 "T"
R_PAREN@50..51 ")"
SEMICOLON@51..52 ";"
WHITESPACE@52..53 "\n"
NAME@7..8
IDENT@7..8 "S"
GENERIC_PARAM_LIST@8..11
L_ANGLE@8..9 "<"
TYPE_PARAM@9..10
NAME@9..10
IDENT@9..10 "T"
R_ANGLE@10..11 ">"
TUPLE_FIELD_LIST@11..14
L_PAREN@11..12 "("
TUPLE_FIELD@12..13
PATH_TYPE@12..13
PATH@12..13
PATH_SEGMENT@12..13
NAME_REF@12..13
IDENT@12..13 "T"
R_PAREN@13..14 ")"
WHITESPACE@14..15 " "
WHERE_CLAUSE@15..29
WHERE_KW@15..20 "where"
WHITESPACE@20..21 " "
WHERE_PRED@21..29
PATH_TYPE@21..22
PATH@21..22
PATH_SEGMENT@21..22
NAME_REF@21..22
IDENT@21..22 "T"
COLON@22..23 ":"
WHITESPACE@23..24 " "
TYPE_BOUND_LIST@24..29
TYPE_BOUND@24..29
PATH_TYPE@24..29
PATH@24..29
PATH_SEGMENT@24..29
NAME_REF@24..29
IDENT@24..29 "Clone"
SEMICOLON@29..30 ";"
WHITESPACE@30..31 "\n"

View File

@ -1,2 +1 @@
struct Test<T>(T) where T: Clone;
struct Test<T>(T);
struct S<T>(T) where T: Clone;

View File

@ -1,45 +1,19 @@
SOURCE_FILE@0..50
MACRO_DEF@0..28
SOURCE_FILE@0..21
MACRO_DEF@0..20
MACRO_KW@0..5 "macro"
WHITESPACE@5..6 " "
NAME@6..7
IDENT@6..7 "m"
WHITESPACE@7..8 " "
TOKEN_TREE@8..28
L_CURLY@8..9 "{"
WHITESPACE@9..10 " "
TOKEN_TREE@10..20
L_PAREN@10..11 "("
DOLLAR@11..12 "$"
IDENT@12..13 "i"
COLON@13..14 ":"
IDENT@14..19 "ident"
R_PAREN@19..20 ")"
WHITESPACE@20..21 " "
EQ@21..22 "="
R_ANGLE@22..23 ">"
WHITESPACE@23..24 " "
TOKEN_TREE@24..26
L_CURLY@24..25 "{"
R_CURLY@25..26 "}"
WHITESPACE@26..27 " "
R_CURLY@27..28 "}"
WHITESPACE@28..29 "\n"
MACRO_DEF@29..49
MACRO_KW@29..34 "macro"
WHITESPACE@34..35 " "
NAME@35..36
IDENT@35..36 "m"
TOKEN_TREE@36..49
TOKEN_TREE@36..46
L_PAREN@36..37 "("
DOLLAR@37..38 "$"
IDENT@38..39 "i"
COLON@39..40 ":"
IDENT@40..45 "ident"
R_PAREN@45..46 ")"
WHITESPACE@46..47 " "
TOKEN_TREE@47..49
L_CURLY@47..48 "{"
R_CURLY@48..49 "}"
WHITESPACE@49..50 "\n"
TOKEN_TREE@7..20
TOKEN_TREE@7..17
L_PAREN@7..8 "("
DOLLAR@8..9 "$"
IDENT@9..10 "i"
COLON@10..11 ":"
IDENT@11..16 "ident"
R_PAREN@16..17 ")"
WHITESPACE@17..18 " "
TOKEN_TREE@18..20
L_CURLY@18..19 "{"
R_CURLY@19..20 "}"
WHITESPACE@20..21 "\n"

View File

@ -1,2 +1 @@
macro m { ($i:ident) => {} }
macro m($i:ident) {}

View File

@ -1,21 +0,0 @@
SOURCE_FILE@0..24
MACRO_DEF@0..23
VISIBILITY@0..3
PUB_KW@0..3 "pub"
WHITESPACE@3..4 " "
MACRO_KW@4..9 "macro"
WHITESPACE@9..10 " "
NAME@10..11
IDENT@10..11 "m"
TOKEN_TREE@11..23
TOKEN_TREE@11..20
L_PAREN@11..12 "("
DOLLAR@12..13 "$"
COLON@13..14 ":"
IDENT@14..19 "ident"
R_PAREN@19..20 ")"
WHITESPACE@20..21 " "
TOKEN_TREE@21..23
L_CURLY@21..22 "{"
R_CURLY@22..23 "}"
WHITESPACE@23..24 "\n"

View File

@ -1 +0,0 @@
pub macro m($:ident) {}

View File

@ -0,0 +1,16 @@
SOURCE_FILE@0..25
EXTERN_CRATE@0..24
EXTERN_KW@0..6 "extern"
WHITESPACE@6..7 " "
CRATE_KW@7..12 "crate"
WHITESPACE@12..13 " "
NAME_REF@13..16
IDENT@13..16 "foo"
WHITESPACE@16..17 " "
RENAME@17..23
AS_KW@17..19 "as"
WHITESPACE@19..20 " "
NAME@20..23
IDENT@20..23 "bar"
SEMICOLON@23..24 ";"
WHITESPACE@24..25 "\n"

View File

@ -0,0 +1 @@
extern crate foo as bar;

View File

@ -0,0 +1,10 @@
SOURCE_FILE@0..19
EXTERN_CRATE@0..18
EXTERN_KW@0..6 "extern"
WHITESPACE@6..7 " "
CRATE_KW@7..12 "crate"
WHITESPACE@12..13 " "
NAME_REF@13..17
SELF_KW@13..17 "self"
SEMICOLON@17..18 ";"
WHITESPACE@18..19 "\n"

View File

@ -0,0 +1 @@
extern crate self;

View File

@ -0,0 +1,8 @@
SOURCE_FILE@0..7
MODULE@0..6
MOD_KW@0..3 "mod"
WHITESPACE@3..4 " "
NAME@4..5
IDENT@4..5 "a"
SEMICOLON@5..6 ";"
WHITESPACE@6..7 "\n"

View File

@ -0,0 +1 @@
mod a;

View File

@ -0,0 +1,12 @@
SOURCE_FILE@0..10
MODULE@0..9
MOD_KW@0..3 "mod"
WHITESPACE@3..4 " "
NAME@4..5
IDENT@4..5 "b"
WHITESPACE@5..6 " "
ITEM_LIST@6..9
L_CURLY@6..7 "{"
WHITESPACE@7..8 " "
R_CURLY@8..9 "}"
WHITESPACE@9..10 "\n"

View File

@ -0,0 +1 @@
mod b { }

View File

@ -0,0 +1,25 @@
SOURCE_FILE@0..25
STRUCT@0..24
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "S"
TUPLE_FIELD_LIST@8..23
L_PAREN@8..9 "("
TUPLE_FIELD@9..15
PATH_TYPE@9..15
PATH@9..15
PATH_SEGMENT@9..15
NAME_REF@9..15
IDENT@9..15 "String"
COMMA@15..16 ","
WHITESPACE@16..17 " "
TUPLE_FIELD@17..22
PATH_TYPE@17..22
PATH@17..22
PATH_SEGMENT@17..22
NAME_REF@17..22
IDENT@17..22 "usize"
R_PAREN@22..23 ")"
SEMICOLON@23..24 ";"
WHITESPACE@24..25 "\n"

View File

@ -0,0 +1 @@
struct S(String, usize);

View File

@ -0,0 +1,11 @@
SOURCE_FILE@0..12
STRUCT@0..11
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "S"
WHITESPACE@8..9 " "
RECORD_FIELD_LIST@9..11
L_CURLY@9..10 "{"
R_CURLY@10..11 "}"
WHITESPACE@11..12 "\n"

View File

@ -0,0 +1 @@
struct S {}

View File

@ -0,0 +1,35 @@
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..27
L_CURLY@9..10 "{"
WHITESPACE@10..11 " "
RECORD_FIELD@11..17
NAME@11..12
IDENT@11..12 "a"
COLON@12..13 ":"
WHITESPACE@13..14 " "
PATH_TYPE@14..17
PATH@14..17
PATH_SEGMENT@14..17
NAME_REF@14..17
IDENT@14..17 "i32"
COMMA@17..18 ","
WHITESPACE@18..19 " "
RECORD_FIELD@19..25
NAME@19..20
IDENT@19..20 "b"
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"

View File

@ -0,0 +1 @@
struct S { a: i32, b: f32 }

View File

@ -0,0 +1,27 @@
SOURCE_FILE@0..29
MACRO_DEF@0..28
MACRO_KW@0..5 "macro"
WHITESPACE@5..6 " "
NAME@6..7
IDENT@6..7 "m"
WHITESPACE@7..8 " "
TOKEN_TREE@8..28
L_CURLY@8..9 "{"
WHITESPACE@9..10 " "
TOKEN_TREE@10..20
L_PAREN@10..11 "("
DOLLAR@11..12 "$"
IDENT@12..13 "i"
COLON@13..14 ":"
IDENT@14..19 "ident"
R_PAREN@19..20 ")"
WHITESPACE@20..21 " "
EQ@21..22 "="
R_ANGLE@22..23 ">"
WHITESPACE@23..24 " "
TOKEN_TREE@24..26
L_CURLY@24..25 "{"
R_CURLY@25..26 "}"
WHITESPACE@26..27 " "
R_CURLY@27..28 "}"
WHITESPACE@28..29 "\n"

View File

@ -0,0 +1 @@
macro m { ($i:ident) => {} }

View File

@ -0,0 +1,35 @@
SOURCE_FILE@0..28
STRUCT@0..27
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "U"
WHITESPACE@8..9 " "
RECORD_FIELD_LIST@9..27
L_CURLY@9..10 "{"
WHITESPACE@10..11 " "
RECORD_FIELD@11..17
NAME@11..12
IDENT@11..12 "i"
COLON@12..13 ":"
WHITESPACE@13..14 " "
PATH_TYPE@14..17
PATH@14..17
PATH_SEGMENT@14..17
NAME_REF@14..17
IDENT@14..17 "i32"
COMMA@17..18 ","
WHITESPACE@18..19 " "
RECORD_FIELD@19..25
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"

View File

@ -0,0 +1 @@
struct U { i: i32, f: f32 }

View File

@ -0,0 +1,8 @@
SOURCE_FILE@0..10
STRUCT@0..9
STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " "
NAME@7..8
IDENT@7..8 "S"
SEMICOLON@8..9 ";"
WHITESPACE@9..10 "\n"

View File

@ -0,0 +1 @@
struct S;

View File

@ -1,93 +1,76 @@
SOURCE_FILE@0..118
MODULE@0..6
SOURCE_FILE@0..100
MODULE@0..46
MOD_KW@0..3 "mod"
WHITESPACE@3..4 " "
NAME@4..5
IDENT@4..5 "a"
SEMICOLON@5..6 ";"
WHITESPACE@6..8 "\n\n"
MODULE@8..17
MOD_KW@8..11 "mod"
WHITESPACE@11..12 " "
NAME@12..13
IDENT@12..13 "b"
WHITESPACE@13..14 " "
ITEM_LIST@14..17
L_CURLY@14..15 "{"
WHITESPACE@15..16 "\n"
R_CURLY@16..17 "}"
WHITESPACE@17..19 "\n\n"
MODULE@19..65
MOD_KW@19..22 "mod"
WHITESPACE@22..23 " "
NAME@23..24
IDENT@23..24 "c"
WHITESPACE@24..25 " "
ITEM_LIST@25..65
L_CURLY@25..26 "{"
WHITESPACE@26..31 "\n "
FN@31..47
FN_KW@31..33 "fn"
WHITESPACE@33..34 " "
NAME@34..37
IDENT@34..37 "foo"
PARAM_LIST@37..39
L_PAREN@37..38 "("
R_PAREN@38..39 ")"
IDENT@4..5 "c"
WHITESPACE@5..6 " "
ITEM_LIST@6..46
L_CURLY@6..7 "{"
WHITESPACE@7..12 "\n "
FN@12..28
FN_KW@12..14 "fn"
WHITESPACE@14..15 " "
NAME@15..18
IDENT@15..18 "foo"
PARAM_LIST@18..20
L_PAREN@18..19 "("
R_PAREN@19..20 ")"
WHITESPACE@20..21 " "
BLOCK_EXPR@21..28
L_CURLY@21..22 "{"
WHITESPACE@22..27 "\n "
R_CURLY@27..28 "}"
WHITESPACE@28..33 "\n "
STRUCT@33..44
STRUCT_KW@33..39 "struct"
WHITESPACE@39..40 " "
BLOCK_EXPR@40..47
L_CURLY@40..41 "{"
WHITESPACE@41..46 "\n "
R_CURLY@46..47 "}"
WHITESPACE@47..52 "\n "
STRUCT@52..63
STRUCT_KW@52..58 "struct"
WHITESPACE@58..59 " "
NAME@59..60
IDENT@59..60 "S"
WHITESPACE@60..61 " "
RECORD_FIELD_LIST@61..63
L_CURLY@61..62 "{"
R_CURLY@62..63 "}"
WHITESPACE@63..64 "\n"
R_CURLY@64..65 "}"
WHITESPACE@65..67 "\n\n"
MODULE@67..118
MOD_KW@67..70 "mod"
WHITESPACE@70..71 " "
NAME@71..72
IDENT@71..72 "d"
WHITESPACE@72..73 " "
ITEM_LIST@73..118
L_CURLY@73..74 "{"
WHITESPACE@74..79 "\n "
ATTR@79..87
POUND@79..80 "#"
BANG@80..81 "!"
L_BRACK@81..82 "["
META@82..86
PATH@82..86
PATH_SEGMENT@82..86
NAME_REF@82..86
IDENT@82..86 "attr"
R_BRACK@86..87 "]"
WHITESPACE@87..92 "\n "
MODULE@92..98
MOD_KW@92..95 "mod"
WHITESPACE@95..96 " "
NAME@96..97
IDENT@96..97 "e"
SEMICOLON@97..98 ";"
WHITESPACE@98..103 "\n "
MODULE@103..116
MOD_KW@103..106 "mod"
WHITESPACE@106..107 " "
NAME@107..108
IDENT@107..108 "f"
WHITESPACE@108..109 " "
ITEM_LIST@109..116
L_CURLY@109..110 "{"
WHITESPACE@110..115 "\n "
R_CURLY@115..116 "}"
WHITESPACE@116..117 "\n"
R_CURLY@117..118 "}"
NAME@40..41
IDENT@40..41 "S"
WHITESPACE@41..42 " "
RECORD_FIELD_LIST@42..44
L_CURLY@42..43 "{"
R_CURLY@43..44 "}"
WHITESPACE@44..45 "\n"
R_CURLY@45..46 "}"
WHITESPACE@46..48 "\n\n"
MODULE@48..99
MOD_KW@48..51 "mod"
WHITESPACE@51..52 " "
NAME@52..53
IDENT@52..53 "d"
WHITESPACE@53..54 " "
ITEM_LIST@54..99
L_CURLY@54..55 "{"
WHITESPACE@55..60 "\n "
ATTR@60..68
POUND@60..61 "#"
BANG@61..62 "!"
L_BRACK@62..63 "["
META@63..67
PATH@63..67
PATH_SEGMENT@63..67
NAME_REF@63..67
IDENT@63..67 "attr"
R_BRACK@67..68 "]"
WHITESPACE@68..73 "\n "
MODULE@73..79
MOD_KW@73..76 "mod"
WHITESPACE@76..77 " "
NAME@77..78
IDENT@77..78 "e"
SEMICOLON@78..79 ";"
WHITESPACE@79..84 "\n "
MODULE@84..97
MOD_KW@84..87 "mod"
WHITESPACE@87..88 " "
NAME@88..89
IDENT@88..89 "f"
WHITESPACE@89..90 " "
ITEM_LIST@90..97
L_CURLY@90..91 "{"
WHITESPACE@91..96 "\n "
R_CURLY@96..97 "}"
WHITESPACE@97..98 "\n"
R_CURLY@98..99 "}"
WHITESPACE@99..100 "\n"

View File

@ -1,8 +1,3 @@
mod a;
mod b {
}
mod c {
fn foo() {
}
@ -14,4 +9,4 @@ mod d {
mod e;
mod f {
}
}
}

View File

@ -1,4 +1,4 @@
SOURCE_FILE@0..98
SOURCE_FILE@0..122
FN@0..9
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
@ -28,81 +28,101 @@ SOURCE_FILE@0..98
L_CURLY@21..22 "{"
R_CURLY@22..23 "}"
WHITESPACE@23..24 "\n"
FN@24..44
VISIBILITY@24..34
MACRO_DEF@24..47
VISIBILITY@24..27
PUB_KW@24..27 "pub"
L_PAREN@27..28 "("
PATH@28..33
PATH_SEGMENT@28..33
NAME_REF@28..33
CRATE_KW@28..33 "crate"
R_PAREN@33..34 ")"
WHITESPACE@34..35 " "
FN_KW@35..37 "fn"
WHITESPACE@37..38 " "
NAME@38..39
IDENT@38..39 "c"
PARAM_LIST@39..41
L_PAREN@39..40 "("
R_PAREN@40..41 ")"
WHITESPACE@41..42 " "
BLOCK_EXPR@42..44
L_CURLY@42..43 "{"
R_CURLY@43..44 "}"
WHITESPACE@44..45 "\n"
FN@45..65
VISIBILITY@45..55
PUB_KW@45..48 "pub"
L_PAREN@48..49 "("
PATH@49..54
PATH_SEGMENT@49..54
NAME_REF@49..54
SUPER_KW@49..54 "super"
R_PAREN@54..55 ")"
WHITESPACE@55..56 " "
FN_KW@56..58 "fn"
WHITESPACE@27..28 " "
MACRO_KW@28..33 "macro"
WHITESPACE@33..34 " "
NAME@34..35
IDENT@34..35 "m"
TOKEN_TREE@35..47
TOKEN_TREE@35..44
L_PAREN@35..36 "("
DOLLAR@36..37 "$"
COLON@37..38 ":"
IDENT@38..43 "ident"
R_PAREN@43..44 ")"
WHITESPACE@44..45 " "
TOKEN_TREE@45..47
L_CURLY@45..46 "{"
R_CURLY@46..47 "}"
WHITESPACE@47..48 "\n"
FN@48..68
VISIBILITY@48..58
PUB_KW@48..51 "pub"
L_PAREN@51..52 "("
PATH@52..57
PATH_SEGMENT@52..57
NAME_REF@52..57
CRATE_KW@52..57 "crate"
R_PAREN@57..58 ")"
WHITESPACE@58..59 " "
NAME@59..60
IDENT@59..60 "d"
PARAM_LIST@60..62
L_PAREN@60..61 "("
R_PAREN@61..62 ")"
WHITESPACE@62..63 " "
BLOCK_EXPR@63..65
L_CURLY@63..64 "{"
R_CURLY@64..65 "}"
WHITESPACE@65..66 "\n"
FN@66..97
VISIBILITY@66..87
PUB_KW@66..69 "pub"
L_PAREN@69..70 "("
IN_KW@70..72 "in"
WHITESPACE@72..73 " "
PATH@73..86
PATH@73..81
PATH@73..76
PATH_SEGMENT@73..76
NAME_REF@73..76
IDENT@73..76 "foo"
COLON2@76..78 "::"
PATH_SEGMENT@78..81
NAME_REF@78..81
IDENT@78..81 "bar"
COLON2@81..83 "::"
PATH_SEGMENT@83..86
NAME_REF@83..86
IDENT@83..86 "baz"
R_PAREN@86..87 ")"
WHITESPACE@87..88 " "
FN_KW@88..90 "fn"
WHITESPACE@90..91 " "
NAME@91..92
IDENT@91..92 "e"
PARAM_LIST@92..94
L_PAREN@92..93 "("
R_PAREN@93..94 ")"
WHITESPACE@94..95 " "
BLOCK_EXPR@95..97
L_CURLY@95..96 "{"
R_CURLY@96..97 "}"
WHITESPACE@97..98 "\n"
FN_KW@59..61 "fn"
WHITESPACE@61..62 " "
NAME@62..63
IDENT@62..63 "c"
PARAM_LIST@63..65
L_PAREN@63..64 "("
R_PAREN@64..65 ")"
WHITESPACE@65..66 " "
BLOCK_EXPR@66..68
L_CURLY@66..67 "{"
R_CURLY@67..68 "}"
WHITESPACE@68..69 "\n"
FN@69..89
VISIBILITY@69..79
PUB_KW@69..72 "pub"
L_PAREN@72..73 "("
PATH@73..78
PATH_SEGMENT@73..78
NAME_REF@73..78
SUPER_KW@73..78 "super"
R_PAREN@78..79 ")"
WHITESPACE@79..80 " "
FN_KW@80..82 "fn"
WHITESPACE@82..83 " "
NAME@83..84
IDENT@83..84 "d"
PARAM_LIST@84..86
L_PAREN@84..85 "("
R_PAREN@85..86 ")"
WHITESPACE@86..87 " "
BLOCK_EXPR@87..89
L_CURLY@87..88 "{"
R_CURLY@88..89 "}"
WHITESPACE@89..90 "\n"
FN@90..121
VISIBILITY@90..111
PUB_KW@90..93 "pub"
L_PAREN@93..94 "("
IN_KW@94..96 "in"
WHITESPACE@96..97 " "
PATH@97..110
PATH@97..105
PATH@97..100
PATH_SEGMENT@97..100
NAME_REF@97..100
IDENT@97..100 "foo"
COLON2@100..102 "::"
PATH_SEGMENT@102..105
NAME_REF@102..105
IDENT@102..105 "bar"
COLON2@105..107 "::"
PATH_SEGMENT@107..110
NAME_REF@107..110
IDENT@107..110 "baz"
R_PAREN@110..111 ")"
WHITESPACE@111..112 " "
FN_KW@112..114 "fn"
WHITESPACE@114..115 " "
NAME@115..116
IDENT@115..116 "e"
PARAM_LIST@116..118
L_PAREN@116..117 "("
R_PAREN@117..118 ")"
WHITESPACE@118..119 " "
BLOCK_EXPR@119..121
L_CURLY@119..120 "{"
R_CURLY@120..121 "}"
WHITESPACE@121..122 "\n"

View File

@ -1,5 +1,6 @@
fn a() {}
pub fn b() {}
pub macro m($:ident) {}
pub(crate) fn c() {}
pub(super) fn d() {}
pub(in foo::bar::baz) fn e() {}