Skip to content

Commit 35e7966

Browse files
committed
Add comma list to use tree
1 parent be803ef commit 35e7966

File tree

3 files changed

+126
-89
lines changed

3 files changed

+126
-89
lines changed

crates/ra_syntax/src/ast/generated/nodes.rs

Lines changed: 78 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,36 @@ pub struct Rename {
268268
impl ast::NameOwner for Rename {}
269269
impl Rename {
270270
pub fn as_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![as]) }
271+
pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) }
272+
}
273+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
274+
pub struct UseTree {
275+
pub(crate) syntax: SyntaxNode,
276+
}
277+
impl UseTree {
278+
pub fn path(&self) -> Option<Path> { support::child(&self.syntax) }
279+
pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }
280+
pub fn star_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![*]) }
281+
pub fn use_tree_list(&self) -> Option<UseTreeList> { support::child(&self.syntax) }
282+
pub fn rename(&self) -> Option<Rename> { support::child(&self.syntax) }
283+
}
284+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
285+
pub struct Path {
286+
pub(crate) syntax: SyntaxNode,
287+
}
288+
impl Path {
289+
pub fn qualifier(&self) -> Option<Path> { support::child(&self.syntax) }
290+
pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }
291+
pub fn segment(&self) -> Option<PathSegment> { support::child(&self.syntax) }
292+
}
293+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
294+
pub struct UseTreeList {
295+
pub(crate) syntax: SyntaxNode,
296+
}
297+
impl UseTreeList {
298+
pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
299+
pub fn use_trees(&self) -> AstChildren<UseTree> { support::children(&self.syntax) }
300+
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
271301
}
272302
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
273303
pub struct Abi {
@@ -433,15 +463,6 @@ impl PathType {
433463
pub fn path(&self) -> Option<Path> { support::child(&self.syntax) }
434464
}
435465
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
436-
pub struct Path {
437-
pub(crate) syntax: SyntaxNode,
438-
}
439-
impl Path {
440-
pub fn qualifier(&self) -> Option<Path> { support::child(&self.syntax) }
441-
pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }
442-
pub fn segment(&self) -> Option<PathSegment> { support::child(&self.syntax) }
443-
}
444-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
445466
pub struct PointerType {
446467
pub(crate) syntax: SyntaxNode,
447468
}
@@ -1178,26 +1199,6 @@ impl Param {
11781199
pub fn dotdotdot_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![...]) }
11791200
}
11801201
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1181-
pub struct UseTree {
1182-
pub(crate) syntax: SyntaxNode,
1183-
}
1184-
impl UseTree {
1185-
pub fn path(&self) -> Option<Path> { support::child(&self.syntax) }
1186-
pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }
1187-
pub fn star_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![*]) }
1188-
pub fn use_tree_list(&self) -> Option<UseTreeList> { support::child(&self.syntax) }
1189-
pub fn rename(&self) -> Option<Rename> { support::child(&self.syntax) }
1190-
}
1191-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1192-
pub struct UseTreeList {
1193-
pub(crate) syntax: SyntaxNode,
1194-
}
1195-
impl UseTreeList {
1196-
pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
1197-
pub fn use_trees(&self) -> AstChildren<UseTree> { support::children(&self.syntax) }
1198-
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
1199-
}
1200-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
12011202
pub struct PathSegment {
12021203
pub(crate) syntax: SyntaxNode,
12031204
}
@@ -1627,6 +1628,39 @@ impl AstNode for Rename {
16271628
}
16281629
fn syntax(&self) -> &SyntaxNode { &self.syntax }
16291630
}
1631+
impl AstNode for UseTree {
1632+
fn can_cast(kind: SyntaxKind) -> bool { kind == USE_TREE }
1633+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1634+
if Self::can_cast(syntax.kind()) {
1635+
Some(Self { syntax })
1636+
} else {
1637+
None
1638+
}
1639+
}
1640+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1641+
}
1642+
impl AstNode for Path {
1643+
fn can_cast(kind: SyntaxKind) -> bool { kind == PATH }
1644+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1645+
if Self::can_cast(syntax.kind()) {
1646+
Some(Self { syntax })
1647+
} else {
1648+
None
1649+
}
1650+
}
1651+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1652+
}
1653+
impl AstNode for UseTreeList {
1654+
fn can_cast(kind: SyntaxKind) -> bool { kind == USE_TREE_LIST }
1655+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1656+
if Self::can_cast(syntax.kind()) {
1657+
Some(Self { syntax })
1658+
} else {
1659+
None
1660+
}
1661+
}
1662+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1663+
}
16301664
impl AstNode for Abi {
16311665
fn can_cast(kind: SyntaxKind) -> bool { kind == ABI }
16321666
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -1825,17 +1859,6 @@ impl AstNode for PathType {
18251859
}
18261860
fn syntax(&self) -> &SyntaxNode { &self.syntax }
18271861
}
1828-
impl AstNode for Path {
1829-
fn can_cast(kind: SyntaxKind) -> bool { kind == PATH }
1830-
fn cast(syntax: SyntaxNode) -> Option<Self> {
1831-
if Self::can_cast(syntax.kind()) {
1832-
Some(Self { syntax })
1833-
} else {
1834-
None
1835-
}
1836-
}
1837-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1838-
}
18391862
impl AstNode for PointerType {
18401863
fn can_cast(kind: SyntaxKind) -> bool { kind == POINTER_TYPE }
18411864
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2672,28 +2695,6 @@ impl AstNode for Param {
26722695
}
26732696
fn syntax(&self) -> &SyntaxNode { &self.syntax }
26742697
}
2675-
impl AstNode for UseTree {
2676-
fn can_cast(kind: SyntaxKind) -> bool { kind == USE_TREE }
2677-
fn cast(syntax: SyntaxNode) -> Option<Self> {
2678-
if Self::can_cast(syntax.kind()) {
2679-
Some(Self { syntax })
2680-
} else {
2681-
None
2682-
}
2683-
}
2684-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2685-
}
2686-
impl AstNode for UseTreeList {
2687-
fn can_cast(kind: SyntaxKind) -> bool { kind == USE_TREE_LIST }
2688-
fn cast(syntax: SyntaxNode) -> Option<Self> {
2689-
if Self::can_cast(syntax.kind()) {
2690-
Some(Self { syntax })
2691-
} else {
2692-
None
2693-
}
2694-
}
2695-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2696-
}
26972698
impl AstNode for PathSegment {
26982699
fn can_cast(kind: SyntaxKind) -> bool { kind == PATH_SEGMENT }
26992700
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3560,6 +3561,21 @@ impl std::fmt::Display for Rename {
35603561
std::fmt::Display::fmt(self.syntax(), f)
35613562
}
35623563
}
3564+
impl std::fmt::Display for UseTree {
3565+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3566+
std::fmt::Display::fmt(self.syntax(), f)
3567+
}
3568+
}
3569+
impl std::fmt::Display for Path {
3570+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3571+
std::fmt::Display::fmt(self.syntax(), f)
3572+
}
3573+
}
3574+
impl std::fmt::Display for UseTreeList {
3575+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3576+
std::fmt::Display::fmt(self.syntax(), f)
3577+
}
3578+
}
35633579
impl std::fmt::Display for Abi {
35643580
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35653581
std::fmt::Display::fmt(self.syntax(), f)
@@ -3650,11 +3666,6 @@ impl std::fmt::Display for PathType {
36503666
std::fmt::Display::fmt(self.syntax(), f)
36513667
}
36523668
}
3653-
impl std::fmt::Display for Path {
3654-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3655-
std::fmt::Display::fmt(self.syntax(), f)
3656-
}
3657-
}
36583669
impl std::fmt::Display for PointerType {
36593670
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36603671
std::fmt::Display::fmt(self.syntax(), f)
@@ -4035,16 +4046,6 @@ impl std::fmt::Display for Param {
40354046
std::fmt::Display::fmt(self.syntax(), f)
40364047
}
40374048
}
4038-
impl std::fmt::Display for UseTree {
4039-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4040-
std::fmt::Display::fmt(self.syntax(), f)
4041-
}
4042-
}
4043-
impl std::fmt::Display for UseTreeList {
4044-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4045-
std::fmt::Display::fmt(self.syntax(), f)
4046-
}
4047-
}
40484049
impl std::fmt::Display for PathSegment {
40494050
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40504051
std::fmt::Display::fmt(self.syntax(), f)

xtask/src/codegen/gen_syntax.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,10 @@ fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
543543
}
544544

545545
fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
546+
if lower_comma_list(acc, grammar, rule) {
547+
return;
548+
}
549+
546550
match rule {
547551
Rule::Node(node) => {
548552
let field = Field::Node { name: grammar[*node].name.clone(), src: FieldSrc::Shorthand };
@@ -595,6 +599,37 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
595599
}
596600
}
597601

602+
// (T (',' T)* ','?)?
603+
fn lower_comma_list(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) -> bool {
604+
let rule = match rule {
605+
Rule::Opt(it) => it,
606+
_ => return false,
607+
};
608+
let rule = match &**rule {
609+
Rule::Seq(it) => it,
610+
_ => return false,
611+
};
612+
let (node, repeat, trailing_comma) = match rule.as_slice() {
613+
[Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {
614+
(node, repeat, trailing_comma)
615+
}
616+
_ => return false,
617+
};
618+
let repeat = match &**repeat {
619+
Rule::Seq(it) => it,
620+
_ => return false,
621+
};
622+
match repeat.as_slice() {
623+
[comma, Rule::Node(n)] if comma == &**trailing_comma && n == node => (),
624+
_ => return false,
625+
}
626+
let name = grammar[*node].name.clone();
627+
let label = pluralize(&to_lower_snake_case(&name));
628+
let field = Field::Node { name: label.clone(), src: FieldSrc::Many(name) };
629+
acc.push(field);
630+
true
631+
}
632+
598633
fn deduplicate_fields(ast: &mut AstSrc) {
599634
for node in &mut ast.nodes {
600635
let mut i = 0;

xtask/src/codegen/rust.ungram

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ ItemList =
2929
ExternCrate =
3030
Attr* Visibility? 'extern' 'crate' (NameRef | 'self') Rename? ';'
3131

32+
Rename =
33+
'as' (Name | '_')
34+
35+
UseItem =
36+
Attr* Visibility? 'use' UseTree ';'
37+
38+
UseTree =
39+
(Path? '::')? ('*' | UseTreeList )
40+
| Path Rename?
41+
42+
UseTreeList =
43+
'{' (UseTree (',' UseTree)* ','?)? '}'
44+
3245
FnDef =
3346
Attr* Visibility? Abi? 'const' 'default' 'async' 'unsafe' 'fn' Name TypeParamList?
3447
ParamList RetType?
@@ -395,18 +408,6 @@ Param =
395408
Attr* Pat (':' ascribed_type:TypeRef)
396409
| '...'
397410

398-
UseItem =
399-
Attr* Visibility? 'use' UseTree ';'
400-
401-
UseTree =
402-
Path ('::' ('*' | UseTreeList)) Rename?
403-
404-
UseTreeList =
405-
'{' UseTree* '}'
406-
407-
Rename =
408-
'as' Name
409-
410411
Path =
411412
(qualifier:Path '::')? segment:PathSegment
412413

0 commit comments

Comments
 (0)