From af9fd37cd9a003cc26c07abdbd82473d501f95f1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 15:22:49 +0300 Subject: [PATCH 1/5] internal: minimize use_tree parser tests The code here is intentionally dense and does exactly what is written. Explaining semantic difference between Rust 2015 and 2018 doesn't help with understanding syntax. Better to just add more targeted tests. --- crates/parser/src/grammar/items/use_item.rs | 93 +++------- .../parser/inline/ok/0002_use_tree_list.rast | 160 +++--------------- .../parser/inline/ok/0002_use_tree_list.rs | 5 +- .../parser/inline/ok/0020_use_star.rast | 59 ------- .../parser/inline/ok/0020_use_star.rs | 4 - .../parser/inline/ok/0043_use_alias.rast | 138 --------------- .../parser/inline/ok/0043_use_alias.rs | 8 - .../ok/0069_use_tree_list_after_path.rast | 39 ----- .../ok/0069_use_tree_list_after_path.rs | 2 - .../parser/inline/ok/0110_use_path.rast | 108 ------------ .../parser/inline/ok/0110_use_path.rs | 8 - .../parser/inline/ok/0174_use_tree_star.rast | 24 +++ .../parser/inline/ok/0174_use_tree_star.rs | 2 + .../parser/inline/ok/0176_use_tree_alias.rast | 32 ++++ .../parser/inline/ok/0176_use_tree_alias.rs | 2 + .../parser/inline/ok/0177_use_tree.rast | 30 ++++ .../parser/inline/ok/0177_use_tree.rs | 1 + .../parser/inline/ok/0177_use_tree_path.rast | 72 ++++++++ .../parser/inline/ok/0177_use_tree_path.rs | 6 + .../ok/0178_use_tree_path_use_tree.rast | 20 +++ .../inline/ok/0178_use_tree_path_use_tree.rs | 1 + .../inline/ok/0179_use_tree_abs_star.rast | 26 +++ .../inline/ok/0179_use_tree_abs_star.rs | 2 + .../inline/ok/0180_use_tree_path_star.rast | 13 ++ .../inline/ok/0180_use_tree_path_star.rs | 1 + .../parser/inline/ok/0181_use_item.rast | 16 ++ .../parser/inline/ok/0181_use_item.rs | 1 + 27 files changed, 304 insertions(+), 569 deletions(-) delete mode 100644 crates/syntax/test_data/parser/inline/ok/0020_use_star.rast delete mode 100644 crates/syntax/test_data/parser/inline/ok/0020_use_star.rs delete mode 100644 crates/syntax/test_data/parser/inline/ok/0043_use_alias.rast delete mode 100644 crates/syntax/test_data/parser/inline/ok/0043_use_alias.rs delete mode 100644 crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rast delete mode 100644 crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rs delete mode 100644 crates/syntax/test_data/parser/inline/ok/0110_use_path.rast delete mode 100644 crates/syntax/test_data/parser/inline/ok/0110_use_path.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0177_use_tree.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0177_use_tree.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0181_use_item.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0181_use_item.rs diff --git a/crates/parser/src/grammar/items/use_item.rs b/crates/parser/src/grammar/items/use_item.rs index 2339d0c69cc3..ffb147b1fd2a 100644 --- a/crates/parser/src/grammar/items/use_item.rs +++ b/crates/parser/src/grammar/items/use_item.rs @@ -1,99 +1,60 @@ use super::*; +// test use_item +// use std::collections; pub(super) fn use_(p: &mut Parser, m: Marker) { - assert!(p.at(T![use])); p.bump(T![use]); use_tree(p, true); p.expect(T![;]); m.complete(p, USE); } -/// Parse a use 'tree', such as `some::path` in `use some::path;` -/// Note that this is called both by `use_item` and `use_tree_list`, -/// so handles both `some::path::{inner::path}` and `inner::path` in -/// `use some::path::{inner::path};` +// test use_tree +// use outer::tree::{inner::tree}; fn use_tree(p: &mut Parser, top_level: bool) { let m = p.start(); match p.current() { - // Finish the use_tree for cases of e.g. - // `use some::path::{self, *};` or `use *;` - // This does not handle cases such as `use some::path::*` - // N.B. in Rust 2015 `use *;` imports all from crate root - // however in Rust 2018 `use *;` errors: ('cannot glob-import all possible crates') - // FIXME: Add this error (if not out of scope) - - // test use_star + // test use_tree_star // use *; - // use ::*; - // use some::path::{*}; - // use some::path::{::*}; + // use std::{*}; T![*] => p.bump(T![*]), + // test use_tree_abs_star + // use ::*; + // use std::{::*}; T![:] if p.at(T![::]) && p.nth(2) == T![*] => { - // Parse `use ::*;`, which imports all from the crate root in Rust 2015 - // This is invalid inside a use_tree_list, (e.g. `use some::path::{::*}`) - // but still parses and errors later: ('crate root in paths can only be used in start position') - // FIXME: Add this error (if not out of scope) - // In Rust 2018, it is always invalid (see above) p.bump(T![::]); p.bump(T![*]); } - // Open a use tree list - // Handles cases such as `use {some::path};` or `{inner::path}` in - // `use some::path::{{inner::path}, other::path}` - - // test use_tree_list - // use {crate::path::from::root, or::path::from::crate_name}; // Rust 2018 (with a crate named `or`) - // use {path::from::root}; // Rust 2015 - // use ::{some::arbitrary::path}; // Rust 2015 - // use ::{{{root::export}}}; // Nonsensical but perfectly legal nesting - T!['{'] => { - use_tree_list(p); - } + T!['{'] => use_tree_list(p), T![:] if p.at(T![::]) && p.nth(2) == T!['{'] => { p.bump(T![::]); use_tree_list(p); } - // Parse a 'standard' path. - // Also handles aliases (e.g. `use something as something_else`) - // test use_path - // use ::crate_name; // Rust 2018 - All flavours - // use crate_name; // Rust 2018 - Anchored paths - // use item_in_scope_or_crate_name; // Rust 2018 - Uniform Paths + // test use_tree_path + // use ::std; + // use std::collections; // - // use self::module::Item; - // use crate::Item; - // use self::some::Struct; - // use crate_name::some_item; + // use self::m; + // use super::m; + // use crate::m; _ if paths::is_use_path_start(p) => { paths::use_path(p); match p.current() { - T![as] => { - // test use_alias - // use some::path as some_name; - // use some::{ - // other::path as some_other_name, - // different::path as different_name, - // yet::another::path, - // running::out::of::synonyms::for_::different::* - // }; - // use Trait as _; - opt_rename(p); - } + // test use_tree_alias + // use std as stdlib; + // use Trait as _; + T![as] => opt_rename(p), T![:] if p.at(T![::]) => { p.bump(T![::]); match p.current() { - T![*] => { - p.bump(T![*]); - } - // test use_tree_list_after_path - // use crate::{Item}; - // use self::{Item}; + // test use_tree_path_star + // use std::*; + T![*] => p.bump(T![*]), + // test use_tree_path_use_tree + // use std::{collections}; T!['{'] => use_tree_list(p), - _ => { - // is this unreachable? - p.error("expected `{` or `*`"); - } + _ => p.error("expected `{` or `*`"), } } _ => (), @@ -115,6 +76,8 @@ fn use_tree(p: &mut Parser, top_level: bool) { m.complete(p, USE_TREE); } +// test use_tree_list +// use {a, b, c}; pub(crate) fn use_tree_list(p: &mut Parser) { assert!(p.at(T!['{'])); let m = p.start(); diff --git a/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rast b/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rast index 970826739fd4..9bee074b7b25 100644 --- a/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rast +++ b/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rast @@ -1,137 +1,29 @@ -SOURCE_FILE@0..248 - USE@0..58 +SOURCE_FILE@0..15 + USE@0..14 USE_KW@0..3 "use" WHITESPACE@3..4 " " - USE_TREE@4..57 - USE_TREE_LIST@4..57 + USE_TREE@4..13 + USE_TREE_LIST@4..13 L_CURLY@4..5 "{" - USE_TREE@5..28 - PATH@5..28 - PATH@5..22 - PATH@5..16 - PATH@5..10 - PATH_SEGMENT@5..10 - NAME_REF@5..10 - CRATE_KW@5..10 "crate" - COLON2@10..12 "::" - PATH_SEGMENT@12..16 - NAME_REF@12..16 - IDENT@12..16 "path" - COLON2@16..18 "::" - PATH_SEGMENT@18..22 - NAME_REF@18..22 - IDENT@18..22 "from" - COLON2@22..24 "::" - PATH_SEGMENT@24..28 - NAME_REF@24..28 - IDENT@24..28 "root" - COMMA@28..29 "," - WHITESPACE@29..30 " " - USE_TREE@30..56 - PATH@30..56 - PATH@30..44 - PATH@30..38 - PATH@30..32 - PATH_SEGMENT@30..32 - NAME_REF@30..32 - IDENT@30..32 "or" - COLON2@32..34 "::" - PATH_SEGMENT@34..38 - NAME_REF@34..38 - IDENT@34..38 "path" - COLON2@38..40 "::" - PATH_SEGMENT@40..44 - NAME_REF@40..44 - IDENT@40..44 "from" - COLON2@44..46 "::" - PATH_SEGMENT@46..56 - NAME_REF@46..56 - IDENT@46..56 "crate_name" - R_CURLY@56..57 "}" - SEMICOLON@57..58 ";" - WHITESPACE@58..59 " " - USE@59..121 - COMMENT@59..97 "// Rust 2018 (with a ..." - WHITESPACE@97..98 "\n" - USE_KW@98..101 "use" - WHITESPACE@101..102 " " - USE_TREE@102..120 - USE_TREE_LIST@102..120 - L_CURLY@102..103 "{" - USE_TREE@103..119 - PATH@103..119 - PATH@103..113 - PATH@103..107 - PATH_SEGMENT@103..107 - NAME_REF@103..107 - IDENT@103..107 "path" - COLON2@107..109 "::" - PATH_SEGMENT@109..113 - NAME_REF@109..113 - IDENT@109..113 "from" - COLON2@113..115 "::" - PATH_SEGMENT@115..119 - NAME_REF@115..119 - IDENT@115..119 "root" - R_CURLY@119..120 "}" - SEMICOLON@120..121 ";" - WHITESPACE@121..122 " " - USE@122..165 - COMMENT@122..134 "// Rust 2015" - WHITESPACE@134..135 "\n" - USE_KW@135..138 "use" - WHITESPACE@138..139 " " - USE_TREE@139..164 - COLON2@139..141 "::" - USE_TREE_LIST@141..164 - L_CURLY@141..142 "{" - USE_TREE@142..163 - PATH@142..163 - PATH@142..157 - PATH@142..146 - PATH_SEGMENT@142..146 - NAME_REF@142..146 - IDENT@142..146 "some" - COLON2@146..148 "::" - PATH_SEGMENT@148..157 - NAME_REF@148..157 - IDENT@148..157 "arbitrary" - COLON2@157..159 "::" - PATH_SEGMENT@159..163 - NAME_REF@159..163 - IDENT@159..163 "path" - R_CURLY@163..164 "}" - SEMICOLON@164..165 ";" - WHITESPACE@165..166 " " - USE@166..204 - COMMENT@166..178 "// Rust 2015" - WHITESPACE@178..179 "\n" - USE_KW@179..182 "use" - WHITESPACE@182..183 " " - USE_TREE@183..203 - COLON2@183..185 "::" - USE_TREE_LIST@185..203 - L_CURLY@185..186 "{" - USE_TREE@186..202 - USE_TREE_LIST@186..202 - L_CURLY@186..187 "{" - USE_TREE@187..201 - USE_TREE_LIST@187..201 - L_CURLY@187..188 "{" - USE_TREE@188..200 - PATH@188..200 - PATH@188..192 - PATH_SEGMENT@188..192 - NAME_REF@188..192 - IDENT@188..192 "root" - COLON2@192..194 "::" - PATH_SEGMENT@194..200 - NAME_REF@194..200 - IDENT@194..200 "export" - R_CURLY@200..201 "}" - R_CURLY@201..202 "}" - R_CURLY@202..203 "}" - SEMICOLON@203..204 ";" - WHITESPACE@204..205 " " - COMMENT@205..247 "// Nonsensical but pe ..." - WHITESPACE@247..248 "\n" + USE_TREE@5..6 + PATH@5..6 + PATH_SEGMENT@5..6 + NAME_REF@5..6 + IDENT@5..6 "a" + COMMA@6..7 "," + WHITESPACE@7..8 " " + USE_TREE@8..9 + PATH@8..9 + PATH_SEGMENT@8..9 + NAME_REF@8..9 + IDENT@8..9 "b" + COMMA@9..10 "," + WHITESPACE@10..11 " " + USE_TREE@11..12 + PATH@11..12 + PATH_SEGMENT@11..12 + NAME_REF@11..12 + IDENT@11..12 "c" + R_CURLY@12..13 "}" + SEMICOLON@13..14 ";" + WHITESPACE@14..15 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rs b/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rs index 02af4b446e19..6fa175f54296 100644 --- a/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rs +++ b/crates/syntax/test_data/parser/inline/ok/0002_use_tree_list.rs @@ -1,4 +1 @@ -use {crate::path::from::root, or::path::from::crate_name}; // Rust 2018 (with a crate named `or`) -use {path::from::root}; // Rust 2015 -use ::{some::arbitrary::path}; // Rust 2015 -use ::{{{root::export}}}; // Nonsensical but perfectly legal nesting +use {a, b, c}; diff --git a/crates/syntax/test_data/parser/inline/ok/0020_use_star.rast b/crates/syntax/test_data/parser/inline/ok/0020_use_star.rast deleted file mode 100644 index b3623c4455de..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0020_use_star.rast +++ /dev/null @@ -1,59 +0,0 @@ -SOURCE_FILE@0..60 - USE@0..6 - USE_KW@0..3 "use" - WHITESPACE@3..4 " " - USE_TREE@4..5 - STAR@4..5 "*" - SEMICOLON@5..6 ";" - WHITESPACE@6..7 "\n" - USE@7..15 - USE_KW@7..10 "use" - WHITESPACE@10..11 " " - USE_TREE@11..14 - COLON2@11..13 "::" - STAR@13..14 "*" - SEMICOLON@14..15 ";" - WHITESPACE@15..16 "\n" - USE@16..36 - USE_KW@16..19 "use" - WHITESPACE@19..20 " " - USE_TREE@20..35 - PATH@20..30 - PATH@20..24 - PATH_SEGMENT@20..24 - NAME_REF@20..24 - IDENT@20..24 "some" - COLON2@24..26 "::" - PATH_SEGMENT@26..30 - NAME_REF@26..30 - IDENT@26..30 "path" - COLON2@30..32 "::" - USE_TREE_LIST@32..35 - L_CURLY@32..33 "{" - USE_TREE@33..34 - STAR@33..34 "*" - R_CURLY@34..35 "}" - SEMICOLON@35..36 ";" - WHITESPACE@36..37 "\n" - USE@37..59 - USE_KW@37..40 "use" - WHITESPACE@40..41 " " - USE_TREE@41..58 - PATH@41..51 - PATH@41..45 - PATH_SEGMENT@41..45 - NAME_REF@41..45 - IDENT@41..45 "some" - COLON2@45..47 "::" - PATH_SEGMENT@47..51 - NAME_REF@47..51 - IDENT@47..51 "path" - COLON2@51..53 "::" - USE_TREE_LIST@53..58 - L_CURLY@53..54 "{" - USE_TREE@54..57 - COLON2@54..56 "::" - STAR@56..57 "*" - R_CURLY@57..58 "}" - SEMICOLON@58..59 ";" - WHITESPACE@59..60 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0020_use_star.rs b/crates/syntax/test_data/parser/inline/ok/0020_use_star.rs deleted file mode 100644 index 6f15769a8c78..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0020_use_star.rs +++ /dev/null @@ -1,4 +0,0 @@ -use *; -use ::*; -use some::path::{*}; -use some::path::{::*}; diff --git a/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rast b/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rast deleted file mode 100644 index 60b517230e8b..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rast +++ /dev/null @@ -1,138 +0,0 @@ -SOURCE_FILE@0..198 - USE@0..28 - USE_KW@0..3 "use" - WHITESPACE@3..4 " " - USE_TREE@4..27 - PATH@4..14 - PATH@4..8 - PATH_SEGMENT@4..8 - NAME_REF@4..8 - IDENT@4..8 "some" - COLON2@8..10 "::" - PATH_SEGMENT@10..14 - NAME_REF@10..14 - IDENT@10..14 "path" - WHITESPACE@14..15 " " - RENAME@15..27 - AS_KW@15..17 "as" - WHITESPACE@17..18 " " - NAME@18..27 - IDENT@18..27 "some_name" - SEMICOLON@27..28 ";" - WHITESPACE@28..29 "\n" - USE@29..181 - USE_KW@29..32 "use" - WHITESPACE@32..33 " " - USE_TREE@33..180 - PATH@33..37 - PATH_SEGMENT@33..37 - NAME_REF@33..37 - IDENT@33..37 "some" - COLON2@37..39 "::" - USE_TREE_LIST@39..180 - L_CURLY@39..40 "{" - WHITESPACE@40..42 "\n " - USE_TREE@42..72 - PATH@42..53 - PATH@42..47 - PATH_SEGMENT@42..47 - NAME_REF@42..47 - IDENT@42..47 "other" - COLON2@47..49 "::" - PATH_SEGMENT@49..53 - NAME_REF@49..53 - IDENT@49..53 "path" - WHITESPACE@53..54 " " - RENAME@54..72 - AS_KW@54..56 "as" - WHITESPACE@56..57 " " - NAME@57..72 - IDENT@57..72 "some_other_name" - COMMA@72..73 "," - WHITESPACE@73..75 "\n " - USE_TREE@75..108 - PATH@75..90 - PATH@75..84 - PATH_SEGMENT@75..84 - NAME_REF@75..84 - IDENT@75..84 "different" - COLON2@84..86 "::" - PATH_SEGMENT@86..90 - NAME_REF@86..90 - IDENT@86..90 "path" - WHITESPACE@90..91 " " - RENAME@91..108 - AS_KW@91..93 "as" - WHITESPACE@93..94 " " - NAME@94..108 - IDENT@94..108 "different_name" - COMMA@108..109 "," - WHITESPACE@109..111 "\n " - USE_TREE@111..129 - PATH@111..129 - PATH@111..123 - PATH@111..114 - PATH_SEGMENT@111..114 - NAME_REF@111..114 - IDENT@111..114 "yet" - COLON2@114..116 "::" - PATH_SEGMENT@116..123 - NAME_REF@116..123 - IDENT@116..123 "another" - COLON2@123..125 "::" - PATH_SEGMENT@125..129 - NAME_REF@125..129 - IDENT@125..129 "path" - COMMA@129..130 "," - WHITESPACE@130..132 "\n " - USE_TREE@132..178 - PATH@132..175 - PATH@132..164 - PATH@132..158 - PATH@132..148 - PATH@132..144 - PATH@132..139 - PATH_SEGMENT@132..139 - NAME_REF@132..139 - IDENT@132..139 "running" - COLON2@139..141 "::" - PATH_SEGMENT@141..144 - NAME_REF@141..144 - IDENT@141..144 "out" - COLON2@144..146 "::" - PATH_SEGMENT@146..148 - NAME_REF@146..148 - IDENT@146..148 "of" - COLON2@148..150 "::" - PATH_SEGMENT@150..158 - NAME_REF@150..158 - IDENT@150..158 "synonyms" - COLON2@158..160 "::" - PATH_SEGMENT@160..164 - NAME_REF@160..164 - IDENT@160..164 "for_" - COLON2@164..166 "::" - PATH_SEGMENT@166..175 - NAME_REF@166..175 - IDENT@166..175 "different" - COLON2@175..177 "::" - STAR@177..178 "*" - WHITESPACE@178..179 "\n" - R_CURLY@179..180 "}" - SEMICOLON@180..181 ";" - WHITESPACE@181..182 "\n" - USE@182..197 - USE_KW@182..185 "use" - WHITESPACE@185..186 " " - USE_TREE@186..196 - PATH@186..191 - PATH_SEGMENT@186..191 - NAME_REF@186..191 - IDENT@186..191 "Trait" - WHITESPACE@191..192 " " - RENAME@192..196 - AS_KW@192..194 "as" - WHITESPACE@194..195 " " - UNDERSCORE@195..196 "_" - SEMICOLON@196..197 ";" - WHITESPACE@197..198 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rs b/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rs deleted file mode 100644 index 9be50f87708d..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0043_use_alias.rs +++ /dev/null @@ -1,8 +0,0 @@ -use some::path as some_name; -use some::{ - other::path as some_other_name, - different::path as different_name, - yet::another::path, - running::out::of::synonyms::for_::different::* -}; -use Trait as _; diff --git a/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rast b/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rast deleted file mode 100644 index 192a9cca6874..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rast +++ /dev/null @@ -1,39 +0,0 @@ -SOURCE_FILE@0..37 - USE@0..18 - USE_KW@0..3 "use" - WHITESPACE@3..4 " " - USE_TREE@4..17 - PATH@4..9 - PATH_SEGMENT@4..9 - NAME_REF@4..9 - CRATE_KW@4..9 "crate" - COLON2@9..11 "::" - USE_TREE_LIST@11..17 - L_CURLY@11..12 "{" - USE_TREE@12..16 - PATH@12..16 - PATH_SEGMENT@12..16 - NAME_REF@12..16 - IDENT@12..16 "Item" - R_CURLY@16..17 "}" - SEMICOLON@17..18 ";" - WHITESPACE@18..19 "\n" - USE@19..36 - USE_KW@19..22 "use" - WHITESPACE@22..23 " " - USE_TREE@23..35 - PATH@23..27 - PATH_SEGMENT@23..27 - NAME_REF@23..27 - SELF_KW@23..27 "self" - COLON2@27..29 "::" - USE_TREE_LIST@29..35 - L_CURLY@29..30 "{" - USE_TREE@30..34 - PATH@30..34 - PATH_SEGMENT@30..34 - NAME_REF@30..34 - IDENT@30..34 "Item" - R_CURLY@34..35 "}" - SEMICOLON@35..36 ";" - WHITESPACE@36..37 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rs b/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rs deleted file mode 100644 index c0a3d634e571..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0069_use_tree_list_after_path.rs +++ /dev/null @@ -1,2 +0,0 @@ -use crate::{Item}; -use self::{Item}; diff --git a/crates/syntax/test_data/parser/inline/ok/0110_use_path.rast b/crates/syntax/test_data/parser/inline/ok/0110_use_path.rast deleted file mode 100644 index ac51eb91d20a..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0110_use_path.rast +++ /dev/null @@ -1,108 +0,0 @@ -SOURCE_FILE@0..247 - USE@0..17 - USE_KW@0..3 "use" - WHITESPACE@3..4 " " - USE_TREE@4..16 - PATH@4..16 - PATH_SEGMENT@4..16 - COLON2@4..6 "::" - NAME_REF@6..16 - IDENT@6..16 "crate_name" - SEMICOLON@16..17 ";" - WHITESPACE@17..18 " " - USE@18..61 - COMMENT@18..45 "// Rust 2018 - All fl ..." - WHITESPACE@45..46 "\n" - USE_KW@46..49 "use" - WHITESPACE@49..50 " " - USE_TREE@50..60 - PATH@50..60 - PATH_SEGMENT@50..60 - NAME_REF@50..60 - IDENT@50..60 "crate_name" - SEMICOLON@60..61 ";" - WHITESPACE@61..62 " " - USE@62..124 - COMMENT@62..91 "// Rust 2018 - Anchor ..." - WHITESPACE@91..92 "\n" - USE_KW@92..95 "use" - WHITESPACE@95..96 " " - USE_TREE@96..123 - PATH@96..123 - PATH_SEGMENT@96..123 - NAME_REF@96..123 - IDENT@96..123 "item_in_scope_or_crat ..." - SEMICOLON@123..124 ";" - WHITESPACE@124..125 " " - COMMENT@125..153 "// Rust 2018 - Unifor ..." - WHITESPACE@153..155 "\n\n" - USE@155..178 - USE_KW@155..158 "use" - WHITESPACE@158..159 " " - USE_TREE@159..177 - PATH@159..177 - PATH@159..171 - PATH@159..163 - PATH_SEGMENT@159..163 - NAME_REF@159..163 - SELF_KW@159..163 "self" - COLON2@163..165 "::" - PATH_SEGMENT@165..171 - NAME_REF@165..171 - IDENT@165..171 "module" - COLON2@171..173 "::" - PATH_SEGMENT@173..177 - NAME_REF@173..177 - IDENT@173..177 "Item" - SEMICOLON@177..178 ";" - WHITESPACE@178..179 "\n" - USE@179..195 - USE_KW@179..182 "use" - WHITESPACE@182..183 " " - USE_TREE@183..194 - PATH@183..194 - PATH@183..188 - PATH_SEGMENT@183..188 - NAME_REF@183..188 - CRATE_KW@183..188 "crate" - COLON2@188..190 "::" - PATH_SEGMENT@190..194 - NAME_REF@190..194 - IDENT@190..194 "Item" - SEMICOLON@194..195 ";" - WHITESPACE@195..196 "\n" - USE@196..219 - USE_KW@196..199 "use" - WHITESPACE@199..200 " " - USE_TREE@200..218 - PATH@200..218 - PATH@200..210 - PATH@200..204 - PATH_SEGMENT@200..204 - NAME_REF@200..204 - SELF_KW@200..204 "self" - COLON2@204..206 "::" - PATH_SEGMENT@206..210 - NAME_REF@206..210 - IDENT@206..210 "some" - COLON2@210..212 "::" - PATH_SEGMENT@212..218 - NAME_REF@212..218 - IDENT@212..218 "Struct" - SEMICOLON@218..219 ";" - WHITESPACE@219..220 "\n" - USE@220..246 - USE_KW@220..223 "use" - WHITESPACE@223..224 " " - USE_TREE@224..245 - PATH@224..245 - PATH@224..234 - PATH_SEGMENT@224..234 - NAME_REF@224..234 - IDENT@224..234 "crate_name" - COLON2@234..236 "::" - PATH_SEGMENT@236..245 - NAME_REF@236..245 - IDENT@236..245 "some_item" - SEMICOLON@245..246 ";" - WHITESPACE@246..247 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0110_use_path.rs b/crates/syntax/test_data/parser/inline/ok/0110_use_path.rs deleted file mode 100644 index 1e436a6bc2b4..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0110_use_path.rs +++ /dev/null @@ -1,8 +0,0 @@ -use ::crate_name; // Rust 2018 - All flavours -use crate_name; // Rust 2018 - Anchored paths -use item_in_scope_or_crate_name; // Rust 2018 - Uniform Paths - -use self::module::Item; -use crate::Item; -use self::some::Struct; -use crate_name::some_item; diff --git a/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rast b/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rast new file mode 100644 index 000000000000..b9c6a3bed8c2 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rast @@ -0,0 +1,24 @@ +SOURCE_FILE@0..21 + USE@0..6 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..5 + STAR@4..5 "*" + SEMICOLON@5..6 ";" + WHITESPACE@6..7 "\n" + USE@7..20 + USE_KW@7..10 "use" + WHITESPACE@10..11 " " + USE_TREE@11..19 + PATH@11..14 + PATH_SEGMENT@11..14 + NAME_REF@11..14 + IDENT@11..14 "std" + COLON2@14..16 "::" + USE_TREE_LIST@16..19 + L_CURLY@16..17 "{" + USE_TREE@17..18 + STAR@17..18 "*" + R_CURLY@18..19 "}" + SEMICOLON@19..20 ";" + WHITESPACE@20..21 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rs b/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rs new file mode 100644 index 000000000000..b8c613440d50 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0174_use_tree_star.rs @@ -0,0 +1,2 @@ +use *; +use std::{*}; diff --git a/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rast b/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rast new file mode 100644 index 000000000000..210ff1f9816e --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rast @@ -0,0 +1,32 @@ +SOURCE_FILE@0..35 + USE@0..18 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..17 + PATH@4..7 + PATH_SEGMENT@4..7 + NAME_REF@4..7 + IDENT@4..7 "std" + WHITESPACE@7..8 " " + RENAME@8..17 + AS_KW@8..10 "as" + WHITESPACE@10..11 " " + NAME@11..17 + IDENT@11..17 "stdlib" + SEMICOLON@17..18 ";" + WHITESPACE@18..19 "\n" + USE@19..34 + USE_KW@19..22 "use" + WHITESPACE@22..23 " " + USE_TREE@23..33 + PATH@23..28 + PATH_SEGMENT@23..28 + NAME_REF@23..28 + IDENT@23..28 "Trait" + WHITESPACE@28..29 " " + RENAME@29..33 + AS_KW@29..31 "as" + WHITESPACE@31..32 " " + UNDERSCORE@32..33 "_" + SEMICOLON@33..34 ";" + WHITESPACE@34..35 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rs b/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rs new file mode 100644 index 000000000000..19a6906a2684 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0176_use_tree_alias.rs @@ -0,0 +1,2 @@ +use std as stdlib; +use Trait as _; diff --git a/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rast b/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rast new file mode 100644 index 000000000000..978d2963e84a --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rast @@ -0,0 +1,30 @@ +SOURCE_FILE@0..32 + USE@0..31 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..30 + PATH@4..15 + PATH@4..9 + PATH_SEGMENT@4..9 + NAME_REF@4..9 + IDENT@4..9 "outer" + COLON2@9..11 "::" + PATH_SEGMENT@11..15 + NAME_REF@11..15 + IDENT@11..15 "tree" + COLON2@15..17 "::" + USE_TREE_LIST@17..30 + L_CURLY@17..18 "{" + USE_TREE@18..29 + PATH@18..29 + PATH@18..23 + PATH_SEGMENT@18..23 + NAME_REF@18..23 + IDENT@18..23 "inner" + COLON2@23..25 "::" + PATH_SEGMENT@25..29 + NAME_REF@25..29 + IDENT@25..29 "tree" + R_CURLY@29..30 "}" + SEMICOLON@30..31 ";" + WHITESPACE@31..32 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rs b/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rs new file mode 100644 index 000000000000..3cc39434820b --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0177_use_tree.rs @@ -0,0 +1 @@ +use outer::tree::{inner::tree}; diff --git a/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rast b/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rast new file mode 100644 index 000000000000..24086b5a1df4 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rast @@ -0,0 +1,72 @@ +SOURCE_FILE@0..75 + USE@0..10 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..9 + PATH@4..9 + PATH_SEGMENT@4..9 + COLON2@4..6 "::" + NAME_REF@6..9 + IDENT@6..9 "std" + SEMICOLON@9..10 ";" + WHITESPACE@10..11 "\n" + USE@11..32 + USE_KW@11..14 "use" + WHITESPACE@14..15 " " + USE_TREE@15..31 + PATH@15..31 + PATH@15..18 + PATH_SEGMENT@15..18 + NAME_REF@15..18 + IDENT@15..18 "std" + COLON2@18..20 "::" + PATH_SEGMENT@20..31 + NAME_REF@20..31 + IDENT@20..31 "collections" + SEMICOLON@31..32 ";" + WHITESPACE@32..34 "\n\n" + USE@34..46 + USE_KW@34..37 "use" + WHITESPACE@37..38 " " + USE_TREE@38..45 + PATH@38..45 + PATH@38..42 + PATH_SEGMENT@38..42 + NAME_REF@38..42 + SELF_KW@38..42 "self" + COLON2@42..44 "::" + PATH_SEGMENT@44..45 + NAME_REF@44..45 + IDENT@44..45 "m" + SEMICOLON@45..46 ";" + WHITESPACE@46..47 "\n" + USE@47..60 + USE_KW@47..50 "use" + WHITESPACE@50..51 " " + USE_TREE@51..59 + PATH@51..59 + PATH@51..56 + PATH_SEGMENT@51..56 + NAME_REF@51..56 + SUPER_KW@51..56 "super" + COLON2@56..58 "::" + PATH_SEGMENT@58..59 + NAME_REF@58..59 + IDENT@58..59 "m" + SEMICOLON@59..60 ";" + WHITESPACE@60..61 "\n" + USE@61..74 + USE_KW@61..64 "use" + WHITESPACE@64..65 " " + USE_TREE@65..73 + PATH@65..73 + PATH@65..70 + PATH_SEGMENT@65..70 + NAME_REF@65..70 + CRATE_KW@65..70 "crate" + COLON2@70..72 "::" + PATH_SEGMENT@72..73 + NAME_REF@72..73 + IDENT@72..73 "m" + SEMICOLON@73..74 ";" + WHITESPACE@74..75 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rs b/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rs new file mode 100644 index 000000000000..5b22f88523ba --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0177_use_tree_path.rs @@ -0,0 +1,6 @@ +use ::std; +use std::collections; + +use self::m; +use super::m; +use crate::m; diff --git a/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rast b/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rast new file mode 100644 index 000000000000..620a792306fa --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rast @@ -0,0 +1,20 @@ +SOURCE_FILE@0..24 + USE@0..23 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..22 + PATH@4..7 + PATH_SEGMENT@4..7 + NAME_REF@4..7 + IDENT@4..7 "std" + COLON2@7..9 "::" + USE_TREE_LIST@9..22 + L_CURLY@9..10 "{" + USE_TREE@10..21 + PATH@10..21 + PATH_SEGMENT@10..21 + NAME_REF@10..21 + IDENT@10..21 "collections" + R_CURLY@21..22 "}" + SEMICOLON@22..23 ";" + WHITESPACE@23..24 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rs b/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rs new file mode 100644 index 000000000000..c3086f51a2e7 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0178_use_tree_path_use_tree.rs @@ -0,0 +1 @@ +use std::{collections}; diff --git a/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rast b/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rast new file mode 100644 index 000000000000..4b132f2ded5b --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rast @@ -0,0 +1,26 @@ +SOURCE_FILE@0..25 + USE@0..8 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..7 + COLON2@4..6 "::" + STAR@6..7 "*" + SEMICOLON@7..8 ";" + WHITESPACE@8..9 "\n" + USE@9..24 + USE_KW@9..12 "use" + WHITESPACE@12..13 " " + USE_TREE@13..23 + PATH@13..16 + PATH_SEGMENT@13..16 + NAME_REF@13..16 + IDENT@13..16 "std" + COLON2@16..18 "::" + USE_TREE_LIST@18..23 + L_CURLY@18..19 "{" + USE_TREE@19..22 + COLON2@19..21 "::" + STAR@21..22 "*" + R_CURLY@22..23 "}" + SEMICOLON@23..24 ";" + WHITESPACE@24..25 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rs b/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rs new file mode 100644 index 000000000000..caae0ba026aa --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0179_use_tree_abs_star.rs @@ -0,0 +1,2 @@ +use ::*; +use std::{::*}; diff --git a/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rast b/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rast new file mode 100644 index 000000000000..93384d6ed7f4 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rast @@ -0,0 +1,13 @@ +SOURCE_FILE@0..12 + USE@0..11 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..10 + PATH@4..7 + PATH_SEGMENT@4..7 + NAME_REF@4..7 + IDENT@4..7 "std" + COLON2@7..9 "::" + STAR@9..10 "*" + SEMICOLON@10..11 ";" + WHITESPACE@11..12 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rs b/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rs new file mode 100644 index 000000000000..dd601cffe5dd --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0180_use_tree_path_star.rs @@ -0,0 +1 @@ +use std::*; diff --git a/crates/syntax/test_data/parser/inline/ok/0181_use_item.rast b/crates/syntax/test_data/parser/inline/ok/0181_use_item.rast new file mode 100644 index 000000000000..3952fcf09e39 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0181_use_item.rast @@ -0,0 +1,16 @@ +SOURCE_FILE@0..22 + USE@0..21 + USE_KW@0..3 "use" + WHITESPACE@3..4 " " + USE_TREE@4..20 + PATH@4..20 + PATH@4..7 + PATH_SEGMENT@4..7 + NAME_REF@4..7 + IDENT@4..7 "std" + COLON2@7..9 "::" + PATH_SEGMENT@9..20 + NAME_REF@9..20 + IDENT@9..20 "collections" + SEMICOLON@20..21 ";" + WHITESPACE@21..22 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0181_use_item.rs b/crates/syntax/test_data/parser/inline/ok/0181_use_item.rs new file mode 100644 index 000000000000..48ac87b14a0f --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0181_use_item.rs @@ -0,0 +1 @@ +use std::collections; From 3dc2aeea0f242a7fe7a9c9add731a1de1495a59a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 15:46:28 +0300 Subject: [PATCH 2/5] internal: parser cleanup --- crates/parser/src/grammar/items.rs | 2 +- crates/parser/src/grammar/type_params.rs | 87 +++++++++---------- .../0122_generic_lifetime_type_attribute.rast | 69 --------------- .../0122_generic_lifetime_type_attribute.rs | 2 - ...81_generic_param_list_param_attribute.rast | 45 ++++++++++ ...0181_generic_param_list_param_attribute.rs | 1 + .../parser/inline/ok/0182_lifetime_param.rast | 24 +++++ .../parser/inline/ok/0182_lifetime_param.rs | 1 + .../parser/inline/ok/0183_type_param.rast | 29 +++++++ .../parser/inline/ok/0183_type_param.rs | 1 + .../inline/ok/0184_generic_param_list.rast | 29 +++++++ .../inline/ok/0184_generic_param_list.rs | 1 + 12 files changed, 175 insertions(+), 116 deletions(-) delete mode 100644 crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rast delete mode 100644 crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0183_type_param.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0183_type_param.rs create mode 100644 crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rs diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 13d9f9e1ab48..96a2ba40129b 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -19,7 +19,7 @@ use super::*; // struct S; pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) { attributes::inner_attrs(p); - while !(stop_on_r_curly && p.at(T!['}']) || p.at(EOF)) { + while !p.at(EOF) && !(p.at(T!['}']) && stop_on_r_curly) { item_or_macro(p, stop_on_r_curly) } } diff --git a/crates/parser/src/grammar/type_params.rs b/crates/parser/src/grammar/type_params.rs index a7a0109fd1ba..f5db4c7222f6 100644 --- a/crates/parser/src/grammar/type_params.rs +++ b/crates/parser/src/grammar/type_params.rs @@ -1,12 +1,13 @@ use super::*; pub(super) fn opt_generic_param_list(p: &mut Parser) { - if !p.at(T![<]) { - return; + if p.at(T![<]) { + generic_param_list(p); } - generic_param_list(p); } +// test generic_param_list +// fn f() {} fn generic_param_list(p: &mut Parser) { assert!(p.at(T![<])); let m = p.start(); @@ -15,9 +16,8 @@ fn generic_param_list(p: &mut Parser) { while !p.at(EOF) && !p.at(T![>]) { let m = p.start(); - // test generic_lifetime_type_attribute - // fn foo<#[derive(Lifetime)] 'a, #[derive(Type)] T>(_: &'a T) { - // } + // test generic_param_list_param_attribute + // fn foo<#[lt_attr] 'a, #[t_attr] T>() {} attributes::outer_attrs(p); match p.current() { @@ -37,6 +37,8 @@ fn generic_param_list(p: &mut Parser) { m.complete(p, GENERIC_PARAM_LIST); } +// test lifetime_param +// fn f<'a: 'b>() {} fn lifetime_param(p: &mut Parser, m: Marker) { assert!(p.at(LIFETIME_IDENT)); lifetime(p); @@ -46,15 +48,17 @@ fn lifetime_param(p: &mut Parser, m: Marker) { m.complete(p, LIFETIME_PARAM); } +// test type_param +// fn f() {} fn type_param(p: &mut Parser, m: Marker) { assert!(p.at(IDENT)); name(p); if p.at(T![:]) { bounds(p); } - // test type_param_default - // struct S; if p.at(T![=]) { + // test type_param_default + // struct S; p.bump(T![=]); types::type_(p) } @@ -64,7 +68,6 @@ fn type_param(p: &mut Parser, m: Marker) { // test const_param // struct S; fn const_param(p: &mut Parser, m: Marker) { - assert!(p.at(T![const])); p.bump(T![const]); name(p); if p.at(T![:]) { @@ -73,11 +76,11 @@ fn const_param(p: &mut Parser, m: Marker) { p.error("missing type for const parameter"); } - // test const_param_defaults - // struct A; - // struct B; - // struct C; if p.at(T![=]) { + // test const_param_defaults + // struct A; + // struct B; + // struct C; p.bump(T![=]); type_args::const_arg(p); } @@ -85,14 +88,6 @@ fn const_param(p: &mut Parser, m: Marker) { m.complete(p, CONST_PARAM); } -// test type_param_bounds -// struct S; -pub(super) fn bounds(p: &mut Parser) { - assert!(p.at(T![:])); - p.bump(T![:]); - bounds_without_colon(p); -} - fn lifetime_bounds(p: &mut Parser) { assert!(p.at(T![:])); p.bump(T![:]); @@ -104,21 +99,28 @@ fn lifetime_bounds(p: &mut Parser) { } } +// test type_param_bounds +// struct S; +pub(super) fn bounds(p: &mut Parser) { + assert!(p.at(T![:])); + p.bump(T![:]); + bounds_without_colon(p); +} + +pub(super) fn bounds_without_colon(p: &mut Parser) { + let m = p.start(); + bounds_without_colon_m(p, m); +} + pub(super) fn bounds_without_colon_m(p: &mut Parser, marker: Marker) -> CompletedMarker { while type_bound(p) { if !p.eat(T![+]) { break; } } - marker.complete(p, TYPE_BOUND_LIST) } -pub(super) fn bounds_without_colon(p: &mut Parser) { - let m = p.start(); - bounds_without_colon_m(p, m); -} - fn type_bound(p: &mut Parser) -> bool { let m = p.start(); let has_paren = p.eat(T!['(']); @@ -160,8 +162,9 @@ pub(super) fn opt_where_clause(p: &mut Parser) { let comma = p.eat(T![,]); - if is_where_clause_end(p) { - break; + match p.current() { + T!['{'] | T![;] | T![=] => break, + _ => (), } if !comma { @@ -170,20 +173,16 @@ pub(super) fn opt_where_clause(p: &mut Parser) { } m.complete(p, WHERE_CLAUSE); -} -fn is_where_predicate(p: &mut Parser) -> bool { - match p.current() { - LIFETIME_IDENT => true, - T![impl] => false, - token => types::TYPE_FIRST.contains(token), + fn is_where_predicate(p: &mut Parser) -> bool { + match p.current() { + LIFETIME_IDENT => true, + T![impl] => false, + token => types::TYPE_FIRST.contains(token), + } } } -fn is_where_clause_end(p: &mut Parser) -> bool { - matches!(p.current(), T!['{'] | T![;] | T![=]) -} - fn where_predicate(p: &mut Parser) { let m = p.start(); match p.current() { @@ -199,12 +198,12 @@ fn where_predicate(p: &mut Parser) { p.error("expected lifetime or type"); } _ => { - // test where_pred_for - // fn for_trait() - // where - // for<'a> F: Fn(&'a str) - // { } if p.at(T![for]) { + // test where_pred_for + // fn for_trait() + // where + // for<'a> F: Fn(&'a str) + // { } types::for_binder(p); } diff --git a/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rast b/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rast deleted file mode 100644 index 5682bd28c579..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rast +++ /dev/null @@ -1,69 +0,0 @@ -SOURCE_FILE@0..64 - FN@0..63 - FN_KW@0..2 "fn" - WHITESPACE@2..3 " " - NAME@3..6 - IDENT@3..6 "foo" - GENERIC_PARAM_LIST@6..49 - L_ANGLE@6..7 "<" - LIFETIME_PARAM@7..29 - ATTR@7..26 - POUND@7..8 "#" - L_BRACK@8..9 "[" - META@9..25 - PATH@9..15 - PATH_SEGMENT@9..15 - NAME_REF@9..15 - IDENT@9..15 "derive" - TOKEN_TREE@15..25 - L_PAREN@15..16 "(" - IDENT@16..24 "Lifetime" - R_PAREN@24..25 ")" - R_BRACK@25..26 "]" - WHITESPACE@26..27 " " - LIFETIME@27..29 - LIFETIME_IDENT@27..29 "'a" - COMMA@29..30 "," - WHITESPACE@30..31 " " - TYPE_PARAM@31..48 - ATTR@31..46 - POUND@31..32 "#" - L_BRACK@32..33 "[" - META@33..45 - PATH@33..39 - PATH_SEGMENT@33..39 - NAME_REF@33..39 - IDENT@33..39 "derive" - TOKEN_TREE@39..45 - L_PAREN@39..40 "(" - IDENT@40..44 "Type" - R_PAREN@44..45 ")" - R_BRACK@45..46 "]" - WHITESPACE@46..47 " " - NAME@47..48 - IDENT@47..48 "T" - R_ANGLE@48..49 ">" - PARAM_LIST@49..59 - L_PAREN@49..50 "(" - PARAM@50..58 - WILDCARD_PAT@50..51 - UNDERSCORE@50..51 "_" - COLON@51..52 ":" - WHITESPACE@52..53 " " - REF_TYPE@53..58 - AMP@53..54 "&" - LIFETIME@54..56 - LIFETIME_IDENT@54..56 "'a" - WHITESPACE@56..57 " " - PATH_TYPE@57..58 - PATH@57..58 - PATH_SEGMENT@57..58 - NAME_REF@57..58 - IDENT@57..58 "T" - R_PAREN@58..59 ")" - WHITESPACE@59..60 " " - BLOCK_EXPR@60..63 - L_CURLY@60..61 "{" - WHITESPACE@61..62 "\n" - R_CURLY@62..63 "}" - WHITESPACE@63..64 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rs b/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rs deleted file mode 100644 index e8fdf741fb91..000000000000 --- a/crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rs +++ /dev/null @@ -1,2 +0,0 @@ -fn foo<#[derive(Lifetime)] 'a, #[derive(Type)] T>(_: &'a T) { -} diff --git a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast new file mode 100644 index 000000000000..475c23676630 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast @@ -0,0 +1,45 @@ +SOURCE_FILE@0..40 + FN@0..39 + FN_KW@0..2 "fn" + WHITESPACE@2..3 " " + NAME@3..6 + IDENT@3..6 "foo" + GENERIC_PARAM_LIST@6..34 + L_ANGLE@6..7 "<" + LIFETIME_PARAM@7..20 + ATTR@7..17 + POUND@7..8 "#" + L_BRACK@8..9 "[" + META@9..16 + PATH@9..16 + PATH_SEGMENT@9..16 + NAME_REF@9..16 + IDENT@9..16 "lt_attr" + R_BRACK@16..17 "]" + WHITESPACE@17..18 " " + LIFETIME@18..20 + LIFETIME_IDENT@18..20 "'a" + COMMA@20..21 "," + WHITESPACE@21..22 " " + TYPE_PARAM@22..33 + ATTR@22..31 + POUND@22..23 "#" + L_BRACK@23..24 "[" + META@24..30 + PATH@24..30 + PATH_SEGMENT@24..30 + NAME_REF@24..30 + IDENT@24..30 "t_attr" + R_BRACK@30..31 "]" + WHITESPACE@31..32 " " + NAME@32..33 + IDENT@32..33 "T" + R_ANGLE@33..34 ">" + PARAM_LIST@34..36 + L_PAREN@34..35 "(" + R_PAREN@35..36 ")" + WHITESPACE@36..37 " " + BLOCK_EXPR@37..39 + L_CURLY@37..38 "{" + R_CURLY@38..39 "}" + WHITESPACE@39..40 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs new file mode 100644 index 000000000000..0509f81da7ed --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs @@ -0,0 +1 @@ +fn foo<#[lt_attr] 'a, #[t_attr] T>() {} diff --git a/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast new file mode 100644 index 000000000000..0eb7361ce42c --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast @@ -0,0 +1,24 @@ +SOURCE_FILE@0..18 + FN@0..17 + FN_KW@0..2 "fn" + WHITESPACE@2..3 " " + NAME@3..4 + IDENT@3..4 "f" + GENERIC_PARAM_LIST@4..12 + L_ANGLE@4..5 "<" + LIFETIME_PARAM@5..11 + LIFETIME@5..7 + LIFETIME_IDENT@5..7 "'a" + COLON@7..8 ":" + WHITESPACE@8..9 " " + LIFETIME@9..11 + LIFETIME_IDENT@9..11 "'b" + R_ANGLE@11..12 ">" + PARAM_LIST@12..14 + L_PAREN@12..13 "(" + R_PAREN@13..14 ")" + WHITESPACE@14..15 " " + BLOCK_EXPR@15..17 + L_CURLY@15..16 "{" + R_CURLY@16..17 "}" + WHITESPACE@17..18 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rs b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rs new file mode 100644 index 000000000000..2bb38ece8c6a --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rs @@ -0,0 +1 @@ +fn f<'a: 'b>() {} diff --git a/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast new file mode 100644 index 000000000000..9d8ab493e078 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast @@ -0,0 +1,29 @@ +SOURCE_FILE@0..20 + FN@0..19 + FN_KW@0..2 "fn" + WHITESPACE@2..3 " " + NAME@3..4 + IDENT@3..4 "f" + GENERIC_PARAM_LIST@4..14 + L_ANGLE@4..5 "<" + TYPE_PARAM@5..13 + NAME@5..6 + IDENT@5..6 "T" + COLON@6..7 ":" + WHITESPACE@7..8 " " + TYPE_BOUND_LIST@8..13 + TYPE_BOUND@8..13 + PATH_TYPE@8..13 + PATH@8..13 + PATH_SEGMENT@8..13 + NAME_REF@8..13 + IDENT@8..13 "Clone" + R_ANGLE@13..14 ">" + PARAM_LIST@14..16 + L_PAREN@14..15 "(" + R_PAREN@15..16 ")" + WHITESPACE@16..17 " " + BLOCK_EXPR@17..19 + L_CURLY@17..18 "{" + R_CURLY@18..19 "}" + WHITESPACE@19..20 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0183_type_param.rs b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rs new file mode 100644 index 000000000000..b250bc6bf07c --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rs @@ -0,0 +1 @@ +fn f() {} diff --git a/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast new file mode 100644 index 000000000000..9d8ab493e078 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast @@ -0,0 +1,29 @@ +SOURCE_FILE@0..20 + FN@0..19 + FN_KW@0..2 "fn" + WHITESPACE@2..3 " " + NAME@3..4 + IDENT@3..4 "f" + GENERIC_PARAM_LIST@4..14 + L_ANGLE@4..5 "<" + TYPE_PARAM@5..13 + NAME@5..6 + IDENT@5..6 "T" + COLON@6..7 ":" + WHITESPACE@7..8 " " + TYPE_BOUND_LIST@8..13 + TYPE_BOUND@8..13 + PATH_TYPE@8..13 + PATH@8..13 + PATH_SEGMENT@8..13 + NAME_REF@8..13 + IDENT@8..13 "Clone" + R_ANGLE@13..14 ">" + PARAM_LIST@14..16 + L_PAREN@14..15 "(" + R_PAREN@15..16 ")" + WHITESPACE@16..17 " " + BLOCK_EXPR@17..19 + L_CURLY@17..18 "{" + R_CURLY@18..19 "}" + WHITESPACE@19..20 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rs b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rs new file mode 100644 index 000000000000..b250bc6bf07c --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rs @@ -0,0 +1 @@ +fn f() {} From ed84717869d4847dd9aa835efd498922f6c61bce Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 15:54:55 +0300 Subject: [PATCH 3/5] internal: better naming --- crates/parser/src/grammar.rs | 4 +- crates/parser/src/grammar/expressions.rs | 2 +- .../grammar/{type_args.rs => generic_args.rs} | 66 +++++++++---------- .../{type_params.rs => generic_params.rs} | 2 +- crates/parser/src/grammar/items.rs | 10 +-- crates/parser/src/grammar/items/adt.rs | 10 +-- crates/parser/src/grammar/items/traits.rs | 14 ++-- crates/parser/src/grammar/paths.rs | 4 +- crates/parser/src/grammar/types.rs | 8 +-- 9 files changed, 60 insertions(+), 60 deletions(-) rename crates/parser/src/grammar/{type_args.rs => generic_args.rs} (97%) rename crates/parser/src/grammar/{type_params.rs => generic_params.rs} (99%) diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs index 58e182d68c65..d0b07f593143 100644 --- a/crates/parser/src/grammar.rs +++ b/crates/parser/src/grammar.rs @@ -34,8 +34,8 @@ mod items; mod params; mod paths; mod patterns; -mod type_args; -mod type_params; +mod generic_args; +mod generic_params; mod types; use crate::{ diff --git a/crates/parser/src/grammar/expressions.rs b/crates/parser/src/grammar/expressions.rs index 12e62cddbc0d..29310b71bd8c 100644 --- a/crates/parser/src/grammar/expressions.rs +++ b/crates/parser/src/grammar/expressions.rs @@ -486,7 +486,7 @@ fn method_call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { let m = lhs.precede(p); p.bump_any(); name_ref(p); - type_args::opt_generic_arg_list(p, true); + generic_args::opt_generic_arg_list(p, true); if p.at(T!['(']) { arg_list(p); } diff --git a/crates/parser/src/grammar/type_args.rs b/crates/parser/src/grammar/generic_args.rs similarity index 97% rename from crates/parser/src/grammar/type_args.rs rename to crates/parser/src/grammar/generic_args.rs index f09a28c443ac..0ae3eea57783 100644 --- a/crates/parser/src/grammar/type_args.rs +++ b/crates/parser/src/grammar/generic_args.rs @@ -23,38 +23,6 @@ pub(super) fn opt_generic_arg_list(p: &mut Parser, colon_colon_required: bool) { m.complete(p, GENERIC_ARG_LIST); } -pub(super) fn const_arg(p: &mut Parser) { - let m = p.start(); - // FIXME: duplicates the code below - match p.current() { - T!['{'] => { - expressions::block_expr(p); - m.complete(p, CONST_ARG); - } - k if k.is_literal() => { - expressions::literal(p); - m.complete(p, CONST_ARG); - } - T![true] | T![false] => { - expressions::literal(p); - m.complete(p, CONST_ARG); - } - T![-] => { - let lm = p.start(); - p.bump(T![-]); - expressions::literal(p); - lm.complete(p, PREFIX_EXPR); - m.complete(p, CONST_ARG); - } - _ => { - let lm = p.start(); - paths::use_path(p); - lm.complete(p, PATH_EXPR); - m.complete(p, CONST_ARG); - } - } -} - // test type_arg // type A = B<'static, i32, 1, { 2 }, Item=u64, true, false>; fn generic_arg(p: &mut Parser) { @@ -94,7 +62,7 @@ fn generic_arg(p: &mut Parser) { } // NameRef<...>: T![:] => { - type_params::bounds(p); + generic_params::bounds(p); path_seg.abandon(p); path.abandon(p); @@ -137,3 +105,35 @@ fn generic_arg(p: &mut Parser) { } } } + +pub(super) fn const_arg(p: &mut Parser) { + let m = p.start(); + // FIXME: duplicates the code above + match p.current() { + T!['{'] => { + expressions::block_expr(p); + m.complete(p, CONST_ARG); + } + k if k.is_literal() => { + expressions::literal(p); + m.complete(p, CONST_ARG); + } + T![true] | T![false] => { + expressions::literal(p); + m.complete(p, CONST_ARG); + } + T![-] => { + let lm = p.start(); + p.bump(T![-]); + expressions::literal(p); + lm.complete(p, PREFIX_EXPR); + m.complete(p, CONST_ARG); + } + _ => { + let lm = p.start(); + paths::use_path(p); + lm.complete(p, PATH_EXPR); + m.complete(p, CONST_ARG); + } + } +} diff --git a/crates/parser/src/grammar/type_params.rs b/crates/parser/src/grammar/generic_params.rs similarity index 99% rename from crates/parser/src/grammar/type_params.rs rename to crates/parser/src/grammar/generic_params.rs index f5db4c7222f6..b2ce101835dd 100644 --- a/crates/parser/src/grammar/type_params.rs +++ b/crates/parser/src/grammar/generic_params.rs @@ -82,7 +82,7 @@ fn const_param(p: &mut Parser, m: Marker) { // struct B; // struct C; p.bump(T![=]); - type_args::const_arg(p); + generic_args::const_arg(p); } m.complete(p, CONST_PARAM); diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 96a2ba40129b..517da6e95c49 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -284,15 +284,15 @@ fn type_alias(p: &mut Parser, m: Marker) { // test type_item_type_params // type Result = (); - type_params::opt_generic_param_list(p); + generic_params::opt_generic_param_list(p); if p.at(T![:]) { - type_params::bounds(p); + generic_params::bounds(p); } // test type_item_where_clause // type Foo where Foo: Copy = (); - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); if p.eat(T![=]) { types::type_(p); } @@ -383,7 +383,7 @@ fn fn_(p: &mut Parser, m: Marker) { name_r(p, ITEM_RECOVERY_SET); // test function_type_params // fn foo(){} - type_params::opt_generic_param_list(p); + generic_params::opt_generic_param_list(p); if p.at(T!['(']) { params::param_list_fn_def(p); @@ -397,7 +397,7 @@ fn fn_(p: &mut Parser, m: Marker) { // test function_where_clause // fn foo() where T: Copy {} - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); if p.at(T![;]) { // test fn_decl diff --git a/crates/parser/src/grammar/items/adt.rs b/crates/parser/src/grammar/items/adt.rs index e870de9de041..e4b1116958a9 100644 --- a/crates/parser/src/grammar/items/adt.rs +++ b/crates/parser/src/grammar/items/adt.rs @@ -17,10 +17,10 @@ pub(super) fn union(p: &mut Parser, m: Marker) { 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); + generic_params::opt_generic_param_list(p); match p.current() { T![where] => { - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); match p.current() { T![;] => p.bump(T![;]), T!['{'] => record_field_list(p), @@ -42,7 +42,7 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) { tuple_field_list(p); // test tuple_struct_where // struct S(T) where T: Clone; - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); p.expect(T![;]); } _ => p.error(if is_struct { "expected `;`, `{`, or `(`" } else { "expected `{`" }), @@ -53,8 +53,8 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) { pub(super) fn enum_(p: &mut Parser, m: Marker) { p.bump(T![enum]); name_r(p, ITEM_RECOVERY_SET); - type_params::opt_generic_param_list(p); - type_params::opt_where_clause(p); + generic_params::opt_generic_param_list(p); + generic_params::opt_where_clause(p); if p.at(T!['{']) { variant_list(p); } else { diff --git a/crates/parser/src/grammar/items/traits.rs b/crates/parser/src/grammar/items/traits.rs index dd1ecf97e44d..d6bb3b9b621f 100644 --- a/crates/parser/src/grammar/items/traits.rs +++ b/crates/parser/src/grammar/items/traits.rs @@ -8,17 +8,17 @@ pub(super) fn trait_(p: &mut Parser, m: Marker) { // test trait_item_generic_params // trait X {} - type_params::opt_generic_param_list(p); + generic_params::opt_generic_param_list(p); if p.eat(T![=]) { // test trait_alias // trait Z = T; - type_params::bounds_without_colon(p); + generic_params::bounds_without_colon(p); // test trait_alias_where_clause // trait Z = T where U: Copy; // trait Z = where Self: T; - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); p.expect(T![;]); m.complete(p, TRAIT); return; @@ -27,12 +27,12 @@ pub(super) fn trait_(p: &mut Parser, m: Marker) { if p.at(T![:]) { // test trait_item_bounds // trait T: Hash + Clone {} - type_params::bounds(p); + generic_params::bounds(p); } // test trait_item_where_clause // trait T where Self: Copy {} - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); if p.at(T!['{']) { assoc_item_list(p); @@ -47,7 +47,7 @@ pub(super) fn trait_(p: &mut Parser, m: Marker) { pub(super) fn impl_(p: &mut Parser, m: Marker) { p.bump(T![impl]); if p.at(T![<]) && not_a_qualified_path(p) { - type_params::opt_generic_param_list(p); + generic_params::opt_generic_param_list(p); } // test impl_item_const @@ -64,7 +64,7 @@ pub(super) fn impl_(p: &mut Parser, m: Marker) { if p.eat(T![for]) { impl_type(p); } - type_params::opt_where_clause(p); + generic_params::opt_where_clause(p); if p.at(T!['{']) { assoc_item_list(p); } else { diff --git a/crates/parser/src/grammar/paths.rs b/crates/parser/src/grammar/paths.rs index c4e4f010ffbe..e51dc38f9735 100644 --- a/crates/parser/src/grammar/paths.rs +++ b/crates/parser/src/grammar/paths.rs @@ -117,9 +117,9 @@ fn opt_path_type_args(p: &mut Parser, mode: Mode) { params::param_list_fn_trait(p); opt_ret_type(p); } else { - type_args::opt_generic_arg_list(p, false) + generic_args::opt_generic_arg_list(p, false) } } - Mode::Expr => type_args::opt_generic_arg_list(p, true), + Mode::Expr => generic_args::opt_generic_arg_list(p, true), } } diff --git a/crates/parser/src/grammar/types.rs b/crates/parser/src/grammar/types.rs index e0b3c1bf0cb0..c2aa9ffc3bdb 100644 --- a/crates/parser/src/grammar/types.rs +++ b/crates/parser/src/grammar/types.rs @@ -216,7 +216,7 @@ pub(super) fn for_binder(p: &mut Parser) { assert!(p.at(T![for])); p.bump(T![for]); if p.at(T![<]) { - type_params::opt_generic_param_list(p); + generic_params::opt_generic_param_list(p); } else { p.error("expected `<`"); } @@ -254,7 +254,7 @@ fn impl_trait_type(p: &mut Parser) { assert!(p.at(T![impl])); let m = p.start(); p.bump(T![impl]); - type_params::bounds_without_colon(p); + generic_params::bounds_without_colon(p); m.complete(p, IMPL_TRAIT_TYPE); } @@ -264,7 +264,7 @@ fn dyn_trait_type(p: &mut Parser) { assert!(p.at(T![dyn])); let m = p.start(); p.bump(T![dyn]); - type_params::bounds_without_colon(p); + generic_params::bounds_without_colon(p); m.complete(p, DYN_TRAIT_TYPE); } @@ -339,7 +339,7 @@ fn opt_type_bounds_as_dyn_trait_type(p: &mut Parser, type_marker: CompletedMarke p.eat(T![+]); // Parse rest of the bounds into the TYPE_BOUND_LIST - let m = type_params::bounds_without_colon_m(p, m); + let m = generic_params::bounds_without_colon_m(p, m); // Finally precede everything with DYN_TRAIT_TYPE m.precede(p).complete(p, DYN_TRAIT_TYPE); From c0556bd8c1b5faf4d784b3a93cfb093a2cfa0587 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 15:56:26 +0300 Subject: [PATCH 4/5] minor: improve readability --- crates/parser/src/grammar/generic_params.rs | 32 ++++++++++--------- ...rast => 0181_generic_param_attribute.rast} | 0 ...ute.rs => 0181_generic_param_attribute.rs} | 0 3 files changed, 17 insertions(+), 15 deletions(-) rename crates/syntax/test_data/parser/inline/ok/{0181_generic_param_list_param_attribute.rast => 0181_generic_param_attribute.rast} (100%) rename crates/syntax/test_data/parser/inline/ok/{0181_generic_param_list_param_attribute.rs => 0181_generic_param_attribute.rs} (100%) diff --git a/crates/parser/src/grammar/generic_params.rs b/crates/parser/src/grammar/generic_params.rs index b2ce101835dd..b8119f0a2166 100644 --- a/crates/parser/src/grammar/generic_params.rs +++ b/crates/parser/src/grammar/generic_params.rs @@ -14,21 +14,7 @@ fn generic_param_list(p: &mut Parser) { p.bump(T![<]); while !p.at(EOF) && !p.at(T![>]) { - let m = p.start(); - - // test generic_param_list_param_attribute - // fn foo<#[lt_attr] 'a, #[t_attr] T>() {} - attributes::outer_attrs(p); - - match p.current() { - LIFETIME_IDENT => lifetime_param(p, m), - IDENT => type_param(p, m), - T![const] => const_param(p, m), - _ => { - m.abandon(p); - p.err_and_bump("expected type parameter") - } - } + generic_param(p); if !p.at(T![>]) && !p.expect(T![,]) { break; } @@ -37,6 +23,22 @@ fn generic_param_list(p: &mut Parser) { m.complete(p, GENERIC_PARAM_LIST); } +fn generic_param(p: &mut Parser) { + let m = p.start(); + // test generic_param_attribute + // fn foo<#[lt_attr] 'a, #[t_attr] T>() {} + attributes::outer_attrs(p); + match p.current() { + LIFETIME_IDENT => lifetime_param(p, m), + IDENT => type_param(p, m), + T![const] => const_param(p, m), + _ => { + m.abandon(p); + p.err_and_bump("expected type parameter") + } + } +} + // test lifetime_param // fn f<'a: 'b>() {} fn lifetime_param(p: &mut Parser, m: Marker) { diff --git a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast similarity index 100% rename from crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rast rename to crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast diff --git a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rs similarity index 100% rename from crates/syntax/test_data/parser/inline/ok/0181_generic_param_list_param_attribute.rs rename to crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rs From fbb6a6a95b9b96901a612d76404e4705cadbe254 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 18 Sep 2021 16:09:12 +0300 Subject: [PATCH 5/5] fix: correctly handle jointness --- crates/parser/src/grammar/generic_args.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/parser/src/grammar/generic_args.rs b/crates/parser/src/grammar/generic_args.rs index 0ae3eea57783..cd75d20a42f4 100644 --- a/crates/parser/src/grammar/generic_args.rs +++ b/crates/parser/src/grammar/generic_args.rs @@ -51,7 +51,7 @@ fn generic_arg(p: &mut Parser) { path_ty.abandon(p); m.complete(p, ASSOC_TYPE_ARG); } - T![:] if p.nth(1) == T![:] => { + T![:] if p.at(T![::]) => { // NameRef::, this is a path type path_seg.complete(p, PATH_SEGMENT); let qual = path.complete(p, PATH);