Skip to content

Commit 2496628

Browse files
bors[bot]matklad
andauthored
Merge #5600
5600: Finalize structs grammar r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 61d9d6c + 8ddbf06 commit 2496628

File tree

4 files changed

+29
-41
lines changed

4 files changed

+29
-41
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ pub struct TupleField {
422422
pub(crate) syntax: SyntaxNode,
423423
}
424424
impl ast::AttrsOwner for TupleField {}
425-
impl ast::NameOwner for TupleField {}
426425
impl ast::VisibilityOwner for TupleField {}
427426
impl TupleField {
428427
pub fn type_ref(&self) -> Option<TypeRef> { support::child(&self.syntax) }

xtask/src/ast_src.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ pub(crate) struct AstNodeSrc {
242242
#[derive(Debug, Eq, PartialEq)]
243243
pub(crate) enum Field {
244244
Token(String),
245-
Node { name: String, ty: String, valence: Valence },
245+
Node { name: String, ty: String, cardinality: Cardinality },
246246
}
247247

248248
#[derive(Debug, Eq, PartialEq)]
249-
pub(crate) enum Valence {
249+
pub(crate) enum Cardinality {
250250
Optional,
251251
Many,
252252
}

xtask/src/codegen/gen_syntax.rs

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use quote::{format_ident, quote};
1313
use ungrammar::{Grammar, Rule};
1414

1515
use crate::{
16-
ast_src::{AstEnumSrc, AstNodeSrc, AstSrc, Field, KindsSrc, Valence, KINDS_SRC},
16+
ast_src::{AstEnumSrc, AstNodeSrc, AstSrc, Cardinality, Field, KindsSrc, KINDS_SRC},
1717
codegen::{self, update, Mode},
1818
project_root, Result,
1919
};
@@ -431,7 +431,7 @@ fn pluralize(s: &str) -> String {
431431

432432
impl Field {
433433
fn is_many(&self) -> bool {
434-
matches!(self, Field::Node { valence: Valence::Many, .. })
434+
matches!(self, Field::Node { cardinality: Cardinality::Many, .. })
435435
}
436436
fn token_kind(&self) -> Option<proc_macro2::TokenStream> {
437437
match self {
@@ -509,7 +509,7 @@ fn lower(grammar: &Grammar) -> AstSrc {
509509
}
510510
None => {
511511
let mut fields = Vec::new();
512-
lower_rule(&mut fields, grammar, rule);
512+
lower_rule(&mut fields, grammar, None, rule);
513513
res.nodes.push(AstNodeSrc { doc: Vec::new(), name, traits: Vec::new(), fields });
514514
}
515515
}
@@ -537,19 +537,20 @@ fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
537537
Some(variants)
538538
}
539539

540-
fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
541-
if lower_comma_list(acc, grammar, rule) {
540+
fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, label: Option<&String>, rule: &Rule) {
541+
if lower_comma_list(acc, grammar, label, rule) {
542542
return;
543543
}
544544

545545
match rule {
546546
Rule::Node(node) => {
547547
let ty = grammar[*node].name.clone();
548-
let name = to_lower_snake_case(&ty);
549-
let field = Field::Node { name, ty, valence: Valence::Optional };
548+
let name = label.cloned().unwrap_or_else(|| to_lower_snake_case(&ty));
549+
let field = Field::Node { name, ty, cardinality: Cardinality::Optional };
550550
acc.push(field);
551551
}
552552
Rule::Token(token) => {
553+
assert!(label.is_none());
553554
let mut name = grammar[*token].name.clone();
554555
if name != "int_number" && name != "string" {
555556
if "[]{}()".contains(&name) {
@@ -562,44 +563,33 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
562563
Rule::Rep(inner) => {
563564
if let Rule::Node(node) = &**inner {
564565
let ty = grammar[*node].name.clone();
565-
let name = pluralize(&to_lower_snake_case(&ty));
566-
let field = Field::Node { name, ty, valence: Valence::Many };
566+
let name = label.cloned().unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
567+
let field = Field::Node { name, ty, cardinality: Cardinality::Many };
567568
acc.push(field);
568569
return;
569570
}
570571
todo!("{:?}", rule)
571572
}
572-
Rule::Labeled { label, rule } => {
573-
let node = match &**rule {
574-
Rule::Rep(inner) | Rule::Opt(inner) => match &**inner {
575-
Rule::Node(node) => node,
576-
_ => todo!("{:?}", rule),
577-
},
578-
Rule::Node(node) => node,
579-
_ => todo!("{:?}", rule),
580-
};
581-
let ty = grammar[*node].name.clone();
582-
let field = Field::Node {
583-
name: label.clone(),
584-
ty,
585-
valence: match &**rule {
586-
Rule::Rep(_) => Valence::Many,
587-
_ => Valence::Optional,
588-
},
589-
};
590-
acc.push(field);
573+
Rule::Labeled { label: l, rule } => {
574+
assert!(label.is_none());
575+
lower_rule(acc, grammar, Some(l), rule);
591576
}
592577
Rule::Seq(rules) | Rule::Alt(rules) => {
593578
for rule in rules {
594-
lower_rule(acc, grammar, rule)
579+
lower_rule(acc, grammar, label, rule)
595580
}
596581
}
597-
Rule::Opt(rule) => lower_rule(acc, grammar, rule),
582+
Rule::Opt(rule) => lower_rule(acc, grammar, label, rule),
598583
}
599584
}
600585

601586
// (T (',' T)* ','?)
602-
fn lower_comma_list(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) -> bool {
587+
fn lower_comma_list(
588+
acc: &mut Vec<Field>,
589+
grammar: &Grammar,
590+
label: Option<&String>,
591+
rule: &Rule,
592+
) -> bool {
603593
let rule = match rule {
604594
Rule::Seq(it) => it,
605595
_ => return false,
@@ -619,8 +609,8 @@ fn lower_comma_list(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) -> boo
619609
_ => return false,
620610
}
621611
let ty = grammar[*node].name.clone();
622-
let name = pluralize(&to_lower_snake_case(&ty));
623-
let field = Field::Node { name, ty, valence: Valence::Many };
612+
let name = label.cloned().unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));
613+
let field = Field::Node { name, ty, cardinality: Cardinality::Many };
624614
acc.push(field);
625615
true
626616
}
@@ -656,7 +646,7 @@ fn extract_enums(ast: &mut AstSrc) {
656646
node.remove_field(to_remove);
657647
let ty = enm.name.clone();
658648
let name = to_lower_snake_case(&ty);
659-
node.fields.push(Field::Node { name, ty, valence: Valence::Optional });
649+
node.fields.push(Field::Node { name, ty, cardinality: Cardinality::Optional });
660650
}
661651
}
662652
}

xtask/src/codegen/rust.ungram

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,21 @@ StructDef =
8383
)
8484

8585
RecordFieldList =
86-
'{' fields:RecordField* '}'
86+
'{' fields:(RecordField (',' RecordField)* ','?)? '}'
8787

8888
RecordField =
8989
Attr* Visibility? Name ':' ascribed_type:TypeRef
9090

9191
TupleFieldList =
92-
'(' fields:TupleField* ')'
92+
'(' fields:(TupleField (',' TupleField)* ','?)? ')'
9393

9494
TupleField =
95-
Attr* Visibility? Name TypeRef
95+
Attr* Visibility? TypeRef
9696

9797
FieldList =
9898
RecordFieldList
9999
| TupleFieldList
100100

101-
102101
UnionDef =
103102
Attr* Visibility? 'union' Name GenericParamList? WhereClause?
104103
RecordFieldList

0 commit comments

Comments
 (0)