Skip to content

Commit bc8610e

Browse files
bors[bot]matklad
andauthored
Merge #5608
5608: Introduce GenericParam r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents af8132e + 3dce34a commit bc8610e

File tree

5 files changed

+170
-103
lines changed

5 files changed

+170
-103
lines changed

crates/ra_parser/src/syntax_kind/generated.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ pub enum SyntaxKind {
231231
LET_STMT,
232232
EXPR_STMT,
233233
GENERIC_PARAM_LIST,
234+
GENERIC_PARAM,
234235
LIFETIME_PARAM,
235236
TYPE_PARAM,
236237
CONST_PARAM,

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

Lines changed: 128 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,7 @@ pub struct GenericParamList {
312312
}
313313
impl GenericParamList {
314314
pub fn l_angle_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<]) }
315-
pub fn type_params(&self) -> AstChildren<TypeParam> { support::children(&self.syntax) }
316-
pub fn lifetime_params(&self) -> AstChildren<LifetimeParam> { support::children(&self.syntax) }
317-
pub fn const_params(&self) -> AstChildren<ConstParam> { support::children(&self.syntax) }
315+
pub fn generic_params(&self) -> AstChildren<GenericParam> { support::children(&self.syntax) }
318316
pub fn r_angle_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>]) }
319317
}
320318
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -470,6 +468,40 @@ impl ExternItemList {
470468
pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
471469
}
472470
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
471+
pub struct LifetimeParam {
472+
pub(crate) syntax: SyntaxNode,
473+
}
474+
impl ast::AttrsOwner for LifetimeParam {}
475+
impl LifetimeParam {
476+
pub fn lifetime_token(&self) -> Option<SyntaxToken> {
477+
support::token(&self.syntax, T![lifetime])
478+
}
479+
}
480+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
481+
pub struct TypeParam {
482+
pub(crate) syntax: SyntaxNode,
483+
}
484+
impl ast::AttrsOwner for TypeParam {}
485+
impl ast::NameOwner for TypeParam {}
486+
impl ast::TypeBoundsOwner for TypeParam {}
487+
impl TypeParam {
488+
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
489+
pub fn default_type(&self) -> Option<TypeRef> { support::child(&self.syntax) }
490+
}
491+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
492+
pub struct ConstParam {
493+
pub(crate) syntax: SyntaxNode,
494+
}
495+
impl ast::AttrsOwner for ConstParam {}
496+
impl ast::NameOwner for ConstParam {}
497+
impl ast::TypeAscriptionOwner for ConstParam {}
498+
impl ConstParam {
499+
pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
500+
pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
501+
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
502+
pub fn default_val(&self) -> Option<Expr> { support::child(&self.syntax) }
503+
}
504+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
473505
pub struct ParenType {
474506
pub(crate) syntax: SyntaxNode,
475507
}
@@ -1133,40 +1165,6 @@ impl MacroStmts {
11331165
pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
11341166
}
11351167
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1136-
pub struct TypeParam {
1137-
pub(crate) syntax: SyntaxNode,
1138-
}
1139-
impl ast::AttrsOwner for TypeParam {}
1140-
impl ast::NameOwner for TypeParam {}
1141-
impl ast::TypeBoundsOwner for TypeParam {}
1142-
impl TypeParam {
1143-
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
1144-
pub fn default_type(&self) -> Option<TypeRef> { support::child(&self.syntax) }
1145-
}
1146-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1147-
pub struct LifetimeParam {
1148-
pub(crate) syntax: SyntaxNode,
1149-
}
1150-
impl ast::AttrsOwner for LifetimeParam {}
1151-
impl LifetimeParam {
1152-
pub fn lifetime_token(&self) -> Option<SyntaxToken> {
1153-
support::token(&self.syntax, T![lifetime])
1154-
}
1155-
}
1156-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1157-
pub struct ConstParam {
1158-
pub(crate) syntax: SyntaxNode,
1159-
}
1160-
impl ast::AttrsOwner for ConstParam {}
1161-
impl ast::NameOwner for ConstParam {}
1162-
impl ast::TypeAscriptionOwner for ConstParam {}
1163-
impl ConstParam {
1164-
pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
1165-
pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
1166-
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
1167-
pub fn default_val(&self) -> Option<Expr> { support::child(&self.syntax) }
1168-
}
1169-
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
11701168
pub struct TypeBound {
11711169
pub(crate) syntax: SyntaxNode,
11721170
}
@@ -1383,6 +1381,13 @@ pub enum ExternItem {
13831381
impl ast::AttrsOwner for ExternItem {}
13841382
impl ast::NameOwner for ExternItem {}
13851383
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1384+
pub enum GenericParam {
1385+
LifetimeParam(LifetimeParam),
1386+
TypeParam(TypeParam),
1387+
ConstParam(ConstParam),
1388+
}
1389+
impl ast::AttrsOwner for GenericParam {}
1390+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
13861391
pub enum Stmt {
13871392
LetStmt(LetStmt),
13881393
ExprStmt(ExprStmt),
@@ -1854,6 +1859,39 @@ impl AstNode for ExternItemList {
18541859
}
18551860
fn syntax(&self) -> &SyntaxNode { &self.syntax }
18561861
}
1862+
impl AstNode for LifetimeParam {
1863+
fn can_cast(kind: SyntaxKind) -> bool { kind == LIFETIME_PARAM }
1864+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1865+
if Self::can_cast(syntax.kind()) {
1866+
Some(Self { syntax })
1867+
} else {
1868+
None
1869+
}
1870+
}
1871+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1872+
}
1873+
impl AstNode for TypeParam {
1874+
fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_PARAM }
1875+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1876+
if Self::can_cast(syntax.kind()) {
1877+
Some(Self { syntax })
1878+
} else {
1879+
None
1880+
}
1881+
}
1882+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1883+
}
1884+
impl AstNode for ConstParam {
1885+
fn can_cast(kind: SyntaxKind) -> bool { kind == CONST_PARAM }
1886+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1887+
if Self::can_cast(syntax.kind()) {
1888+
Some(Self { syntax })
1889+
} else {
1890+
None
1891+
}
1892+
}
1893+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1894+
}
18571895
impl AstNode for ParenType {
18581896
fn can_cast(kind: SyntaxKind) -> bool { kind == PAREN_TYPE }
18591897
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2635,39 +2673,6 @@ impl AstNode for MacroStmts {
26352673
}
26362674
fn syntax(&self) -> &SyntaxNode { &self.syntax }
26372675
}
2638-
impl AstNode for TypeParam {
2639-
fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_PARAM }
2640-
fn cast(syntax: SyntaxNode) -> Option<Self> {
2641-
if Self::can_cast(syntax.kind()) {
2642-
Some(Self { syntax })
2643-
} else {
2644-
None
2645-
}
2646-
}
2647-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2648-
}
2649-
impl AstNode for LifetimeParam {
2650-
fn can_cast(kind: SyntaxKind) -> bool { kind == LIFETIME_PARAM }
2651-
fn cast(syntax: SyntaxNode) -> Option<Self> {
2652-
if Self::can_cast(syntax.kind()) {
2653-
Some(Self { syntax })
2654-
} else {
2655-
None
2656-
}
2657-
}
2658-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2659-
}
2660-
impl AstNode for ConstParam {
2661-
fn can_cast(kind: SyntaxKind) -> bool { kind == CONST_PARAM }
2662-
fn cast(syntax: SyntaxNode) -> Option<Self> {
2663-
if Self::can_cast(syntax.kind()) {
2664-
Some(Self { syntax })
2665-
} else {
2666-
None
2667-
}
2668-
}
2669-
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2670-
}
26712676
impl AstNode for TypeBound {
26722677
fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_BOUND }
26732678
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3325,6 +3330,39 @@ impl AstNode for ExternItem {
33253330
}
33263331
}
33273332
}
3333+
impl From<LifetimeParam> for GenericParam {
3334+
fn from(node: LifetimeParam) -> GenericParam { GenericParam::LifetimeParam(node) }
3335+
}
3336+
impl From<TypeParam> for GenericParam {
3337+
fn from(node: TypeParam) -> GenericParam { GenericParam::TypeParam(node) }
3338+
}
3339+
impl From<ConstParam> for GenericParam {
3340+
fn from(node: ConstParam) -> GenericParam { GenericParam::ConstParam(node) }
3341+
}
3342+
impl AstNode for GenericParam {
3343+
fn can_cast(kind: SyntaxKind) -> bool {
3344+
match kind {
3345+
LIFETIME_PARAM | TYPE_PARAM | CONST_PARAM => true,
3346+
_ => false,
3347+
}
3348+
}
3349+
fn cast(syntax: SyntaxNode) -> Option<Self> {
3350+
let res = match syntax.kind() {
3351+
LIFETIME_PARAM => GenericParam::LifetimeParam(LifetimeParam { syntax }),
3352+
TYPE_PARAM => GenericParam::TypeParam(TypeParam { syntax }),
3353+
CONST_PARAM => GenericParam::ConstParam(ConstParam { syntax }),
3354+
_ => return None,
3355+
};
3356+
Some(res)
3357+
}
3358+
fn syntax(&self) -> &SyntaxNode {
3359+
match self {
3360+
GenericParam::LifetimeParam(it) => &it.syntax,
3361+
GenericParam::TypeParam(it) => &it.syntax,
3362+
GenericParam::ConstParam(it) => &it.syntax,
3363+
}
3364+
}
3365+
}
33283366
impl From<LetStmt> for Stmt {
33293367
fn from(node: LetStmt) -> Stmt { Stmt::LetStmt(node) }
33303368
}
@@ -3449,6 +3487,11 @@ impl std::fmt::Display for ExternItem {
34493487
std::fmt::Display::fmt(self.syntax(), f)
34503488
}
34513489
}
3490+
impl std::fmt::Display for GenericParam {
3491+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3492+
std::fmt::Display::fmt(self.syntax(), f)
3493+
}
3494+
}
34523495
impl std::fmt::Display for Stmt {
34533496
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34543497
std::fmt::Display::fmt(self.syntax(), f)
@@ -3669,6 +3712,21 @@ impl std::fmt::Display for ExternItemList {
36693712
std::fmt::Display::fmt(self.syntax(), f)
36703713
}
36713714
}
3715+
impl std::fmt::Display for LifetimeParam {
3716+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3717+
std::fmt::Display::fmt(self.syntax(), f)
3718+
}
3719+
}
3720+
impl std::fmt::Display for TypeParam {
3721+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3722+
std::fmt::Display::fmt(self.syntax(), f)
3723+
}
3724+
}
3725+
impl std::fmt::Display for ConstParam {
3726+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3727+
std::fmt::Display::fmt(self.syntax(), f)
3728+
}
3729+
}
36723730
impl std::fmt::Display for ParenType {
36733731
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36743732
std::fmt::Display::fmt(self.syntax(), f)
@@ -4024,21 +4082,6 @@ impl std::fmt::Display for MacroStmts {
40244082
std::fmt::Display::fmt(self.syntax(), f)
40254083
}
40264084
}
4027-
impl std::fmt::Display for TypeParam {
4028-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4029-
std::fmt::Display::fmt(self.syntax(), f)
4030-
}
4031-
}
4032-
impl std::fmt::Display for LifetimeParam {
4033-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4034-
std::fmt::Display::fmt(self.syntax(), f)
4035-
}
4036-
}
4037-
impl std::fmt::Display for ConstParam {
4038-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4039-
std::fmt::Display::fmt(self.syntax(), f)
4040-
}
4041-
}
40424085
impl std::fmt::Display for TypeBound {
40434086
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40444087
std::fmt::Display::fmt(self.syntax(), f)

crates/ra_syntax/src/ast/node_ext.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,27 @@ impl ast::TokenTree {
473473
}
474474
}
475475

476+
impl ast::GenericParamList {
477+
pub fn lifetime_params(&self) -> impl Iterator<Item = ast::LifetimeParam> {
478+
self.generic_params().filter_map(|param| match param {
479+
ast::GenericParam::LifetimeParam(it) => Some(it),
480+
ast::GenericParam::TypeParam(_) | ast::GenericParam::ConstParam(_) => None,
481+
})
482+
}
483+
pub fn type_params(&self) -> impl Iterator<Item = ast::TypeParam> {
484+
self.generic_params().filter_map(|param| match param {
485+
ast::GenericParam::TypeParam(it) => Some(it),
486+
ast::GenericParam::LifetimeParam(_) | ast::GenericParam::ConstParam(_) => None,
487+
})
488+
}
489+
pub fn const_params(&self) -> impl Iterator<Item = ast::ConstParam> {
490+
self.generic_params().filter_map(|param| match param {
491+
ast::GenericParam::ConstParam(it) => Some(it),
492+
ast::GenericParam::TypeParam(_) | ast::GenericParam::LifetimeParam(_) => None,
493+
})
494+
}
495+
}
496+
476497
impl ast::DocCommentsOwner for ast::SourceFile {}
477498
impl ast::DocCommentsOwner for ast::Fn {}
478499
impl ast::DocCommentsOwner for ast::Struct {}

xtask/src/ast_src.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
204204
"LET_STMT",
205205
"EXPR_STMT",
206206
"GENERIC_PARAM_LIST",
207+
"GENERIC_PARAM",
207208
"LIFETIME_PARAM",
208209
"TYPE_PARAM",
209210
"CONST_PARAM",

xtask/src/codegen/rust.ungram

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,25 @@ ExternItemList =
154154
ExternItem =
155155
Fn | Static | MacroCall
156156

157+
GenericParamList =
158+
'<' (GenericParam (',' GenericParam)* ','?)? '>'
159+
160+
GenericParam =
161+
LifetimeParam
162+
| TypeParam
163+
| ConstParam
164+
165+
TypeParam =
166+
Attr* Name (':' TypeBoundList?)?
167+
('=' default_type:TypeRef)?
168+
169+
ConstParam =
170+
Attr* 'const' Name ':' ascribed_type:TypeRef
171+
('=' default_val:Expr)?
172+
173+
LifetimeParam =
174+
Attr* 'lifetime'
175+
157176
ParenType =
158177
'(' TypeRef ')'
159178

@@ -400,24 +419,6 @@ MacroStmts =
400419
Attr =
401420
'#' '!'? '[' Path ('=' input:AttrInput)? ']'
402421

403-
GenericParamList =
404-
'<'
405-
TypeParam*
406-
LifetimeParam*
407-
ConstParam*
408-
'>'
409-
410-
TypeParam =
411-
Attr* Name (':' TypeBoundList?)?
412-
('=' default_type:TypeRef)?
413-
414-
ConstParam =
415-
Attr* 'const' Name ':' ascribed_type:TypeRef
416-
('=' default_val:Expr)?
417-
418-
LifetimeParam =
419-
Attr* 'lifetime'
420-
421422
TypeBound =
422423
'lifetime' | 'const'? TypeRef
423424

0 commit comments

Comments
 (0)