Skip to content

Commit 2e7d2c2

Browse files
committed
Parse trait alias as a distinct AST type
1 parent 9b441b9 commit 2e7d2c2

File tree

11 files changed

+103
-10
lines changed

11 files changed

+103
-10
lines changed

crates/hir-def/src/item_tree/lower.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ impl<'a> Ctx<'a> {
110110
ast::Item::Const(ast) => self.lower_const(ast).into(),
111111
ast::Item::Module(ast) => self.lower_module(ast)?.into(),
112112
ast::Item::Trait(ast) => self.lower_trait(ast)?.into(),
113+
ast::Item::TraitAlias(_) => return None,
113114
ast::Item::Impl(ast) => self.lower_impl(ast)?.into(),
114115
ast::Item::Use(ast) => self.lower_use(ast)?.into(),
115116
ast::Item::ExternCrate(ast) => self.lower_extern_crate(ast)?.into(),

crates/parser/src/grammar/items/traits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub(super) fn trait_(p: &mut Parser<'_>, m: Marker) {
2020
// trait Z<U> = where Self: T<U>;
2121
generic_params::opt_where_clause(p);
2222
p.expect(T![;]);
23-
m.complete(p, TRAIT);
23+
m.complete(p, TRAIT_ALIAS);
2424
return;
2525
}
2626

crates/parser/src/syntax_kind/generated.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ pub enum SyntaxKind {
135135
STATIC,
136136
CONST,
137137
TRAIT,
138+
TRAIT_ALIAS,
138139
IMPL,
139140
TYPE_ALIAS,
140141
MACRO_CALL,

crates/parser/test_data/parser/inline/ok/0151_trait_alias.rast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
SOURCE_FILE
2-
TRAIT
2+
TRAIT_ALIAS
33
TRAIT_KW "trait"
44
WHITESPACE " "
55
NAME

crates/parser/test_data/parser/inline/ok/0177_trait_alias_where_clause.rast

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
SOURCE_FILE
2-
TRAIT
2+
TRAIT_ALIAS
33
TRAIT_KW "trait"
44
WHITESPACE " "
55
NAME
@@ -50,7 +50,7 @@ SOURCE_FILE
5050
IDENT "Copy"
5151
SEMICOLON ";"
5252
WHITESPACE "\n"
53-
TRAIT
53+
TRAIT_ALIAS
5454
TRAIT_KW "trait"
5555
WHITESPACE " "
5656
NAME

crates/syntax/rust.ungram

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ Item =
9797
| Static
9898
| Struct
9999
| Trait
100+
| TraitAlias
100101
| TypeAlias
101102
| Union
102103
| Use
@@ -240,10 +241,11 @@ Trait =
240241
Attr* Visibility?
241242
'unsafe'? 'auto'?
242243
'trait' Name GenericParamList?
243-
(
244-
(':' TypeBoundList?)? WhereClause? AssocItemList
245-
| '=' TypeBoundList? WhereClause? ';'
246-
)
244+
(':' TypeBoundList?)? WhereClause? AssocItemList
245+
246+
TraitAlias =
247+
Attr* Visibility?
248+
'trait' Name GenericParamList? '=' TypeBoundList? WhereClause? ';'
247249

248250
AssocItemList =
249251
'{' Attr* AssocItem* '}'

crates/syntax/src/ast.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ pub use self::{
2525
generated::{nodes::*, tokens::*},
2626
node_ext::{
2727
AttrKind, FieldKind, Macro, NameLike, NameOrNameRef, PathSegmentKind, SelfParamKind,
28-
SlicePatComponents, StructKind, TypeBoundKind, TypeOrConstParam, VisibilityKind,
28+
SlicePatComponents, StructKind, TraitOrAlias, TypeBoundKind, TypeOrConstParam,
29+
VisibilityKind,
2930
},
3031
operators::{ArithOp, BinaryOp, CmpOp, LogicOp, Ordering, RangeOp, UnaryOp},
3132
token_ext::{CommentKind, CommentPlacement, CommentShape, IsString, QuoteOffsets, Radix},

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,21 @@ impl Trait {
407407
pub fn auto_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![auto]) }
408408
pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) }
409409
pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
410+
}
411+
412+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
413+
pub struct TraitAlias {
414+
pub(crate) syntax: SyntaxNode,
415+
}
416+
impl ast::HasAttrs for TraitAlias {}
417+
impl ast::HasName for TraitAlias {}
418+
impl ast::HasVisibility for TraitAlias {}
419+
impl ast::HasGenericParams for TraitAlias {}
420+
impl ast::HasDocComments for TraitAlias {}
421+
impl TraitAlias {
422+
pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) }
410423
pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
424+
pub fn type_bound_list(&self) -> Option<TypeBoundList> { support::child(&self.syntax) }
411425
pub fn semicolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }
412426
}
413427

@@ -1573,6 +1587,7 @@ pub enum Item {
15731587
Static(Static),
15741588
Struct(Struct),
15751589
Trait(Trait),
1590+
TraitAlias(TraitAlias),
15761591
TypeAlias(TypeAlias),
15771592
Union(Union),
15781593
Use(Use),
@@ -2058,6 +2073,17 @@ impl AstNode for Trait {
20582073
}
20592074
fn syntax(&self) -> &SyntaxNode { &self.syntax }
20602075
}
2076+
impl AstNode for TraitAlias {
2077+
fn can_cast(kind: SyntaxKind) -> bool { kind == TRAIT_ALIAS }
2078+
fn cast(syntax: SyntaxNode) -> Option<Self> {
2079+
if Self::can_cast(syntax.kind()) {
2080+
Some(Self { syntax })
2081+
} else {
2082+
None
2083+
}
2084+
}
2085+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2086+
}
20612087
impl AstNode for TypeAlias {
20622088
fn can_cast(kind: SyntaxKind) -> bool { kind == TYPE_ALIAS }
20632089
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3570,6 +3596,9 @@ impl From<Struct> for Item {
35703596
impl From<Trait> for Item {
35713597
fn from(node: Trait) -> Item { Item::Trait(node) }
35723598
}
3599+
impl From<TraitAlias> for Item {
3600+
fn from(node: TraitAlias) -> Item { Item::TraitAlias(node) }
3601+
}
35733602
impl From<TypeAlias> for Item {
35743603
fn from(node: TypeAlias) -> Item { Item::TypeAlias(node) }
35753604
}
@@ -3596,6 +3625,7 @@ impl AstNode for Item {
35963625
| STATIC
35973626
| STRUCT
35983627
| TRAIT
3628+
| TRAIT_ALIAS
35993629
| TYPE_ALIAS
36003630
| UNION
36013631
| USE
@@ -3616,6 +3646,7 @@ impl AstNode for Item {
36163646
STATIC => Item::Static(Static { syntax }),
36173647
STRUCT => Item::Struct(Struct { syntax }),
36183648
TRAIT => Item::Trait(Trait { syntax }),
3649+
TRAIT_ALIAS => Item::TraitAlias(TraitAlias { syntax }),
36193650
TYPE_ALIAS => Item::TypeAlias(TypeAlias { syntax }),
36203651
UNION => Item::Union(Union { syntax }),
36213652
USE => Item::Use(Use { syntax }),
@@ -3638,6 +3669,7 @@ impl AstNode for Item {
36383669
Item::Static(it) => &it.syntax,
36393670
Item::Struct(it) => &it.syntax,
36403671
Item::Trait(it) => &it.syntax,
3672+
Item::TraitAlias(it) => &it.syntax,
36413673
Item::TypeAlias(it) => &it.syntax,
36423674
Item::Union(it) => &it.syntax,
36433675
Item::Use(it) => &it.syntax,
@@ -3950,6 +3982,7 @@ impl AstNode for AnyHasAttrs {
39503982
| STATIC
39513983
| STRUCT
39523984
| TRAIT
3985+
| TRAIT_ALIAS
39533986
| TYPE_ALIAS
39543987
| UNION
39553988
| USE
@@ -4035,6 +4068,7 @@ impl AstNode for AnyHasDocComments {
40354068
| STATIC
40364069
| STRUCT
40374070
| TRAIT
4071+
| TRAIT_ALIAS
40384072
| TYPE_ALIAS
40394073
| UNION
40404074
| USE
@@ -4056,7 +4090,7 @@ impl AnyHasGenericParams {
40564090
}
40574091
impl AstNode for AnyHasGenericParams {
40584092
fn can_cast(kind: SyntaxKind) -> bool {
4059-
matches!(kind, ENUM | FN | IMPL | STRUCT | TRAIT | TYPE_ALIAS | UNION)
4093+
matches!(kind, ENUM | FN | IMPL | STRUCT | TRAIT | TRAIT_ALIAS | TYPE_ALIAS | UNION)
40604094
}
40614095
fn cast(syntax: SyntaxNode) -> Option<Self> {
40624096
Self::can_cast(syntax.kind()).then_some(AnyHasGenericParams { syntax })
@@ -4108,6 +4142,7 @@ impl AstNode for AnyHasName {
41084142
| STATIC
41094143
| STRUCT
41104144
| TRAIT
4145+
| TRAIT_ALIAS
41114146
| TYPE_ALIAS
41124147
| UNION
41134148
| RENAME
@@ -4163,6 +4198,7 @@ impl AstNode for AnyHasVisibility {
41634198
| STATIC
41644199
| STRUCT
41654200
| TRAIT
4201+
| TRAIT_ALIAS
41664202
| TYPE_ALIAS
41674203
| UNION
41684204
| USE
@@ -4391,6 +4427,11 @@ impl std::fmt::Display for Trait {
43914427
std::fmt::Display::fmt(self.syntax(), f)
43924428
}
43934429
}
4430+
impl std::fmt::Display for TraitAlias {
4431+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4432+
std::fmt::Display::fmt(self.syntax(), f)
4433+
}
4434+
}
43944435
impl std::fmt::Display for TypeAlias {
43954436
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43964437
std::fmt::Display::fmt(self.syntax(), f)

crates/syntax/src/ast/node_ext.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,51 @@ impl TypeOrConstParam {
680680
}
681681
}
682682

683+
#[derive(Debug, Clone)]
684+
pub enum TraitOrAlias {
685+
Trait(ast::Trait),
686+
TraitAlias(ast::TraitAlias),
687+
}
688+
689+
impl TraitOrAlias {
690+
pub fn name(&self) -> Option<ast::Name> {
691+
match self {
692+
TraitOrAlias::Trait(x) => x.name(),
693+
TraitOrAlias::TraitAlias(x) => x.name(),
694+
}
695+
}
696+
}
697+
698+
impl AstNode for TraitOrAlias {
699+
fn can_cast(kind: SyntaxKind) -> bool
700+
where
701+
Self: Sized,
702+
{
703+
matches!(kind, SyntaxKind::TRAIT | SyntaxKind::TRAIT_ALIAS)
704+
}
705+
706+
fn cast(syntax: SyntaxNode) -> Option<Self>
707+
where
708+
Self: Sized,
709+
{
710+
let res = match syntax.kind() {
711+
SyntaxKind::TRAIT => TraitOrAlias::Trait(ast::Trait { syntax }),
712+
SyntaxKind::TRAIT_ALIAS => TraitOrAlias::TraitAlias(ast::TraitAlias { syntax }),
713+
_ => return None,
714+
};
715+
Some(res)
716+
}
717+
718+
fn syntax(&self) -> &SyntaxNode {
719+
match self {
720+
TraitOrAlias::Trait(it) => it.syntax(),
721+
TraitOrAlias::TraitAlias(it) => it.syntax(),
722+
}
723+
}
724+
}
725+
726+
impl HasAttrs for TraitOrAlias {}
727+
683728
pub enum VisibilityKind {
684729
In(ast::Path),
685730
PubCrate,

crates/syntax/src/tests/ast_src.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ pub(crate) const KINDS_SRC: KindsSrc<'_> = KindsSrc {
8686
"STATIC",
8787
"CONST",
8888
"TRAIT",
89+
"TRAIT_ALIAS",
8990
"IMPL",
9091
"TYPE_ALIAS",
9192
"MACRO_CALL",

0 commit comments

Comments
 (0)