aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/assists/src/handlers/generate_impl.rs2
-rw-r--r--crates/assists/src/handlers/generate_new.rs2
-rw-r--r--crates/assists/src/handlers/introduce_named_lifetime.rs21
-rw-r--r--crates/hir/src/semantics.rs17
-rw-r--r--crates/hir_def/src/body/lower.rs24
-rw-r--r--crates/hir_def/src/generics.rs9
-rw-r--r--crates/hir_def/src/item_tree/lower.rs4
-rw-r--r--crates/hir_def/src/path/lower.rs4
-rw-r--r--crates/hir_def/src/type_ref.rs10
-rw-r--r--crates/hir_expand/src/name.rs5
-rw-r--r--crates/ide/src/extend_selection.rs2
-rw-r--r--crates/mbe/src/mbe_expander/matcher.rs2
-rw-r--r--crates/mbe/src/subtree_source.rs8
-rw-r--r--crates/mbe/src/syntax_bridge.rs4
-rw-r--r--crates/parser/src/grammar.rs7
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs16
-rw-r--r--crates/parser/src/grammar/items/traits.rs10
-rw-r--r--crates/parser/src/grammar/params.rs13
-rw-r--r--crates/parser/src/grammar/type_args.rs4
-rw-r--r--crates/parser/src/grammar/type_params.rs18
-rw-r--r--crates/parser/src/grammar/types.rs4
-rw-r--r--crates/parser/src/syntax_kind/generated.rs5
-rw-r--r--crates/syntax/src/ast.rs2
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs62
-rw-r--r--crates/syntax/src/ast/node_ext.rs12
-rw-r--r--crates/syntax/src/parsing/lexer.rs4
-rw-r--r--crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.rs (renamed from crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.rs)0
-rw-r--r--crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.txt (renamed from crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.txt)4
-rw-r--r--crates/syntax/test_data/lexer/ok/0007_lifetimes.txt8
-rw-r--r--crates/syntax/test_data/parser/err/0024_many_type_parens.rast22
-rw-r--r--crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast3
-rw-r--r--crates/syntax/test_data/parser/err/0043_weird_blocks.rast3
-rw-r--r--crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast45
-rw-r--r--crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast9
-rw-r--r--crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0006_self_param.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0007_type_param_bounds.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0028_impl_trait_type.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0033_reference_type;.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0039_type_arg.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast18
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0065_dyn_trait_type.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0081_for_type.rast15
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0109_label.rast9
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0122_generic_lifetime_type_attribute.rast6
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast3
-rw-r--r--crates/syntax/test_data/parser/ok/0018_struct_type_params.rast51
-rw-r--r--crates/syntax/test_data/parser/ok/0020_type_param_bounds.rast42
-rw-r--r--crates/syntax/test_data/parser/ok/0032_where_for.rast6
-rw-r--r--crates/syntax/test_data/parser/ok/0033_label_break.rast21
-rw-r--r--crates/syntax/test_data/parser/ok/0035_weird_exprs.rast19
-rw-r--r--crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast18
-rw-r--r--crates/syntax/test_data/parser/ok/0067_where_for_pred.rast45
-rw-r--r--crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast9
59 files changed, 413 insertions, 268 deletions
diff --git a/crates/assists/src/handlers/generate_impl.rs b/crates/assists/src/handlers/generate_impl.rs
index 114974465..960af5ab3 100644
--- a/crates/assists/src/handlers/generate_impl.rs
+++ b/crates/assists/src/handlers/generate_impl.rs
@@ -53,7 +53,7 @@ pub(crate) fn generate_impl(acc: &mut Assists, ctx: &AssistContext) -> Option<()
53 if let Some(type_params) = type_params { 53 if let Some(type_params) = type_params {
54 let lifetime_params = type_params 54 let lifetime_params = type_params
55 .lifetime_params() 55 .lifetime_params()
56 .filter_map(|it| it.lifetime_token()) 56 .filter_map(|it| it.lifetime())
57 .map(|it| it.text().clone()); 57 .map(|it| it.text().clone());
58 let type_params = type_params 58 let type_params = type_params
59 .type_params() 59 .type_params()
diff --git a/crates/assists/src/handlers/generate_new.rs b/crates/assists/src/handlers/generate_new.rs
index 7db10f276..c5fec4e0a 100644
--- a/crates/assists/src/handlers/generate_new.rs
+++ b/crates/assists/src/handlers/generate_new.rs
@@ -99,7 +99,7 @@ fn generate_impl_text(strukt: &ast::Struct, code: &str) -> String {
99 if let Some(type_params) = type_params { 99 if let Some(type_params) = type_params {
100 let lifetime_params = type_params 100 let lifetime_params = type_params
101 .lifetime_params() 101 .lifetime_params()
102 .filter_map(|it| it.lifetime_token()) 102 .filter_map(|it| it.lifetime())
103 .map(|it| it.text().clone()); 103 .map(|it| it.text().clone());
104 let type_params = 104 let type_params =
105 type_params.type_params().filter_map(|it| it.name()).map(|it| it.text().clone()); 105 type_params.type_params().filter_map(|it| it.name()).map(|it| it.text().clone());
diff --git a/crates/assists/src/handlers/introduce_named_lifetime.rs b/crates/assists/src/handlers/introduce_named_lifetime.rs
index 4cc8dae65..ab8fe3ea9 100644
--- a/crates/assists/src/handlers/introduce_named_lifetime.rs
+++ b/crates/assists/src/handlers/introduce_named_lifetime.rs
@@ -1,7 +1,7 @@
1use rustc_hash::FxHashSet; 1use rustc_hash::FxHashSet;
2use syntax::{ 2use syntax::{
3 ast::{self, GenericParamsOwner, NameOwner}, 3 ast::{self, GenericParamsOwner, NameOwner},
4 AstNode, SyntaxKind, TextRange, TextSize, 4 AstNode, TextRange, TextSize,
5}; 5};
6 6
7use crate::{assist_context::AssistBuilder, AssistContext, AssistId, AssistKind, Assists}; 7use crate::{assist_context::AssistBuilder, AssistContext, AssistId, AssistKind, Assists};
@@ -35,13 +35,12 @@ static ASSIST_LABEL: &str = "Introduce named lifetime";
35// FIXME: How can we handle renaming any one of multiple anonymous lifetimes? 35// FIXME: How can we handle renaming any one of multiple anonymous lifetimes?
36// FIXME: should also add support for the case fun(f: &Foo) -> &<|>Foo 36// FIXME: should also add support for the case fun(f: &Foo) -> &<|>Foo
37pub(crate) fn introduce_named_lifetime(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { 37pub(crate) fn introduce_named_lifetime(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
38 let lifetime_token = ctx 38 let lifetime =
39 .find_token_syntax_at_offset(SyntaxKind::LIFETIME) 39 ctx.find_node_at_offset::<ast::Lifetime>().filter(|lifetime| lifetime.text() == "'_")?;
40 .filter(|lifetime| lifetime.text() == "'_")?; 40 if let Some(fn_def) = lifetime.syntax().ancestors().find_map(ast::Fn::cast) {
41 if let Some(fn_def) = lifetime_token.ancestors().find_map(ast::Fn::cast) { 41 generate_fn_def_assist(acc, &fn_def, lifetime.lifetime_ident_token()?.text_range())
42 generate_fn_def_assist(acc, &fn_def, lifetime_token.text_range()) 42 } else if let Some(impl_def) = lifetime.syntax().ancestors().find_map(ast::Impl::cast) {
43 } else if let Some(impl_def) = lifetime_token.ancestors().find_map(ast::Impl::cast) { 43 generate_impl_def_assist(acc, &impl_def, lifetime.lifetime_ident_token()?.text_range())
44 generate_impl_def_assist(acc, &impl_def, lifetime_token.text_range())
45 } else { 44 } else {
46 None 45 None
47 } 46 }
@@ -58,7 +57,7 @@ fn generate_fn_def_assist(
58 let end_of_fn_ident = fn_def.name()?.ident_token()?.text_range().end(); 57 let end_of_fn_ident = fn_def.name()?.ident_token()?.text_range().end();
59 let self_param = 58 let self_param =
60 // use the self if it's a reference and has no explicit lifetime 59 // use the self if it's a reference and has no explicit lifetime
61 param_list.self_param().filter(|p| p.lifetime_token().is_none() && p.amp_token().is_some()); 60 param_list.self_param().filter(|p| p.lifetime().is_none() && p.amp_token().is_some());
62 // compute the location which implicitly has the same lifetime as the anonymous lifetime 61 // compute the location which implicitly has the same lifetime as the anonymous lifetime
63 let loc_needing_lifetime = if let Some(self_param) = self_param { 62 let loc_needing_lifetime = if let Some(self_param) = self_param {
64 // if we have a self reference, use that 63 // if we have a self reference, use that
@@ -68,9 +67,7 @@ fn generate_fn_def_assist(
68 let fn_params_without_lifetime: Vec<_> = param_list 67 let fn_params_without_lifetime: Vec<_> = param_list
69 .params() 68 .params()
70 .filter_map(|param| match param.ty() { 69 .filter_map(|param| match param.ty() {
71 Some(ast::Type::RefType(ascribed_type)) 70 Some(ast::Type::RefType(ascribed_type)) if ascribed_type.lifetime().is_none() => {
72 if ascribed_type.lifetime_token() == None =>
73 {
74 Some(ascribed_type.amp_token()?.text_range().end()) 71 Some(ascribed_type.amp_token()?.text_range().end())
75 } 72 }
76 _ => None, 73 _ => None,
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 5959ac4ca..ee2074602 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -178,9 +178,8 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> {
178 self.imp.descend_node_at_offset(node, offset).find_map(N::cast) 178 self.imp.descend_node_at_offset(node, offset).find_map(N::cast)
179 } 179 }
180 180
181 // FIXME: Replace the SyntaxToken with a typed ast Node/Token 181 pub fn resolve_lifetime_param(&self, lifetime: &ast::Lifetime) -> Option<LifetimeParam> {
182 pub fn resolve_lifetime_param(&self, lifetime_token: &SyntaxToken) -> Option<LifetimeParam> { 182 self.imp.resolve_lifetime_param(lifetime)
183 self.imp.resolve_lifetime_param(lifetime_token)
184 } 183 }
185 184
186 pub fn type_of_expr(&self, expr: &ast::Expr) -> Option<Type> { 185 pub fn type_of_expr(&self, expr: &ast::Expr) -> Option<Type> {
@@ -402,13 +401,9 @@ impl<'db> SemanticsImpl<'db> {
402 .kmerge_by(|node1, node2| node1.text_range().len() < node2.text_range().len()) 401 .kmerge_by(|node1, node2| node1.text_range().len() < node2.text_range().len())
403 } 402 }
404 403
405 // FIXME: Replace the SyntaxToken with a typed ast Node/Token 404 fn resolve_lifetime_param(&self, lifetime: &ast::Lifetime) -> Option<LifetimeParam> {
406 fn resolve_lifetime_param(&self, lifetime_token: &SyntaxToken) -> Option<LifetimeParam> { 405 let text = lifetime.text();
407 if lifetime_token.kind() != syntax::SyntaxKind::LIFETIME { 406 let lifetime_param = lifetime.syntax().ancestors().find_map(|syn| {
408 return None;
409 }
410 let lifetime_text = lifetime_token.text();
411 let lifetime_param = lifetime_token.parent().ancestors().find_map(|syn| {
412 let gpl = match_ast! { 407 let gpl = match_ast! {
413 match syn { 408 match syn {
414 ast::Fn(it) => it.generic_param_list()?, 409 ast::Fn(it) => it.generic_param_list()?,
@@ -424,7 +419,7 @@ impl<'db> SemanticsImpl<'db> {
424 } 419 }
425 }; 420 };
426 gpl.lifetime_params() 421 gpl.lifetime_params()
427 .find(|tp| tp.lifetime_token().as_ref().map(|lt| lt.text()) == Some(lifetime_text)) 422 .find(|tp| tp.lifetime().as_ref().map(|lt| lt.text()) == Some(text))
428 })?; 423 })?;
429 let src = self.find_file(lifetime_param.syntax().clone()).with_value(lifetime_param); 424 let src = self.find_file(lifetime_param.syntax().clone()).with_value(lifetime_param);
430 ToDef::to_def(self, src) 425 ToDef::to_def(self, src)
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs
index 23e2fd764..3b3d74987 100644
--- a/crates/hir_def/src/body/lower.rs
+++ b/crates/hir_def/src/body/lower.rs
@@ -233,8 +233,7 @@ impl ExprCollector<'_> {
233 let res = self.collect_block(block); 233 let res = self.collect_block(block);
234 match &mut self.body.exprs[res] { 234 match &mut self.body.exprs[res] {
235 Expr::Block { label: block_label, .. } => { 235 Expr::Block { label: block_label, .. } => {
236 *block_label = 236 *block_label = label.lifetime().map(|t| Name::new_lifetime(&t))
237 label.lifetime_token().map(|t| Name::new_lifetime(&t))
238 } 237 }
239 _ => unreachable!(), 238 _ => unreachable!(),
240 } 239 }
@@ -254,10 +253,7 @@ impl ExprCollector<'_> {
254 self.alloc_expr( 253 self.alloc_expr(
255 Expr::Loop { 254 Expr::Loop {
256 body, 255 body,
257 label: e 256 label: e.label().and_then(|l| l.lifetime()).map(|l| Name::new_lifetime(&l)),
258 .label()
259 .and_then(|l| l.lifetime_token())
260 .map(|l| Name::new_lifetime(&l)),
261 }, 257 },
262 syntax_ptr, 258 syntax_ptr,
263 ) 259 )
@@ -288,7 +284,7 @@ impl ExprCollector<'_> {
288 body: match_expr, 284 body: match_expr,
289 label: e 285 label: e
290 .label() 286 .label()
291 .and_then(|l| l.lifetime_token()) 287 .and_then(|l| l.lifetime())
292 .map(|l| Name::new_lifetime(&l)), 288 .map(|l| Name::new_lifetime(&l)),
293 }, 289 },
294 syntax_ptr, 290 syntax_ptr,
@@ -301,10 +297,7 @@ impl ExprCollector<'_> {
301 Expr::While { 297 Expr::While {
302 condition, 298 condition,
303 body, 299 body,
304 label: e 300 label: e.label().and_then(|l| l.lifetime()).map(|l| Name::new_lifetime(&l)),
305 .label()
306 .and_then(|l| l.lifetime_token())
307 .map(|l| Name::new_lifetime(&l)),
308 }, 301 },
309 syntax_ptr, 302 syntax_ptr,
310 ) 303 )
@@ -318,10 +311,7 @@ impl ExprCollector<'_> {
318 iterable, 311 iterable,
319 pat, 312 pat,
320 body, 313 body,
321 label: e 314 label: e.label().and_then(|l| l.lifetime()).map(|l| Name::new_lifetime(&l)),
322 .label()
323 .and_then(|l| l.lifetime_token())
324 .map(|l| Name::new_lifetime(&l)),
325 }, 315 },
326 syntax_ptr, 316 syntax_ptr,
327 ) 317 )
@@ -380,13 +370,13 @@ impl ExprCollector<'_> {
380 self.alloc_expr(path, syntax_ptr) 370 self.alloc_expr(path, syntax_ptr)
381 } 371 }
382 ast::Expr::ContinueExpr(e) => self.alloc_expr( 372 ast::Expr::ContinueExpr(e) => self.alloc_expr(
383 Expr::Continue { label: e.lifetime_token().map(|l| Name::new_lifetime(&l)) }, 373 Expr::Continue { label: e.lifetime().map(|l| Name::new_lifetime(&l)) },
384 syntax_ptr, 374 syntax_ptr,
385 ), 375 ),
386 ast::Expr::BreakExpr(e) => { 376 ast::Expr::BreakExpr(e) => {
387 let expr = e.expr().map(|e| self.collect_expr(e)); 377 let expr = e.expr().map(|e| self.collect_expr(e));
388 self.alloc_expr( 378 self.alloc_expr(
389 Expr::Break { expr, label: e.lifetime_token().map(|l| Name::new_lifetime(&l)) }, 379 Expr::Break { expr, label: e.lifetime().map(|l| Name::new_lifetime(&l)) },
390 syntax_ptr, 380 syntax_ptr,
391 ) 381 )
392 } 382 }
diff --git a/crates/hir_def/src/generics.rs b/crates/hir_def/src/generics.rs
index 924046435..41134d23b 100644
--- a/crates/hir_def/src/generics.rs
+++ b/crates/hir_def/src/generics.rs
@@ -260,9 +260,8 @@ impl GenericParams {
260 self.fill_bounds(&lower_ctx, &type_param, Either::Left(type_ref)); 260 self.fill_bounds(&lower_ctx, &type_param, Either::Left(type_ref));
261 } 261 }
262 for lifetime_param in params.lifetime_params() { 262 for lifetime_param in params.lifetime_params() {
263 let name = lifetime_param 263 let name =
264 .lifetime_token() 264 lifetime_param.lifetime().map_or_else(Name::missing, |lt| Name::new_lifetime(&lt));
265 .map_or_else(Name::missing, |tok| Name::new_lifetime(&tok));
266 let param = LifetimeParamData { name: name.clone() }; 265 let param = LifetimeParamData { name: name.clone() };
267 let param_id = self.lifetimes.alloc(param); 266 let param_id = self.lifetimes.alloc(param);
268 sm.lifetime_params.insert(param_id, lifetime_param.clone()); 267 sm.lifetime_params.insert(param_id, lifetime_param.clone());
@@ -275,8 +274,8 @@ impl GenericParams {
275 for pred in where_clause.predicates() { 274 for pred in where_clause.predicates() {
276 let target = if let Some(type_ref) = pred.ty() { 275 let target = if let Some(type_ref) = pred.ty() {
277 Either::Left(TypeRef::from_ast(lower_ctx, type_ref)) 276 Either::Left(TypeRef::from_ast(lower_ctx, type_ref))
278 } else if let Some(lifetime_tok) = pred.lifetime_token() { 277 } else if let Some(lifetime) = pred.lifetime() {
279 Either::Right(LifetimeRef::from_token(lifetime_tok)) 278 Either::Right(LifetimeRef::new(&lifetime))
280 } else { 279 } else {
281 continue; 280 continue;
282 }; 281 };
diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs
index 1dc06a211..dd3409762 100644
--- a/crates/hir_def/src/item_tree/lower.rs
+++ b/crates/hir_def/src/item_tree/lower.rs
@@ -300,12 +300,12 @@ impl Ctx {
300 ast::SelfParamKind::Owned => self_type, 300 ast::SelfParamKind::Owned => self_type,
301 ast::SelfParamKind::Ref => TypeRef::Reference( 301 ast::SelfParamKind::Ref => TypeRef::Reference(
302 Box::new(self_type), 302 Box::new(self_type),
303 self_param.lifetime_token().map(LifetimeRef::from_token), 303 self_param.lifetime().as_ref().map(LifetimeRef::new),
304 Mutability::Shared, 304 Mutability::Shared,
305 ), 305 ),
306 ast::SelfParamKind::MutRef => TypeRef::Reference( 306 ast::SelfParamKind::MutRef => TypeRef::Reference(
307 Box::new(self_type), 307 Box::new(self_type),
308 self_param.lifetime_token().map(LifetimeRef::from_token), 308 self_param.lifetime().as_ref().map(LifetimeRef::new),
309 Mutability::Mut, 309 Mutability::Mut,
310 ), 310 ),
311 } 311 }
diff --git a/crates/hir_def/src/path/lower.rs b/crates/hir_def/src/path/lower.rs
index 609925012..8a01e6eea 100644
--- a/crates/hir_def/src/path/lower.rs
+++ b/crates/hir_def/src/path/lower.rs
@@ -169,8 +169,8 @@ pub(super) fn lower_generic_args(
169 } 169 }
170 } 170 }
171 ast::GenericArg::LifetimeArg(lifetime_arg) => { 171 ast::GenericArg::LifetimeArg(lifetime_arg) => {
172 if let Some(lifetime) = lifetime_arg.lifetime_token() { 172 if let Some(lifetime) = lifetime_arg.lifetime() {
173 let lifetime_ref = LifetimeRef::from_token(lifetime); 173 let lifetime_ref = LifetimeRef::new(&lifetime);
174 args.push(GenericArg::Lifetime(lifetime_ref)) 174 args.push(GenericArg::Lifetime(lifetime_ref))
175 } 175 }
176 } 176 }
diff --git a/crates/hir_def/src/type_ref.rs b/crates/hir_def/src/type_ref.rs
index 347ceabb9..ae93d0d10 100644
--- a/crates/hir_def/src/type_ref.rs
+++ b/crates/hir_def/src/type_ref.rs
@@ -1,7 +1,7 @@
1//! HIR for references to types. Paths in these are not yet resolved. They can 1//! HIR for references to types. Paths in these are not yet resolved. They can
2//! be directly created from an ast::TypeRef, without further queries. 2//! be directly created from an ast::TypeRef, without further queries.
3use hir_expand::name::Name; 3use hir_expand::name::Name;
4use syntax::{ast, SyntaxToken}; 4use syntax::ast;
5 5
6use crate::{body::LowerCtx, path::Path}; 6use crate::{body::LowerCtx, path::Path};
7 7
@@ -80,8 +80,8 @@ impl LifetimeRef {
80 LifetimeRef { name } 80 LifetimeRef { name }
81 } 81 }
82 82
83 pub(crate) fn from_token(token: SyntaxToken) -> Self { 83 pub(crate) fn new(lifetime: &ast::Lifetime) -> Self {
84 LifetimeRef { name: Name::new_lifetime(&token) } 84 LifetimeRef { name: Name::new_lifetime(lifetime) }
85 } 85 }
86 86
87 pub fn missing() -> LifetimeRef { 87 pub fn missing() -> LifetimeRef {
@@ -127,7 +127,7 @@ impl TypeRef {
127 } 127 }
128 ast::Type::RefType(inner) => { 128 ast::Type::RefType(inner) => {
129 let inner_ty = TypeRef::from_ast_opt(&ctx, inner.ty()); 129 let inner_ty = TypeRef::from_ast_opt(&ctx, inner.ty());
130 let lifetime = inner.lifetime_token().map(|t| LifetimeRef::from_token(t)); 130 let lifetime = inner.lifetime().map(|lt| LifetimeRef::new(&lt));
131 let mutability = Mutability::from_mutable(inner.mut_token().is_some()); 131 let mutability = Mutability::from_mutable(inner.mut_token().is_some());
132 TypeRef::Reference(Box::new(inner_ty), lifetime, mutability) 132 TypeRef::Reference(Box::new(inner_ty), lifetime, mutability)
133 } 133 }
@@ -259,7 +259,7 @@ impl TypeBound {
259 } 259 }
260 ast::TypeBoundKind::ForType(_) => TypeBound::Error, // FIXME ForType 260 ast::TypeBoundKind::ForType(_) => TypeBound::Error, // FIXME ForType
261 ast::TypeBoundKind::Lifetime(lifetime) => { 261 ast::TypeBoundKind::Lifetime(lifetime) => {
262 TypeBound::Lifetime(LifetimeRef::from_token(lifetime)) 262 TypeBound::Lifetime(LifetimeRef::new(&lifetime))
263 } 263 }
264 } 264 }
265 } 265 }
diff --git a/crates/hir_expand/src/name.rs b/crates/hir_expand/src/name.rs
index 69d8e6803..7fb4caea3 100644
--- a/crates/hir_expand/src/name.rs
+++ b/crates/hir_expand/src/name.rs
@@ -37,9 +37,8 @@ impl Name {
37 Name(Repr::TupleField(idx)) 37 Name(Repr::TupleField(idx))
38 } 38 }
39 39
40 pub fn new_lifetime(lt: &syntax::SyntaxToken) -> Name { 40 pub fn new_lifetime(lt: &ast::Lifetime) -> Name {
41 assert_eq!(lt.kind(), syntax::SyntaxKind::LIFETIME); 41 Self::new_text(lt.text().clone())
42 Name(Repr::Text(lt.text().clone()))
43 } 42 }
44 43
45 /// Shortcut to create inline plain text name 44 /// Shortcut to create inline plain text name
diff --git a/crates/ide/src/extend_selection.rs b/crates/ide/src/extend_selection.rs
index 0971f7701..6f3022dfd 100644
--- a/crates/ide/src/extend_selection.rs
+++ b/crates/ide/src/extend_selection.rs
@@ -237,7 +237,7 @@ fn pick_best(l: SyntaxToken, r: SyntaxToken) -> SyntaxToken {
237 fn priority(n: &SyntaxToken) -> usize { 237 fn priority(n: &SyntaxToken) -> usize {
238 match n.kind() { 238 match n.kind() {
239 WHITESPACE => 0, 239 WHITESPACE => 0,
240 IDENT | T![self] | T![super] | T![crate] | LIFETIME => 2, 240 IDENT | T![self] | T![super] | T![crate] | LIFETIME_IDENT => 2,
241 _ => 1, 241 _ => 1,
242 } 242 }
243 } 243 }
diff --git a/crates/mbe/src/mbe_expander/matcher.rs b/crates/mbe/src/mbe_expander/matcher.rs
index 93ee77908..7aeef7be5 100644
--- a/crates/mbe/src/mbe_expander/matcher.rs
+++ b/crates/mbe/src/mbe_expander/matcher.rs
@@ -295,7 +295,7 @@ impl<'a> TtIter<'a> {
295 295
296 impl<'a> TreeSink for OffsetTokenSink<'a> { 296 impl<'a> TreeSink for OffsetTokenSink<'a> {
297 fn token(&mut self, kind: SyntaxKind, mut n_tokens: u8) { 297 fn token(&mut self, kind: SyntaxKind, mut n_tokens: u8) {
298 if kind == SyntaxKind::LIFETIME { 298 if kind == SyntaxKind::LIFETIME_IDENT {
299 n_tokens = 2; 299 n_tokens = 2;
300 } 300 }
301 for _ in 0..n_tokens { 301 for _ in 0..n_tokens {
diff --git a/crates/mbe/src/subtree_source.rs b/crates/mbe/src/subtree_source.rs
index ccc56c479..d10d4b70e 100644
--- a/crates/mbe/src/subtree_source.rs
+++ b/crates/mbe/src/subtree_source.rs
@@ -84,7 +84,11 @@ impl<'a> SubtreeTokenSource<'a> {
84 } 84 }
85 85
86 if let Some((curr, text)) = is_lifetime(cursor) { 86 if let Some((curr, text)) = is_lifetime(cursor) {
87 cached.push(Some(TtToken { kind: LIFETIME, is_joint_to_next: false, text })); 87 cached.push(Some(TtToken {
88 kind: LIFETIME_IDENT,
89 is_joint_to_next: false,
90 text,
91 }));
88 self.cached_cursor.set(curr); 92 self.cached_cursor.set(curr);
89 continue; 93 continue;
90 } 94 }
@@ -172,7 +176,7 @@ fn convert_ident(ident: &tt::Ident) -> TtToken {
172 let kind = match ident.text.as_ref() { 176 let kind = match ident.text.as_ref() {
173 "true" => T![true], 177 "true" => T![true],
174 "false" => T![false], 178 "false" => T![false],
175 i if i.starts_with('\'') => LIFETIME, 179 i if i.starts_with('\'') => LIFETIME_IDENT,
176 _ => SyntaxKind::from_keyword(ident.text.as_str()).unwrap_or(IDENT), 180 _ => SyntaxKind::from_keyword(ident.text.as_str()).unwrap_or(IDENT),
177 }; 181 };
178 182
diff --git a/crates/mbe/src/syntax_bridge.rs b/crates/mbe/src/syntax_bridge.rs
index d987b2500..265c0d63d 100644
--- a/crates/mbe/src/syntax_bridge.rs
+++ b/crates/mbe/src/syntax_bridge.rs
@@ -380,7 +380,7 @@ trait TokenConvertor {
380 IDENT => make_leaf!(Ident), 380 IDENT => make_leaf!(Ident),
381 k if k.is_keyword() => make_leaf!(Ident), 381 k if k.is_keyword() => make_leaf!(Ident),
382 k if k.is_literal() => make_leaf!(Literal), 382 k if k.is_literal() => make_leaf!(Literal),
383 LIFETIME => { 383 LIFETIME_IDENT => {
384 let char_unit = TextSize::of('\''); 384 let char_unit = TextSize::of('\'');
385 let r = TextRange::at(range.start(), char_unit); 385 let r = TextRange::at(range.start(), char_unit);
386 let apostrophe = tt::Leaf::from(tt::Punct { 386 let apostrophe = tt::Leaf::from(tt::Punct {
@@ -620,7 +620,7 @@ impl<'a> TreeSink for TtTreeSink<'a> {
620 self.cursor = self.cursor.bump_subtree(); 620 self.cursor = self.cursor.bump_subtree();
621 return; 621 return;
622 } 622 }
623 if kind == LIFETIME { 623 if kind == LIFETIME_IDENT {
624 n_tokens = 2; 624 n_tokens = 2;
625 } 625 }
626 626
diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs
index 116b991a8..23039eba4 100644
--- a/crates/parser/src/grammar.rs
+++ b/crates/parser/src/grammar.rs
@@ -283,6 +283,13 @@ fn name_ref_or_index(p: &mut Parser) {
283 m.complete(p, NAME_REF); 283 m.complete(p, NAME_REF);
284} 284}
285 285
286fn lifetime(p: &mut Parser) {
287 assert!(p.at(LIFETIME_IDENT));
288 let m = p.start();
289 p.bump(LIFETIME_IDENT);
290 m.complete(p, LIFETIME);
291}
292
286fn error_block(p: &mut Parser, message: &str) { 293fn error_block(p: &mut Parser, message: &str) {
287 assert!(p.at(T!['{'])); 294 assert!(p.at(T!['{']));
288 let m = p.start(); 295 let m = p.start();
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index 31f42f161..18b63feb7 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -48,7 +48,7 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
48 T![try], 48 T![try],
49 T![loop], 49 T![loop],
50 T![for], 50 T![for],
51 LIFETIME, 51 LIFETIME_IDENT,
52 ])); 52 ]));
53 53
54const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[LET_KW, R_DOLLAR]); 54const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[LET_KW, R_DOLLAR]);
@@ -75,7 +75,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
75 T![for] => for_expr(p, None), 75 T![for] => for_expr(p, None),
76 T![while] => while_expr(p, None), 76 T![while] => while_expr(p, None),
77 T![try] => try_block_expr(p, None), 77 T![try] => try_block_expr(p, None),
78 LIFETIME if la == T![:] => { 78 LIFETIME_IDENT if la == T![:] => {
79 let m = p.start(); 79 let m = p.start();
80 label(p); 80 label(p);
81 match p.current() { 81 match p.current() {
@@ -275,9 +275,9 @@ fn if_expr(p: &mut Parser) -> CompletedMarker {
275// 'c: for x in () {} 275// 'c: for x in () {}
276// } 276// }
277fn label(p: &mut Parser) { 277fn label(p: &mut Parser) {
278 assert!(p.at(LIFETIME) && p.nth(1) == T![:]); 278 assert!(p.at(LIFETIME_IDENT) && p.nth(1) == T![:]);
279 let m = p.start(); 279 let m = p.start();
280 p.bump(LIFETIME); 280 lifetime(p);
281 p.bump_any(); 281 p.bump_any();
282 m.complete(p, LABEL); 282 m.complete(p, LABEL);
283} 283}
@@ -501,7 +501,9 @@ fn continue_expr(p: &mut Parser) -> CompletedMarker {
501 assert!(p.at(T![continue])); 501 assert!(p.at(T![continue]));
502 let m = p.start(); 502 let m = p.start();
503 p.bump(T![continue]); 503 p.bump(T![continue]);
504 p.eat(LIFETIME); 504 if p.at(LIFETIME_IDENT) {
505 lifetime(p);
506 }
505 m.complete(p, CONTINUE_EXPR) 507 m.complete(p, CONTINUE_EXPR)
506} 508}
507 509
@@ -518,7 +520,9 @@ fn break_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker {
518 assert!(p.at(T![break])); 520 assert!(p.at(T![break]));
519 let m = p.start(); 521 let m = p.start();
520 p.bump(T![break]); 522 p.bump(T![break]);
521 p.eat(LIFETIME); 523 if p.at(LIFETIME_IDENT) {
524 lifetime(p);
525 }
522 // test break_ambiguity 526 // test break_ambiguity
523 // fn foo(){ 527 // fn foo(){
524 // if break {} 528 // if break {}
diff --git a/crates/parser/src/grammar/items/traits.rs b/crates/parser/src/grammar/items/traits.rs
index 8394020da..ab9a12b4d 100644
--- a/crates/parser/src/grammar/items/traits.rs
+++ b/crates/parser/src/grammar/items/traits.rs
@@ -98,10 +98,10 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
98 // `<` `>` - empty generic parameters 98 // `<` `>` - empty generic parameters
99 // `<` `#` - generic parameters with attributes 99 // `<` `#` - generic parameters with attributes
100 // `<` `const` - const generic parameters 100 // `<` `const` - const generic parameters
101 // `<` (LIFETIME|IDENT) `>` - single generic parameter 101 // `<` (LIFETIME_IDENT|IDENT) `>` - single generic parameter
102 // `<` (LIFETIME|IDENT) `,` - first generic parameter in a list 102 // `<` (LIFETIME_IDENT|IDENT) `,` - first generic parameter in a list
103 // `<` (LIFETIME|IDENT) `:` - generic parameter with bounds 103 // `<` (LIFETIME_IDENT|IDENT) `:` - generic parameter with bounds
104 // `<` (LIFETIME|IDENT) `=` - generic parameter with a default 104 // `<` (LIFETIME_IDENT|IDENT) `=` - generic parameter with a default
105 // The only truly ambiguous case is 105 // The only truly ambiguous case is
106 // `<` IDENT `>` `::` IDENT ... 106 // `<` IDENT `>` `::` IDENT ...
107 // we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`) 107 // we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`)
@@ -113,7 +113,7 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
113 if p.nth(1) == T![#] || p.nth(1) == T![>] || p.nth(1) == CONST_KW { 113 if p.nth(1) == T![#] || p.nth(1) == T![>] || p.nth(1) == CONST_KW {
114 return true; 114 return true;
115 } 115 }
116 (p.nth(1) == LIFETIME || p.nth(1) == IDENT) 116 (p.nth(1) == LIFETIME_IDENT || p.nth(1) == IDENT)
117 && (p.nth(2) == T![>] || p.nth(2) == T![,] || p.nth(2) == T![:] || p.nth(2) == T![=]) 117 && (p.nth(2) == T![>] || p.nth(2) == T![,] || p.nth(2) == T![:] || p.nth(2) == T![=])
118} 118}
119 119
diff --git a/crates/parser/src/grammar/params.rs b/crates/parser/src/grammar/params.rs
index a665ffc13..3ee4e4fca 100644
--- a/crates/parser/src/grammar/params.rs
+++ b/crates/parser/src/grammar/params.rs
@@ -169,15 +169,20 @@ fn opt_self_param(p: &mut Parser) {
169 let la1 = p.nth(1); 169 let la1 = p.nth(1);
170 let la2 = p.nth(2); 170 let la2 = p.nth(2);
171 let la3 = p.nth(3); 171 let la3 = p.nth(3);
172 let n_toks = match (p.current(), la1, la2, la3) { 172 let mut n_toks = match (p.current(), la1, la2, la3) {
173 (T![&], T![self], _, _) => 2, 173 (T![&], T![self], _, _) => 2,
174 (T![&], T![mut], T![self], _) => 3, 174 (T![&], T![mut], T![self], _) => 3,
175 (T![&], LIFETIME, T![self], _) => 3, 175 (T![&], LIFETIME_IDENT, T![self], _) => 3,
176 (T![&], LIFETIME, T![mut], T![self]) => 4, 176 (T![&], LIFETIME_IDENT, T![mut], T![self]) => 4,
177 _ => return, 177 _ => return,
178 }; 178 };
179 m = p.start(); 179 m = p.start();
180 for _ in 0..n_toks { 180 p.bump_any();
181 if p.at(LIFETIME_IDENT) {
182 lifetime(p);
183 n_toks -= 1;
184 }
185 for _ in 1..n_toks {
181 p.bump_any(); 186 p.bump_any();
182 } 187 }
183 } 188 }
diff --git a/crates/parser/src/grammar/type_args.rs b/crates/parser/src/grammar/type_args.rs
index f2d34a749..a013c49b9 100644
--- a/crates/parser/src/grammar/type_args.rs
+++ b/crates/parser/src/grammar/type_args.rs
@@ -30,8 +30,8 @@ pub(super) fn opt_generic_arg_list(p: &mut Parser, colon_colon_required: bool) {
30fn generic_arg(p: &mut Parser) { 30fn generic_arg(p: &mut Parser) {
31 let m = p.start(); 31 let m = p.start();
32 match p.current() { 32 match p.current() {
33 LIFETIME => { 33 LIFETIME_IDENT => {
34 p.bump(LIFETIME); 34 lifetime(p);
35 m.complete(p, LIFETIME_ARG); 35 m.complete(p, LIFETIME_ARG);
36 } 36 }
37 // test associated_type_bounds 37 // test associated_type_bounds
diff --git a/crates/parser/src/grammar/type_params.rs b/crates/parser/src/grammar/type_params.rs
index bc7d8d724..9c3f7c28a 100644
--- a/crates/parser/src/grammar/type_params.rs
+++ b/crates/parser/src/grammar/type_params.rs
@@ -23,7 +23,7 @@ fn generic_param_list(p: &mut Parser) {
23 attributes::outer_attrs(p); 23 attributes::outer_attrs(p);
24 24
25 match p.current() { 25 match p.current() {
26 LIFETIME => lifetime_param(p, m), 26 LIFETIME_IDENT => lifetime_param(p, m),
27 IDENT => type_param(p, m), 27 IDENT => type_param(p, m),
28 CONST_KW => const_param(p, m), 28 CONST_KW => const_param(p, m),
29 _ => { 29 _ => {
@@ -40,8 +40,8 @@ fn generic_param_list(p: &mut Parser) {
40} 40}
41 41
42fn lifetime_param(p: &mut Parser, m: Marker) { 42fn lifetime_param(p: &mut Parser, m: Marker) {
43 assert!(p.at(LIFETIME)); 43 assert!(p.at(LIFETIME_IDENT));
44 p.bump(LIFETIME); 44 lifetime(p);
45 if p.at(T![:]) { 45 if p.at(T![:]) {
46 lifetime_bounds(p); 46 lifetime_bounds(p);
47 } 47 }
@@ -84,8 +84,8 @@ pub(super) fn bounds(p: &mut Parser) {
84fn lifetime_bounds(p: &mut Parser) { 84fn lifetime_bounds(p: &mut Parser) {
85 assert!(p.at(T![:])); 85 assert!(p.at(T![:]));
86 p.bump(T![:]); 86 p.bump(T![:]);
87 while p.at(LIFETIME) { 87 while p.at(LIFETIME_IDENT) {
88 p.bump(LIFETIME); 88 lifetime(p);
89 if !p.eat(T![+]) { 89 if !p.eat(T![+]) {
90 break; 90 break;
91 } 91 }
@@ -112,7 +112,7 @@ fn type_bound(p: &mut Parser) -> bool {
112 let has_paren = p.eat(T!['(']); 112 let has_paren = p.eat(T!['(']);
113 p.eat(T![?]); 113 p.eat(T![?]);
114 match p.current() { 114 match p.current() {
115 LIFETIME => p.bump(LIFETIME), 115 LIFETIME_IDENT => lifetime(p),
116 T![for] => types::for_type(p), 116 T![for] => types::for_type(p),
117 _ if paths::is_use_path_start(p) => types::path_type_(p, false), 117 _ if paths::is_use_path_start(p) => types::path_type_(p, false),
118 _ => { 118 _ => {
@@ -162,7 +162,7 @@ pub(super) fn opt_where_clause(p: &mut Parser) {
162 162
163fn is_where_predicate(p: &mut Parser) -> bool { 163fn is_where_predicate(p: &mut Parser) -> bool {
164 match p.current() { 164 match p.current() {
165 LIFETIME => true, 165 LIFETIME_IDENT => true,
166 T![impl] => false, 166 T![impl] => false,
167 token => types::TYPE_FIRST.contains(token), 167 token => types::TYPE_FIRST.contains(token),
168 } 168 }
@@ -175,8 +175,8 @@ fn is_where_clause_end(p: &mut Parser) -> bool {
175fn where_predicate(p: &mut Parser) { 175fn where_predicate(p: &mut Parser) {
176 let m = p.start(); 176 let m = p.start();
177 match p.current() { 177 match p.current() {
178 LIFETIME => { 178 LIFETIME_IDENT => {
179 p.bump(LIFETIME); 179 lifetime(p);
180 if p.at(T![:]) { 180 if p.at(T![:]) {
181 bounds(p); 181 bounds(p);
182 } else { 182 } else {
diff --git a/crates/parser/src/grammar/types.rs b/crates/parser/src/grammar/types.rs
index 1ea130ac5..36a15eace 100644
--- a/crates/parser/src/grammar/types.rs
+++ b/crates/parser/src/grammar/types.rs
@@ -167,7 +167,9 @@ fn ref_type(p: &mut Parser) {
167 assert!(p.at(T![&])); 167 assert!(p.at(T![&]));
168 let m = p.start(); 168 let m = p.start();
169 p.bump(T![&]); 169 p.bump(T![&]);
170 p.eat(LIFETIME); 170 if p.at(LIFETIME_IDENT) {
171 lifetime(p);
172 }
171 p.eat(T![mut]); 173 p.eat(T![mut]);
172 type_no_bounds(p); 174 type_no_bounds(p);
173 m.complete(p, REF_TYPE); 175 m.complete(p, REF_TYPE);
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index 5d6ec17a4..980aa5979 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -116,7 +116,7 @@ pub enum SyntaxKind {
116 ERROR, 116 ERROR,
117 IDENT, 117 IDENT,
118 WHITESPACE, 118 WHITESPACE,
119 LIFETIME, 119 LIFETIME_IDENT,
120 COMMENT, 120 COMMENT,
121 SHEBANG, 121 SHEBANG,
122 L_DOLLAR, 122 L_DOLLAR,
@@ -237,6 +237,7 @@ pub enum SyntaxKind {
237 TYPE_PARAM, 237 TYPE_PARAM,
238 CONST_PARAM, 238 CONST_PARAM,
239 GENERIC_ARG_LIST, 239 GENERIC_ARG_LIST,
240 LIFETIME,
240 LIFETIME_ARG, 241 LIFETIME_ARG,
241 TYPE_ARG, 242 TYPE_ARG,
242 ASSOC_TYPE_ARG, 243 ASSOC_TYPE_ARG,
@@ -364,4 +365,4 @@ impl SyntaxKind {
364 } 365 }
365} 366}
366#[macro_export] 367#[macro_export]
367macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [lifetime] => { $ crate :: SyntaxKind :: LIFETIME } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; } 368macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; }
diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs
index 70c568ea1..83de067d9 100644
--- a/crates/syntax/src/ast.rs
+++ b/crates/syntax/src/ast.rs
@@ -311,7 +311,7 @@ where
311 let pred = predicates.next().unwrap(); 311 let pred = predicates.next().unwrap();
312 let mut bounds = pred.type_bound_list().unwrap().bounds(); 312 let mut bounds = pred.type_bound_list().unwrap().bounds();
313 313
314 assert_eq!("'a", pred.lifetime_token().unwrap().text()); 314 assert_eq!("'a", pred.lifetime().unwrap().lifetime_ident_token().unwrap().text());
315 315
316 assert_bound("'b", bounds.next()); 316 assert_bound("'b", bounds.next());
317 assert_bound("'c", bounds.next()); 317 assert_bound("'c", bounds.next());
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs
index 6eae323f4..1588ba93e 100644
--- a/crates/syntax/src/ast/generated/nodes.rs
+++ b/crates/syntax/src/ast/generated/nodes.rs
@@ -20,6 +20,15 @@ impl NameRef {
20 pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) } 20 pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }
21} 21}
22#[derive(Debug, Clone, PartialEq, Eq, Hash)] 22#[derive(Debug, Clone, PartialEq, Eq, Hash)]
23pub struct Lifetime {
24 pub(crate) syntax: SyntaxNode,
25}
26impl Lifetime {
27 pub fn lifetime_ident_token(&self) -> Option<SyntaxToken> {
28 support::token(&self.syntax, T![lifetime_ident])
29 }
30}
31#[derive(Debug, Clone, PartialEq, Eq, Hash)]
23pub struct Path { 32pub struct Path {
24 pub(crate) syntax: SyntaxNode, 33 pub(crate) syntax: SyntaxNode,
25} 34}
@@ -105,9 +114,7 @@ pub struct LifetimeArg {
105 pub(crate) syntax: SyntaxNode, 114 pub(crate) syntax: SyntaxNode,
106} 115}
107impl LifetimeArg { 116impl LifetimeArg {
108 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 117 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
109 support::token(&self.syntax, T![lifetime])
110 }
111} 118}
112#[derive(Debug, Clone, PartialEq, Eq, Hash)] 119#[derive(Debug, Clone, PartialEq, Eq, Hash)]
113pub struct ConstArg { 120pub struct ConstArg {
@@ -487,9 +494,7 @@ pub struct SelfParam {
487impl ast::AttrsOwner for SelfParam {} 494impl ast::AttrsOwner for SelfParam {}
488impl SelfParam { 495impl SelfParam {
489 pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) } 496 pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) }
490 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 497 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
491 support::token(&self.syntax, T![lifetime])
492 }
493 pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) } 498 pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) }
494 pub fn self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![self]) } 499 pub fn self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![self]) }
495 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) } 500 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
@@ -605,9 +610,7 @@ pub struct LifetimeParam {
605impl ast::AttrsOwner for LifetimeParam {} 610impl ast::AttrsOwner for LifetimeParam {}
606impl ast::TypeBoundsOwner for LifetimeParam {} 611impl ast::TypeBoundsOwner for LifetimeParam {}
607impl LifetimeParam { 612impl LifetimeParam {
608 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 613 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
609 support::token(&self.syntax, T![lifetime])
610 }
611} 614}
612#[derive(Debug, Clone, PartialEq, Eq, Hash)] 615#[derive(Debug, Clone, PartialEq, Eq, Hash)]
613pub struct TypeParam { 616pub struct TypeParam {
@@ -628,9 +631,7 @@ impl ast::TypeBoundsOwner for WherePred {}
628impl WherePred { 631impl WherePred {
629 pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) } 632 pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
630 pub fn generic_param_list(&self) -> Option<GenericParamList> { support::child(&self.syntax) } 633 pub fn generic_param_list(&self) -> Option<GenericParamList> { support::child(&self.syntax) }
631 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 634 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
632 support::token(&self.syntax, T![lifetime])
633 }
634 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) } 635 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) }
635} 636}
636#[derive(Debug, Clone, PartialEq, Eq, Hash)] 637#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -706,9 +707,7 @@ pub struct BreakExpr {
706impl ast::AttrsOwner for BreakExpr {} 707impl ast::AttrsOwner for BreakExpr {}
707impl BreakExpr { 708impl BreakExpr {
708 pub fn break_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![break]) } 709 pub fn break_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![break]) }
709 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 710 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
710 support::token(&self.syntax, T![lifetime])
711 }
712 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) } 711 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
713} 712}
714#[derive(Debug, Clone, PartialEq, Eq, Hash)] 713#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -752,9 +751,7 @@ impl ContinueExpr {
752 pub fn continue_token(&self) -> Option<SyntaxToken> { 751 pub fn continue_token(&self) -> Option<SyntaxToken> {
753 support::token(&self.syntax, T![continue]) 752 support::token(&self.syntax, T![continue])
754 } 753 }
755 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 754 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
756 support::token(&self.syntax, T![lifetime])
757 }
758} 755}
759#[derive(Debug, Clone, PartialEq, Eq, Hash)] 756#[derive(Debug, Clone, PartialEq, Eq, Hash)]
760pub struct EffectExpr { 757pub struct EffectExpr {
@@ -937,9 +934,8 @@ pub struct Label {
937 pub(crate) syntax: SyntaxNode, 934 pub(crate) syntax: SyntaxNode,
938} 935}
939impl Label { 936impl Label {
940 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 937 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
941 support::token(&self.syntax, T![lifetime]) 938 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }
942 }
943} 939}
944#[derive(Debug, Clone, PartialEq, Eq, Hash)] 940#[derive(Debug, Clone, PartialEq, Eq, Hash)]
945pub struct RecordExprFieldList { 941pub struct RecordExprFieldList {
@@ -1100,9 +1096,7 @@ pub struct RefType {
1100} 1096}
1101impl RefType { 1097impl RefType {
1102 pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) } 1098 pub fn amp_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) }
1103 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 1099 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
1104 support::token(&self.syntax, T![lifetime])
1105 }
1106 pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) } 1100 pub fn mut_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![mut]) }
1107 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) } 1101 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) }
1108} 1102}
@@ -1129,9 +1123,7 @@ pub struct TypeBound {
1129 pub(crate) syntax: SyntaxNode, 1123 pub(crate) syntax: SyntaxNode,
1130} 1124}
1131impl TypeBound { 1125impl TypeBound {
1132 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 1126 pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
1133 support::token(&self.syntax, T![lifetime])
1134 }
1135 pub fn question_mark_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![?]) } 1127 pub fn question_mark_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![?]) }
1136 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) } 1128 pub fn ty(&self) -> Option<Type> { support::child(&self.syntax) }
1137} 1129}
@@ -1438,6 +1430,17 @@ impl AstNode for NameRef {
1438 } 1430 }
1439 fn syntax(&self) -> &SyntaxNode { &self.syntax } 1431 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1440} 1432}
1433impl AstNode for Lifetime {
1434 fn can_cast(kind: SyntaxKind) -> bool { kind == LIFETIME }
1435 fn cast(syntax: SyntaxNode) -> Option<Self> {
1436 if Self::can_cast(syntax.kind()) {
1437 Some(Self { syntax })
1438 } else {
1439 None
1440 }
1441 }
1442 fn syntax(&self) -> &SyntaxNode { &self.syntax }
1443}
1441impl AstNode for Path { 1444impl AstNode for Path {
1442 fn can_cast(kind: SyntaxKind) -> bool { kind == PATH } 1445 fn can_cast(kind: SyntaxKind) -> bool { kind == PATH }
1443 fn cast(syntax: SyntaxNode) -> Option<Self> { 1446 fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3524,6 +3527,11 @@ impl std::fmt::Display for NameRef {
3524 std::fmt::Display::fmt(self.syntax(), f) 3527 std::fmt::Display::fmt(self.syntax(), f)
3525 } 3528 }
3526} 3529}
3530impl std::fmt::Display for Lifetime {
3531 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3532 std::fmt::Display::fmt(self.syntax(), f)
3533 }
3534}
3527impl std::fmt::Display for Path { 3535impl std::fmt::Display for Path {
3528 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 3536 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3529 std::fmt::Display::fmt(self.syntax(), f) 3537 std::fmt::Display::fmt(self.syntax(), f)
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs
index 40dec3c7f..c45cb514a 100644
--- a/crates/syntax/src/ast/node_ext.rs
+++ b/crates/syntax/src/ast/node_ext.rs
@@ -12,6 +12,12 @@ use crate::{
12 SmolStr, SyntaxElement, SyntaxToken, T, 12 SmolStr, SyntaxElement, SyntaxToken, T,
13}; 13};
14 14
15impl ast::Lifetime {
16 pub fn text(&self) -> &SmolStr {
17 text_of_first_token(self.syntax())
18 }
19}
20
15impl ast::Name { 21impl ast::Name {
16 pub fn text(&self) -> &SmolStr { 22 pub fn text(&self) -> &SmolStr {
17 text_of_first_token(self.syntax()) 23 text_of_first_token(self.syntax())
@@ -393,7 +399,7 @@ pub enum TypeBoundKind {
393 /// for<'a> ... 399 /// for<'a> ...
394 ForType(ast::ForType), 400 ForType(ast::ForType),
395 /// 'a 401 /// 'a
396 Lifetime(SyntaxToken), 402 Lifetime(ast::Lifetime),
397} 403}
398 404
399impl ast::TypeBound { 405impl ast::TypeBound {
@@ -402,7 +408,7 @@ impl ast::TypeBound {
402 TypeBoundKind::PathType(path_type) 408 TypeBoundKind::PathType(path_type)
403 } else if let Some(for_type) = support::children(self.syntax()).next() { 409 } else if let Some(for_type) = support::children(self.syntax()).next() {
404 TypeBoundKind::ForType(for_type) 410 TypeBoundKind::ForType(for_type)
405 } else if let Some(lifetime) = self.lifetime_token() { 411 } else if let Some(lifetime) = self.lifetime() {
406 TypeBoundKind::Lifetime(lifetime) 412 TypeBoundKind::Lifetime(lifetime)
407 } else { 413 } else {
408 unreachable!() 414 unreachable!()
@@ -440,7 +446,7 @@ impl ast::LifetimeParam {
440 .children_with_tokens() 446 .children_with_tokens()
441 .filter_map(|it| it.into_token()) 447 .filter_map(|it| it.into_token())
442 .skip_while(|x| x.kind() != T![:]) 448 .skip_while(|x| x.kind() != T![:])
443 .filter(|it| it.kind() == T![lifetime]) 449 .filter(|it| it.kind() == T![lifetime_ident])
444 } 450 }
445} 451}
446 452
diff --git a/crates/syntax/src/parsing/lexer.rs b/crates/syntax/src/parsing/lexer.rs
index 8afd7e53b..0cbba73c5 100644
--- a/crates/syntax/src/parsing/lexer.rs
+++ b/crates/syntax/src/parsing/lexer.rs
@@ -146,9 +146,9 @@ fn rustc_token_kind_to_syntax_kind(
146 rustc_lexer::TokenKind::RawIdent => IDENT, 146 rustc_lexer::TokenKind::RawIdent => IDENT,
147 rustc_lexer::TokenKind::Literal { kind, .. } => return match_literal_kind(&kind), 147 rustc_lexer::TokenKind::Literal { kind, .. } => return match_literal_kind(&kind),
148 148
149 rustc_lexer::TokenKind::Lifetime { starts_with_number: false } => LIFETIME, 149 rustc_lexer::TokenKind::Lifetime { starts_with_number: false } => LIFETIME_IDENT,
150 rustc_lexer::TokenKind::Lifetime { starts_with_number: true } => { 150 rustc_lexer::TokenKind::Lifetime { starts_with_number: true } => {
151 return (LIFETIME, Some("Lifetime name cannot start with a number")) 151 return (LIFETIME_IDENT, Some("Lifetime name cannot start with a number"))
152 } 152 }
153 153
154 rustc_lexer::TokenKind::Semi => T![;], 154 rustc_lexer::TokenKind::Semi => T![;],
diff --git a/crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.rs b/crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.rs
index a7698a404..a7698a404 100644
--- a/crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.rs
+++ b/crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.rs
diff --git a/crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.txt b/crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.txt
index e138bcebc..11e0ae14a 100644
--- a/crates/syntax/test_data/lexer/err/0057_lifetime_strarts_with_a_number.txt
+++ b/crates/syntax/test_data/lexer/err/0057_lifetime_starts_with_a_number.txt
@@ -1,6 +1,6 @@
1LIFETIME 2 "\'1" 1LIFETIME_IDENT 2 "\'1"
2WHITESPACE 1 "\n" 2WHITESPACE 1 "\n"
3LIFETIME 10 "\'1lifetime" 3LIFETIME_IDENT 10 "\'1lifetime"
4WHITESPACE 1 "\n" 4WHITESPACE 1 "\n"
5> error0..2 token("\'1") msg(Lifetime name cannot start with a number) 5> error0..2 token("\'1") msg(Lifetime name cannot start with a number)
6> error3..13 token("\'1lifetime") msg(Lifetime name cannot start with a number) 6> error3..13 token("\'1lifetime") msg(Lifetime name cannot start with a number)
diff --git a/crates/syntax/test_data/lexer/ok/0007_lifetimes.txt b/crates/syntax/test_data/lexer/ok/0007_lifetimes.txt
index 005c29100..4d6625c3a 100644
--- a/crates/syntax/test_data/lexer/ok/0007_lifetimes.txt
+++ b/crates/syntax/test_data/lexer/ok/0007_lifetimes.txt
@@ -1,8 +1,8 @@
1LIFETIME 2 "\'a" 1LIFETIME_IDENT 2 "\'a"
2WHITESPACE 1 " " 2WHITESPACE 1 " "
3LIFETIME 4 "\'foo" 3LIFETIME_IDENT 4 "\'foo"
4WHITESPACE 1 " " 4WHITESPACE 1 " "
5LIFETIME 12 "\'foo_bar_baz" 5LIFETIME_IDENT 12 "\'foo_bar_baz"
6WHITESPACE 1 " " 6WHITESPACE 1 " "
7LIFETIME 2 "\'_" 7LIFETIME_IDENT 2 "\'_"
8WHITESPACE 1 "\n" 8WHITESPACE 1 "\n"
diff --git a/crates/syntax/test_data/parser/err/0024_many_type_parens.rast b/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
index e3be6b22e..4c4ddf5ec 100644
--- a/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
+++ b/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
@@ -42,7 +42,8 @@ SOURCE_FILE@0..240
42 GENERIC_PARAM_LIST@32..36 42 GENERIC_PARAM_LIST@32..36
43 L_ANGLE@32..33 "<" 43 L_ANGLE@32..33 "<"
44 LIFETIME_PARAM@33..35 44 LIFETIME_PARAM@33..35
45 LIFETIME@33..35 "\'a" 45 LIFETIME@33..35
46 LIFETIME_IDENT@33..35 "\'a"
46 R_ANGLE@35..36 ">" 47 R_ANGLE@35..36 ">"
47 WHITESPACE@36..37 " " 48 WHITESPACE@36..37 " "
48 PATH_TYPE@37..46 49 PATH_TYPE@37..46
@@ -53,7 +54,8 @@ SOURCE_FILE@0..240
53 GENERIC_ARG_LIST@42..46 54 GENERIC_ARG_LIST@42..46
54 L_ANGLE@42..43 "<" 55 L_ANGLE@42..43 "<"
55 LIFETIME_ARG@43..45 56 LIFETIME_ARG@43..45
56 LIFETIME@43..45 "\'a" 57 LIFETIME@43..45
58 LIFETIME_IDENT@43..45 "\'a"
57 R_ANGLE@45..46 ">" 59 R_ANGLE@45..46 ">"
58 R_PAREN@46..47 ")" 60 R_PAREN@46..47 ")"
59 R_ANGLE@47..48 ">" 61 R_ANGLE@47..48 ">"
@@ -125,7 +127,8 @@ SOURCE_FILE@0..240
125 GENERIC_PARAM_LIST@106..110 127 GENERIC_PARAM_LIST@106..110
126 L_ANGLE@106..107 "<" 128 L_ANGLE@106..107 "<"
127 LIFETIME_PARAM@107..109 129 LIFETIME_PARAM@107..109
128 LIFETIME@107..109 "\'a" 130 LIFETIME@107..109
131 LIFETIME_IDENT@107..109 "\'a"
129 R_ANGLE@109..110 ">" 132 R_ANGLE@109..110 ">"
130 WHITESPACE@110..111 " " 133 WHITESPACE@110..111 " "
131 PATH_TYPE@111..120 134 PATH_TYPE@111..120
@@ -136,7 +139,8 @@ SOURCE_FILE@0..240
136 GENERIC_ARG_LIST@116..120 139 GENERIC_ARG_LIST@116..120
137 L_ANGLE@116..117 "<" 140 L_ANGLE@116..117 "<"
138 LIFETIME_ARG@117..119 141 LIFETIME_ARG@117..119
139 LIFETIME@117..119 "\'a" 142 LIFETIME@117..119
143 LIFETIME_IDENT@117..119 "\'a"
140 R_ANGLE@119..120 ">" 144 R_ANGLE@119..120 ">"
141 R_PAREN@120..121 ")" 145 R_PAREN@120..121 ")"
142 EXPR_STMT@121..123 146 EXPR_STMT@121..123
@@ -187,7 +191,7 @@ SOURCE_FILE@0..240
187 PATH_SEGMENT@154..158 191 PATH_SEGMENT@154..158
188 L_ANGLE@154..155 "<" 192 L_ANGLE@154..155 "<"
189 ERROR@155..157 193 ERROR@155..157
190 LIFETIME@155..157 "\'a" 194 LIFETIME_IDENT@155..157 "\'a"
191 R_ANGLE@157..158 ">" 195 R_ANGLE@157..158 ">"
192 WHITESPACE@158..159 " " 196 WHITESPACE@158..159 " "
193 BIN_EXPR@159..180 197 BIN_EXPR@159..180
@@ -201,7 +205,7 @@ SOURCE_FILE@0..240
201 IDENT@159..164 "Trait" 205 IDENT@159..164 "Trait"
202 L_ANGLE@164..165 "<" 206 L_ANGLE@164..165 "<"
203 ERROR@165..167 207 ERROR@165..167
204 LIFETIME@165..167 "\'a" 208 LIFETIME_IDENT@165..167 "\'a"
205 R_ANGLE@167..168 ">" 209 R_ANGLE@167..168 ">"
206 ERROR@168..169 210 ERROR@168..169
207 R_PAREN@168..169 ")" 211 R_PAREN@168..169 ")"
@@ -245,7 +249,8 @@ SOURCE_FILE@0..240
245 GENERIC_PARAM_LIST@200..204 249 GENERIC_PARAM_LIST@200..204
246 L_ANGLE@200..201 "<" 250 L_ANGLE@200..201 "<"
247 LIFETIME_PARAM@201..203 251 LIFETIME_PARAM@201..203
248 LIFETIME@201..203 "\'a" 252 LIFETIME@201..203
253 LIFETIME_IDENT@201..203 "\'a"
249 R_ANGLE@203..204 ">" 254 R_ANGLE@203..204 ">"
250 WHITESPACE@204..205 " " 255 WHITESPACE@204..205 " "
251 PATH_TYPE@205..214 256 PATH_TYPE@205..214
@@ -256,7 +261,8 @@ SOURCE_FILE@0..240
256 GENERIC_ARG_LIST@210..214 261 GENERIC_ARG_LIST@210..214
257 L_ANGLE@210..211 "<" 262 L_ANGLE@210..211 "<"
258 LIFETIME_ARG@211..213 263 LIFETIME_ARG@211..213
259 LIFETIME@211..213 "\'a" 264 LIFETIME@211..213
265 LIFETIME_IDENT@211..213 "\'a"
260 R_ANGLE@213..214 ">" 266 R_ANGLE@213..214 ">"
261 R_PAREN@214..215 ")" 267 R_PAREN@214..215 ")"
262 WHITESPACE@215..216 " " 268 WHITESPACE@215..216 " "
diff --git a/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast b/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
index a8e42e6ea..c5215d6b1 100644
--- a/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
+++ b/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
@@ -16,7 +16,8 @@ SOURCE_FILE@0..30
16 GENERIC_PARAM_LIST@22..26 16 GENERIC_PARAM_LIST@22..26
17 L_ANGLE@22..23 "<" 17 L_ANGLE@22..23 "<"
18 LIFETIME_PARAM@23..25 18 LIFETIME_PARAM@23..25
19 LIFETIME@23..25 "\'a" 19 LIFETIME@23..25
20 LIFETIME_IDENT@23..25 "\'a"
20 R_ANGLE@25..26 ">" 21 R_ANGLE@25..26 ">"
21 WHITESPACE@26..27 "\n" 22 WHITESPACE@26..27 "\n"
22 BLOCK_EXPR@27..29 23 BLOCK_EXPR@27..29
diff --git a/crates/syntax/test_data/parser/err/0043_weird_blocks.rast b/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
index df29017e7..e73bd1aea 100644
--- a/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
+++ b/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
@@ -54,7 +54,8 @@ SOURCE_FILE@0..83
54 EXPR_STMT@68..75 54 EXPR_STMT@68..75
55 ERROR@68..75 55 ERROR@68..75
56 LABEL@68..75 56 LABEL@68..75
57 LIFETIME@68..74 "\'label" 57 LIFETIME@68..74
58 LIFETIME_IDENT@68..74 "\'label"
58 COLON@74..75 ":" 59 COLON@74..75 ":"
59 WHITESPACE@75..76 " " 60 WHITESPACE@75..76 " "
60 LITERAL@76..78 61 LITERAL@76..78
diff --git a/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast b/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
index 71aa86494..cc54185e5 100644
--- a/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
+++ b/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
@@ -12,12 +12,14 @@ SOURCE_FILE@0..239
12 GENERIC_PARAM_LIST@17..21 12 GENERIC_PARAM_LIST@17..21
13 L_ANGLE@17..18 "<" 13 L_ANGLE@17..18 "<"
14 LIFETIME_PARAM@18..20 14 LIFETIME_PARAM@18..20
15 LIFETIME@18..20 "\'a" 15 LIFETIME@18..20
16 LIFETIME_IDENT@18..20 "\'a"
16 R_ANGLE@20..21 ">" 17 R_ANGLE@20..21 ">"
17 WHITESPACE@21..22 " " 18 WHITESPACE@21..22 " "
18 REF_TYPE@22..29 19 REF_TYPE@22..29
19 AMP@22..23 "&" 20 AMP@22..23 "&"
20 LIFETIME@23..25 "\'a" 21 LIFETIME@23..25
22 LIFETIME_IDENT@23..25 "\'a"
21 WHITESPACE@25..26 " " 23 WHITESPACE@25..26 " "
22 PATH_TYPE@26..29 24 PATH_TYPE@26..29
23 PATH@26..29 25 PATH@26..29
@@ -39,14 +41,16 @@ SOURCE_FILE@0..239
39 GENERIC_PARAM_LIST@48..52 41 GENERIC_PARAM_LIST@48..52
40 L_ANGLE@48..49 "<" 42 L_ANGLE@48..49 "<"
41 LIFETIME_PARAM@49..51 43 LIFETIME_PARAM@49..51
42 LIFETIME@49..51 "\'a" 44 LIFETIME@49..51
45 LIFETIME_IDENT@49..51 "\'a"
43 R_ANGLE@51..52 ">" 46 R_ANGLE@51..52 ">"
44 WHITESPACE@52..53 " " 47 WHITESPACE@52..53 " "
45 TUPLE_TYPE@53..63 48 TUPLE_TYPE@53..63
46 L_PAREN@53..54 "(" 49 L_PAREN@53..54 "("
47 REF_TYPE@54..61 50 REF_TYPE@54..61
48 AMP@54..55 "&" 51 AMP@54..55 "&"
49 LIFETIME@55..57 "\'a" 52 LIFETIME@55..57
53 LIFETIME_IDENT@55..57 "\'a"
50 WHITESPACE@57..58 " " 54 WHITESPACE@57..58 " "
51 PATH_TYPE@58..61 55 PATH_TYPE@58..61
52 PATH@58..61 56 PATH@58..61
@@ -70,7 +74,8 @@ SOURCE_FILE@0..239
70 GENERIC_PARAM_LIST@84..88 74 GENERIC_PARAM_LIST@84..88
71 L_ANGLE@84..85 "<" 75 L_ANGLE@84..85 "<"
72 LIFETIME_PARAM@85..87 76 LIFETIME_PARAM@85..87
73 LIFETIME@85..87 "\'a" 77 LIFETIME@85..87
78 LIFETIME_IDENT@85..87 "\'a"
74 R_ANGLE@87..88 ">" 79 R_ANGLE@87..88 ">"
75 WHITESPACE@88..89 " " 80 WHITESPACE@88..89 " "
76 SLICE_TYPE@89..94 81 SLICE_TYPE@89..94
@@ -96,7 +101,8 @@ SOURCE_FILE@0..239
96 GENERIC_PARAM_LIST@115..119 101 GENERIC_PARAM_LIST@115..119
97 L_ANGLE@115..116 "<" 102 L_ANGLE@115..116 "<"
98 LIFETIME_PARAM@116..118 103 LIFETIME_PARAM@116..118
99 LIFETIME@116..118 "\'a" 104 LIFETIME@116..118
105 LIFETIME_IDENT@116..118 "\'a"
100 R_ANGLE@118..119 ">" 106 R_ANGLE@118..119 ">"
101 WHITESPACE@119..120 " " 107 WHITESPACE@119..120 " "
102 FOR_TYPE@120..148 108 FOR_TYPE@120..148
@@ -104,7 +110,8 @@ SOURCE_FILE@0..239
104 GENERIC_PARAM_LIST@123..127 110 GENERIC_PARAM_LIST@123..127
105 L_ANGLE@123..124 "<" 111 L_ANGLE@123..124 "<"
106 LIFETIME_PARAM@124..126 112 LIFETIME_PARAM@124..126
107 LIFETIME@124..126 "\'b" 113 LIFETIME@124..126
114 LIFETIME_IDENT@124..126 "\'b"
108 R_ANGLE@126..127 ">" 115 R_ANGLE@126..127 ">"
109 WHITESPACE@127..128 " " 116 WHITESPACE@127..128 " "
110 FN_PTR_TYPE@128..148 117 FN_PTR_TYPE@128..148
@@ -114,7 +121,8 @@ SOURCE_FILE@0..239
114 PARAM@131..138 121 PARAM@131..138
115 REF_TYPE@131..138 122 REF_TYPE@131..138
116 AMP@131..132 "&" 123 AMP@131..132 "&"
117 LIFETIME@132..134 "\'a" 124 LIFETIME@132..134
125 LIFETIME_IDENT@132..134 "\'a"
118 WHITESPACE@134..135 " " 126 WHITESPACE@134..135 " "
119 PATH_TYPE@135..138 127 PATH_TYPE@135..138
120 PATH@135..138 128 PATH@135..138
@@ -126,7 +134,8 @@ SOURCE_FILE@0..239
126 PARAM@140..147 134 PARAM@140..147
127 REF_TYPE@140..147 135 REF_TYPE@140..147
128 AMP@140..141 "&" 136 AMP@140..141 "&"
129 LIFETIME@141..143 "\'b" 137 LIFETIME@141..143
138 LIFETIME_IDENT@141..143 "\'b"
130 WHITESPACE@143..144 " " 139 WHITESPACE@143..144 " "
131 PATH_TYPE@144..147 140 PATH_TYPE@144..147
132 PATH@144..147 141 PATH@144..147
@@ -159,7 +168,8 @@ SOURCE_FILE@0..239
159 GENERIC_PARAM_LIST@183..187 168 GENERIC_PARAM_LIST@183..187
160 L_ANGLE@183..184 "<" 169 L_ANGLE@183..184 "<"
161 LIFETIME_PARAM@184..186 170 LIFETIME_PARAM@184..186
162 LIFETIME@184..186 "\'a" 171 LIFETIME@184..186
172 LIFETIME_IDENT@184..186 "\'a"
163 R_ANGLE@186..187 ">" 173 R_ANGLE@186..187 ">"
164 WHITESPACE@187..188 " " 174 WHITESPACE@187..188 " "
165 FOR_TYPE@188..227 175 FOR_TYPE@188..227
@@ -167,7 +177,8 @@ SOURCE_FILE@0..239
167 GENERIC_PARAM_LIST@191..195 177 GENERIC_PARAM_LIST@191..195
168 L_ANGLE@191..192 "<" 178 L_ANGLE@191..192 "<"
169 LIFETIME_PARAM@192..194 179 LIFETIME_PARAM@192..194
170 LIFETIME@192..194 "\'b" 180 LIFETIME@192..194
181 LIFETIME_IDENT@192..194 "\'b"
171 R_ANGLE@194..195 ">" 182 R_ANGLE@194..195 ">"
172 WHITESPACE@195..196 " " 183 WHITESPACE@195..196 " "
173 FOR_TYPE@196..227 184 FOR_TYPE@196..227
@@ -175,7 +186,8 @@ SOURCE_FILE@0..239
175 GENERIC_PARAM_LIST@199..203 186 GENERIC_PARAM_LIST@199..203
176 L_ANGLE@199..200 "<" 187 L_ANGLE@199..200 "<"
177 LIFETIME_PARAM@200..202 188 LIFETIME_PARAM@200..202
178 LIFETIME@200..202 "\'c" 189 LIFETIME@200..202
190 LIFETIME_IDENT@200..202 "\'c"
179 R_ANGLE@202..203 ">" 191 R_ANGLE@202..203 ">"
180 WHITESPACE@203..204 " " 192 WHITESPACE@203..204 " "
181 FN_PTR_TYPE@204..227 193 FN_PTR_TYPE@204..227
@@ -185,7 +197,8 @@ SOURCE_FILE@0..239
185 PARAM@207..212 197 PARAM@207..212
186 REF_TYPE@207..212 198 REF_TYPE@207..212
187 AMP@207..208 "&" 199 AMP@207..208 "&"
188 LIFETIME@208..210 "\'a" 200 LIFETIME@208..210
201 LIFETIME_IDENT@208..210 "\'a"
189 WHITESPACE@210..211 " " 202 WHITESPACE@210..211 " "
190 PATH_TYPE@211..212 203 PATH_TYPE@211..212
191 PATH@211..212 204 PATH@211..212
@@ -197,7 +210,8 @@ SOURCE_FILE@0..239
197 PARAM@214..219 210 PARAM@214..219
198 REF_TYPE@214..219 211 REF_TYPE@214..219
199 AMP@214..215 "&" 212 AMP@214..215 "&"
200 LIFETIME@215..217 "\'b" 213 LIFETIME@215..217
214 LIFETIME_IDENT@215..217 "\'b"
201 WHITESPACE@217..218 " " 215 WHITESPACE@217..218 " "
202 PATH_TYPE@218..219 216 PATH_TYPE@218..219
203 PATH@218..219 217 PATH@218..219
@@ -209,7 +223,8 @@ SOURCE_FILE@0..239
209 PARAM@221..226 223 PARAM@221..226
210 REF_TYPE@221..226 224 REF_TYPE@221..226
211 AMP@221..222 "&" 225 AMP@221..222 "&"
212 LIFETIME@222..224 "\'c" 226 LIFETIME@222..224
227 LIFETIME_IDENT@222..224 "\'c"
213 WHITESPACE@224..225 " " 228 WHITESPACE@224..225 " "
214 PATH_TYPE@225..226 229 PATH_TYPE@225..226
215 PATH@225..226 230 PATH@225..226
diff --git a/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast b/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
index 592741cdb..7049f4734 100644
--- a/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
+++ b/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
@@ -7,14 +7,16 @@ SOURCE_FILE@0..187
7 GENERIC_PARAM_LIST@8..12 7 GENERIC_PARAM_LIST@8..12
8 L_ANGLE@8..9 "<" 8 L_ANGLE@8..9 "<"
9 LIFETIME_PARAM@9..11 9 LIFETIME_PARAM@9..11
10 LIFETIME@9..11 "\'a" 10 LIFETIME@9..11
11 LIFETIME_IDENT@9..11 "\'a"
11 R_ANGLE@11..12 ">" 12 R_ANGLE@11..12 ">"
12 WHITESPACE@12..13 " " 13 WHITESPACE@12..13 " "
13 EQ@13..14 "=" 14 EQ@13..14 "="
14 WHITESPACE@14..15 " " 15 WHITESPACE@14..15 " "
15 REF_TYPE@15..34 16 REF_TYPE@15..34
16 AMP@15..16 "&" 17 AMP@15..16 "&"
17 LIFETIME@16..18 "\'a" 18 LIFETIME@16..18
19 LIFETIME_IDENT@16..18 "\'a"
18 WHITESPACE@18..19 " " 20 WHITESPACE@18..19 " "
19 DYN_TRAIT_TYPE@19..34 21 DYN_TRAIT_TYPE@19..34
20 DYN_KW@19..22 "dyn" 22 DYN_KW@19..22 "dyn"
@@ -101,7 +103,8 @@ SOURCE_FILE@0..187
101 PLUS@99..100 "+" 103 PLUS@99..100 "+"
102 WHITESPACE@100..101 " " 104 WHITESPACE@100..101 " "
103 TYPE_BOUND@101..108 105 TYPE_BOUND@101..108
104 LIFETIME@101..108 "\'static" 106 LIFETIME@101..108
107 LIFETIME_IDENT@101..108 "\'static"
105 SEMICOLON@108..109 ";" 108 SEMICOLON@108..109 ";"
106 WHITESPACE@109..110 "\n" 109 WHITESPACE@109..110 "\n"
107 FN@110..186 110 FN@110..186
diff --git a/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast b/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
index a4271fc87..0adf2cd5a 100644
--- a/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
+++ b/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
@@ -14,7 +14,8 @@ SOURCE_FILE@0..30
14 EXPR_STMT@16..22 14 EXPR_STMT@16..22
15 ERROR@16..22 15 ERROR@16..22
16 LABEL@16..22 16 LABEL@16..22
17 LIFETIME@16..21 "\'loop" 17 LIFETIME@16..21
18 LIFETIME_IDENT@16..21 "\'loop"
18 COLON@21..22 ":" 19 COLON@21..22 ":"
19 WHITESPACE@22..23 " " 20 WHITESPACE@22..23 " "
20 IMPL@23..27 21 IMPL@23..27
diff --git a/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast b/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
index 62da7b887..6cdfd058b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
@@ -22,7 +22,8 @@ SOURCE_FILE@0..54
22 GENERIC_PARAM_LIST@30..34 22 GENERIC_PARAM_LIST@30..34
23 L_ANGLE@30..31 "<" 23 L_ANGLE@30..31 "<"
24 LIFETIME_PARAM@31..33 24 LIFETIME_PARAM@31..33
25 LIFETIME@31..33 "\'a" 25 LIFETIME@31..33
26 LIFETIME_IDENT@31..33 "\'a"
26 R_ANGLE@33..34 ">" 27 R_ANGLE@33..34 ">"
27 WHITESPACE@34..35 " " 28 WHITESPACE@34..35 " "
28 PATH_TYPE@35..36 29 PATH_TYPE@35..36
@@ -44,7 +45,8 @@ SOURCE_FILE@0..54
44 PARAM@41..48 45 PARAM@41..48
45 REF_TYPE@41..48 46 REF_TYPE@41..48
46 AMP@41..42 "&" 47 AMP@41..42 "&"
47 LIFETIME@42..44 "\'a" 48 LIFETIME@42..44
49 LIFETIME_IDENT@42..44 "\'a"
48 WHITESPACE@44..45 " " 50 WHITESPACE@44..45 " "
49 PATH_TYPE@45..48 51 PATH_TYPE@45..48
50 PATH@45..48 52 PATH@45..48
diff --git a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
index d24ad7423..8048f5fad 100644
--- a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
@@ -52,7 +52,8 @@ SOURCE_FILE@0..128
52 L_PAREN@55..56 "(" 52 L_PAREN@55..56 "("
53 SELF_PARAM@56..64 53 SELF_PARAM@56..64
54 AMP@56..57 "&" 54 AMP@56..57 "&"
55 LIFETIME@57..59 "\'a" 55 LIFETIME@57..59
56 LIFETIME_IDENT@57..59 "\'a"
56 WHITESPACE@59..60 " " 57 WHITESPACE@59..60 " "
57 SELF_KW@60..64 "self" 58 SELF_KW@60..64 "self"
58 COMMA@64..65 "," 59 COMMA@64..65 ","
@@ -71,7 +72,8 @@ SOURCE_FILE@0..128
71 L_PAREN@78..79 "(" 72 L_PAREN@78..79 "("
72 SELF_PARAM@79..91 73 SELF_PARAM@79..91
73 AMP@79..80 "&" 74 AMP@79..80 "&"
74 LIFETIME@80..82 "\'a" 75 LIFETIME@80..82
76 LIFETIME_IDENT@80..82 "\'a"
75 WHITESPACE@82..83 " " 77 WHITESPACE@82..83 " "
76 MUT_KW@83..86 "mut" 78 MUT_KW@83..86 "mut"
77 WHITESPACE@86..87 " " 79 WHITESPACE@86..87 " "
diff --git a/crates/syntax/test_data/parser/inline/ok/0007_type_param_bounds.rast b/crates/syntax/test_data/parser/inline/ok/0007_type_param_bounds.rast
index e95688f56..075b438d2 100644
--- a/crates/syntax/test_data/parser/inline/ok/0007_type_param_bounds.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0007_type_param_bounds.rast
@@ -13,7 +13,8 @@ SOURCE_FILE@0..35
13 WHITESPACE@11..12 " " 13 WHITESPACE@11..12 " "
14 TYPE_BOUND_LIST@12..32 14 TYPE_BOUND_LIST@12..32
15 TYPE_BOUND@12..14 15 TYPE_BOUND@12..14
16 LIFETIME@12..14 "\'a" 16 LIFETIME@12..14
17 LIFETIME_IDENT@12..14 "\'a"
17 WHITESPACE@14..15 " " 18 WHITESPACE@14..15 " "
18 PLUS@15..16 "+" 19 PLUS@15..16 "+"
19 WHITESPACE@16..17 " " 20 WHITESPACE@16..17 " "
diff --git a/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast b/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
index 104e153ce..b9e92b57a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
@@ -26,7 +26,8 @@ SOURCE_FILE@0..69
26 CONTINUE_EXPR@48..59 26 CONTINUE_EXPR@48..59
27 CONTINUE_KW@48..56 "continue" 27 CONTINUE_KW@48..56 "continue"
28 WHITESPACE@56..57 " " 28 WHITESPACE@56..57 " "
29 LIFETIME@57..59 "\'l" 29 LIFETIME@57..59
30 LIFETIME_IDENT@57..59 "\'l"
30 SEMICOLON@59..60 ";" 31 SEMICOLON@59..60 ";"
31 WHITESPACE@60..65 "\n " 32 WHITESPACE@60..65 "\n "
32 R_CURLY@65..66 "}" 33 R_CURLY@65..66 "}"
diff --git a/crates/syntax/test_data/parser/inline/ok/0028_impl_trait_type.rast b/crates/syntax/test_data/parser/inline/ok/0028_impl_trait_type.rast
index 32b2959bd..dad4362b7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0028_impl_trait_type.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0028_impl_trait_type.rast
@@ -31,13 +31,15 @@ SOURCE_FILE@0..43
31 GENERIC_ARG_LIST@31..35 31 GENERIC_ARG_LIST@31..35
32 L_ANGLE@31..32 "<" 32 L_ANGLE@31..32 "<"
33 LIFETIME_ARG@32..34 33 LIFETIME_ARG@32..34
34 LIFETIME@32..34 "\'a" 34 LIFETIME@32..34
35 LIFETIME_IDENT@32..34 "\'a"
35 R_ANGLE@34..35 ">" 36 R_ANGLE@34..35 ">"
36 R_ANGLE@35..36 ">" 37 R_ANGLE@35..36 ">"
37 WHITESPACE@36..37 " " 38 WHITESPACE@36..37 " "
38 PLUS@37..38 "+" 39 PLUS@37..38 "+"
39 WHITESPACE@38..39 " " 40 WHITESPACE@38..39 " "
40 TYPE_BOUND@39..41 41 TYPE_BOUND@39..41
41 LIFETIME@39..41 "\'a" 42 LIFETIME@39..41
43 LIFETIME_IDENT@39..41 "\'a"
42 SEMICOLON@41..42 ";" 44 SEMICOLON@41..42 ";"
43 WHITESPACE@42..43 "\n" 45 WHITESPACE@42..43 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0033_reference_type;.rast b/crates/syntax/test_data/parser/inline/ok/0033_reference_type;.rast
index 974df9f9a..ac0299268 100644
--- a/crates/syntax/test_data/parser/inline/ok/0033_reference_type;.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0033_reference_type;.rast
@@ -24,7 +24,8 @@ SOURCE_FILE@0..54
24 WHITESPACE@22..23 " " 24 WHITESPACE@22..23 " "
25 REF_TYPE@23..34 25 REF_TYPE@23..34
26 AMP@23..24 "&" 26 AMP@23..24 "&"
27 LIFETIME@24..31 "\'static" 27 LIFETIME@24..31
28 LIFETIME_IDENT@24..31 "\'static"
28 WHITESPACE@31..32 " " 29 WHITESPACE@31..32 " "
29 TUPLE_TYPE@32..34 30 TUPLE_TYPE@32..34
30 L_PAREN@32..33 "(" 31 L_PAREN@32..33 "("
diff --git a/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast b/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
index f905def6f..828013d45 100644
--- a/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
@@ -26,7 +26,8 @@ SOURCE_FILE@0..102
26 BREAK_EXPR@45..53 26 BREAK_EXPR@45..53
27 BREAK_KW@45..50 "break" 27 BREAK_KW@45..50 "break"
28 WHITESPACE@50..51 " " 28 WHITESPACE@50..51 " "
29 LIFETIME@51..53 "\'l" 29 LIFETIME@51..53
30 LIFETIME_IDENT@51..53 "\'l"
30 SEMICOLON@53..54 ";" 31 SEMICOLON@53..54 ";"
31 WHITESPACE@54..63 "\n " 32 WHITESPACE@54..63 "\n "
32 EXPR_STMT@63..72 33 EXPR_STMT@63..72
@@ -41,7 +42,8 @@ SOURCE_FILE@0..102
41 BREAK_EXPR@81..92 42 BREAK_EXPR@81..92
42 BREAK_KW@81..86 "break" 43 BREAK_KW@81..86 "break"
43 WHITESPACE@86..87 " " 44 WHITESPACE@86..87 " "
44 LIFETIME@87..89 "\'l" 45 LIFETIME@87..89
46 LIFETIME_IDENT@87..89 "\'l"
45 WHITESPACE@89..90 " " 47 WHITESPACE@89..90 " "
46 LITERAL@90..92 48 LITERAL@90..92
47 INT_NUMBER@90..92 "92" 49 INT_NUMBER@90..92 "92"
diff --git a/crates/syntax/test_data/parser/inline/ok/0039_type_arg.rast b/crates/syntax/test_data/parser/inline/ok/0039_type_arg.rast
index 69e98b9d6..51e881a8e 100644
--- a/crates/syntax/test_data/parser/inline/ok/0039_type_arg.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0039_type_arg.rast
@@ -15,7 +15,8 @@ SOURCE_FILE@0..46
15 GENERIC_ARG_LIST@10..44 15 GENERIC_ARG_LIST@10..44
16 L_ANGLE@10..11 "<" 16 L_ANGLE@10..11 "<"
17 LIFETIME_ARG@11..18 17 LIFETIME_ARG@11..18
18 LIFETIME@11..18 "\'static" 18 LIFETIME@11..18
19 LIFETIME_IDENT@11..18 "\'static"
19 COMMA@18..19 "," 20 COMMA@18..19 ","
20 WHITESPACE@19..20 " " 21 WHITESPACE@19..20 " "
21 TYPE_ARG@20..23 22 TYPE_ARG@20..23
diff --git a/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast b/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
index 6baea6e3c..b6f5a5689 100644
--- a/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
@@ -33,7 +33,8 @@ SOURCE_FILE@0..35
33 GENERIC_ARG_LIST@24..28 33 GENERIC_ARG_LIST@24..28
34 L_ANGLE@24..25 "<" 34 L_ANGLE@24..25 "<"
35 LIFETIME_ARG@25..27 35 LIFETIME_ARG@25..27
36 LIFETIME@25..27 "\'a" 36 LIFETIME@25..27
37 LIFETIME_IDENT@25..27 "\'a"
37 R_ANGLE@27..28 ">" 38 R_ANGLE@27..28 ">"
38 R_PAREN@28..29 ")" 39 R_PAREN@28..29 ")"
39 R_ANGLE@29..30 ">" 40 R_ANGLE@29..30 ">"
diff --git a/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast b/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
index 4d8404e7c..7df6e190a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
@@ -31,7 +31,8 @@ SOURCE_FILE@0..58
31 PLUS@18..19 "+" 31 PLUS@18..19 "+"
32 WHITESPACE@19..20 " " 32 WHITESPACE@19..20 " "
33 TYPE_BOUND@20..22 33 TYPE_BOUND@20..22
34 LIFETIME@20..22 "\'f" 34 LIFETIME@20..22
35 LIFETIME_IDENT@20..22 "\'f"
35 R_ANGLE@22..23 ">" 36 R_ANGLE@22..23 ">"
36 WHITESPACE@23..24 " " 37 WHITESPACE@23..24 " "
37 BLOCK_EXPR@24..26 38 BLOCK_EXPR@24..26
@@ -72,7 +73,8 @@ SOURCE_FILE@0..58
72 PLUS@49..50 "+" 73 PLUS@49..50 "+"
73 WHITESPACE@50..51 " " 74 WHITESPACE@50..51 " "
74 TYPE_BOUND@51..53 75 TYPE_BOUND@51..53
75 LIFETIME@51..53 "\'f" 76 LIFETIME@51..53
77 LIFETIME_IDENT@51..53 "\'f"
76 R_ANGLE@53..54 ">" 78 R_ANGLE@53..54 ">"
77 WHITESPACE@54..55 " " 79 WHITESPACE@54..55 " "
78 BLOCK_EXPR@55..57 80 BLOCK_EXPR@55..57
diff --git a/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast b/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
index 28129c50c..61dea413d 100644
--- a/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
@@ -12,17 +12,20 @@ SOURCE_FILE@0..116
12 WHERE_KW@9..14 "where" 12 WHERE_KW@9..14 "where"
13 WHITESPACE@14..18 "\n " 13 WHITESPACE@14..18 "\n "
14 WHERE_PRED@18..29 14 WHERE_PRED@18..29
15 LIFETIME@18..20 "\'a" 15 LIFETIME@18..20
16 LIFETIME_IDENT@18..20 "\'a"
16 COLON@20..21 ":" 17 COLON@20..21 ":"
17 WHITESPACE@21..22 " " 18 WHITESPACE@21..22 " "
18 TYPE_BOUND_LIST@22..29 19 TYPE_BOUND_LIST@22..29
19 TYPE_BOUND@22..24 20 TYPE_BOUND@22..24
20 LIFETIME@22..24 "\'b" 21 LIFETIME@22..24
22 LIFETIME_IDENT@22..24 "\'b"
21 WHITESPACE@24..25 " " 23 WHITESPACE@24..25 " "
22 PLUS@25..26 "+" 24 PLUS@25..26 "+"
23 WHITESPACE@26..27 " " 25 WHITESPACE@26..27 " "
24 TYPE_BOUND@27..29 26 TYPE_BOUND@27..29
25 LIFETIME@27..29 "\'c" 27 LIFETIME@27..29
28 LIFETIME_IDENT@27..29 "\'c"
26 COMMA@29..30 "," 29 COMMA@29..30 ","
27 WHITESPACE@30..34 "\n " 30 WHITESPACE@30..34 "\n "
28 WHERE_PRED@34..59 31 WHERE_PRED@34..59
@@ -53,7 +56,8 @@ SOURCE_FILE@0..116
53 PLUS@50..51 "+" 56 PLUS@50..51 "+"
54 WHITESPACE@51..52 " " 57 WHITESPACE@51..52 " "
55 TYPE_BOUND@52..59 58 TYPE_BOUND@52..59
56 LIFETIME@52..59 "\'static" 59 LIFETIME@52..59
60 LIFETIME_IDENT@52..59 "\'static"
57 COMMA@59..60 "," 61 COMMA@59..60 ","
58 WHITESPACE@60..64 "\n " 62 WHITESPACE@60..64 "\n "
59 WHERE_PRED@64..82 63 WHERE_PRED@64..82
@@ -71,7 +75,8 @@ SOURCE_FILE@0..116
71 WHITESPACE@79..80 " " 75 WHITESPACE@79..80 " "
72 TYPE_BOUND_LIST@80..82 76 TYPE_BOUND_LIST@80..82
73 TYPE_BOUND@80..82 77 TYPE_BOUND@80..82
74 LIFETIME@80..82 "\'a" 78 LIFETIME@80..82
79 LIFETIME_IDENT@80..82 "\'a"
75 COMMA@82..83 "," 80 COMMA@82..83 ","
76 WHITESPACE@83..87 "\n " 81 WHITESPACE@83..87 "\n "
77 WHERE_PRED@87..112 82 WHERE_PRED@87..112
@@ -102,7 +107,8 @@ SOURCE_FILE@0..116
102 WHITESPACE@109..110 " " 107 WHITESPACE@109..110 " "
103 TYPE_BOUND_LIST@110..112 108 TYPE_BOUND_LIST@110..112
104 TYPE_BOUND@110..112 109 TYPE_BOUND@110..112
105 LIFETIME@110..112 "\'a" 110 LIFETIME@110..112
111 LIFETIME_IDENT@110..112 "\'a"
106 WHITESPACE@112..113 "\n" 112 WHITESPACE@112..113 "\n"
107 BLOCK_EXPR@113..115 113 BLOCK_EXPR@113..115
108 L_CURLY@113..114 "{" 114 L_CURLY@113..114 "{"
diff --git a/crates/syntax/test_data/parser/inline/ok/0065_dyn_trait_type.rast b/crates/syntax/test_data/parser/inline/ok/0065_dyn_trait_type.rast
index 3a7fcfe24..49d26cef4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0065_dyn_trait_type.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0065_dyn_trait_type.rast
@@ -31,13 +31,15 @@ SOURCE_FILE@0..42
31 GENERIC_ARG_LIST@30..34 31 GENERIC_ARG_LIST@30..34
32 L_ANGLE@30..31 "<" 32 L_ANGLE@30..31 "<"
33 LIFETIME_ARG@31..33 33 LIFETIME_ARG@31..33
34 LIFETIME@31..33 "\'a" 34 LIFETIME@31..33
35 LIFETIME_IDENT@31..33 "\'a"
35 R_ANGLE@33..34 ">" 36 R_ANGLE@33..34 ">"
36 R_ANGLE@34..35 ">" 37 R_ANGLE@34..35 ">"
37 WHITESPACE@35..36 " " 38 WHITESPACE@35..36 " "
38 PLUS@36..37 "+" 39 PLUS@36..37 "+"
39 WHITESPACE@37..38 " " 40 WHITESPACE@37..38 " "
40 TYPE_BOUND@38..40 41 TYPE_BOUND@38..40
41 LIFETIME@38..40 "\'a" 42 LIFETIME@38..40
43 LIFETIME_IDENT@38..40 "\'a"
42 SEMICOLON@40..41 ";" 44 SEMICOLON@40..41 ";"
43 WHITESPACE@41..42 "\n" 45 WHITESPACE@41..42 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0081_for_type.rast b/crates/syntax/test_data/parser/inline/ok/0081_for_type.rast
index f319d5141..8c909b5af 100644
--- a/crates/syntax/test_data/parser/inline/ok/0081_for_type.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0081_for_type.rast
@@ -12,7 +12,8 @@ SOURCE_FILE@0..121
12 GENERIC_PARAM_LIST@12..16 12 GENERIC_PARAM_LIST@12..16
13 L_ANGLE@12..13 "<" 13 L_ANGLE@12..13 "<"
14 LIFETIME_PARAM@13..15 14 LIFETIME_PARAM@13..15
15 LIFETIME@13..15 "\'a" 15 LIFETIME@13..15
16 LIFETIME_IDENT@13..15 "\'a"
16 R_ANGLE@15..16 ">" 17 R_ANGLE@15..16 ">"
17 WHITESPACE@16..17 " " 18 WHITESPACE@16..17 " "
18 FN_PTR_TYPE@17..27 19 FN_PTR_TYPE@17..27
@@ -42,7 +43,8 @@ SOURCE_FILE@0..121
42 GENERIC_PARAM_LIST@41..45 43 GENERIC_PARAM_LIST@41..45
43 L_ANGLE@41..42 "<" 44 L_ANGLE@41..42 "<"
44 LIFETIME_PARAM@42..44 45 LIFETIME_PARAM@42..44
45 LIFETIME@42..44 "\'a" 46 LIFETIME@42..44
47 LIFETIME_IDENT@42..44 "\'a"
46 R_ANGLE@44..45 ">" 48 R_ANGLE@44..45 ">"
47 WHITESPACE@45..46 " " 49 WHITESPACE@45..46 " "
48 FN_PTR_TYPE@46..80 50 FN_PTR_TYPE@46..80
@@ -59,7 +61,8 @@ SOURCE_FILE@0..121
59 PARAM@67..73 61 PARAM@67..73
60 REF_TYPE@67..73 62 REF_TYPE@67..73
61 AMP@67..68 "&" 63 AMP@67..68 "&"
62 LIFETIME@68..70 "\'a" 64 LIFETIME@68..70
65 LIFETIME_IDENT@68..70 "\'a"
63 WHITESPACE@70..71 " " 66 WHITESPACE@70..71 " "
64 TUPLE_TYPE@71..73 67 TUPLE_TYPE@71..73
65 L_PAREN@71..72 "(" 68 L_PAREN@71..72 "("
@@ -87,7 +90,8 @@ SOURCE_FILE@0..121
87 GENERIC_PARAM_LIST@96..100 90 GENERIC_PARAM_LIST@96..100
88 L_ANGLE@96..97 "<" 91 L_ANGLE@96..97 "<"
89 LIFETIME_PARAM@97..99 92 LIFETIME_PARAM@97..99
90 LIFETIME@97..99 "\'a" 93 LIFETIME@97..99
94 LIFETIME_IDENT@97..99 "\'a"
91 R_ANGLE@99..100 ">" 95 R_ANGLE@99..100 ">"
92 WHITESPACE@100..101 " " 96 WHITESPACE@100..101 " "
93 PATH_TYPE@101..119 97 PATH_TYPE@101..119
@@ -100,7 +104,8 @@ SOURCE_FILE@0..121
100 TYPE_ARG@111..118 104 TYPE_ARG@111..118
101 REF_TYPE@111..118 105 REF_TYPE@111..118
102 AMP@111..112 "&" 106 AMP@111..112 "&"
103 LIFETIME@112..114 "\'a" 107 LIFETIME@112..114
108 LIFETIME_IDENT@112..114 "\'a"
104 WHITESPACE@114..115 " " 109 WHITESPACE@114..115 " "
105 PATH_TYPE@115..118 110 PATH_TYPE@115..118
106 PATH@115..118 111 PATH@115..118
diff --git a/crates/syntax/test_data/parser/inline/ok/0109_label.rast b/crates/syntax/test_data/parser/inline/ok/0109_label.rast
index c9588025c..860dfe608 100644
--- a/crates/syntax/test_data/parser/inline/ok/0109_label.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0109_label.rast
@@ -14,7 +14,8 @@ SOURCE_FILE@0..74
14 EXPR_STMT@15..26 14 EXPR_STMT@15..26
15 LOOP_EXPR@15..26 15 LOOP_EXPR@15..26
16 LABEL@15..18 16 LABEL@15..18
17 LIFETIME@15..17 "\'a" 17 LIFETIME@15..17
18 LIFETIME_IDENT@15..17 "\'a"
18 COLON@17..18 ":" 19 COLON@17..18 ":"
19 WHITESPACE@18..19 " " 20 WHITESPACE@18..19 " "
20 LOOP_KW@19..23 "loop" 21 LOOP_KW@19..23 "loop"
@@ -26,7 +27,8 @@ SOURCE_FILE@0..74
26 EXPR_STMT@31..48 27 EXPR_STMT@31..48
27 WHILE_EXPR@31..48 28 WHILE_EXPR@31..48
28 LABEL@31..34 29 LABEL@31..34
29 LIFETIME@31..33 "\'b" 30 LIFETIME@31..33
31 LIFETIME_IDENT@31..33 "\'b"
30 COLON@33..34 ":" 32 COLON@33..34 ":"
31 WHITESPACE@34..35 " " 33 WHITESPACE@34..35 " "
32 WHILE_KW@35..40 "while" 34 WHILE_KW@35..40 "while"
@@ -41,7 +43,8 @@ SOURCE_FILE@0..74
41 WHITESPACE@48..53 "\n " 43 WHITESPACE@48..53 "\n "
42 FOR_EXPR@53..71 44 FOR_EXPR@53..71
43 LABEL@53..56 45 LABEL@53..56
44 LIFETIME@53..55 "\'c" 46 LIFETIME@53..55
47 LIFETIME_IDENT@53..55 "\'c"
45 COLON@55..56 ":" 48 COLON@55..56 ":"
46 WHITESPACE@56..57 " " 49 WHITESPACE@56..57 " "
47 FOR_KW@57..60 "for" 50 FOR_KW@57..60 "for"
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
index 570b95205..616aa984e 100644
--- 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
@@ -20,7 +20,8 @@ SOURCE_FILE@0..64
20 R_PAREN@24..25 ")" 20 R_PAREN@24..25 ")"
21 R_BRACK@25..26 "]" 21 R_BRACK@25..26 "]"
22 WHITESPACE@26..27 " " 22 WHITESPACE@26..27 " "
23 LIFETIME@27..29 "\'a" 23 LIFETIME@27..29
24 LIFETIME_IDENT@27..29 "\'a"
24 COMMA@29..30 "," 25 COMMA@29..30 ","
25 WHITESPACE@30..31 " " 26 WHITESPACE@30..31 " "
26 TYPE_PARAM@31..48 27 TYPE_PARAM@31..48
@@ -49,7 +50,8 @@ SOURCE_FILE@0..64
49 WHITESPACE@52..53 " " 50 WHITESPACE@52..53 " "
50 REF_TYPE@53..58 51 REF_TYPE@53..58
51 AMP@53..54 "&" 52 AMP@53..54 "&"
52 LIFETIME@54..56 "\'a" 53 LIFETIME@54..56
54 LIFETIME_IDENT@54..56 "\'a"
53 WHITESPACE@56..57 " " 55 WHITESPACE@56..57 " "
54 PATH_TYPE@57..58 56 PATH_TYPE@57..58
55 PATH@57..58 57 PATH@57..58
diff --git a/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast b/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
index 9e9a5f9c5..c2dea1cc1 100644
--- a/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
@@ -14,7 +14,8 @@ SOURCE_FILE@0..23
14 EXPR_STMT@9..20 14 EXPR_STMT@9..20
15 EFFECT_EXPR@9..19 15 EFFECT_EXPR@9..19
16 LABEL@9..16 16 LABEL@9..16
17 LIFETIME@9..15 "\'label" 17 LIFETIME@9..15
18 LIFETIME_IDENT@9..15 "\'label"
18 COLON@15..16 ":" 19 COLON@15..16 ":"
19 WHITESPACE@16..17 " " 20 WHITESPACE@16..17 " "
20 BLOCK_EXPR@17..19 21 BLOCK_EXPR@17..19
diff --git a/crates/syntax/test_data/parser/ok/0018_struct_type_params.rast b/crates/syntax/test_data/parser/ok/0018_struct_type_params.rast
index 630aa0708..83e17757b 100644
--- a/crates/syntax/test_data/parser/ok/0018_struct_type_params.rast
+++ b/crates/syntax/test_data/parser/ok/0018_struct_type_params.rast
@@ -80,7 +80,8 @@ SOURCE_FILE@0..290
80 GENERIC_PARAM_LIST@80..84 80 GENERIC_PARAM_LIST@80..84
81 L_ANGLE@80..81 "<" 81 L_ANGLE@80..81 "<"
82 LIFETIME_PARAM@81..83 82 LIFETIME_PARAM@81..83
83 LIFETIME@81..83 "\'a" 83 LIFETIME@81..83
84 LIFETIME_IDENT@81..83 "\'a"
84 R_ANGLE@83..84 ">" 85 R_ANGLE@83..84 ">"
85 SEMICOLON@84..85 ";" 86 SEMICOLON@84..85 ";"
86 WHITESPACE@85..86 "\n" 87 WHITESPACE@85..86 "\n"
@@ -92,7 +93,8 @@ SOURCE_FILE@0..290
92 GENERIC_PARAM_LIST@95..100 93 GENERIC_PARAM_LIST@95..100
93 L_ANGLE@95..96 "<" 94 L_ANGLE@95..96 "<"
94 LIFETIME_PARAM@96..99 95 LIFETIME_PARAM@96..99
95 LIFETIME@96..98 "\'a" 96 LIFETIME@96..98
97 LIFETIME_IDENT@96..98 "\'a"
96 COLON@98..99 ":" 98 COLON@98..99 ":"
97 R_ANGLE@99..100 ">" 99 R_ANGLE@99..100 ">"
98 SEMICOLON@100..101 ";" 100 SEMICOLON@100..101 ";"
@@ -105,10 +107,12 @@ SOURCE_FILE@0..290
105 GENERIC_PARAM_LIST@111..119 107 GENERIC_PARAM_LIST@111..119
106 L_ANGLE@111..112 "<" 108 L_ANGLE@111..112 "<"
107 LIFETIME_PARAM@112..118 109 LIFETIME_PARAM@112..118
108 LIFETIME@112..114 "\'a" 110 LIFETIME@112..114
111 LIFETIME_IDENT@112..114 "\'a"
109 COLON@114..115 ":" 112 COLON@114..115 ":"
110 WHITESPACE@115..116 " " 113 WHITESPACE@115..116 " "
111 LIFETIME@116..118 "\'b" 114 LIFETIME@116..118
115 LIFETIME_IDENT@116..118 "\'b"
112 R_ANGLE@118..119 ">" 116 R_ANGLE@118..119 ">"
113 SEMICOLON@119..120 ";" 117 SEMICOLON@119..120 ";"
114 WHITESPACE@120..121 "\n" 118 WHITESPACE@120..121 "\n"
@@ -120,10 +124,12 @@ SOURCE_FILE@0..290
120 GENERIC_PARAM_LIST@130..141 124 GENERIC_PARAM_LIST@130..141
121 L_ANGLE@130..131 "<" 125 L_ANGLE@130..131 "<"
122 LIFETIME_PARAM@131..139 126 LIFETIME_PARAM@131..139
123 LIFETIME@131..133 "\'a" 127 LIFETIME@131..133
128 LIFETIME_IDENT@131..133 "\'a"
124 COLON@133..134 ":" 129 COLON@133..134 ":"
125 WHITESPACE@134..135 " " 130 WHITESPACE@134..135 " "
126 LIFETIME@135..137 "\'b" 131 LIFETIME@135..137
132 LIFETIME_IDENT@135..137 "\'b"
127 WHITESPACE@137..138 " " 133 WHITESPACE@137..138 " "
128 PLUS@138..139 "+" 134 PLUS@138..139 "+"
129 WHITESPACE@139..140 " " 135 WHITESPACE@139..140 " "
@@ -138,14 +144,17 @@ SOURCE_FILE@0..290
138 GENERIC_PARAM_LIST@152..165 144 GENERIC_PARAM_LIST@152..165
139 L_ANGLE@152..153 "<" 145 L_ANGLE@152..153 "<"
140 LIFETIME_PARAM@153..164 146 LIFETIME_PARAM@153..164
141 LIFETIME@153..155 "\'a" 147 LIFETIME@153..155
148 LIFETIME_IDENT@153..155 "\'a"
142 COLON@155..156 ":" 149 COLON@155..156 ":"
143 WHITESPACE@156..157 " " 150 WHITESPACE@156..157 " "
144 LIFETIME@157..159 "\'b" 151 LIFETIME@157..159
152 LIFETIME_IDENT@157..159 "\'b"
145 WHITESPACE@159..160 " " 153 WHITESPACE@159..160 " "
146 PLUS@160..161 "+" 154 PLUS@160..161 "+"
147 WHITESPACE@161..162 " " 155 WHITESPACE@161..162 " "
148 LIFETIME@162..164 "\'c" 156 LIFETIME@162..164
157 LIFETIME_IDENT@162..164 "\'c"
149 R_ANGLE@164..165 ">" 158 R_ANGLE@164..165 ">"
150 SEMICOLON@165..166 ";" 159 SEMICOLON@165..166 ";"
151 WHITESPACE@166..167 "\n" 160 WHITESPACE@166..167 "\n"
@@ -157,7 +166,8 @@ SOURCE_FILE@0..290
157 GENERIC_PARAM_LIST@177..182 166 GENERIC_PARAM_LIST@177..182
158 L_ANGLE@177..178 "<" 167 L_ANGLE@177..178 "<"
159 LIFETIME_PARAM@178..180 168 LIFETIME_PARAM@178..180
160 LIFETIME@178..180 "\'a" 169 LIFETIME@178..180
170 LIFETIME_IDENT@178..180 "\'a"
161 COMMA@180..181 "," 171 COMMA@180..181 ","
162 R_ANGLE@181..182 ">" 172 R_ANGLE@181..182 ">"
163 SEMICOLON@182..183 ";" 173 SEMICOLON@182..183 ";"
@@ -170,11 +180,13 @@ SOURCE_FILE@0..290
170 GENERIC_PARAM_LIST@194..202 180 GENERIC_PARAM_LIST@194..202
171 L_ANGLE@194..195 "<" 181 L_ANGLE@194..195 "<"
172 LIFETIME_PARAM@195..197 182 LIFETIME_PARAM@195..197
173 LIFETIME@195..197 "\'a" 183 LIFETIME@195..197
184 LIFETIME_IDENT@195..197 "\'a"
174 COMMA@197..198 "," 185 COMMA@197..198 ","
175 WHITESPACE@198..199 " " 186 WHITESPACE@198..199 " "
176 LIFETIME_PARAM@199..201 187 LIFETIME_PARAM@199..201
177 LIFETIME@199..201 "\'b" 188 LIFETIME@199..201
189 LIFETIME_IDENT@199..201 "\'b"
178 R_ANGLE@201..202 ">" 190 R_ANGLE@201..202 ">"
179 SEMICOLON@202..203 ";" 191 SEMICOLON@202..203 ";"
180 WHITESPACE@203..204 "\n" 192 WHITESPACE@203..204 "\n"
@@ -186,18 +198,22 @@ SOURCE_FILE@0..290
186 GENERIC_PARAM_LIST@214..232 198 GENERIC_PARAM_LIST@214..232
187 L_ANGLE@214..215 "<" 199 L_ANGLE@214..215 "<"
188 LIFETIME_PARAM@215..222 200 LIFETIME_PARAM@215..222
189 LIFETIME@215..217 "\'a" 201 LIFETIME@215..217
202 LIFETIME_IDENT@215..217 "\'a"
190 COLON@217..218 ":" 203 COLON@217..218 ":"
191 WHITESPACE@218..219 " " 204 WHITESPACE@218..219 " "
192 LIFETIME@219..221 "\'b" 205 LIFETIME@219..221
206 LIFETIME_IDENT@219..221 "\'b"
193 PLUS@221..222 "+" 207 PLUS@221..222 "+"
194 COMMA@222..223 "," 208 COMMA@222..223 ","
195 WHITESPACE@223..224 " " 209 WHITESPACE@223..224 " "
196 LIFETIME_PARAM@224..230 210 LIFETIME_PARAM@224..230
197 LIFETIME@224..226 "\'b" 211 LIFETIME@224..226
212 LIFETIME_IDENT@224..226 "\'b"
198 COLON@226..227 ":" 213 COLON@226..227 ":"
199 WHITESPACE@227..228 " " 214 WHITESPACE@227..228 " "
200 LIFETIME@228..230 "\'c" 215 LIFETIME@228..230
216 LIFETIME_IDENT@228..230 "\'c"
201 COMMA@230..231 "," 217 COMMA@230..231 ","
202 R_ANGLE@231..232 ">" 218 R_ANGLE@231..232 ">"
203 SEMICOLON@232..233 ";" 219 SEMICOLON@232..233 ";"
@@ -241,7 +257,8 @@ SOURCE_FILE@0..290
241 GENERIC_PARAM_LIST@278..288 257 GENERIC_PARAM_LIST@278..288
242 L_ANGLE@278..279 "<" 258 L_ANGLE@278..279 "<"
243 LIFETIME_PARAM@279..281 259 LIFETIME_PARAM@279..281
244 LIFETIME@279..281 "\'a" 260 LIFETIME@279..281
261 LIFETIME_IDENT@279..281 "\'a"
245 COMMA@281..282 "," 262 COMMA@281..282 ","
246 WHITESPACE@282..283 " " 263 WHITESPACE@282..283 " "
247 TYPE_PARAM@283..284 264 TYPE_PARAM@283..284
diff --git a/crates/syntax/test_data/parser/ok/0020_type_param_bounds.rast b/crates/syntax/test_data/parser/ok/0020_type_param_bounds.rast
index 9bdc50e1e..0612a71de 100644
--- a/crates/syntax/test_data/parser/ok/0020_type_param_bounds.rast
+++ b/crates/syntax/test_data/parser/ok/0020_type_param_bounds.rast
@@ -41,7 +41,8 @@ SOURCE_FILE@0..250
41 WHITESPACE@38..39 " " 41 WHITESPACE@38..39 " "
42 TYPE_BOUND_LIST@39..41 42 TYPE_BOUND_LIST@39..41
43 TYPE_BOUND@39..41 43 TYPE_BOUND@39..41
44 LIFETIME@39..41 "\'a" 44 LIFETIME@39..41
45 LIFETIME_IDENT@39..41 "\'a"
45 R_ANGLE@41..42 ">" 46 R_ANGLE@41..42 ">"
46 SEMICOLON@42..43 ";" 47 SEMICOLON@42..43 ";"
47 WHITESPACE@43..44 "\n" 48 WHITESPACE@43..44 "\n"
@@ -59,7 +60,8 @@ SOURCE_FILE@0..250
59 WHITESPACE@55..56 " " 60 WHITESPACE@55..56 " "
60 TYPE_BOUND_LIST@56..60 61 TYPE_BOUND_LIST@56..60
61 TYPE_BOUND@56..58 62 TYPE_BOUND@56..58
62 LIFETIME@56..58 "\'a" 63 LIFETIME@56..58
64 LIFETIME_IDENT@56..58 "\'a"
63 WHITESPACE@58..59 " " 65 WHITESPACE@58..59 " "
64 PLUS@59..60 "+" 66 PLUS@59..60 "+"
65 WHITESPACE@60..61 " " 67 WHITESPACE@60..61 " "
@@ -80,12 +82,14 @@ SOURCE_FILE@0..250
80 WHITESPACE@75..76 " " 82 WHITESPACE@75..76 " "
81 TYPE_BOUND_LIST@76..83 83 TYPE_BOUND_LIST@76..83
82 TYPE_BOUND@76..78 84 TYPE_BOUND@76..78
83 LIFETIME@76..78 "\'a" 85 LIFETIME@76..78
86 LIFETIME_IDENT@76..78 "\'a"
84 WHITESPACE@78..79 " " 87 WHITESPACE@78..79 " "
85 PLUS@79..80 "+" 88 PLUS@79..80 "+"
86 WHITESPACE@80..81 " " 89 WHITESPACE@80..81 " "
87 TYPE_BOUND@81..83 90 TYPE_BOUND@81..83
88 LIFETIME@81..83 "\'d" 91 LIFETIME@81..83
92 LIFETIME_IDENT@81..83 "\'d"
89 WHITESPACE@83..84 " " 93 WHITESPACE@83..84 " "
90 R_ANGLE@84..85 ">" 94 R_ANGLE@84..85 ">"
91 SEMICOLON@85..86 ";" 95 SEMICOLON@85..86 ";"
@@ -104,12 +108,14 @@ SOURCE_FILE@0..250
104 WHITESPACE@98..99 " " 108 WHITESPACE@98..99 " "
105 TYPE_BOUND_LIST@99..114 109 TYPE_BOUND_LIST@99..114
106 TYPE_BOUND@99..101 110 TYPE_BOUND@99..101
107 LIFETIME@99..101 "\'a" 111 LIFETIME@99..101
112 LIFETIME_IDENT@99..101 "\'a"
108 WHITESPACE@101..102 " " 113 WHITESPACE@101..102 " "
109 PLUS@102..103 "+" 114 PLUS@102..103 "+"
110 WHITESPACE@103..104 " " 115 WHITESPACE@103..104 " "
111 TYPE_BOUND@104..106 116 TYPE_BOUND@104..106
112 LIFETIME@104..106 "\'d" 117 LIFETIME@104..106
118 LIFETIME_IDENT@104..106 "\'d"
113 WHITESPACE@106..107 " " 119 WHITESPACE@106..107 " "
114 PLUS@107..108 "+" 120 PLUS@107..108 "+"
115 WHITESPACE@108..109 " " 121 WHITESPACE@108..109 " "
@@ -190,7 +196,8 @@ SOURCE_FILE@0..250
190 PLUS@174..175 "+" 196 PLUS@174..175 "+"
191 WHITESPACE@175..176 " " 197 WHITESPACE@175..176 " "
192 TYPE_BOUND@176..178 198 TYPE_BOUND@176..178
193 LIFETIME@176..178 "\'a" 199 LIFETIME@176..178
200 LIFETIME_IDENT@176..178 "\'a"
194 R_ANGLE@178..179 ">" 201 R_ANGLE@178..179 ">"
195 SEMICOLON@179..180 ";" 202 SEMICOLON@179..180 ";"
196 WHITESPACE@180..181 "\n" 203 WHITESPACE@180..181 "\n"
@@ -225,21 +232,26 @@ SOURCE_FILE@0..250
225 GENERIC_PARAM_LIST@208..249 232 GENERIC_PARAM_LIST@208..249
226 L_ANGLE@208..209 "<" 233 L_ANGLE@208..209 "<"
227 LIFETIME_PARAM@209..215 234 LIFETIME_PARAM@209..215
228 LIFETIME@209..211 "\'a" 235 LIFETIME@209..211
236 LIFETIME_IDENT@209..211 "\'a"
229 COLON@211..212 ":" 237 COLON@211..212 ":"
230 WHITESPACE@212..213 " " 238 WHITESPACE@212..213 " "
231 LIFETIME@213..215 "\'d" 239 LIFETIME@213..215
240 LIFETIME_IDENT@213..215 "\'d"
232 COMMA@215..216 "," 241 COMMA@215..216 ","
233 WHITESPACE@216..217 " " 242 WHITESPACE@216..217 " "
234 LIFETIME_PARAM@217..228 243 LIFETIME_PARAM@217..228
235 LIFETIME@217..219 "\'d" 244 LIFETIME@217..219
245 LIFETIME_IDENT@217..219 "\'d"
236 COLON@219..220 ":" 246 COLON@219..220 ":"
237 WHITESPACE@220..221 " " 247 WHITESPACE@220..221 " "
238 LIFETIME@221..223 "\'a" 248 LIFETIME@221..223
249 LIFETIME_IDENT@221..223 "\'a"
239 WHITESPACE@223..224 " " 250 WHITESPACE@223..224 " "
240 PLUS@224..225 "+" 251 PLUS@224..225 "+"
241 WHITESPACE@225..226 " " 252 WHITESPACE@225..226 " "
242 LIFETIME@226..228 "\'b" 253 LIFETIME@226..228
254 LIFETIME_IDENT@226..228 "\'b"
243 COMMA@228..229 "," 255 COMMA@228..229 ","
244 WHITESPACE@229..230 " " 256 WHITESPACE@229..230 " "
245 TYPE_PARAM@230..248 257 TYPE_PARAM@230..248
@@ -249,12 +261,14 @@ SOURCE_FILE@0..250
249 WHITESPACE@232..233 " " 261 WHITESPACE@232..233 " "
250 TYPE_BOUND_LIST@233..248 262 TYPE_BOUND_LIST@233..248
251 TYPE_BOUND@233..235 263 TYPE_BOUND@233..235
252 LIFETIME@233..235 "\'a" 264 LIFETIME@233..235
265 LIFETIME_IDENT@233..235 "\'a"
253 WHITESPACE@235..236 " " 266 WHITESPACE@235..236 " "
254 PLUS@236..237 "+" 267 PLUS@236..237 "+"
255 WHITESPACE@237..238 " " 268 WHITESPACE@237..238 " "
256 TYPE_BOUND@238..240 269 TYPE_BOUND@238..240
257 LIFETIME@238..240 "\'d" 270 LIFETIME@238..240
271 LIFETIME_IDENT@238..240 "\'d"
258 WHITESPACE@240..241 " " 272 WHITESPACE@240..241 " "
259 PLUS@241..242 "+" 273 PLUS@241..242 "+"
260 WHITESPACE@242..243 " " 274 WHITESPACE@242..243 " "
diff --git a/crates/syntax/test_data/parser/ok/0032_where_for.rast b/crates/syntax/test_data/parser/ok/0032_where_for.rast
index d59548f21..0cb2eca33 100644
--- a/crates/syntax/test_data/parser/ok/0032_where_for.rast
+++ b/crates/syntax/test_data/parser/ok/0032_where_for.rast
@@ -41,7 +41,8 @@ SOURCE_FILE@0..116
41 GENERIC_PARAM_LIST@59..64 41 GENERIC_PARAM_LIST@59..64
42 L_ANGLE@59..60 "<" 42 L_ANGLE@59..60 "<"
43 LIFETIME_PARAM@60..63 43 LIFETIME_PARAM@60..63
44 LIFETIME@60..63 "\'de" 44 LIFETIME@60..63
45 LIFETIME_IDENT@60..63 "\'de"
45 R_ANGLE@63..64 ">" 46 R_ANGLE@63..64 ">"
46 WHITESPACE@64..65 " " 47 WHITESPACE@64..65 " "
47 PATH_TYPE@65..81 48 PATH_TYPE@65..81
@@ -52,7 +53,8 @@ SOURCE_FILE@0..116
52 GENERIC_ARG_LIST@76..81 53 GENERIC_ARG_LIST@76..81
53 L_ANGLE@76..77 "<" 54 L_ANGLE@76..77 "<"
54 LIFETIME_ARG@77..80 55 LIFETIME_ARG@77..80
55 LIFETIME@77..80 "\'de" 56 LIFETIME@77..80
57 LIFETIME_IDENT@77..80 "\'de"
56 R_ANGLE@80..81 ">" 58 R_ANGLE@80..81 ">"
57 WHITESPACE@81..82 " " 59 WHITESPACE@81..82 " "
58 PLUS@82..83 "+" 60 PLUS@82..83 "+"
diff --git a/crates/syntax/test_data/parser/ok/0033_label_break.rast b/crates/syntax/test_data/parser/ok/0033_label_break.rast
index 88800ca7a..487e073ba 100644
--- a/crates/syntax/test_data/parser/ok/0033_label_break.rast
+++ b/crates/syntax/test_data/parser/ok/0033_label_break.rast
@@ -16,7 +16,8 @@ SOURCE_FILE@0..506
16 EXPR_STMT@50..66 16 EXPR_STMT@50..66
17 EFFECT_EXPR@50..66 17 EFFECT_EXPR@50..66
18 LABEL@50..63 18 LABEL@50..63
19 LIFETIME@50..62 "\'empty_block" 19 LIFETIME@50..62
20 LIFETIME_IDENT@50..62 "\'empty_block"
20 COLON@62..63 ":" 21 COLON@62..63 ":"
21 WHITESPACE@63..64 " " 22 WHITESPACE@63..64 " "
22 BLOCK_EXPR@64..66 23 BLOCK_EXPR@64..66
@@ -26,7 +27,8 @@ SOURCE_FILE@0..506
26 EXPR_STMT@72..295 27 EXPR_STMT@72..295
27 EFFECT_EXPR@72..295 28 EFFECT_EXPR@72..295
28 LABEL@72..79 29 LABEL@72..79
29 LIFETIME@72..78 "\'block" 30 LIFETIME@72..78
31 LIFETIME_IDENT@72..78 "\'block"
30 COLON@78..79 ":" 32 COLON@78..79 ":"
31 WHITESPACE@79..80 " " 33 WHITESPACE@79..80 " "
32 BLOCK_EXPR@80..295 34 BLOCK_EXPR@80..295
@@ -66,7 +68,8 @@ SOURCE_FILE@0..506
66 BREAK_EXPR@147..159 68 BREAK_EXPR@147..159
67 BREAK_KW@147..152 "break" 69 BREAK_KW@147..152 "break"
68 WHITESPACE@152..153 " " 70 WHITESPACE@152..153 " "
69 LIFETIME@153..159 "\'block" 71 LIFETIME@153..159
72 LIFETIME_IDENT@153..159 "\'block"
70 SEMICOLON@159..160 ";" 73 SEMICOLON@159..160 ";"
71 WHITESPACE@160..169 "\n " 74 WHITESPACE@160..169 "\n "
72 R_CURLY@169..170 "}" 75 R_CURLY@169..170 "}"
@@ -105,7 +108,8 @@ SOURCE_FILE@0..506
105 BREAK_EXPR@241..253 108 BREAK_EXPR@241..253
106 BREAK_KW@241..246 "break" 109 BREAK_KW@241..246 "break"
107 WHITESPACE@246..247 " " 110 WHITESPACE@246..247 " "
108 LIFETIME@247..253 "\'block" 111 LIFETIME@247..253
112 LIFETIME_IDENT@247..253 "\'block"
109 SEMICOLON@253..254 ";" 113 SEMICOLON@253..254 ";"
110 WHITESPACE@254..263 "\n " 114 WHITESPACE@254..263 "\n "
111 R_CURLY@263..264 "}" 115 R_CURLY@263..264 "}"
@@ -135,7 +139,8 @@ SOURCE_FILE@0..506
135 WHITESPACE@313..314 " " 139 WHITESPACE@313..314 " "
136 EFFECT_EXPR@314..502 140 EFFECT_EXPR@314..502
137 LABEL@314..321 141 LABEL@314..321
138 LIFETIME@314..320 "\'block" 142 LIFETIME@314..320
143 LIFETIME_IDENT@314..320 "\'block"
139 COLON@320..321 ":" 144 COLON@320..321 ":"
140 WHITESPACE@321..322 " " 145 WHITESPACE@321..322 " "
141 BLOCK_EXPR@322..502 146 BLOCK_EXPR@322..502
@@ -165,7 +170,8 @@ SOURCE_FILE@0..506
165 BREAK_EXPR@378..392 170 BREAK_EXPR@378..392
166 BREAK_KW@378..383 "break" 171 BREAK_KW@378..383 "break"
167 WHITESPACE@383..384 " " 172 WHITESPACE@383..384 " "
168 LIFETIME@384..390 "\'block" 173 LIFETIME@384..390
174 LIFETIME_IDENT@384..390 "\'block"
169 WHITESPACE@390..391 " " 175 WHITESPACE@390..391 " "
170 LITERAL@391..392 176 LITERAL@391..392
171 INT_NUMBER@391..392 "1" 177 INT_NUMBER@391..392 "1"
@@ -197,7 +203,8 @@ SOURCE_FILE@0..506
197 BREAK_EXPR@461..475 203 BREAK_EXPR@461..475
198 BREAK_KW@461..466 "break" 204 BREAK_KW@461..466 "break"
199 WHITESPACE@466..467 " " 205 WHITESPACE@466..467 " "
200 LIFETIME@467..473 "\'block" 206 LIFETIME@467..473
207 LIFETIME_IDENT@467..473 "\'block"
201 WHITESPACE@473..474 " " 208 WHITESPACE@473..474 " "
202 LITERAL@474..475 209 LITERAL@474..475
203 INT_NUMBER@474..475 "2" 210 INT_NUMBER@474..475 "2"
diff --git a/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast b/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
index 7c61b5006..46b192dc1 100644
--- a/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
+++ b/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
@@ -1373,14 +1373,14 @@ SOURCE_FILE@0..3813
1373 WHITESPACE@2376..2377 " " 1373 WHITESPACE@2376..2377 " "
1374 IDENT@2377..2379 "u8" 1374 IDENT@2377..2379 "u8"
1375 L_ANGLE@2379..2380 "<" 1375 L_ANGLE@2379..2380 "<"
1376 LIFETIME@2380..2383 "\'u8" 1376 LIFETIME_IDENT@2380..2383 "\'u8"
1377 COLON@2383..2384 ":" 1377 COLON@2383..2384 ":"
1378 WHITESPACE@2384..2385 " " 1378 WHITESPACE@2384..2385 " "
1379 LIFETIME@2385..2388 "\'u8" 1379 LIFETIME_IDENT@2385..2388 "\'u8"
1380 WHITESPACE@2388..2389 " " 1380 WHITESPACE@2388..2389 " "
1381 PLUS@2389..2390 "+" 1381 PLUS@2389..2390 "+"
1382 WHITESPACE@2390..2391 " " 1382 WHITESPACE@2390..2391 " "
1383 LIFETIME@2391..2394 "\'u8" 1383 LIFETIME_IDENT@2391..2394 "\'u8"
1384 R_ANGLE@2394..2395 ">" 1384 R_ANGLE@2394..2395 ">"
1385 TOKEN_TREE@2395..2408 1385 TOKEN_TREE@2395..2408
1386 L_PAREN@2395..2396 "(" 1386 L_PAREN@2395..2396 "("
@@ -1388,7 +1388,7 @@ SOURCE_FILE@0..3813
1388 COLON@2398..2399 ":" 1388 COLON@2398..2399 ":"
1389 WHITESPACE@2399..2400 " " 1389 WHITESPACE@2399..2400 " "
1390 AMP@2400..2401 "&" 1390 AMP@2400..2401 "&"
1391 LIFETIME@2401..2404 "\'u8" 1391 LIFETIME_IDENT@2401..2404 "\'u8"
1392 WHITESPACE@2404..2405 " " 1392 WHITESPACE@2404..2405 " "
1393 IDENT@2405..2407 "u8" 1393 IDENT@2405..2407 "u8"
1394 R_PAREN@2407..2408 ")" 1394 R_PAREN@2407..2408 ")"
@@ -1397,7 +1397,7 @@ SOURCE_FILE@0..3813
1397 R_ANGLE@2410..2411 ">" 1397 R_ANGLE@2410..2411 ">"
1398 WHITESPACE@2411..2412 " " 1398 WHITESPACE@2411..2412 " "
1399 AMP@2412..2413 "&" 1399 AMP@2412..2413 "&"
1400 LIFETIME@2413..2416 "\'u8" 1400 LIFETIME_IDENT@2413..2416 "\'u8"
1401 WHITESPACE@2416..2417 " " 1401 WHITESPACE@2416..2417 " "
1402 IDENT@2417..2419 "u8" 1402 IDENT@2417..2419 "u8"
1403 WHITESPACE@2419..2420 " " 1403 WHITESPACE@2419..2420 " "
@@ -1568,7 +1568,8 @@ SOURCE_FILE@0..3813
1568 GENERIC_PARAM_LIST@2862..2870 1568 GENERIC_PARAM_LIST@2862..2870
1569 L_ANGLE@2862..2863 "<" 1569 L_ANGLE@2862..2863 "<"
1570 LIFETIME_PARAM@2863..2869 1570 LIFETIME_PARAM@2863..2869
1571 LIFETIME@2863..2869 "\'union" 1571 LIFETIME@2863..2869
1572 LIFETIME_IDENT@2863..2869 "\'union"
1572 R_ANGLE@2869..2870 ">" 1573 R_ANGLE@2869..2870 ">"
1573 WHITESPACE@2870..2871 " " 1574 WHITESPACE@2870..2871 " "
1574 RECORD_FIELD_LIST@2871..2904 1575 RECORD_FIELD_LIST@2871..2904
@@ -1581,7 +1582,8 @@ SOURCE_FILE@0..3813
1581 WHITESPACE@2879..2880 " " 1582 WHITESPACE@2879..2880 " "
1582 REF_TYPE@2880..2901 1583 REF_TYPE@2880..2901
1583 AMP@2880..2881 "&" 1584 AMP@2880..2881 "&"
1584 LIFETIME@2881..2887 "\'union" 1585 LIFETIME@2881..2887
1586 LIFETIME_IDENT@2881..2887 "\'union"
1585 WHITESPACE@2887..2888 " " 1587 WHITESPACE@2887..2888 " "
1586 PATH_TYPE@2888..2901 1588 PATH_TYPE@2888..2901
1587 PATH@2888..2901 1589 PATH@2888..2901
@@ -1591,7 +1593,8 @@ SOURCE_FILE@0..3813
1591 GENERIC_ARG_LIST@2893..2901 1593 GENERIC_ARG_LIST@2893..2901
1592 L_ANGLE@2893..2894 "<" 1594 L_ANGLE@2893..2894 "<"
1593 LIFETIME_ARG@2894..2900 1595 LIFETIME_ARG@2894..2900
1594 LIFETIME@2894..2900 "\'union" 1596 LIFETIME@2894..2900
1597 LIFETIME_IDENT@2894..2900 "\'union"
1595 R_ANGLE@2900..2901 ">" 1598 R_ANGLE@2900..2901 ">"
1596 COMMA@2901..2902 "," 1599 COMMA@2901..2902 ","
1597 WHITESPACE@2902..2903 " " 1600 WHITESPACE@2902..2903 " "
diff --git a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
index d4f05f279..8974f9e40 100644
--- a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
+++ b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
@@ -175,7 +175,8 @@ SOURCE_FILE@0..519
175 GENERIC_ARG_LIST@162..166 175 GENERIC_ARG_LIST@162..166
176 L_ANGLE@162..163 "<" 176 L_ANGLE@162..163 "<"
177 LIFETIME_ARG@163..165 177 LIFETIME_ARG@163..165
178 LIFETIME@163..165 "\'a" 178 LIFETIME@163..165
179 LIFETIME_IDENT@163..165 "\'a"
179 R_ANGLE@165..166 ">" 180 R_ANGLE@165..166 ">"
180 R_PAREN@166..167 ")" 181 R_PAREN@166..167 ")"
181 R_ANGLE@167..168 ">" 182 R_ANGLE@167..168 ">"
@@ -344,7 +345,8 @@ SOURCE_FILE@0..519
344 GENERIC_PARAM_LIST@345..349 345 GENERIC_PARAM_LIST@345..349
345 L_ANGLE@345..346 "<" 346 L_ANGLE@345..346 "<"
346 LIFETIME_PARAM@346..348 347 LIFETIME_PARAM@346..348
347 LIFETIME@346..348 "\'a" 348 LIFETIME@346..348
349 LIFETIME_IDENT@346..348 "\'a"
348 R_ANGLE@348..349 ">" 350 R_ANGLE@348..349 ">"
349 PARAM_LIST@349..368 351 PARAM_LIST@349..368
350 L_PAREN@349..350 "(" 352 L_PAREN@349..350 "("
@@ -376,7 +378,8 @@ SOURCE_FILE@0..519
376 GENERIC_PARAM_LIST@382..386 378 GENERIC_PARAM_LIST@382..386
377 L_ANGLE@382..383 "<" 379 L_ANGLE@382..383 "<"
378 LIFETIME_PARAM@383..385 380 LIFETIME_PARAM@383..385
379 LIFETIME@383..385 "\'a" 381 LIFETIME@383..385
382 LIFETIME_IDENT@383..385 "\'a"
380 R_ANGLE@385..386 ">" 383 R_ANGLE@385..386 ">"
381 PARAM_LIST@386..404 384 PARAM_LIST@386..404
382 L_PAREN@386..387 "(" 385 L_PAREN@386..387 "("
@@ -391,7 +394,8 @@ SOURCE_FILE@0..519
391 WHITESPACE@394..395 " " 394 WHITESPACE@394..395 " "
392 SELF_PARAM@395..403 395 SELF_PARAM@395..403
393 AMP@395..396 "&" 396 AMP@395..396 "&"
394 LIFETIME@396..398 "\'a" 397 LIFETIME@396..398
398 LIFETIME_IDENT@396..398 "\'a"
395 WHITESPACE@398..399 " " 399 WHITESPACE@398..399 " "
396 SELF_KW@399..403 "self" 400 SELF_KW@399..403 "self"
397 R_PAREN@403..404 ")" 401 R_PAREN@403..404 ")"
@@ -408,7 +412,8 @@ SOURCE_FILE@0..519
408 GENERIC_PARAM_LIST@418..422 412 GENERIC_PARAM_LIST@418..422
409 L_ANGLE@418..419 "<" 413 L_ANGLE@418..419 "<"
410 LIFETIME_PARAM@419..421 414 LIFETIME_PARAM@419..421
411 LIFETIME@419..421 "\'a" 415 LIFETIME@419..421
416 LIFETIME_IDENT@419..421 "\'a"
412 R_ANGLE@421..422 ">" 417 R_ANGLE@421..422 ">"
413 PARAM_LIST@422..444 418 PARAM_LIST@422..444
414 L_PAREN@422..423 "(" 419 L_PAREN@422..423 "("
@@ -423,7 +428,8 @@ SOURCE_FILE@0..519
423 WHITESPACE@430..431 " " 428 WHITESPACE@430..431 " "
424 SELF_PARAM@431..443 429 SELF_PARAM@431..443
425 AMP@431..432 "&" 430 AMP@431..432 "&"
426 LIFETIME@432..434 "\'a" 431 LIFETIME@432..434
432 LIFETIME_IDENT@432..434 "\'a"
427 WHITESPACE@434..435 " " 433 WHITESPACE@434..435 " "
428 MUT_KW@435..438 "mut" 434 MUT_KW@435..438 "mut"
429 WHITESPACE@438..439 " " 435 WHITESPACE@438..439 " "
diff --git a/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast b/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
index 8f8639a37..325e9e655 100644
--- a/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
+++ b/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
@@ -22,7 +22,8 @@ SOURCE_FILE@0..374
22 GENERIC_PARAM_LIST@31..35 22 GENERIC_PARAM_LIST@31..35
23 L_ANGLE@31..32 "<" 23 L_ANGLE@31..32 "<"
24 LIFETIME_PARAM@32..34 24 LIFETIME_PARAM@32..34
25 LIFETIME@32..34 "\'a" 25 LIFETIME@32..34
26 LIFETIME_IDENT@32..34 "\'a"
26 R_ANGLE@34..35 ">" 27 R_ANGLE@34..35 ">"
27 WHITESPACE@35..36 " " 28 WHITESPACE@35..36 " "
28 PATH_TYPE@36..37 29 PATH_TYPE@36..37
@@ -44,7 +45,8 @@ SOURCE_FILE@0..374
44 PARAM@42..49 45 PARAM@42..49
45 REF_TYPE@42..49 46 REF_TYPE@42..49
46 AMP@42..43 "&" 47 AMP@42..43 "&"
47 LIFETIME@43..45 "\'a" 48 LIFETIME@43..45
49 LIFETIME_IDENT@43..45 "\'a"
48 WHITESPACE@45..46 " " 50 WHITESPACE@45..46 " "
49 PATH_TYPE@46..49 51 PATH_TYPE@46..49
50 PATH@46..49 52 PATH@46..49
@@ -82,12 +84,14 @@ SOURCE_FILE@0..374
82 GENERIC_PARAM_LIST@85..89 84 GENERIC_PARAM_LIST@85..89
83 L_ANGLE@85..86 "<" 85 L_ANGLE@85..86 "<"
84 LIFETIME_PARAM@86..88 86 LIFETIME_PARAM@86..88
85 LIFETIME@86..88 "\'a" 87 LIFETIME@86..88
88 LIFETIME_IDENT@86..88 "\'a"
86 R_ANGLE@88..89 ">" 89 R_ANGLE@88..89 ">"
87 WHITESPACE@89..90 " " 90 WHITESPACE@89..90 " "
88 REF_TYPE@90..95 91 REF_TYPE@90..95
89 AMP@90..91 "&" 92 AMP@90..91 "&"
90 LIFETIME@91..93 "\'a" 93 LIFETIME@91..93
94 LIFETIME_IDENT@91..93 "\'a"
91 WHITESPACE@93..94 " " 95 WHITESPACE@93..94 " "
92 PATH_TYPE@94..95 96 PATH_TYPE@94..95
93 PATH@94..95 97 PATH@94..95
@@ -133,14 +137,16 @@ SOURCE_FILE@0..374
133 GENERIC_PARAM_LIST@140..144 137 GENERIC_PARAM_LIST@140..144
134 L_ANGLE@140..141 "<" 138 L_ANGLE@140..141 "<"
135 LIFETIME_PARAM@141..143 139 LIFETIME_PARAM@141..143
136 LIFETIME@141..143 "\'a" 140 LIFETIME@141..143
141 LIFETIME_IDENT@141..143 "\'a"
137 R_ANGLE@143..144 ">" 142 R_ANGLE@143..144 ">"
138 WHITESPACE@144..145 " " 143 WHITESPACE@144..145 " "
139 PAREN_TYPE@145..152 144 PAREN_TYPE@145..152
140 L_PAREN@145..146 "(" 145 L_PAREN@145..146 "("
141 REF_TYPE@146..151 146 REF_TYPE@146..151
142 AMP@146..147 "&" 147 AMP@146..147 "&"
143 LIFETIME@147..149 "\'a" 148 LIFETIME@147..149
149 LIFETIME_IDENT@147..149 "\'a"
144 WHITESPACE@149..150 " " 150 WHITESPACE@149..150 " "
145 PATH_TYPE@150..151 151 PATH_TYPE@150..151
146 PATH@150..151 152 PATH@150..151
@@ -162,7 +168,8 @@ SOURCE_FILE@0..374
162 PARAM@157..164 168 PARAM@157..164
163 REF_TYPE@157..164 169 REF_TYPE@157..164
164 AMP@157..158 "&" 170 AMP@157..158 "&"
165 LIFETIME@158..160 "\'a" 171 LIFETIME@158..160
172 LIFETIME_IDENT@158..160 "\'a"
166 WHITESPACE@160..161 " " 173 WHITESPACE@160..161 " "
167 PATH_TYPE@161..164 174 PATH_TYPE@161..164
168 PATH@161..164 175 PATH@161..164
@@ -200,14 +207,16 @@ SOURCE_FILE@0..374
200 GENERIC_PARAM_LIST@202..206 207 GENERIC_PARAM_LIST@202..206
201 L_ANGLE@202..203 "<" 208 L_ANGLE@202..203 "<"
202 LIFETIME_PARAM@203..205 209 LIFETIME_PARAM@203..205
203 LIFETIME@203..205 "\'a" 210 LIFETIME@203..205
211 LIFETIME_IDENT@203..205 "\'a"
204 R_ANGLE@205..206 ">" 212 R_ANGLE@205..206 ">"
205 WHITESPACE@206..207 " " 213 WHITESPACE@206..207 " "
206 SLICE_TYPE@207..214 214 SLICE_TYPE@207..214
207 L_BRACK@207..208 "[" 215 L_BRACK@207..208 "["
208 REF_TYPE@208..213 216 REF_TYPE@208..213
209 AMP@208..209 "&" 217 AMP@208..209 "&"
210 LIFETIME@209..211 "\'a" 218 LIFETIME@209..211
219 LIFETIME_IDENT@209..211 "\'a"
211 WHITESPACE@211..212 " " 220 WHITESPACE@211..212 " "
212 PATH_TYPE@212..213 221 PATH_TYPE@212..213
213 PATH@212..213 222 PATH@212..213
@@ -267,7 +276,8 @@ SOURCE_FILE@0..374
267 GENERIC_PARAM_LIST@261..265 276 GENERIC_PARAM_LIST@261..265
268 L_ANGLE@261..262 "<" 277 L_ANGLE@261..262 "<"
269 LIFETIME_PARAM@262..264 278 LIFETIME_PARAM@262..264
270 LIFETIME@262..264 "\'a" 279 LIFETIME@262..264
280 LIFETIME_IDENT@262..264 "\'a"
271 R_ANGLE@264..265 ">" 281 R_ANGLE@264..265 ">"
272 WHITESPACE@265..266 " " 282 WHITESPACE@265..266 " "
273 PATH_TYPE@266..285 283 PATH_TYPE@266..285
@@ -277,7 +287,8 @@ SOURCE_FILE@0..374
277 L_ANGLE@266..267 "<" 287 L_ANGLE@266..267 "<"
278 REF_TYPE@267..272 288 REF_TYPE@267..272
279 AMP@267..268 "&" 289 AMP@267..268 "&"
280 LIFETIME@268..270 "\'a" 290 LIFETIME@268..270
291 LIFETIME_IDENT@268..270 "\'a"
281 WHITESPACE@270..271 " " 292 WHITESPACE@270..271 " "
282 PATH_TYPE@271..272 293 PATH_TYPE@271..272
283 PATH@271..272 294 PATH@271..272
@@ -336,7 +347,8 @@ SOURCE_FILE@0..374
336 GENERIC_PARAM_LIST@333..337 347 GENERIC_PARAM_LIST@333..337
337 L_ANGLE@333..334 "<" 348 L_ANGLE@333..334 "<"
338 LIFETIME_PARAM@334..336 349 LIFETIME_PARAM@334..336
339 LIFETIME@334..336 "\'a" 350 LIFETIME@334..336
351 LIFETIME_IDENT@334..336 "\'a"
340 R_ANGLE@336..337 ">" 352 R_ANGLE@336..337 ">"
341 WHITESPACE@337..338 " " 353 WHITESPACE@337..338 " "
342 FOR_TYPE@338..362 354 FOR_TYPE@338..362
@@ -344,7 +356,8 @@ SOURCE_FILE@0..374
344 GENERIC_PARAM_LIST@341..345 356 GENERIC_PARAM_LIST@341..345
345 L_ANGLE@341..342 "<" 357 L_ANGLE@341..342 "<"
346 LIFETIME_PARAM@342..344 358 LIFETIME_PARAM@342..344
347 LIFETIME@342..344 "\'b" 359 LIFETIME@342..344
360 LIFETIME_IDENT@342..344 "\'b"
348 R_ANGLE@344..345 ">" 361 R_ANGLE@344..345 ">"
349 WHITESPACE@345..346 " " 362 WHITESPACE@345..346 " "
350 FN_PTR_TYPE@346..362 363 FN_PTR_TYPE@346..362
@@ -354,7 +367,8 @@ SOURCE_FILE@0..374
354 PARAM@349..354 367 PARAM@349..354
355 REF_TYPE@349..354 368 REF_TYPE@349..354
356 AMP@349..350 "&" 369 AMP@349..350 "&"
357 LIFETIME@350..352 "\'a" 370 LIFETIME@350..352
371 LIFETIME_IDENT@350..352 "\'a"
358 WHITESPACE@352..353 " " 372 WHITESPACE@352..353 " "
359 PATH_TYPE@353..354 373 PATH_TYPE@353..354
360 PATH@353..354 374 PATH@353..354
@@ -366,7 +380,8 @@ SOURCE_FILE@0..374
366 PARAM@356..361 380 PARAM@356..361
367 REF_TYPE@356..361 381 REF_TYPE@356..361
368 AMP@356..357 "&" 382 AMP@356..357 "&"
369 LIFETIME@357..359 "\'b" 383 LIFETIME@357..359
384 LIFETIME_IDENT@357..359 "\'b"
370 WHITESPACE@359..360 " " 385 WHITESPACE@359..360 " "
371 PATH_TYPE@360..361 386 PATH_TYPE@360..361
372 PATH@360..361 387 PATH@360..361
diff --git a/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast b/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
index 0cd868a83..8d3e187ae 100644
--- a/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
+++ b/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
@@ -7,14 +7,16 @@ SOURCE_FILE@0..195
7 GENERIC_PARAM_LIST@8..12 7 GENERIC_PARAM_LIST@8..12
8 L_ANGLE@8..9 "<" 8 L_ANGLE@8..9 "<"
9 LIFETIME_PARAM@9..11 9 LIFETIME_PARAM@9..11
10 LIFETIME@9..11 "\'a" 10 LIFETIME@9..11
11 LIFETIME_IDENT@9..11 "\'a"
11 R_ANGLE@11..12 ">" 12 R_ANGLE@11..12 ">"
12 WHITESPACE@12..13 " " 13 WHITESPACE@12..13 " "
13 EQ@13..14 "=" 14 EQ@13..14 "="
14 WHITESPACE@14..15 " " 15 WHITESPACE@14..15 " "
15 REF_TYPE@15..36 16 REF_TYPE@15..36
16 AMP@15..16 "&" 17 AMP@15..16 "&"
17 LIFETIME@16..18 "\'a" 18 LIFETIME@16..18
19 LIFETIME_IDENT@16..18 "\'a"
18 WHITESPACE@18..19 " " 20 WHITESPACE@18..19 " "
19 PAREN_TYPE@19..36 21 PAREN_TYPE@19..36
20 L_PAREN@19..20 "(" 22 L_PAREN@19..20 "("
@@ -109,7 +111,8 @@ SOURCE_FILE@0..195
109 PLUS@104..105 "+" 111 PLUS@104..105 "+"
110 WHITESPACE@105..106 " " 112 WHITESPACE@105..106 " "
111 TYPE_BOUND@106..113 113 TYPE_BOUND@106..113
112 LIFETIME@106..113 "\'static" 114 LIFETIME@106..113
115 LIFETIME_IDENT@106..113 "\'static"
113 R_PAREN@113..114 ")" 116 R_PAREN@113..114 ")"
114 SEMICOLON@114..115 ";" 117 SEMICOLON@114..115 ";"
115 WHITESPACE@115..116 "\n" 118 WHITESPACE@115..116 "\n"